connections_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // Copyright (C) 2016 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 connections
  7. import (
  8. "context"
  9. "errors"
  10. "net/url"
  11. "testing"
  12. "github.com/syncthing/syncthing/lib/config"
  13. "github.com/syncthing/syncthing/lib/protocol"
  14. )
  15. func TestFixupPort(t *testing.T) {
  16. cases := [][2]string{
  17. {"tcp://1.2.3.4:5", "tcp://1.2.3.4:5"},
  18. {"tcp://1.2.3.4:", "tcp://1.2.3.4:22000"},
  19. {"tcp://1.2.3.4", "tcp://1.2.3.4:22000"},
  20. }
  21. for _, tc := range cases {
  22. u0, _ := url.Parse(tc[0])
  23. u1 := fixupPort(u0, 22000).String()
  24. if u1 != tc[1] {
  25. t.Errorf("fixupPort(%q, 22000) => %q, expected %q", tc[0], u1, tc[1])
  26. }
  27. }
  28. }
  29. func TestAllowedNetworks(t *testing.T) {
  30. cases := []struct {
  31. host string
  32. allowed []string
  33. ok bool
  34. }{
  35. {
  36. "192.168.0.1",
  37. nil,
  38. false,
  39. },
  40. {
  41. "192.168.0.1",
  42. []string{},
  43. false,
  44. },
  45. {
  46. "fe80::1",
  47. nil,
  48. false,
  49. },
  50. {
  51. "fe80::1",
  52. []string{},
  53. false,
  54. },
  55. {
  56. "192.168.0.1",
  57. []string{"fe80::/48", "192.168.0.0/24"},
  58. true,
  59. },
  60. {
  61. "fe80::1",
  62. []string{"192.168.0.0/24", "fe80::/48"},
  63. true,
  64. },
  65. {
  66. "192.168.0.1",
  67. []string{"192.168.1.0/24", "fe80::/48"},
  68. false,
  69. },
  70. {
  71. "fe80::1",
  72. []string{"fe82::/48", "192.168.1.0/24"},
  73. false,
  74. },
  75. {
  76. "192.168.0.1:4242",
  77. []string{"fe80::/48", "192.168.0.0/24"},
  78. true,
  79. },
  80. {
  81. "[fe80::1]:4242",
  82. []string{"192.168.0.0/24", "fe80::/48"},
  83. true,
  84. },
  85. {
  86. "10.20.30.40",
  87. []string{"!10.20.30.0/24", "10.0.0.0/8"},
  88. false,
  89. },
  90. {
  91. "10.20.30.40",
  92. []string{"10.0.0.0/8", "!10.20.30.0/24"},
  93. true,
  94. },
  95. {
  96. "[fe80::1]:4242",
  97. []string{"192.168.0.0/24", "!fe00::/8", "fe80::/48"},
  98. false,
  99. },
  100. }
  101. for _, tc := range cases {
  102. res := IsAllowedNetwork(tc.host, tc.allowed)
  103. if res != tc.ok {
  104. t.Errorf("allowedNetwork(%q, %q) == %v, want %v", tc.host, tc.allowed, res, tc.ok)
  105. }
  106. }
  107. }
  108. func TestGetDialer(t *testing.T) {
  109. mustParseURI := func(v string) *url.URL {
  110. uri, err := url.Parse(v)
  111. if err != nil {
  112. panic(err)
  113. }
  114. return uri
  115. }
  116. cases := []struct {
  117. uri *url.URL
  118. ok bool
  119. disabled bool
  120. deprecated bool
  121. }{
  122. {mustParseURI("tcp://1.2.3.4:5678"), true, false, false}, // ok
  123. {mustParseURI("tcp4://1.2.3.4:5678"), true, false, false}, // ok
  124. {mustParseURI("kcp://1.2.3.4:5678"), false, false, true}, // deprecated
  125. {mustParseURI("relay://1.2.3.4:5678"), false, true, false}, // disabled
  126. {mustParseURI("http://1.2.3.4:5678"), false, false, false}, // generally bad
  127. {mustParseURI("bananas!"), false, false, false}, // wat
  128. }
  129. cfg := config.New(protocol.LocalDeviceID)
  130. cfg.Options.RelaysEnabled = false
  131. for _, tc := range cases {
  132. df, err := getDialerFactory(cfg, tc.uri)
  133. if tc.ok && err != nil {
  134. t.Errorf("getDialerFactory(%q) => %v, expected nil err", tc.uri, err)
  135. }
  136. if tc.ok && df == nil {
  137. t.Errorf("getDialerFactory(%q) => nil factory, expected non-nil", tc.uri)
  138. }
  139. if tc.deprecated && err != errDeprecated {
  140. t.Errorf("getDialerFactory(%q) => %v, expected %v", tc.uri, err, errDeprecated)
  141. }
  142. if tc.disabled && err != errDisabled {
  143. t.Errorf("getDialerFactory(%q) => %v, expected %v", tc.uri, err, errDisabled)
  144. }
  145. lf, err := getListenerFactory(cfg, tc.uri)
  146. if tc.ok && err != nil {
  147. t.Errorf("getListenerFactory(%q) => %v, expected nil err", tc.uri, err)
  148. }
  149. if tc.ok && lf == nil {
  150. t.Errorf("getListenerFactory(%q) => nil factory, expected non-nil", tc.uri)
  151. }
  152. if tc.deprecated && err != errDeprecated {
  153. t.Errorf("getListenerFactory(%q) => %v, expected %v", tc.uri, err, errDeprecated)
  154. }
  155. if tc.disabled && err != errDisabled {
  156. t.Errorf("getListenerFactory(%q) => %v, expected %v", tc.uri, err, errDisabled)
  157. }
  158. }
  159. }
  160. func TestConnectionStatus(t *testing.T) {
  161. s := newConnectionStatusHandler()
  162. addr := "testAddr"
  163. testErr := errors.New("testErr")
  164. if stats := s.ConnectionStatus(); len(stats) != 0 {
  165. t.Fatal("newly created connectionStatusHandler isn't empty:", len(stats))
  166. }
  167. check := func(in, out error) {
  168. t.Helper()
  169. s.setConnectionStatus(addr, in)
  170. switch stat, ok := s.ConnectionStatus()[addr]; {
  171. case !ok:
  172. t.Fatal("entry missing")
  173. case out == nil:
  174. if stat.Error != nil {
  175. t.Fatal("expected nil error, got", stat.Error)
  176. }
  177. case *stat.Error != out.Error():
  178. t.Fatalf("expected %v error, got %v", out.Error(), *stat.Error)
  179. }
  180. }
  181. check(nil, nil)
  182. check(context.Canceled, nil)
  183. check(testErr, testErr)
  184. check(context.Canceled, testErr)
  185. check(nil, nil)
  186. }