sheddinghandler_test.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package handler
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/wuntsong-org/go-zero-plus/core/load"
  8. "github.com/wuntsong-org/go-zero-plus/core/stat"
  9. )
  10. func TestSheddingHandlerAccept(t *testing.T) {
  11. metrics := stat.NewMetrics("unit-test")
  12. shedder := mockShedder{
  13. allow: true,
  14. }
  15. sheddingHandler := SheddingHandler(shedder, metrics)
  16. handler := sheddingHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  17. w.Header().Set("X-Test", "test")
  18. _, err := w.Write([]byte("content"))
  19. assert.Nil(t, err)
  20. }))
  21. req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody)
  22. req.Header.Set("X-Test", "test")
  23. resp := httptest.NewRecorder()
  24. handler.ServeHTTP(resp, req)
  25. assert.Equal(t, http.StatusOK, resp.Code)
  26. assert.Equal(t, "test", resp.Header().Get("X-Test"))
  27. assert.Equal(t, "content", resp.Body.String())
  28. }
  29. func TestSheddingHandlerFail(t *testing.T) {
  30. metrics := stat.NewMetrics("unit-test")
  31. shedder := mockShedder{
  32. allow: true,
  33. }
  34. sheddingHandler := SheddingHandler(shedder, metrics)
  35. handler := sheddingHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  36. w.WriteHeader(http.StatusServiceUnavailable)
  37. }))
  38. req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody)
  39. resp := httptest.NewRecorder()
  40. handler.ServeHTTP(resp, req)
  41. assert.Equal(t, http.StatusServiceUnavailable, resp.Code)
  42. }
  43. func TestSheddingHandlerReject(t *testing.T) {
  44. metrics := stat.NewMetrics("unit-test")
  45. shedder := mockShedder{
  46. allow: false,
  47. }
  48. sheddingHandler := SheddingHandler(shedder, metrics)
  49. handler := sheddingHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  50. w.WriteHeader(http.StatusOK)
  51. }))
  52. req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody)
  53. resp := httptest.NewRecorder()
  54. handler.ServeHTTP(resp, req)
  55. assert.Equal(t, http.StatusServiceUnavailable, resp.Code)
  56. }
  57. func TestSheddingHandlerNoShedding(t *testing.T) {
  58. metrics := stat.NewMetrics("unit-test")
  59. sheddingHandler := SheddingHandler(nil, metrics)
  60. handler := sheddingHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  61. w.WriteHeader(http.StatusOK)
  62. }))
  63. req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody)
  64. resp := httptest.NewRecorder()
  65. handler.ServeHTTP(resp, req)
  66. assert.Equal(t, http.StatusOK, resp.Code)
  67. }
  68. type mockShedder struct {
  69. allow bool
  70. }
  71. func (s mockShedder) Allow() (load.Promise, error) {
  72. if s.allow {
  73. return mockPromise{}, nil
  74. }
  75. return nil, load.ErrServiceOverloaded
  76. }
  77. type mockPromise struct{}
  78. func (p mockPromise) Pass() {
  79. }
  80. func (p mockPromise) Fail() {
  81. }