summaryrefslogtreecommitdiffhomepage
path: root/control/controlclient/controlclient_test.go
diff options
context:
space:
mode:
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
+}