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  }