@@ -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+
742759func 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