github.com/lingyao2333/mo-zero@v1.4.1/core/service/servicegroup_test.go (about) 1 package service 2 3 import ( 4 "sync" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 var ( 11 number = 1 12 mutex sync.Mutex 13 done = make(chan struct{}) 14 ) 15 16 type mockedService struct { 17 quit chan struct{} 18 multiplier int 19 } 20 21 func newMockedService(multiplier int) *mockedService { 22 return &mockedService{ 23 quit: make(chan struct{}), 24 multiplier: multiplier, 25 } 26 } 27 28 func (s *mockedService) Start() { 29 mutex.Lock() 30 number *= s.multiplier 31 mutex.Unlock() 32 done <- struct{}{} 33 <-s.quit 34 } 35 36 func (s *mockedService) Stop() { 37 close(s.quit) 38 } 39 40 func TestServiceGroup(t *testing.T) { 41 multipliers := []int{2, 3, 5, 7} 42 want := 1 43 44 group := NewServiceGroup() 45 for _, multiplier := range multipliers { 46 want *= multiplier 47 service := newMockedService(multiplier) 48 group.Add(service) 49 } 50 51 go group.Start() 52 53 for i := 0; i < len(multipliers); i++ { 54 <-done 55 } 56 57 group.Stop() 58 59 mutex.Lock() 60 defer mutex.Unlock() 61 assert.Equal(t, want, number) 62 } 63 64 func TestServiceGroup_WithStart(t *testing.T) { 65 multipliers := []int{2, 3, 5, 7} 66 want := 1 67 68 var wait sync.WaitGroup 69 var lock sync.Mutex 70 wait.Add(len(multipliers)) 71 group := NewServiceGroup() 72 for _, multiplier := range multipliers { 73 mul := multiplier 74 group.Add(WithStart(func() { 75 lock.Lock() 76 want *= mul 77 lock.Unlock() 78 wait.Done() 79 })) 80 } 81 82 go group.Start() 83 wait.Wait() 84 group.Stop() 85 86 lock.Lock() 87 defer lock.Unlock() 88 assert.Equal(t, 210, want) 89 } 90 91 func TestServiceGroup_WithStarter(t *testing.T) { 92 multipliers := []int{2, 3, 5, 7} 93 want := 1 94 95 var wait sync.WaitGroup 96 var lock sync.Mutex 97 wait.Add(len(multipliers)) 98 group := NewServiceGroup() 99 for _, multiplier := range multipliers { 100 mul := multiplier 101 group.Add(WithStarter(mockedStarter{ 102 fn: func() { 103 lock.Lock() 104 want *= mul 105 lock.Unlock() 106 wait.Done() 107 }, 108 })) 109 } 110 111 go group.Start() 112 wait.Wait() 113 group.Stop() 114 115 lock.Lock() 116 defer lock.Unlock() 117 assert.Equal(t, 210, want) 118 } 119 120 type mockedStarter struct { 121 fn func() 122 } 123 124 func (s mockedStarter) Start() { 125 s.fn() 126 }