github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/changestream/eventqueue/package_test.go (about) 1 // Copyright 2023 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package eventqueue 5 6 import ( 7 "sync/atomic" 8 "testing" 9 "time" 10 11 "go.uber.org/mock/gomock" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/core/changestream" 15 dbtesting "github.com/juju/juju/database/testing" 16 jujutesting "github.com/juju/juju/testing" 17 ) 18 19 //go:generate go run go.uber.org/mock/mockgen -package eventqueue -destination change_mock_test.go github.com/juju/juju/core/changestream ChangeEvent 20 //go:generate go run go.uber.org/mock/mockgen -package eventqueue -destination stream_mock_test.go github.com/juju/juju/worker/changestream/eventqueue Stream 21 //go:generate go run go.uber.org/mock/mockgen -package eventqueue -destination logger_mock_test.go github.com/juju/juju/worker/changestream/eventqueue Logger 22 23 func TestPackage(t *testing.T) { 24 gc.TestingT(t) 25 } 26 27 type baseSuite struct { 28 dbtesting.ControllerSuite 29 30 logger *MockLogger 31 stream *MockStream 32 changeEvent *MockChangeEvent 33 } 34 35 func (s *baseSuite) setupMocks(c *gc.C) *gomock.Controller { 36 ctrl := gomock.NewController(c) 37 38 s.logger = NewMockLogger(ctrl) 39 s.stream = NewMockStream(ctrl) 40 s.changeEvent = NewMockChangeEvent(ctrl) 41 42 return ctrl 43 } 44 45 func (s *baseSuite) expectAnyLogs() { 46 s.logger.EXPECT().Infof(gomock.Any()).AnyTimes() 47 s.logger.EXPECT().Tracef(gomock.Any()).AnyTimes() 48 s.logger.EXPECT().Tracef(gomock.Any(), gomock.Any()).AnyTimes() 49 s.logger.EXPECT().IsTraceEnabled().Return(true).AnyTimes() 50 } 51 52 func (s *baseSuite) expectChangeEvent(mask changestream.ChangeType, topic string) { 53 s.changeEvent.EXPECT().Type().Return(mask).MinTimes(1) 54 s.changeEvent.EXPECT().Namespace().Return(topic).MinTimes(1) 55 } 56 57 func (s *baseSuite) dispatchEvent(c *gc.C, changes chan<- changestream.ChangeEvent) <-chan struct{} { 58 done := make(chan struct{}) 59 go func() { 60 defer close(done) 61 62 select { 63 case changes <- s.changeEvent: 64 case <-time.After(jujutesting.ShortWait): 65 c.Fatal("timed out waiting to enqueue event") 66 } 67 }() 68 return done 69 } 70 71 type waitGroup struct { 72 ch chan struct{} 73 state, amount uint64 74 } 75 76 func newWaitGroup(amount uint64) *waitGroup { 77 return &waitGroup{ 78 ch: make(chan struct{}), 79 amount: amount, 80 } 81 } 82 83 func (w *waitGroup) Done() { 84 if atomic.AddUint64(&w.state, 1) == w.amount { 85 close(w.ch) 86 } 87 } 88 89 func (w *waitGroup) Wait() <-chan struct{} { 90 return w.ch 91 }