breakerinterceptor_test.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package clientinterceptors
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/tal-tech/go-zero/core/breaker"
  6. "github.com/tal-tech/go-zero/core/stat"
  7. rcodes "github.com/tal-tech/go-zero/rpcx/internal/codes"
  8. "google.golang.org/grpc/codes"
  9. "google.golang.org/grpc/status"
  10. )
  11. func init() {
  12. stat.SetReporter(nil)
  13. }
  14. type mockError struct {
  15. st *status.Status
  16. }
  17. func (m mockError) GRPCStatus() *status.Status {
  18. return m.st
  19. }
  20. func (m mockError) Error() string {
  21. return "mocked error"
  22. }
  23. func TestBreakerInterceptorNotFound(t *testing.T) {
  24. err := mockError{st: status.New(codes.NotFound, "any")}
  25. for i := 0; i < 1000; i++ {
  26. assert.Equal(t, err, breaker.DoWithAcceptable("call", func() error {
  27. return err
  28. }, rcodes.Acceptable))
  29. }
  30. }
  31. func TestBreakerInterceptorDeadlineExceeded(t *testing.T) {
  32. err := mockError{st: status.New(codes.DeadlineExceeded, "any")}
  33. errs := make(map[error]int)
  34. for i := 0; i < 1000; i++ {
  35. e := breaker.DoWithAcceptable("call", func() error {
  36. return err
  37. }, rcodes.Acceptable)
  38. errs[e]++
  39. }
  40. assert.Equal(t, 2, len(errs))
  41. assert.True(t, errs[err] > 0)
  42. assert.True(t, errs[breaker.ErrServiceUnavailable] > 0)
  43. }