concurrency_error_response_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package handler
  2. import (
  3. "context"
  4. "errors"
  5. "net/http"
  6. "testing"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestConcurrencyErrorResponse(t *testing.T) {
  10. tests := []struct {
  11. name string
  12. err error
  13. slotType string
  14. wantStatus int
  15. wantType string
  16. wantCode string
  17. wantMessage string
  18. }{
  19. {
  20. name: "true concurrency timeout remains rate limit",
  21. err: &ConcurrencyError{SlotType: "account", IsTimeout: true},
  22. slotType: "user",
  23. wantStatus: http.StatusTooManyRequests,
  24. wantType: "rate_limit_error",
  25. wantCode: gatewayConcurrencyLimitCode,
  26. wantMessage: "Concurrency limit exceeded for account, please retry later",
  27. },
  28. {
  29. name: "full local wait queue has gateway code",
  30. err: &WaitQueueFullError{SlotType: "account"},
  31. slotType: "account",
  32. wantStatus: http.StatusTooManyRequests,
  33. wantType: "rate_limit_error",
  34. wantCode: gatewayQueueFullCode,
  35. wantMessage: "Too many pending requests, please retry later",
  36. },
  37. {
  38. name: "client cancellation is not classified as concurrency limit",
  39. err: context.Canceled,
  40. slotType: "user",
  41. wantStatus: statusClientClosedRequest,
  42. wantType: "api_error",
  43. wantMessage: "context canceled",
  44. },
  45. {
  46. name: "deadline exceeded is service unavailable",
  47. err: context.DeadlineExceeded,
  48. slotType: "user",
  49. wantStatus: http.StatusServiceUnavailable,
  50. wantType: "api_error",
  51. wantMessage: "Service temporarily unavailable, please retry later",
  52. },
  53. {
  54. name: "redis acquire error is service unavailable",
  55. err: errors.New("redis unavailable"),
  56. slotType: "user",
  57. wantStatus: http.StatusServiceUnavailable,
  58. wantType: "api_error",
  59. wantMessage: "Service temporarily unavailable, please retry later",
  60. },
  61. }
  62. for _, tt := range tests {
  63. t.Run(tt.name, func(t *testing.T) {
  64. status, errType, code, message := concurrencyErrorResponse(tt.err, tt.slotType)
  65. require.Equal(t, tt.wantStatus, status)
  66. require.Equal(t, tt.wantType, errType)
  67. require.Equal(t, tt.wantCode, code)
  68. require.Equal(t, tt.wantMessage, message)
  69. })
  70. }
  71. }