breaker_test.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package breaker
  2. import (
  3. "errors"
  4. "testing"
  5. "time"
  6. )
  7. var someError = errors.New("someError")
  8. func returnsError() error {
  9. return someError
  10. }
  11. func returnsSuccess() error {
  12. return nil
  13. }
  14. func TestBreakerErrorExpiry(t *testing.T) {
  15. breaker := New(2, 1, 1*time.Second)
  16. for i := 0; i < 5; i++ {
  17. if err := breaker.Run(returnsError); err != someError {
  18. t.Error(err)
  19. }
  20. time.Sleep(1 * time.Second)
  21. }
  22. }
  23. func TestBreakerStateTransitions(t *testing.T) {
  24. breaker := New(3, 2, 1*time.Second)
  25. // three errors opens the breaker
  26. for i := 0; i < 3; i++ {
  27. if err := breaker.Run(returnsError); err != someError {
  28. t.Error(err)
  29. }
  30. }
  31. // breaker is open
  32. for i := 0; i < 5; i++ {
  33. if err := breaker.Run(returnsError); err != BreakerOpen {
  34. t.Error(err)
  35. }
  36. }
  37. // wait for it to half-close
  38. time.Sleep(2 * time.Second)
  39. // one success works, but is not enough to fully close
  40. if err := breaker.Run(returnsSuccess); err != nil {
  41. t.Error(err)
  42. }
  43. // error works, but re-opens immediately
  44. if err := breaker.Run(returnsError); err != someError {
  45. t.Error(err)
  46. }
  47. // breaker is open
  48. if err := breaker.Run(returnsError); err != BreakerOpen {
  49. t.Error(err)
  50. }
  51. // wait for it to half-close
  52. time.Sleep(2 * time.Second)
  53. // two successes is enough to close it for good
  54. for i := 0; i < 2; i++ {
  55. if err := breaker.Run(returnsSuccess); err != nil {
  56. t.Error(err)
  57. }
  58. }
  59. // error works
  60. if err := breaker.Run(returnsError); err != someError {
  61. t.Error(err)
  62. }
  63. // breaker is still closed
  64. if err := breaker.Run(returnsSuccess); err != nil {
  65. t.Error(err)
  66. }
  67. }