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  }