main_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Copyright © 2020 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package main
  7. import (
  8. "bytes"
  9. "encoding/json"
  10. "fmt"
  11. "net/http/httptest"
  12. "net/url"
  13. "strings"
  14. "testing"
  15. )
  16. func init() {
  17. for i := 0; i < 10; i++ {
  18. u := fmt.Sprintf("permanent%d", i)
  19. permanentRelays = append(permanentRelays, &relay{URL: u})
  20. }
  21. knownRelays = []*relay{
  22. {URL: "known1"},
  23. {URL: "known2"},
  24. {URL: "known3"},
  25. }
  26. }
  27. // Regression test: handleGetRequest should not modify permanentRelays.
  28. func TestHandleGetRequest(t *testing.T) {
  29. needcap := len(permanentRelays) + len(knownRelays)
  30. if needcap > cap(permanentRelays) {
  31. t.Fatalf("test setup failed: need cap(permanentRelays) >= %d, have %d",
  32. needcap, cap(permanentRelays))
  33. }
  34. w := httptest.NewRecorder()
  35. w.Body = new(bytes.Buffer)
  36. handleEndpointFull(w, httptest.NewRequest("GET", "/", nil))
  37. result := make(map[string][]*relay)
  38. err := json.NewDecoder(w.Body).Decode(&result)
  39. if err != nil {
  40. t.Fatalf("invalid JSON: %v", err)
  41. }
  42. relays := result["relays"]
  43. expect, actual := len(knownRelays)+len(permanentRelays), len(relays)
  44. if actual != expect {
  45. t.Errorf("expected %d relays, got %d", expect, actual)
  46. }
  47. // Check for changes in permanentRelays.
  48. for i, r := range permanentRelays {
  49. switch {
  50. case !strings.HasPrefix(r.URL, "permanent"):
  51. t.Errorf("relay %q among permanent relays", r.URL)
  52. case r.URL != fmt.Sprintf("permanent%d", i):
  53. t.Error("order of permanent relays changed")
  54. }
  55. }
  56. }
  57. func TestCanonicalizeQueryValues(t *testing.T) {
  58. // This just demonstrates and validates the uri.Parse/String stuff in
  59. // regards to query strings.
  60. in := "http://example.com/?some weird= query^value"
  61. exp := "http://example.com/?some+weird=+query%5Evalue"
  62. uri, err := url.Parse(in)
  63. if err != nil {
  64. t.Fatal(err)
  65. }
  66. str := uri.String()
  67. if str != in {
  68. // Just re-encoding the URL doesn't sanitize the query string.
  69. t.Errorf("expected %q, got %q", in, str)
  70. }
  71. uri.RawQuery = uri.Query().Encode()
  72. str = uri.String()
  73. if str != exp {
  74. // The query string is now in correct format.
  75. t.Errorf("expected %q, got %q", exp, str)
  76. }
  77. }
  78. func TestSlimURL(t *testing.T) {
  79. cases := []struct {
  80. in, out string
  81. }{
  82. {"http://example.com/", "http://example.com/"},
  83. {"relay://192.0.2.42:22067/?globalLimitBps=0&id=EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M&networkTimeout=2m0s&pingInterval=1m0s&providedBy=Test&sessionLimitBps=0&statusAddr=%3A22070", "relay://192.0.2.42:22067/?id=EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M"},
  84. }
  85. for _, c := range cases {
  86. if got := slimURL(c.in); got != c.out {
  87. t.Errorf("expected %q, got %q", c.out, got)
  88. }
  89. }
  90. }