config_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package config
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "reflect"
  7. "testing"
  8. )
  9. func TestDefaultValues(t *testing.T) {
  10. expected := OptionsConfiguration{
  11. ListenAddress: []string{"0.0.0.0:22000"},
  12. GlobalAnnServer: "announce.syncthing.net:22025",
  13. GlobalAnnEnabled: true,
  14. LocalAnnEnabled: true,
  15. LocalAnnPort: 21025,
  16. ParallelRequests: 16,
  17. MaxSendKbps: 0,
  18. RescanIntervalS: 60,
  19. ReconnectIntervalS: 60,
  20. MaxChangeKbps: 10000,
  21. StartBrowser: true,
  22. UPnPEnabled: true,
  23. }
  24. cfg, err := Load(bytes.NewReader(nil), "nodeID")
  25. if err != io.EOF {
  26. t.Error(err)
  27. }
  28. if !reflect.DeepEqual(cfg.Options, expected) {
  29. t.Errorf("Default config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
  30. }
  31. }
  32. func TestNodeConfig(t *testing.T) {
  33. v1data := []byte(`
  34. <configuration version="1">
  35. <repository id="test" directory="~/Sync">
  36. <node id="NODE1" name="node one">
  37. <address>a</address>
  38. </node>
  39. <node id="NODE2" name="node two">
  40. <address>b</address>
  41. </node>
  42. </repository>
  43. <options>
  44. <readOnly>true</readOnly>
  45. </options>
  46. </configuration>
  47. `)
  48. v2data := []byte(`
  49. <configuration version="2">
  50. <repository id="test" directory="~/Sync" ro="true">
  51. <node id="NODE1"/>
  52. <node id="NODE2"/>
  53. </repository>
  54. <node id="NODE1" name="node one">
  55. <address>a</address>
  56. </node>
  57. <node id="NODE2" name="node two">
  58. <address>b</address>
  59. </node>
  60. </configuration>
  61. `)
  62. for i, data := range [][]byte{v1data, v2data} {
  63. cfg, err := Load(bytes.NewReader(data), "NODE1")
  64. if err != nil {
  65. t.Error(err)
  66. }
  67. expectedRepos := []RepositoryConfiguration{
  68. {
  69. ID: "test",
  70. Directory: "~/Sync",
  71. Nodes: []NodeConfiguration{{NodeID: "NODE1"}, {NodeID: "NODE2"}},
  72. ReadOnly: true,
  73. },
  74. }
  75. expectedNodes := []NodeConfiguration{
  76. {
  77. NodeID: "NODE1",
  78. Name: "node one",
  79. Addresses: []string{"a"},
  80. },
  81. {
  82. NodeID: "NODE2",
  83. Name: "node two",
  84. Addresses: []string{"b"},
  85. },
  86. }
  87. expectedNodeIDs := []string{"NODE1", "NODE2"}
  88. if cfg.Version != 2 {
  89. t.Errorf("%d: Incorrect version %d != 2", i, cfg.Version)
  90. }
  91. if !reflect.DeepEqual(cfg.Repositories, expectedRepos) {
  92. t.Errorf("%d: Incorrect Repositories\n A: %#v\n E: %#v", i, cfg.Repositories, expectedRepos)
  93. }
  94. if !reflect.DeepEqual(cfg.Nodes, expectedNodes) {
  95. t.Errorf("%d: Incorrect Nodes\n A: %#v\n E: %#v", i, cfg.Nodes, expectedNodes)
  96. }
  97. if !reflect.DeepEqual(cfg.Repositories[0].NodeIDs(), expectedNodeIDs) {
  98. t.Errorf("%d: Incorrect NodeIDs\n A: %#v\n E: %#v", i, cfg.Repositories[0].NodeIDs(), expectedNodeIDs)
  99. }
  100. }
  101. }
  102. func TestNoListenAddress(t *testing.T) {
  103. data := []byte(`<configuration version="1">
  104. <repository directory="~/Sync">
  105. <node id="..." name="...">
  106. <address>dynamic</address>
  107. </node>
  108. </repository>
  109. <options>
  110. <listenAddress></listenAddress>
  111. </options>
  112. </configuration>
  113. `)
  114. cfg, err := Load(bytes.NewReader(data), "nodeID")
  115. if err != nil {
  116. t.Error(err)
  117. }
  118. expected := []string{""}
  119. if !reflect.DeepEqual(cfg.Options.ListenAddress, expected) {
  120. t.Errorf("Unexpected ListenAddress %#v", cfg.Options.ListenAddress)
  121. }
  122. }
  123. func TestOverriddenValues(t *testing.T) {
  124. data := []byte(`<configuration version="2">
  125. <repository directory="~/Sync">
  126. <node id="..." name="...">
  127. <address>dynamic</address>
  128. </node>
  129. </repository>
  130. <options>
  131. <listenAddress>:23000</listenAddress>
  132. <allowDelete>false</allowDelete>
  133. <globalAnnounceServer>syncthing.nym.se:22025</globalAnnounceServer>
  134. <globalAnnounceEnabled>false</globalAnnounceEnabled>
  135. <localAnnounceEnabled>false</localAnnounceEnabled>
  136. <localAnnouncePort>42123</localAnnouncePort>
  137. <parallelRequests>32</parallelRequests>
  138. <maxSendKbps>1234</maxSendKbps>
  139. <rescanIntervalS>600</rescanIntervalS>
  140. <reconnectionIntervalS>6000</reconnectionIntervalS>
  141. <maxChangeKbps>2345</maxChangeKbps>
  142. <startBrowser>false</startBrowser>
  143. <upnpEnabled>false</upnpEnabled>
  144. </options>
  145. </configuration>
  146. `)
  147. expected := OptionsConfiguration{
  148. ListenAddress: []string{":23000"},
  149. GlobalAnnServer: "syncthing.nym.se:22025",
  150. GlobalAnnEnabled: false,
  151. LocalAnnEnabled: false,
  152. LocalAnnPort: 42123,
  153. ParallelRequests: 32,
  154. MaxSendKbps: 1234,
  155. RescanIntervalS: 600,
  156. ReconnectIntervalS: 6000,
  157. MaxChangeKbps: 2345,
  158. StartBrowser: false,
  159. UPnPEnabled: false,
  160. }
  161. cfg, err := Load(bytes.NewReader(data), "nodeID")
  162. if err != nil {
  163. t.Error(err)
  164. }
  165. if !reflect.DeepEqual(cfg.Options, expected) {
  166. t.Errorf("Overridden config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
  167. }
  168. }
  169. func TestNodeAddresses(t *testing.T) {
  170. data := []byte(`
  171. <configuration version="2">
  172. <node id="n1">
  173. <address>dynamic</address>
  174. </node>
  175. <node id="n2">
  176. <address></address>
  177. </node>
  178. <node id="n3">
  179. </node>
  180. </configuration>
  181. `)
  182. name, _ := os.Hostname()
  183. expected := []NodeConfiguration{
  184. {
  185. NodeID: "N1",
  186. Addresses: []string{"dynamic"},
  187. },
  188. {
  189. NodeID: "N2",
  190. Addresses: []string{"dynamic"},
  191. },
  192. {
  193. NodeID: "N3",
  194. Addresses: []string{"dynamic"},
  195. },
  196. {
  197. NodeID: "N4",
  198. Name: name, // Set when auto created
  199. Addresses: []string{"dynamic"},
  200. },
  201. }
  202. cfg, err := Load(bytes.NewReader(data), "N4")
  203. if err != nil {
  204. t.Error(err)
  205. }
  206. if !reflect.DeepEqual(cfg.Nodes, expected) {
  207. t.Errorf("Nodes differ;\n E: %#v\n A: %#v", expected, cfg.Nodes)
  208. }
  209. }
  210. func TestStripNodeIs(t *testing.T) {
  211. data := []byte(`
  212. <configuration version="2">
  213. <node id="AAAA-BBBB-CCCC">
  214. <address>dynamic</address>
  215. </node>
  216. <node id="AAAA BBBB DDDD">
  217. <address></address>
  218. </node>
  219. <node id="AAAABBBBEEEE">
  220. <address></address>
  221. </node>
  222. <repository directory="~/Sync">
  223. <node id="AAA ABBB-BCC CC" name=""></node>
  224. <node id="AA-AAB BBBD-DDD" name=""></node>
  225. <node id="AAA AB-BBB EEE-E" name=""></node>
  226. </repository>
  227. </configuration>
  228. `)
  229. expected := []NodeConfiguration{
  230. {
  231. NodeID: "AAAABBBBCCCC",
  232. Addresses: []string{"dynamic"},
  233. },
  234. {
  235. NodeID: "AAAABBBBDDDD",
  236. Addresses: []string{"dynamic"},
  237. },
  238. {
  239. NodeID: "AAAABBBBEEEE",
  240. Addresses: []string{"dynamic"},
  241. },
  242. }
  243. cfg, err := Load(bytes.NewReader(data), "n4")
  244. if err != nil {
  245. t.Error(err)
  246. }
  247. for i := range expected {
  248. if !reflect.DeepEqual(cfg.Nodes[i], expected[i]) {
  249. t.Errorf("Nodes[%d] differ;\n E: %#v\n A: %#v", i, expected[i], cfg.Nodes[i])
  250. }
  251. if cfg.Repositories[0].Nodes[i].NodeID != expected[i].NodeID {
  252. t.Errorf("Repo nodes[%d] differ;\n E: %#v\n A: %#v", i, expected[i].NodeID, cfg.Repositories[0].Nodes[i].NodeID)
  253. }
  254. }
  255. }