sheddinginterceptor_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package serverinterceptors
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/wuntsong-org/go-zero-plus/core/load"
  7. "github.com/wuntsong-org/go-zero-plus/core/stat"
  8. "google.golang.org/grpc"
  9. "google.golang.org/grpc/codes"
  10. "google.golang.org/grpc/status"
  11. )
  12. func TestUnarySheddingInterceptor(t *testing.T) {
  13. tests := []struct {
  14. name string
  15. allow bool
  16. handleErr error
  17. expect error
  18. }{
  19. {
  20. name: "allow",
  21. allow: true,
  22. handleErr: nil,
  23. expect: nil,
  24. },
  25. {
  26. name: "allow",
  27. allow: true,
  28. handleErr: context.DeadlineExceeded,
  29. expect: context.DeadlineExceeded,
  30. },
  31. {
  32. name: "reject",
  33. allow: false,
  34. handleErr: nil,
  35. expect: status.Error(codes.ResourceExhausted, load.ErrServiceOverloaded.Error()),
  36. },
  37. }
  38. for _, test := range tests {
  39. test := test
  40. t.Run(test.name, func(t *testing.T) {
  41. t.Parallel()
  42. shedder := mockedShedder{allow: test.allow}
  43. metrics := stat.NewMetrics("mock")
  44. interceptor := UnarySheddingInterceptor(shedder, metrics)
  45. _, err := interceptor(context.Background(), nil, &grpc.UnaryServerInfo{
  46. FullMethod: "/",
  47. }, func(ctx context.Context, req any) (any, error) {
  48. return nil, test.handleErr
  49. })
  50. assert.Equal(t, test.expect, err)
  51. })
  52. }
  53. }
  54. type mockedShedder struct {
  55. allow bool
  56. }
  57. func (m mockedShedder) Allow() (load.Promise, error) {
  58. if m.allow {
  59. return mockedPromise{}, nil
  60. }
  61. return nil, load.ErrServiceOverloaded
  62. }
  63. type mockedPromise struct{}
  64. func (m mockedPromise) Pass() {
  65. }
  66. func (m mockedPromise) Fail() {
  67. }