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