/server/mux_test.go

https://github.com/peer-calls/peer-calls · Go · 192 lines · 161 code · 31 blank · 0 comment · 8 complexity · 37008cdbbe6b32fa359e1eb04ca6db3e MD5 · raw file

  1. package server_test
  2. import (
  3. "encoding/json"
  4. "html"
  5. "net/http"
  6. "net/http/httptest"
  7. "regexp"
  8. "strings"
  9. "testing"
  10. "github.com/peer-calls/peer-calls/server"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. )
  14. var iceServers = []server.ICEServer{}
  15. type addedPeer struct {
  16. room string
  17. clientID string
  18. transport *server.WebRTCTransport
  19. }
  20. type mockTracksManager struct {
  21. added chan addedPeer
  22. }
  23. var _ server.TracksManager = &mockTracksManager{}
  24. func newMockTracksManager() *mockTracksManager {
  25. return &mockTracksManager{
  26. added: make(chan addedPeer, 10),
  27. }
  28. }
  29. func (m *mockTracksManager) Add(room string, transport *server.WebRTCTransport) {
  30. m.added <- addedPeer{
  31. room: room,
  32. clientID: clientID,
  33. transport: transport,
  34. }
  35. }
  36. func (m *mockTracksManager) GetTracksMetadata(room string, clientID string) ([]server.TrackMetadata, bool) {
  37. return nil, true
  38. }
  39. func mesh() (network server.NetworkConfig) {
  40. network.Type = server.NetworkTypeMesh
  41. return
  42. }
  43. const prometheusAccessToken = "prom1234"
  44. func prom() server.PrometheusConfig {
  45. return server.PrometheusConfig{prometheusAccessToken}
  46. }
  47. func Test_routeIndex(t *testing.T) {
  48. mrm := NewMockRoomManager()
  49. trk := newMockTracksManager()
  50. prom := server.PrometheusConfig{"test1234"}
  51. defer mrm.close()
  52. mux := server.NewMux(loggerFactory, "/test", "v0.0.0", mesh(), iceServers, mrm, trk, prom)
  53. w := httptest.NewRecorder()
  54. r := httptest.NewRequest("GET", "/test", nil)
  55. mux.ServeHTTP(w, r)
  56. require.Equal(t, 200, w.Code)
  57. require.Regexp(t, "action=\"/test/call\"", w.Body.String())
  58. }
  59. func Test_routeIndex_noBaseURL(t *testing.T) {
  60. mrm := NewMockRoomManager()
  61. trk := newMockTracksManager()
  62. defer mrm.close()
  63. mux := server.NewMux(loggerFactory, "", "v0.0.0", mesh(), iceServers, mrm, trk, prom())
  64. w := httptest.NewRecorder()
  65. r := httptest.NewRequest("GET", "/", nil)
  66. mux.ServeHTTP(w, r)
  67. require.Equal(t, 200, w.Code)
  68. require.Regexp(t, "action=\"/call\"", w.Body.String())
  69. }
  70. func Test_routeNewCall_name(t *testing.T) {
  71. mrm := NewMockRoomManager()
  72. trk := newMockTracksManager()
  73. defer mrm.close()
  74. mux := server.NewMux(loggerFactory, "/test", "v0.0.0", mesh(), iceServers, mrm, trk, prom())
  75. w := httptest.NewRecorder()
  76. reader := strings.NewReader("call=my room")
  77. r := httptest.NewRequest("POST", "/test/call", reader)
  78. r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  79. mux.ServeHTTP(w, r)
  80. require.Equal(t, 302, w.Code, "expected 302 redirect")
  81. require.Equal(t, "/test/call/my%20room", w.Header().Get("Location"))
  82. }
  83. func Test_routeNewCall_random(t *testing.T) {
  84. mrm := NewMockRoomManager()
  85. trk := newMockTracksManager()
  86. defer mrm.close()
  87. mux := server.NewMux(loggerFactory, "/test", "v0.0.0", mesh(), iceServers, mrm, trk, prom())
  88. w := httptest.NewRecorder()
  89. r := httptest.NewRequest("POST", "/test/call", nil)
  90. r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  91. mux.ServeHTTP(w, r)
  92. uuid := "[0-9a-z-A-Z]+$"
  93. require.Equal(t, 302, w.Code, "expected 302 redirect")
  94. require.Regexp(t, "/test/call/"+uuid, w.Header().Get("Location"))
  95. }
  96. func Test_routeCall(t *testing.T) {
  97. mrm := NewMockRoomManager()
  98. trk := newMockTracksManager()
  99. defer mrm.close()
  100. iceServers := []server.ICEServer{{
  101. URLs: []string{"stun:"},
  102. }}
  103. mux := server.NewMux(loggerFactory, "/test", "v0.0.0", mesh(), iceServers, mrm, trk, prom())
  104. w := httptest.NewRecorder()
  105. r := httptest.NewRequest("GET", "/test/call/abc", nil)
  106. mux.ServeHTTP(w, r)
  107. assert.Equal(t, http.StatusOK, w.Code)
  108. re := regexp.MustCompile(`id="config".*value="(.*?)"`)
  109. result := re.FindStringSubmatch(w.Body.String())
  110. var config server.ClientConfig
  111. err := json.Unmarshal([]byte(html.UnescapeString(result[1])), &config)
  112. require.NoError(t, err)
  113. assert.Equal(t, "/test", config.BaseURL)
  114. assert.Equal(t, "", config.Nickname)
  115. assert.Equal(t, "abc", config.CallID)
  116. assert.NotEmpty(t, config.UserID)
  117. assert.NotEmpty(t, config.ICEServers)
  118. assert.Equal(t, server.NetworkTypeMesh, config.Network)
  119. }
  120. func Test_manifest(t *testing.T) {
  121. mrm := NewMockRoomManager()
  122. trk := newMockTracksManager()
  123. defer mrm.close()
  124. mux := server.NewMux(loggerFactory, "/test", "v0.0.0", mesh(), iceServers, mrm, trk, prom())
  125. w := httptest.NewRecorder()
  126. reader := strings.NewReader("call=my room")
  127. r := httptest.NewRequest("GET", "/test/manifest.json", reader)
  128. mux.ServeHTTP(w, r)
  129. assert.Equal(t, http.StatusOK, w.Code)
  130. data := map[string]interface{}{}
  131. err := json.Unmarshal(w.Body.Bytes(), &data)
  132. assert.NoError(t, err)
  133. }
  134. func Test_Metrics(t *testing.T) {
  135. mrm := NewMockRoomManager()
  136. trk := newMockTracksManager()
  137. defer mrm.close()
  138. mux := server.NewMux(loggerFactory, "/test", "v0.0.0", mesh(), iceServers, mrm, trk, prom())
  139. for _, testCase := range []struct {
  140. statusCode int
  141. authorization string
  142. url string
  143. }{
  144. {401, "", "/test/metrics"},
  145. {401, "Bearer ", "/test/metrics"},
  146. {401, "Bearer", "/test/metrics"},
  147. {401, "Bearer invalid-token", "/test/metrics"},
  148. {200, "Bearer " + prometheusAccessToken, "/test/metrics"},
  149. {200, "", "/test/metrics?access_token=" + prometheusAccessToken},
  150. {401, "", "/test/metrics?access_token=invalid_token"},
  151. } {
  152. t.Run("URL: "+testCase.url+", Authorization: "+testCase.authorization, func(t *testing.T) {
  153. w := httptest.NewRecorder()
  154. reader := strings.NewReader("call=my room")
  155. r := httptest.NewRequest("GET", testCase.url, reader)
  156. r.Header.Set("Authorization", testCase.authorization)
  157. mux.ServeHTTP(w, r)
  158. assert.Equal(t, testCase.statusCode, w.Code)
  159. })
  160. }
  161. }