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  }