config_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. "os"
  7. "reflect"
  8. "testing"
  9. "github.com/syncthing/syncthing/protocol"
  10. )
  11. var node1, node2, node3, node4 protocol.NodeID
  12. func init() {
  13. node1, _ = protocol.NodeIDFromString("AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ")
  14. node2, _ = protocol.NodeIDFromString("GYRZZQB-IRNPV4Z-T7TC52W-EQYJ3TT-FDQW6MW-DFLMU42-SSSU6EM-FBK2VAY")
  15. node3, _ = protocol.NodeIDFromString("LGFPDIT-7SKNNJL-VJZA4FC-7QNCRKA-CE753K7-2BW5QDK-2FOZ7FR-FEP57QJ")
  16. node4, _ = protocol.NodeIDFromString("P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2")
  17. }
  18. func TestDefaultValues(t *testing.T) {
  19. expected := OptionsConfiguration{
  20. ListenAddress: []string{"0.0.0.0:22000"},
  21. GlobalAnnServer: "announce.syncthing.net:22026",
  22. GlobalAnnEnabled: true,
  23. LocalAnnEnabled: true,
  24. LocalAnnPort: 21025,
  25. LocalAnnMCAddr: "[ff32::5222]:21026",
  26. ParallelRequests: 16,
  27. MaxSendKbps: 0,
  28. ReconnectIntervalS: 60,
  29. StartBrowser: true,
  30. UPnPEnabled: true,
  31. UPnPLease: 0,
  32. UPnPRenewal: 30,
  33. }
  34. cfg := New("test", node1)
  35. if !reflect.DeepEqual(cfg.Options, expected) {
  36. t.Errorf("Default config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
  37. }
  38. }
  39. func TestNodeConfig(t *testing.T) {
  40. for i, ver := range []string{"v1", "v2", "v3", "v4"} {
  41. cfg, err := Load("testdata/"+ver+".xml", node1)
  42. if err != nil {
  43. t.Error(err)
  44. }
  45. expectedRepos := []RepositoryConfiguration{
  46. {
  47. ID: "test",
  48. Directory: "~/Sync",
  49. Nodes: []RepositoryNodeConfiguration{{NodeID: node1}, {NodeID: node4}},
  50. ReadOnly: true,
  51. RescanIntervalS: 600,
  52. },
  53. }
  54. expectedNodes := []NodeConfiguration{
  55. {
  56. NodeID: node1,
  57. Name: "node one",
  58. Addresses: []string{"a"},
  59. Compression: true,
  60. },
  61. {
  62. NodeID: node4,
  63. Name: "node two",
  64. Addresses: []string{"b"},
  65. Compression: true,
  66. },
  67. }
  68. expectedNodeIDs := []protocol.NodeID{node1, node4}
  69. if cfg.Version != 4 {
  70. t.Errorf("%d: Incorrect version %d != 3", i, cfg.Version)
  71. }
  72. if !reflect.DeepEqual(cfg.Repositories, expectedRepos) {
  73. t.Errorf("%d: Incorrect Repositories\n A: %#v\n E: %#v", i, cfg.Repositories, expectedRepos)
  74. }
  75. if !reflect.DeepEqual(cfg.Nodes, expectedNodes) {
  76. t.Errorf("%d: Incorrect Nodes\n A: %#v\n E: %#v", i, cfg.Nodes, expectedNodes)
  77. }
  78. if !reflect.DeepEqual(cfg.Repositories[0].NodeIDs(), expectedNodeIDs) {
  79. t.Errorf("%d: Incorrect NodeIDs\n A: %#v\n E: %#v", i, cfg.Repositories[0].NodeIDs(), expectedNodeIDs)
  80. }
  81. if len(cfg.NodeMap()) != len(expectedNodes) {
  82. t.Errorf("Unexpected number of NodeMap() entries")
  83. }
  84. if len(cfg.RepoMap()) != len(expectedRepos) {
  85. t.Errorf("Unexpected number of RepoMap() entries")
  86. }
  87. }
  88. }
  89. func TestNoListenAddress(t *testing.T) {
  90. cfg, err := Load("testdata/nolistenaddress.xml", node1)
  91. if err != nil {
  92. t.Error(err)
  93. }
  94. expected := []string{""}
  95. if !reflect.DeepEqual(cfg.Options.ListenAddress, expected) {
  96. t.Errorf("Unexpected ListenAddress %#v", cfg.Options.ListenAddress)
  97. }
  98. }
  99. func TestOverriddenValues(t *testing.T) {
  100. expected := OptionsConfiguration{
  101. ListenAddress: []string{":23000"},
  102. GlobalAnnServer: "syncthing.nym.se:22026",
  103. GlobalAnnEnabled: false,
  104. LocalAnnEnabled: false,
  105. LocalAnnPort: 42123,
  106. LocalAnnMCAddr: "quux:3232",
  107. ParallelRequests: 32,
  108. MaxSendKbps: 1234,
  109. ReconnectIntervalS: 6000,
  110. StartBrowser: false,
  111. UPnPEnabled: false,
  112. UPnPLease: 60,
  113. UPnPRenewal: 15,
  114. }
  115. cfg, err := Load("testdata/overridenvalues.xml", node1)
  116. if err != nil {
  117. t.Error(err)
  118. }
  119. if !reflect.DeepEqual(cfg.Options, expected) {
  120. t.Errorf("Overridden config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
  121. }
  122. }
  123. func TestNodeAddressesDynamic(t *testing.T) {
  124. name, _ := os.Hostname()
  125. expected := []NodeConfiguration{
  126. {
  127. NodeID: node1,
  128. Addresses: []string{"dynamic"},
  129. Compression: true,
  130. },
  131. {
  132. NodeID: node2,
  133. Addresses: []string{"dynamic"},
  134. Compression: true,
  135. },
  136. {
  137. NodeID: node3,
  138. Addresses: []string{"dynamic"},
  139. Compression: true,
  140. },
  141. {
  142. NodeID: node4,
  143. Name: name, // Set when auto created
  144. Addresses: []string{"dynamic"},
  145. },
  146. }
  147. cfg, err := Load("testdata/nodeaddressesdynamic.xml", node4)
  148. if err != nil {
  149. t.Error(err)
  150. }
  151. if !reflect.DeepEqual(cfg.Nodes, expected) {
  152. t.Errorf("Nodes differ;\n E: %#v\n A: %#v", expected, cfg.Nodes)
  153. }
  154. }
  155. func TestNodeAddressesStatic(t *testing.T) {
  156. name, _ := os.Hostname()
  157. expected := []NodeConfiguration{
  158. {
  159. NodeID: node1,
  160. Addresses: []string{"192.0.2.1", "192.0.2.2"},
  161. },
  162. {
  163. NodeID: node2,
  164. Addresses: []string{"192.0.2.3:6070", "[2001:db8::42]:4242"},
  165. },
  166. {
  167. NodeID: node3,
  168. Addresses: []string{"[2001:db8::44]:4444", "192.0.2.4:6090"},
  169. },
  170. {
  171. NodeID: node4,
  172. Name: name, // Set when auto created
  173. Addresses: []string{"dynamic"},
  174. },
  175. }
  176. cfg, err := Load("testdata/nodeaddressesstatic.xml", node4)
  177. if err != nil {
  178. t.Error(err)
  179. }
  180. if !reflect.DeepEqual(cfg.Nodes, expected) {
  181. t.Errorf("Nodes differ;\n E: %#v\n A: %#v", expected, cfg.Nodes)
  182. }
  183. }
  184. func TestVersioningConfig(t *testing.T) {
  185. cfg, err := Load("testdata/versioningconfig.xml", node4)
  186. if err != nil {
  187. t.Error(err)
  188. }
  189. vc := cfg.Repositories[0].Versioning
  190. if vc.Type != "simple" {
  191. t.Errorf(`vc.Type %q != "simple"`, vc.Type)
  192. }
  193. if l := len(vc.Params); l != 2 {
  194. t.Errorf("len(vc.Params) %d != 2", l)
  195. }
  196. expected := map[string]string{
  197. "foo": "bar",
  198. "baz": "quux",
  199. }
  200. if !reflect.DeepEqual(vc.Params, expected) {
  201. t.Errorf("vc.Params differ;\n E: %#v\n A: %#v", expected, vc.Params)
  202. }
  203. }
  204. func TestNewSaveLoad(t *testing.T) {
  205. path := "testdata/temp.xml"
  206. os.Remove(path)
  207. exists := func(path string) bool {
  208. _, err := os.Stat(path)
  209. return err == nil
  210. }
  211. cfg := New(path, node1)
  212. // To make the equality pass later
  213. cfg.XMLName.Local = "configuration"
  214. if exists(path) {
  215. t.Error(path, "exists")
  216. }
  217. err := cfg.Save()
  218. if err != nil {
  219. t.Error(err)
  220. }
  221. if !exists(path) {
  222. t.Error(path, "does not exist")
  223. }
  224. cfg2, err := Load(path, node1)
  225. if err != nil {
  226. t.Error(err)
  227. }
  228. if !reflect.DeepEqual(cfg, cfg2) {
  229. t.Errorf("Configs are not equal;\n E: %#v\n A: %#v", cfg, cfg2)
  230. }
  231. cfg.GUI.User = "test"
  232. cfg.Save()
  233. cfg2, err = Load(path, node1)
  234. if err != nil {
  235. t.Error(err)
  236. }
  237. if cfg2.GUI.User != "test" || !reflect.DeepEqual(cfg, cfg2) {
  238. t.Errorf("Configs are not equal;\n E: %#v\n A: %#v", cfg, cfg2)
  239. }
  240. os.Remove(path)
  241. }
  242. func TestPrepare(t *testing.T) {
  243. var cfg Configuration
  244. if cfg.Repositories != nil || cfg.Nodes != nil || cfg.Options.ListenAddress != nil {
  245. t.Error("Expected nil")
  246. }
  247. cfg.prepare(node1)
  248. if cfg.Repositories == nil || cfg.Nodes == nil || cfg.Options.ListenAddress == nil {
  249. t.Error("Unexpected nil")
  250. }
  251. }