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  }