github.com/lingyao2333/mo-zero@v1.4.1/core/breaker/breakers_test.go (about) 1 package breaker 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 8 "github.com/lingyao2333/mo-zero/core/stat" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func init() { 13 stat.SetReporter(nil) 14 } 15 16 func TestBreakersDo(t *testing.T) { 17 assert.Nil(t, Do("any", func() error { 18 return nil 19 })) 20 21 errDummy := errors.New("any") 22 assert.Equal(t, errDummy, Do("any", func() error { 23 return errDummy 24 })) 25 } 26 27 func TestBreakersDoWithAcceptable(t *testing.T) { 28 errDummy := errors.New("anyone") 29 for i := 0; i < 10000; i++ { 30 assert.Equal(t, errDummy, GetBreaker("anyone").DoWithAcceptable(func() error { 31 return errDummy 32 }, func(err error) bool { 33 return err == nil || err == errDummy 34 })) 35 } 36 verify(t, func() bool { 37 return Do("anyone", func() error { 38 return nil 39 }) == nil 40 }) 41 42 for i := 0; i < 10000; i++ { 43 err := DoWithAcceptable("another", func() error { 44 return errDummy 45 }, func(err error) bool { 46 return err == nil 47 }) 48 assert.True(t, err == errDummy || err == ErrServiceUnavailable) 49 } 50 verify(t, func() bool { 51 return ErrServiceUnavailable == Do("another", func() error { 52 return nil 53 }) 54 }) 55 } 56 57 func TestBreakersNoBreakerFor(t *testing.T) { 58 NoBreakerFor("any") 59 errDummy := errors.New("any") 60 for i := 0; i < 10000; i++ { 61 assert.Equal(t, errDummy, GetBreaker("any").Do(func() error { 62 return errDummy 63 })) 64 } 65 assert.Equal(t, nil, Do("any", func() error { 66 return nil 67 })) 68 } 69 70 func TestBreakersFallback(t *testing.T) { 71 errDummy := errors.New("any") 72 for i := 0; i < 10000; i++ { 73 err := DoWithFallback("fallback", func() error { 74 return errDummy 75 }, func(err error) error { 76 return nil 77 }) 78 assert.True(t, err == nil || err == errDummy) 79 } 80 verify(t, func() bool { 81 return ErrServiceUnavailable == Do("fallback", func() error { 82 return nil 83 }) 84 }) 85 } 86 87 func TestBreakersAcceptableFallback(t *testing.T) { 88 errDummy := errors.New("any") 89 for i := 0; i < 10000; i++ { 90 err := DoWithFallbackAcceptable("acceptablefallback", func() error { 91 return errDummy 92 }, func(err error) error { 93 return nil 94 }, func(err error) bool { 95 return err == nil 96 }) 97 assert.True(t, err == nil || err == errDummy) 98 } 99 verify(t, func() bool { 100 return ErrServiceUnavailable == Do("acceptablefallback", func() error { 101 return nil 102 }) 103 }) 104 } 105 106 func verify(t *testing.T, fn func() bool) { 107 var count int 108 for i := 0; i < 100; i++ { 109 if fn() { 110 count++ 111 } 112 } 113 assert.True(t, count >= 80, fmt.Sprintf("should be greater than 80, actual %d", count)) 114 }