github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/secretspruner/worker_test.go (about) 1 // Copyright 2023 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package secretspruner_test 5 6 import ( 7 "sync" 8 "time" 9 10 "github.com/juju/loggo" 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 "github.com/juju/worker/v3/workertest" 14 "go.uber.org/mock/gomock" 15 gc "gopkg.in/check.v1" 16 17 coresecrets "github.com/juju/juju/core/secrets" 18 "github.com/juju/juju/core/watcher/watchertest" 19 coretesting "github.com/juju/juju/testing" 20 "github.com/juju/juju/worker/secretspruner" 21 "github.com/juju/juju/worker/secretspruner/mocks" 22 ) 23 24 type workerSuite struct { 25 testing.IsolationSuite 26 logger loggo.Logger 27 28 facade *mocks.MockSecretsFacade 29 30 done chan struct{} 31 changedCh chan []string 32 } 33 34 var _ = gc.Suite(&workerSuite{}) 35 36 func (s *workerSuite) getWorkerNewer(c *gc.C, calls ...*gomock.Call) (func(string), *gomock.Controller) { 37 ctrl := gomock.NewController(c) 38 s.logger = loggo.GetLogger("test") 39 s.facade = mocks.NewMockSecretsFacade(ctrl) 40 41 s.changedCh = make(chan []string, 1) 42 s.done = make(chan struct{}) 43 s.facade.EXPECT().WatchRevisionsToPrune().Return(watchertest.NewMockStringsWatcher(s.changedCh), nil) 44 45 start := func(expectedErr string) { 46 w, err := secretspruner.NewWorker(secretspruner.Config{ 47 Logger: s.logger, 48 SecretsFacade: s.facade, 49 }) 50 c.Assert(err, jc.ErrorIsNil) 51 c.Assert(w, gc.NotNil) 52 workertest.CheckAlive(c, w) 53 s.AddCleanup(func(c *gc.C) { 54 if expectedErr == "" { 55 workertest.CleanKill(c, w) 56 } else { 57 err := workertest.CheckKilled(c, w) 58 c.Assert(err, gc.ErrorMatches, expectedErr) 59 } 60 }) 61 s.waitDone(c) 62 } 63 return start, ctrl 64 } 65 66 func (s *workerSuite) waitDone(c *gc.C) { 67 select { 68 case <-s.done: 69 case <-time.After(coretesting.ShortWait): 70 c.Errorf("timed out waiting for worker") 71 } 72 } 73 74 func (s *workerSuite) TestPrune(c *gc.C) { 75 start, ctrl := s.getWorkerNewer(c) 76 defer ctrl.Finish() 77 78 uri1 := coresecrets.NewURI() 79 uri2 := coresecrets.NewURI() 80 uri3 := coresecrets.NewURI() 81 var revisions []string 82 revisions = append(revisions, uri1.String()+"/1") 83 revisions = append(revisions, uri2.String()+"/1") 84 revisions = append(revisions, uri2.String()+"/2") 85 revisions = append(revisions, uri3.String()+"/1") 86 revisions = append(revisions, uri3.String()+"/2") 87 revisions = append(revisions, uri3.String()+"/3") 88 s.changedCh <- revisions 89 90 var wg sync.WaitGroup 91 wg.Add(3) 92 93 go func() { 94 wg.Wait() 95 close(s.done) 96 }() 97 98 s.facade.EXPECT().DeleteRevisions(uri1, 1).DoAndReturn(func(*coresecrets.URI, ...int) error { 99 wg.Done() 100 return nil 101 }) 102 s.facade.EXPECT().DeleteRevisions(uri2, 1, 2).DoAndReturn(func(*coresecrets.URI, ...int) error { 103 wg.Done() 104 return nil 105 }) 106 s.facade.EXPECT().DeleteRevisions(uri3, 1, 2, 3).DoAndReturn(func(*coresecrets.URI, ...int) error { 107 wg.Done() 108 return nil 109 }) 110 111 start("") 112 }