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  }