You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
2.4 KiB

  1. package v2
  2. import (
  3. "fmt"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. type eventA struct{}
  9. type eventB struct{}
  10. var done = fmt.Errorf("done")
  11. func simpleHandler(event Event) (Events, error) {
  12. switch event.(type) {
  13. case eventA:
  14. return Events{eventB{}}, nil
  15. case eventB:
  16. return Events{routineFinished{}}, done
  17. }
  18. return Events{}, nil
  19. }
  20. func TestRoutine(t *testing.T) {
  21. routine := newRoutine("simpleRoutine", simpleHandler)
  22. assert.False(t, routine.isRunning(),
  23. "expected an initialized routine to not be running")
  24. go routine.run()
  25. go routine.feedback()
  26. for {
  27. if routine.isRunning() {
  28. break
  29. }
  30. time.Sleep(10 * time.Millisecond)
  31. }
  32. routine.send(eventA{})
  33. routine.stop()
  34. }
  35. func TesRoutineSend(t *testing.T) {
  36. routine := newRoutine("simpleRoutine", simpleHandler)
  37. assert.False(t, routine.send(eventA{}),
  38. "expected sending to an unstarted routine to fail")
  39. go routine.run()
  40. go routine.feedback()
  41. for {
  42. if routine.isRunning() {
  43. break
  44. }
  45. time.Sleep(10 * time.Millisecond)
  46. }
  47. assert.True(t, routine.send(eventA{}),
  48. "expected sending to a running routine to succeed")
  49. routine.stop()
  50. assert.False(t, routine.send(eventA{}),
  51. "expected sending to a stopped routine to fail")
  52. }
  53. func genStatefulHandler(maxCount int) handleFunc {
  54. counter := 0
  55. return func(event Event) (Events, error) {
  56. switch event.(type) {
  57. case eventA:
  58. counter += 1
  59. if counter >= maxCount {
  60. return Events{}, done
  61. }
  62. return Events{eventA{}}, nil
  63. }
  64. return Events{}, nil
  65. }
  66. }
  67. func TestStatefulRoutine(t *testing.T) {
  68. handler := genStatefulHandler(10)
  69. routine := newRoutine("statefulRoutine", handler)
  70. go routine.run()
  71. go routine.feedback()
  72. for {
  73. if routine.isRunning() {
  74. break
  75. }
  76. time.Sleep(10 * time.Millisecond)
  77. }
  78. go routine.send(eventA{})
  79. routine.stop()
  80. }
  81. func handleWithErrors(event Event) (Events, error) {
  82. switch event.(type) {
  83. case eventA:
  84. return Events{}, nil
  85. case errEvent:
  86. return Events{}, done
  87. }
  88. return Events{}, nil
  89. }
  90. func TestErrorSaturation(t *testing.T) {
  91. routine := newRoutine("errorRoutine", handleWithErrors)
  92. go routine.run()
  93. go func() {
  94. for {
  95. routine.send(eventA{})
  96. time.Sleep(10 * time.Millisecond)
  97. }
  98. }()
  99. for {
  100. if routine.isRunning() {
  101. break
  102. }
  103. time.Sleep(10 * time.Millisecond)
  104. }
  105. assert.True(t, routine.send(errEvent{}),
  106. "expected send to succeed even when saturated")
  107. routine.wait()
  108. }