summaryrefslogtreecommitdiffhomepage
path: root/control/controlclient/controlclient_test.go
diff options
context:
space:
mode:
authorkari-ts <kari@tailscale.com>2025-03-19 11:28:04 -0700
committerkari-ts <kari@tailscale.com>2025-04-04 14:24:56 -0700
commit6d5c7b11913e09b061e863411ad488dc44a13870 (patch)
tree9e1789b5080ae4a92523611e49920dcb1102604b /control/controlclient/controlclient_test.go
parentca50599c95e0a4cb7b4aab179e866e202f10c0c4 (diff)
parent3a2c92f08eac8cd8f50356ff288e40a28636ee42 (diff)
downloadtailscale-kari/taildropsaf.tar.xz
tailscale-kari/taildropsaf.zip
-check if Context.getExternalFilesDirs works as is for private dir
Diffstat (limited to 'control/controlclient/controlclient_test.go')
-rw-r--r--control/controlclient/controlclient_test.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/control/controlclient/controlclient_test.go b/control/controlclient/controlclient_test.go
index 6885b5851..f8882a4e7 100644
--- a/control/controlclient/controlclient_test.go
+++ b/control/controlclient/controlclient_test.go
@@ -4,6 +4,8 @@
package controlclient
import (
+ "errors"
+ "fmt"
"io"
"reflect"
"slices"
@@ -147,3 +149,42 @@ func TestCanSkipStatus(t *testing.T) {
t.Errorf("Status fields = %q; this code was only written to handle fields %q", f, want)
}
}
+
+func TestRetryableErrors(t *testing.T) {
+ errorTests := []struct {
+ err error
+ want bool
+ }{
+ {errNoNoiseClient, true},
+ {errNoNodeKey, true},
+ {fmt.Errorf("%w: %w", errNoNoiseClient, errors.New("no noise")), true},
+ {fmt.Errorf("%w: %w", errHTTPPostFailure, errors.New("bad post")), true},
+ {fmt.Errorf("%w: %w", errNoNodeKey, errors.New("not node key")), true},
+ {errBadHTTPResponse(429, "too may requests"), true},
+ {errBadHTTPResponse(500, "internal server eror"), true},
+ {errBadHTTPResponse(502, "bad gateway"), true},
+ {errBadHTTPResponse(503, "service unavailable"), true},
+ {errBadHTTPResponse(504, "gateway timeout"), true},
+ {errBadHTTPResponse(1234, "random error"), false},
+ }
+
+ for _, tt := range errorTests {
+ t.Run(tt.err.Error(), func(t *testing.T) {
+ if isRetryableErrorForTest(tt.err) != tt.want {
+ t.Fatalf("retriable: got %v, want %v", tt.err, tt.want)
+ }
+ })
+ }
+}
+
+type retryableForTest interface {
+ Retryable() bool
+}
+
+func isRetryableErrorForTest(err error) bool {
+ var ae retryableForTest
+ if errors.As(err, &ae) {
+ return ae.Retryable()
+ }
+ return false
+}