go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/sdk/breaker/main_test.go (about) 1 package breaker 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 ) 8 9 func createTestBreaker[A, B any]() (*Breaker[A, B], *clock) { 10 shim := new(actionShim[A, B]) 11 c := newClock() 12 b := New[A, B](shim) 13 b.Now = c.Now 14 return b, c 15 } 16 17 type actionShim[A, B any] struct { 18 res B 19 err error 20 panic any 21 22 didCall bool 23 } 24 25 func (a *actionShim[A, B]) Call(_ context.Context, _ A) (B, error) { 26 a.didCall = true 27 if a.panic != nil { 28 panic(a.panic) 29 } 30 return a.res, a.err 31 } 32 33 func succeed[A, B any](b *Breaker[A, B]) error { 34 var zeroB B 35 b.Action.(*actionShim[A, B]).res = zeroB 36 b.Action.(*actionShim[A, B]).err = nil 37 b.Action.(*actionShim[A, B]).panic = nil 38 var zeroA A 39 _, err := b.Call(context.TODO(), zeroA) 40 return err 41 } 42 43 func fail[A, B any](b *Breaker[A, B]) error { 44 msg := "fail" 45 var zeroB B 46 b.Action.(*actionShim[A, B]).res = zeroB 47 b.Action.(*actionShim[A, B]).err = fmt.Errorf(msg) 48 b.Action.(*actionShim[A, B]).panic = nil 49 var zeroA A 50 _, err := b.Call(context.TODO(), zeroA) 51 if err != nil && err.Error() == msg { 52 return nil 53 } 54 return err 55 } 56 57 func failWithPanic[A, B any](b *Breaker[A, B]) error { 58 msg := "fail" 59 var zeroB B 60 b.Action.(*actionShim[A, B]).res = zeroB 61 b.Action.(*actionShim[A, B]).err = nil 62 b.Action.(*actionShim[A, B]).panic = msg 63 var zeroA A 64 _, err := b.Call(context.TODO(), zeroA) 65 if err != nil && err.Error() == msg { 66 return nil 67 } 68 return err 69 } 70 71 func newClock() *clock { 72 return &clock{ 73 now: time.Now(), 74 } 75 } 76 77 type clock struct { 78 now time.Time 79 } 80 81 func (c *clock) Sleep(d time.Duration) { 82 c.now = c.now.Add(d) 83 } 84 85 func (c *clock) Now() time.Time { 86 return c.now 87 }