broadcast_test.go 960 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package broadcast
  2. import (
  3. "sync"
  4. "testing"
  5. "time"
  6. )
  7. var (
  8. totalNum int = 5
  9. succNum int = 0
  10. mutex sync.Mutex
  11. )
  12. func TestBroadcast(t *testing.T) {
  13. b := NewBroadcast()
  14. if b == nil {
  15. t.Errorf("New Broadcast error, nil return")
  16. }
  17. defer b.Close()
  18. var wait sync.WaitGroup
  19. wait.Add(totalNum)
  20. for i := 0; i < totalNum; i++ {
  21. go worker(b, &wait)
  22. }
  23. time.Sleep(1e6 * 20)
  24. msg := "test"
  25. b.In() <- msg
  26. wait.Wait()
  27. if succNum != totalNum {
  28. t.Errorf("TotalNum %d, FailNum(timeout) %d", totalNum, totalNum-succNum)
  29. }
  30. }
  31. func worker(b *Broadcast, wait *sync.WaitGroup) {
  32. defer wait.Done()
  33. msgChan := b.Reg()
  34. // exit if nothing got in 2 seconds
  35. timeout := make(chan bool, 1)
  36. go func() {
  37. time.Sleep(time.Duration(2) * time.Second)
  38. timeout <- true
  39. }()
  40. select {
  41. case item := <-msgChan:
  42. msg := item.(string)
  43. if msg == "test" {
  44. mutex.Lock()
  45. succNum++
  46. mutex.Unlock()
  47. } else {
  48. break
  49. }
  50. case <-timeout:
  51. break
  52. }
  53. }