summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--internal/test/recorder.go34
-rw-r--r--internal/test/test.go25
2 files changed, 46 insertions, 13 deletions
diff --git a/internal/test/recorder.go b/internal/test/recorder.go
index 35ddb0d01..7d9f4a5f2 100644
--- a/internal/test/recorder.go
+++ b/internal/test/recorder.go
@@ -5,24 +5,46 @@ import (
"testing"
)
+const (
+ RecorderFailNow int = iota
+)
+
type recorder struct {
testing.TB
- fail func(string)
- fatal func(string)
+ fail func(string)
+ fatal func(string)
+ failed bool
+}
+
+func (r *recorder) Error(args ...any) {
+ r.failed = true
+ r.fail(fmt.Sprint(args...))
}
func (r *recorder) Errorf(format string, args ...any) {
+ r.failed = true
r.fail(fmt.Sprintf(format, args...))
}
-func (r *recorder) Fatalf(format string, args ...any) {
- r.fatal(fmt.Sprintf(format, args...))
+func (r *recorder) Fail() {
+ r.failed = true
+}
+
+func (r *recorder) FailNow() {
+ r.failed = true
+ panic(RecorderFailNow)
+}
+
+func (r *recorder) Failed() bool {
+ return r.failed
}
func (r *recorder) Fatal(args ...any) {
+ r.failed = true
r.fatal(fmt.Sprint(args...))
}
-func (r *recorder) Error(args ...any) {
- r.fail(fmt.Sprint(args...))
+func (r *recorder) Fatalf(format string, args ...any) {
+ r.failed = true
+ r.fatal(fmt.Sprintf(format, args...))
}
diff --git a/internal/test/test.go b/internal/test/test.go
index 1dc052bfd..8a40e30ab 100644
--- a/internal/test/test.go
+++ b/internal/test/test.go
@@ -38,15 +38,26 @@ func (f *flaky) Run(fn func(t testing.TB)) {
var last error
for attempt := 1; attempt <= f.o.MaxAttempts; attempt++ {
- var failed bool
+ f.t.Logf("attempt %d of %d", attempt, f.o.MaxAttempts)
- fn(&recorder{
+ r := &recorder{
TB: f.t,
- fail: func(e string) { failed = true; last = errors.New(e) },
- fatal: func(e string) { failed = true; last = errors.New(e) },
- })
+ fail: func(s string) { last = errors.New(s) },
+ fatal: func(s string) { last = errors.New(s) },
+ }
+
+ func() {
+ defer func() {
+ if v := recover(); v != nil {
+ if code, ok := v.(int); ok && code != RecorderFailNow {
+ panic(v)
+ }
+ }
+ }()
+ fn(r)
+ }()
- if !failed {
+ if !r.Failed() {
return
}
@@ -56,7 +67,7 @@ func (f *flaky) Run(fn func(t testing.TB)) {
}
}
- f.t.Fatalf("[%s] test failed after %d attempts: %s", f.t.Name(), f.o.MaxAttempts, last)
+ f.t.Fatalf("[%s] test failed after %d attempts: %v", f.t.Name(), f.o.MaxAttempts, last)
}
func applyJitter(d time.Duration, jitter float64) time.Duration {