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  }