config_test.go 7.2 KB

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