Codebase list golang-gopkg-eapache-go-resiliency.v1 / 218d9aa
Add tests, fix a bug Evan Huus 9 years ago
2 changed file(s) with 79 addition(s) and 2 deletion(s). Raw diff Collapse all Expand all
8787 }
8888 } else {
8989 if b.errors > 0 {
90 expiry := b.lastError //time.Add mutates, so take a copy
91 expiry.Add(b.timeout)
90 expiry := b.lastError.Add(b.timeout)
9291 if time.Now().After(expiry) {
9392 b.errors = 0
9493 }
0 package breaker
1
2 import (
3 "errors"
4 "testing"
5 "time"
6 )
7
8 var someError = errors.New("someError")
9
10 func returnsError() error {
11 return someError
12 }
13
14 func returnsSuccess() error {
15 return nil
16 }
17
18 func TestBreakerErrorExpiry(t *testing.T) {
19 breaker := New(2, 1, 1*time.Second)
20
21 for i := 0; i < 5; i++ {
22 if err := breaker.Run(returnsError); err != someError {
23 t.Error(err)
24 }
25 time.Sleep(1 * time.Second)
26 }
27 }
28
29 func TestBreakerStateTransitions(t *testing.T) {
30 breaker := New(3, 2, 1*time.Second)
31
32 // three errors opens the breaker
33 for i := 0; i < 3; i++ {
34 if err := breaker.Run(returnsError); err != someError {
35 t.Error(err)
36 }
37 }
38
39 // breaker is open
40 for i := 0; i < 5; i++ {
41 if err := breaker.Run(returnsError); err != BreakerOpen {
42 t.Error(err)
43 }
44 }
45
46 // wait for it to half-close
47 time.Sleep(2 * time.Second)
48 // one success works, but is not enough to fully close
49 if err := breaker.Run(returnsSuccess); err != nil {
50 t.Error(err)
51 }
52 // error works, but re-opens immediately
53 if err := breaker.Run(returnsError); err != someError {
54 t.Error(err)
55 }
56 // breaker is open
57 if err := breaker.Run(returnsError); err != BreakerOpen {
58 t.Error(err)
59 }
60
61 // wait for it to half-close
62 time.Sleep(2 * time.Second)
63 // two successes is enough to close it for good
64 for i := 0; i < 2; i++ {
65 if err := breaker.Run(returnsSuccess); err != nil {
66 t.Error(err)
67 }
68 }
69 // error works
70 if err := breaker.Run(returnsError); err != someError {
71 t.Error(err)
72 }
73 // breaker is still closed
74 if err := breaker.Run(returnsSuccess); err != nil {
75 t.Error(err)
76 }
77 }