config_test.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. package config
  5. import (
  6. "bytes"
  7. "io"
  8. "os"
  9. "reflect"
  10. "testing"
  11. "github.com/calmh/syncthing/protocol"
  12. )
  13. var node1, node2, node3, node4 protocol.NodeID
  14. func init() {
  15. node1, _ = protocol.NodeIDFromString("AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ")
  16. node2, _ = protocol.NodeIDFromString("GYRZZQB-IRNPV4Z-T7TC52W-EQYJ3TT-FDQW6MW-DFLMU42-SSSU6EM-FBK2VAY")
  17. node3, _ = protocol.NodeIDFromString("LGFPDIT-7SKNNJL-VJZA4FC-7QNCRKA-CE753K7-2BW5QDK-2FOZ7FR-FEP57QJ")
  18. node4, _ = protocol.NodeIDFromString("P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2")
  19. }
  20. func TestDefaultValues(t *testing.T) {
  21. expected := OptionsConfiguration{
  22. ListenAddress: []string{"0.0.0.0:22000"},
  23. GlobalAnnServer: "announce.syncthing.net:22026",
  24. GlobalAnnEnabled: true,
  25. LocalAnnEnabled: true,
  26. LocalAnnPort: 21025,
  27. ParallelRequests: 16,
  28. MaxSendKbps: 0,
  29. RescanIntervalS: 60,
  30. ReconnectIntervalS: 60,
  31. MaxChangeKbps: 10000,
  32. StartBrowser: true,
  33. UPnPEnabled: true,
  34. }
  35. cfg, err := Load(bytes.NewReader(nil), node1)
  36. if err != io.EOF {
  37. t.Error(err)
  38. }
  39. if !reflect.DeepEqual(cfg.Options, expected) {
  40. t.Errorf("Default config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
  41. }
  42. }
  43. func TestNodeConfig(t *testing.T) {
  44. v1data := []byte(`
  45. <configuration version="1">
  46. <repository id="test" directory="~/Sync">
  47. <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ" name="node one">
  48. <address>a</address>
  49. </node>
  50. <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
  51. <address>b</address>
  52. </node>
  53. </repository>
  54. <options>
  55. <readOnly>true</readOnly>
  56. </options>
  57. </configuration>
  58. `)
  59. v2data := []byte(`
  60. <configuration version="2">
  61. <repository id="test" directory="~/Sync" ro="true">
  62. <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ"/>
  63. <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ"/>
  64. </repository>
  65. <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ" name="node one">
  66. <address>a</address>
  67. </node>
  68. <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
  69. <address>b</address>
  70. </node>
  71. </configuration>
  72. `)
  73. for i, data := range [][]byte{v1data, v2data} {
  74. cfg, err := Load(bytes.NewReader(data), node1)
  75. if err != nil {
  76. t.Error(err)
  77. }
  78. expectedRepos := []RepositoryConfiguration{
  79. {
  80. ID: "test",
  81. Directory: "~/Sync",
  82. Nodes: []NodeConfiguration{{NodeID: node1}, {NodeID: node4}},
  83. ReadOnly: true,
  84. },
  85. }
  86. expectedNodes := []NodeConfiguration{
  87. {
  88. NodeID: node1,
  89. Name: "node one",
  90. Addresses: []string{"a"},
  91. },
  92. {
  93. NodeID: node4,
  94. Name: "node two",
  95. Addresses: []string{"b"},
  96. },
  97. }
  98. expectedNodeIDs := []protocol.NodeID{node1, node4}
  99. if cfg.Version != 2 {
  100. t.Errorf("%d: Incorrect version %d != 2", i, cfg.Version)
  101. }
  102. if !reflect.DeepEqual(cfg.Repositories, expectedRepos) {
  103. t.Errorf("%d: Incorrect Repositories\n A: %#v\n E: %#v", i, cfg.Repositories, expectedRepos)
  104. }
  105. if !reflect.DeepEqual(cfg.Nodes, expectedNodes) {
  106. t.Errorf("%d: Incorrect Nodes\n A: %#v\n E: %#v", i, cfg.Nodes, expectedNodes)
  107. }
  108. if !reflect.DeepEqual(cfg.Repositories[0].NodeIDs(), expectedNodeIDs) {
  109. t.Errorf("%d: Incorrect NodeIDs\n A: %#v\n E: %#v", i, cfg.Repositories[0].NodeIDs(), expectedNodeIDs)
  110. }
  111. }
  112. }
  113. func TestNoListenAddress(t *testing.T) {
  114. data := []byte(`<configuration version="1">
  115. <options>
  116. <listenAddress></listenAddress>
  117. </options>
  118. </configuration>
  119. `)
  120. cfg, err := Load(bytes.NewReader(data), node1)
  121. if err != nil {
  122. t.Error(err)
  123. }
  124. expected := []string{""}
  125. if !reflect.DeepEqual(cfg.Options.ListenAddress, expected) {
  126. t.Errorf("Unexpected ListenAddress %#v", cfg.Options.ListenAddress)
  127. }
  128. }
  129. func TestOverriddenValues(t *testing.T) {
  130. data := []byte(`<configuration version="2">
  131. <options>
  132. <listenAddress>:23000</listenAddress>
  133. <allowDelete>false</allowDelete>
  134. <globalAnnounceServer>syncthing.nym.se:22026</globalAnnounceServer>
  135. <globalAnnounceEnabled>false</globalAnnounceEnabled>
  136. <localAnnounceEnabled>false</localAnnounceEnabled>
  137. <localAnnouncePort>42123</localAnnouncePort>
  138. <parallelRequests>32</parallelRequests>
  139. <maxSendKbps>1234</maxSendKbps>
  140. <rescanIntervalS>600</rescanIntervalS>
  141. <reconnectionIntervalS>6000</reconnectionIntervalS>
  142. <maxChangeKbps>2345</maxChangeKbps>
  143. <startBrowser>false</startBrowser>
  144. <upnpEnabled>false</upnpEnabled>
  145. </options>
  146. </configuration>
  147. `)
  148. expected := OptionsConfiguration{
  149. ListenAddress: []string{":23000"},
  150. GlobalAnnServer: "syncthing.nym.se:22026",
  151. GlobalAnnEnabled: false,
  152. LocalAnnEnabled: false,
  153. LocalAnnPort: 42123,
  154. ParallelRequests: 32,
  155. MaxSendKbps: 1234,
  156. RescanIntervalS: 600,
  157. ReconnectIntervalS: 6000,
  158. MaxChangeKbps: 2345,
  159. StartBrowser: false,
  160. UPnPEnabled: false,
  161. }
  162. cfg, err := Load(bytes.NewReader(data), node1)
  163. if err != nil {
  164. t.Error(err)
  165. }
  166. if !reflect.DeepEqual(cfg.Options, expected) {
  167. t.Errorf("Overridden config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
  168. }
  169. }
  170. func TestNodeAddresses(t *testing.T) {
  171. data := []byte(`
  172. <configuration version="2">
  173. <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ">
  174. <address></address>
  175. </node>
  176. <node id="GYRZZQBIRNPV4T7TC52WEQYJ3TFDQW6MWDFLMU4SSSU6EMFBK2VA">
  177. </node>
  178. <node id="LGFPDIT7SKNNJVJZA4FC7QNCRKCE753K72BW5QD2FOZ7FRFEP57Q">
  179. <address>dynamic</address>
  180. </node>
  181. </configuration>
  182. `)
  183. name, _ := os.Hostname()
  184. expected := []NodeConfiguration{
  185. {
  186. NodeID: node1,
  187. Addresses: []string{"dynamic"},
  188. },
  189. {
  190. NodeID: node2,
  191. Addresses: []string{"dynamic"},
  192. },
  193. {
  194. NodeID: node3,
  195. Addresses: []string{"dynamic"},
  196. },
  197. {
  198. NodeID: node4,
  199. Name: name, // Set when auto created
  200. Addresses: []string{"dynamic"},
  201. },
  202. }
  203. cfg, err := Load(bytes.NewReader(data), node4)
  204. if err != nil {
  205. t.Error(err)
  206. }
  207. if !reflect.DeepEqual(cfg.Nodes, expected) {
  208. t.Errorf("Nodes differ;\n E: %#v\n A: %#v", expected, cfg.Nodes)
  209. }
  210. }