config_test.go 7.1 KB

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