readiness_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package metrics_test
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "testing"
  7. "github.com/google/uuid"
  8. "github.com/rs/zerolog"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. "github.com/cloudflare/cloudflared/connection"
  12. "github.com/cloudflare/cloudflared/metrics"
  13. "github.com/cloudflare/cloudflared/tunnelstate"
  14. )
  15. func mockRequest(t *testing.T, readyServer *metrics.ReadyServer) (int, uint) {
  16. t.Helper()
  17. var readyreadyConnections struct {
  18. Status int `json:"status"`
  19. ReadyConnections uint `json:"readyConnections"`
  20. ConnectorID uuid.UUID `json:"connectorId"`
  21. }
  22. rec := httptest.NewRecorder()
  23. readyServer.ServeHTTP(rec, nil)
  24. decoder := json.NewDecoder(rec.Body)
  25. err := decoder.Decode(&readyreadyConnections)
  26. require.NoError(t, err)
  27. return rec.Code, readyreadyConnections.ReadyConnections
  28. }
  29. func TestReadinessEventHandling(t *testing.T) {
  30. nopLogger := zerolog.Nop()
  31. tracker := tunnelstate.NewConnTracker(&nopLogger)
  32. rs := metrics.NewReadyServer(uuid.Nil, tracker)
  33. // start not ok
  34. code, readyConnections := mockRequest(t, rs)
  35. assert.NotEqualValues(t, http.StatusOK, code)
  36. assert.Zero(t, readyConnections)
  37. // one connected => ok
  38. tracker.OnTunnelEvent(connection.Event{
  39. Index: 1,
  40. EventType: connection.Connected,
  41. })
  42. code, readyConnections = mockRequest(t, rs)
  43. assert.EqualValues(t, http.StatusOK, code)
  44. assert.EqualValues(t, 1, readyConnections)
  45. // another connected => still ok
  46. tracker.OnTunnelEvent(connection.Event{
  47. Index: 2,
  48. EventType: connection.Connected,
  49. })
  50. code, readyConnections = mockRequest(t, rs)
  51. assert.EqualValues(t, http.StatusOK, code)
  52. assert.EqualValues(t, 2, readyConnections)
  53. // one reconnecting => still ok
  54. tracker.OnTunnelEvent(connection.Event{
  55. Index: 2,
  56. EventType: connection.Reconnecting,
  57. })
  58. code, readyConnections = mockRequest(t, rs)
  59. assert.EqualValues(t, http.StatusOK, code)
  60. assert.EqualValues(t, 1, readyConnections)
  61. // Regression test for TUN-3777
  62. tracker.OnTunnelEvent(connection.Event{
  63. Index: 1,
  64. EventType: connection.RegisteringTunnel,
  65. })
  66. code, readyConnections = mockRequest(t, rs)
  67. assert.NotEqualValues(t, http.StatusOK, code)
  68. assert.Zero(t, readyConnections)
  69. // other connected then unregistered => not ok
  70. tracker.OnTunnelEvent(connection.Event{
  71. Index: 1,
  72. EventType: connection.Connected,
  73. })
  74. code, readyConnections = mockRequest(t, rs)
  75. assert.EqualValues(t, http.StatusOK, code)
  76. assert.EqualValues(t, 1, readyConnections)
  77. tracker.OnTunnelEvent(connection.Event{
  78. Index: 1,
  79. EventType: connection.Unregistering,
  80. })
  81. code, readyConnections = mockRequest(t, rs)
  82. assert.NotEqualValues(t, http.StatusOK, code)
  83. assert.Zero(t, readyConnections)
  84. // other disconnected => not ok
  85. tracker.OnTunnelEvent(connection.Event{
  86. Index: 1,
  87. EventType: connection.Disconnected,
  88. })
  89. code, readyConnections = mockRequest(t, rs)
  90. assert.NotEqualValues(t, http.StatusOK, code)
  91. assert.Zero(t, readyConnections)
  92. }