Skip to content

Commit b069c34

Browse files
author
Chris Stockton
committed
chore: make a racey test much less racey
1 parent e89a181 commit b069c34

File tree

1 file changed

+50
-33
lines changed

1 file changed

+50
-33
lines changed

internal/reloader/reloader_test.go

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -217,55 +217,62 @@ func TestWatchNotify(t *testing.T) {
217217
})
218218

219219
t.Run("ErrorChanClosed", func(t *testing.T) {
220-
dir, cleanup := helpTestDir(t)
221-
defer cleanup()
220+
fn := func() string {
221+
ctx, cancel := context.WithCancel(ctx)
222+
defer cancel()
222223

223-
cfg := e2e.Must(e2e.Config()).Reloading
224-
cfg.SignalEnabled = false
225-
cfg.PollerEnabled = false
224+
dir, cleanup := helpTestDir(t)
225+
defer cleanup()
226226

227-
rr := mockReloadRecorder()
228-
wr := newMockWatcher(nil)
229-
wr.errorCh <- errors.New("sentinel")
230-
close(wr.errorCh)
227+
cfg := e2e.Must(e2e.Config()).Reloading
228+
cfg.SignalEnabled = false
229+
cfg.PollerEnabled = false
231230

232-
rl := NewReloader(cfg, dir)
233-
rl.watchFn = func() (watcher, error) { return wr, nil }
231+
rr := mockReloadRecorder()
232+
wr := newMockWatcher(nil)
233+
wr.errorCh <- errors.New("sentinel")
234+
close(wr.errorCh)
234235

235-
err := rl.Watch(ctx, rr.configFn)
236-
require.NotNil(t, err)
236+
rl := NewReloader(cfg, dir)
237+
rl.watchFn = func() (watcher, error) { return wr, nil }
237238

238-
msg := "reloader: fsnotify error channel was closed"
239-
if exp, got := msg, err.Error(); exp != got {
240-
require.Equal(t, exp, got)
239+
err := rl.Watch(ctx, rr.configFn)
240+
require.NotNil(t, err)
241+
return err.Error()
241242
}
243+
244+
const exp = "reloader: fsnotify error channel was closed"
245+
runUntilErrorStr(t, exp, fn)
242246
})
243247

244248
t.Run("EventChanClosed", func(t *testing.T) {
245-
dir, cleanup := helpTestDir(t)
246-
defer cleanup()
249+
fn := func() string {
250+
ctx, cancel := context.WithCancel(ctx)
251+
defer cancel()
247252

248-
cfg := e2e.Must(e2e.Config()).Reloading
249-
cfg.SignalEnabled = false
250-
cfg.PollerEnabled = false
251-
cfg.GracePeriodInterval = time.Second / 100
253+
dir, cleanup := helpTestDir(t)
254+
defer cleanup()
252255

253-
rr := mockReloadRecorder()
254-
wr := newMockWatcher(nil)
255-
close(wr.eventCh)
256+
cfg := e2e.Must(e2e.Config()).Reloading
257+
cfg.SignalEnabled = false
258+
cfg.PollerEnabled = false
259+
cfg.GracePeriodInterval = time.Second / 100
256260

257-
rl := NewReloader(cfg, dir)
258-
rl.watchFn = func() (watcher, error) { return wr, nil }
261+
rr := mockReloadRecorder()
262+
wr := newMockWatcher(nil)
263+
close(wr.eventCh)
259264

260-
err := rl.Watch(ctx, rr.configFn)
261-
if err == nil {
265+
rl := NewReloader(cfg, dir)
266+
rl.watchFn = func() (watcher, error) { return wr, nil }
267+
268+
err := rl.Watch(ctx, rr.configFn)
262269
require.NotNil(t, err)
263-
}
264270

265-
msg := "reloader: fsnotify event channel was closed"
266-
if exp, got := msg, err.Error(); exp != got {
267-
require.Equal(t, exp, got)
271+
return err.Error()
268272
}
273+
274+
const exp = "reloader: fsnotify event channel was closed"
275+
runUntilErrorStr(t, exp, fn)
269276
})
270277

271278
t.Run("ErrorChan", func(t *testing.T) {
@@ -739,6 +746,16 @@ func TestReloadCheckAt(t *testing.T) {
739746
}
740747
}
741748

749+
func runUntilErrorStr(t testing.TB, exp string, fn func() string) {
750+
var got string
751+
for range 100 {
752+
if got = fn(); got == exp {
753+
break
754+
}
755+
}
756+
require.Equal(t, exp, got)
757+
}
758+
742759
func helpTestDir(t testing.TB) (dir string, cleanup func()) {
743760
name := fmt.Sprintf("%v_%v", t.Name(), time.Now().Nanosecond())
744761
dir = filepath.Join("testdata", name)

0 commit comments

Comments
 (0)