ingress_reject_test.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package middleware
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "sync"
  6. "testing"
  7. "github.com/gin-gonic/gin"
  8. "github.com/stretchr/testify/require"
  9. )
  10. type ingressRejectRecorderStub struct {
  11. mu sync.Mutex
  12. calls int
  13. clientIP string
  14. }
  15. func (r *ingressRejectRecorderStub) RecordIngressReject(_, _, _, clientIP string, _, _ int64) {
  16. r.mu.Lock()
  17. defer r.mu.Unlock()
  18. r.calls++
  19. r.clientIP = clientIP
  20. }
  21. func TestNormalizeIngressRejectIP(t *testing.T) {
  22. require.Equal(t, "2001:db8:abcd:1234::", normalizeIngressRejectIP("2001:db8:abcd:1234:ffff::1"))
  23. require.Equal(t, "192.0.2.4", normalizeIngressRejectIP("::ffff:192.0.2.4"))
  24. require.Equal(t, "0.0.0.0", normalizeIngressRejectIP("not-an-ip"))
  25. }
  26. func TestLoggerRecordsIngressRejectOnce(t *testing.T) {
  27. gin.SetMode(gin.TestMode)
  28. recorder := &ingressRejectRecorderStub{}
  29. SetIngressRejectRecorder(recorder)
  30. t.Cleanup(func() { SetIngressRejectRecorder(nil) })
  31. router := gin.New()
  32. router.Use(Logger())
  33. router.GET("/v1/messages", func(c *gin.Context) {
  34. MarkIngressRejected(c, IngressRejectInvalidAPIKey)
  35. c.Status(http.StatusUnauthorized)
  36. })
  37. request := httptest.NewRequest(http.MethodGet, "/v1/messages", nil)
  38. request.RemoteAddr = "[2001:db8:abcd:1234:ffff::1]:1234"
  39. router.ServeHTTP(httptest.NewRecorder(), request)
  40. recorder.mu.Lock()
  41. require.Equal(t, 1, recorder.calls)
  42. require.Equal(t, "2001:db8:abcd:1234::", recorder.clientIP)
  43. recorder.mu.Unlock()
  44. }