telemetry_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package telemetry
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "testing"
  9. "github.com/stretchr/testify/require"
  10. "github.com/drakkan/sftpgo/v2/common"
  11. )
  12. const (
  13. httpsCert = `-----BEGIN CERTIFICATE-----
  14. MIICHTCCAaKgAwIBAgIUHnqw7QnB1Bj9oUsNpdb+ZkFPOxMwCgYIKoZIzj0EAwIw
  15. RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
  16. dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDAyMDQwOTUzMDRaFw0zMDAyMDEw
  17. OTUzMDRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
  18. VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwdjAQBgcqhkjOPQIBBgUrgQQA
  19. IgNiAARCjRMqJ85rzMC998X5z761nJ+xL3bkmGVqWvrJ51t5OxV0v25NsOgR82CA
  20. NXUgvhVYs7vNFN+jxtb2aj6Xg+/2G/BNxkaFspIVCzgWkxiz7XE4lgUwX44FCXZM
  21. 3+JeUbKjUzBRMB0GA1UdDgQWBBRhLw+/o3+Z02MI/d4tmaMui9W16jAfBgNVHSME
  22. GDAWgBRhLw+/o3+Z02MI/d4tmaMui9W16jAPBgNVHRMBAf8EBTADAQH/MAoGCCqG
  23. SM49BAMCA2kAMGYCMQDqLt2lm8mE+tGgtjDmtFgdOcI72HSbRQ74D5rYTzgST1rY
  24. /8wTi5xl8TiFUyLMUsICMQC5ViVxdXbhuG7gX6yEqSkMKZICHpO8hqFwOD/uaFVI
  25. dV4vKmHUzwK/eIx+8Ay3neE=
  26. -----END CERTIFICATE-----`
  27. httpsKey = `-----BEGIN EC PARAMETERS-----
  28. BgUrgQQAIg==
  29. -----END EC PARAMETERS-----
  30. -----BEGIN EC PRIVATE KEY-----
  31. MIGkAgEBBDCfMNsN6miEE3rVyUPwElfiJSWaR5huPCzUenZOfJT04GAcQdWvEju3
  32. UM2lmBLIXpGgBwYFK4EEACKhZANiAARCjRMqJ85rzMC998X5z761nJ+xL3bkmGVq
  33. WvrJ51t5OxV0v25NsOgR82CANXUgvhVYs7vNFN+jxtb2aj6Xg+/2G/BNxkaFspIV
  34. CzgWkxiz7XE4lgUwX44FCXZM3+JeUbI=
  35. -----END EC PRIVATE KEY-----`
  36. )
  37. func TestInitialization(t *testing.T) {
  38. c := Conf{
  39. BindPort: 10000,
  40. BindAddress: "invalid",
  41. EnableProfiler: false,
  42. }
  43. err := c.Initialize(".")
  44. require.Error(t, err)
  45. c.AuthUserFile = "missing"
  46. err = c.Initialize(".")
  47. require.Error(t, err)
  48. err = ReloadCertificateMgr()
  49. require.NoError(t, err)
  50. c.AuthUserFile = ""
  51. c.CertificateFile = "crt"
  52. c.CertificateKeyFile = "key"
  53. err = c.Initialize(".")
  54. require.Error(t, err)
  55. certPath := filepath.Join(os.TempDir(), "test.crt")
  56. keyPath := filepath.Join(os.TempDir(), "test.key")
  57. err = os.WriteFile(certPath, []byte(httpsCert), os.ModePerm)
  58. require.NoError(t, err)
  59. err = os.WriteFile(keyPath, []byte(httpsKey), os.ModePerm)
  60. require.NoError(t, err)
  61. c.CertificateFile = certPath
  62. c.CertificateKeyFile = keyPath
  63. err = c.Initialize(".")
  64. require.Error(t, err)
  65. err = ReloadCertificateMgr()
  66. require.NoError(t, err)
  67. err = os.Remove(certPath)
  68. require.NoError(t, err)
  69. err = os.Remove(keyPath)
  70. require.NoError(t, err)
  71. }
  72. func TestShouldBind(t *testing.T) {
  73. c := Conf{
  74. BindPort: 10000,
  75. EnableProfiler: false,
  76. }
  77. require.True(t, c.ShouldBind())
  78. c.BindPort = 0
  79. require.False(t, c.ShouldBind())
  80. if runtime.GOOS != "windows" {
  81. c.BindAddress = "/absolute/path"
  82. require.True(t, c.ShouldBind())
  83. }
  84. }
  85. func TestRouter(t *testing.T) {
  86. authUserFile := filepath.Join(os.TempDir(), "http_users.txt")
  87. authUserData := []byte("test1:$2y$05$bcHSED7aO1cfLto6ZdDBOOKzlwftslVhtpIkRhAtSa4GuLmk5mola\n")
  88. err := os.WriteFile(authUserFile, authUserData, os.ModePerm)
  89. require.NoError(t, err)
  90. httpAuth, err = common.NewBasicAuthProvider(authUserFile)
  91. require.NoError(t, err)
  92. initializeRouter(true)
  93. testServer := httptest.NewServer(router)
  94. defer testServer.Close()
  95. req, err := http.NewRequest(http.MethodGet, "/healthz", nil)
  96. require.NoError(t, err)
  97. rr := httptest.NewRecorder()
  98. testServer.Config.Handler.ServeHTTP(rr, req)
  99. require.Equal(t, http.StatusOK, rr.Code)
  100. require.Equal(t, "ok", rr.Body.String())
  101. req, err = http.NewRequest(http.MethodGet, "/metrics", nil)
  102. require.NoError(t, err)
  103. rr = httptest.NewRecorder()
  104. testServer.Config.Handler.ServeHTTP(rr, req)
  105. require.Equal(t, http.StatusUnauthorized, rr.Code)
  106. req.SetBasicAuth("test1", "password1")
  107. rr = httptest.NewRecorder()
  108. testServer.Config.Handler.ServeHTTP(rr, req)
  109. require.Equal(t, http.StatusOK, rr.Code)
  110. req, err = http.NewRequest(http.MethodGet, pprofBasePath+"/pprof/", nil)
  111. require.NoError(t, err)
  112. rr = httptest.NewRecorder()
  113. testServer.Config.Handler.ServeHTTP(rr, req)
  114. require.Equal(t, http.StatusUnauthorized, rr.Code)
  115. req.SetBasicAuth("test1", "password1")
  116. rr = httptest.NewRecorder()
  117. testServer.Config.Handler.ServeHTTP(rr, req)
  118. require.Equal(t, http.StatusOK, rr.Code)
  119. httpAuth, err = common.NewBasicAuthProvider("")
  120. require.NoError(t, err)
  121. req, err = http.NewRequest(http.MethodGet, "/metrics", nil)
  122. require.NoError(t, err)
  123. rr = httptest.NewRecorder()
  124. testServer.Config.Handler.ServeHTTP(rr, req)
  125. require.Equal(t, http.StatusOK, rr.Code)
  126. err = os.Remove(authUserFile)
  127. require.NoError(t, err)
  128. }