batcher_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package batcher
  2. import (
  3. "errors"
  4. "sync"
  5. "sync/atomic"
  6. "testing"
  7. "time"
  8. )
  9. var errSomeError = errors.New("errSomeError")
  10. func returnsError(params []interface{}) error {
  11. return errSomeError
  12. }
  13. func returnsSuccess(params []interface{}) error {
  14. return nil
  15. }
  16. func TestBatcherSuccess(t *testing.T) {
  17. b := New(10*time.Millisecond, returnsSuccess)
  18. wg := &sync.WaitGroup{}
  19. for i := 0; i < 10; i++ {
  20. wg.Add(1)
  21. go func() {
  22. if err := b.Run(nil); err != nil {
  23. t.Error(err)
  24. }
  25. wg.Done()
  26. }()
  27. }
  28. wg.Wait()
  29. }
  30. func TestBatcherError(t *testing.T) {
  31. b := New(10*time.Millisecond, returnsError)
  32. wg := &sync.WaitGroup{}
  33. for i := 0; i < 10; i++ {
  34. wg.Add(1)
  35. go func() {
  36. if err := b.Run(nil); err != errSomeError {
  37. t.Error(err)
  38. }
  39. wg.Done()
  40. }()
  41. }
  42. wg.Wait()
  43. }
  44. func TestBatcherPrefilter(t *testing.T) {
  45. b := New(1*time.Millisecond, returnsSuccess)
  46. b.Prefilter(func(param interface{}) error {
  47. if param == nil {
  48. return errSomeError
  49. }
  50. return nil
  51. })
  52. if err := b.Run(nil); err != errSomeError {
  53. t.Error(err)
  54. }
  55. if err := b.Run(1); err != nil {
  56. t.Error(err)
  57. }
  58. }
  59. func TestBatcherMultipleBatches(t *testing.T) {
  60. var iters uint32
  61. b := New(10*time.Millisecond, func(params []interface{}) error {
  62. atomic.AddUint32(&iters, 1)
  63. return nil
  64. })
  65. wg := &sync.WaitGroup{}
  66. for group := 0; group < 5; group++ {
  67. for i := 0; i < 10; i++ {
  68. wg.Add(1)
  69. go func() {
  70. if err := b.Run(nil); err != nil {
  71. t.Error(err)
  72. }
  73. wg.Done()
  74. }()
  75. }
  76. time.Sleep(15 * time.Millisecond)
  77. }
  78. wg.Wait()
  79. if iters != 5 {
  80. t.Error("Wrong number of iters:", iters)
  81. }
  82. }
  83. func ExampleBatcher() {
  84. b := New(10*time.Millisecond, func(params []interface{}) error {
  85. // do something with the batch of parameters
  86. return nil
  87. })
  88. b.Prefilter(func(param interface{}) error {
  89. // do some sort of sanity check on the parameter, and return an error if it fails
  90. return nil
  91. })
  92. for i := 0; i < 10; i++ {
  93. go b.Run(i)
  94. }
  95. }