github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/filenotifywatcher/worker_test.go (about) 1 // Copyright 2023 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package filenotifywatcher 5 6 import ( 7 time "time" 8 9 jc "github.com/juju/testing/checkers" 10 "github.com/juju/worker/v3" 11 "github.com/juju/worker/v3/workertest" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/testing" 15 ) 16 17 type workerSuite struct { 18 baseSuite 19 } 20 21 var _ = gc.Suite(&workerSuite{}) 22 23 func (s *workerSuite) TestChanges(c *gc.C) { 24 defer s.setupMocks(c).Finish() 25 26 s.expectAnyLogs() 27 s.expectAnyClock() 28 29 done := make(chan struct{}) 30 ch := make(chan bool) 31 go func() { 32 defer close(done) 33 ch <- true 34 ch <- true 35 }() 36 37 s.watcher.EXPECT().Changes().Return(ch).Times(2) 38 s.watcher.EXPECT().Wait().MinTimes(1) 39 40 // Depending on the timing of the test, the worker may or may not have 41 // received the kill signal before the watcher is killed. 42 s.watcher.EXPECT().Kill().AnyTimes() 43 44 w := s.newWorker(c) 45 defer workertest.DirtyKill(c, w) 46 47 watcher, ok := w.(FileNotifyWatcher) 48 c.Assert(ok, jc.IsTrue, gc.Commentf("worker does not implement FileNotifyWatcher")) 49 50 ch1, err := watcher.Changes("controller") 51 c.Assert(err, jc.ErrorIsNil) 52 53 select { 54 case v := <-ch1: 55 c.Assert(v, jc.IsTrue) 56 case <-time.After(testing.LongWait): 57 c.Fatalf("timed out waiting for changes") 58 } 59 60 ch2, err := watcher.Changes("controller") 61 c.Assert(err, jc.ErrorIsNil) 62 63 select { 64 case v := <-ch2: 65 c.Assert(v, jc.IsTrue) 66 case <-time.After(testing.LongWait): 67 c.Fatalf("timed out waiting for changes") 68 } 69 70 workertest.CleanKill(c, w) 71 72 select { 73 case <-done: 74 case <-time.After(testing.ShortWait): 75 c.Fatalf("timed out waiting for worker to exit") 76 } 77 } 78 79 func (s *workerSuite) newWorker(c *gc.C) worker.Worker { 80 cfg := WorkerConfig{ 81 Clock: s.clock, 82 Logger: s.logger, 83 NewWatcher: func(string, ...Option) (FileWatcher, error) { 84 return s.watcher, nil 85 }, 86 } 87 88 w, err := newWorker(cfg) 89 c.Assert(err, jc.ErrorIsNil) 90 return w 91 }