servicegroup_test.go 2.0 KB

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