| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
- // All rights reserved. Use of this source code is governed by an MIT-style
- // license that can be found in the LICENSE file.
- package config
- import (
- "bytes"
- "io"
- "os"
- "reflect"
- "testing"
- "github.com/syncthing/syncthing/protocol"
- )
- var node1, node2, node3, node4 protocol.NodeID
- func init() {
- node1, _ = protocol.NodeIDFromString("AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ")
- node2, _ = protocol.NodeIDFromString("GYRZZQB-IRNPV4Z-T7TC52W-EQYJ3TT-FDQW6MW-DFLMU42-SSSU6EM-FBK2VAY")
- node3, _ = protocol.NodeIDFromString("LGFPDIT-7SKNNJL-VJZA4FC-7QNCRKA-CE753K7-2BW5QDK-2FOZ7FR-FEP57QJ")
- node4, _ = protocol.NodeIDFromString("P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2")
- }
- func TestDefaultValues(t *testing.T) {
- expected := OptionsConfiguration{
- ListenAddress: []string{"0.0.0.0:22000"},
- GlobalAnnServer: "announce.syncthing.net:22026",
- GlobalAnnEnabled: true,
- LocalAnnEnabled: true,
- LocalAnnPort: 21025,
- LocalAnnMCAddr: "[ff32::5222]:21026",
- ParallelRequests: 16,
- MaxSendKbps: 0,
- ReconnectIntervalS: 60,
- StartBrowser: true,
- UPnPEnabled: true,
- UPnPLease: 0,
- UPnPRenewal: 30,
- }
- cfg, err := Load(bytes.NewReader(nil), node1)
- if err != io.EOF {
- t.Error(err)
- }
- if !reflect.DeepEqual(cfg.Options, expected) {
- t.Errorf("Default config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
- }
- }
- func TestNodeConfig(t *testing.T) {
- v1data := []byte(`
- <configuration version="1">
- <repository id="test" directory="~/Sync">
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ" name="node one">
- <address>a</address>
- </node>
- <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
- <address>b</address>
- </node>
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ" name="node one">
- <address>a</address>
- </node>
- <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
- <address>b</address>
- </node>
- </repository>
- <options>
- <readOnly>true</readOnly>
- <rescanIntervalS>600</rescanIntervalS>
- </options>
- </configuration>
- `)
- v2data := []byte(`
- <configuration version="2">
- <repository id="test" directory="~/Sync" ro="true">
- <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ"/>
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ"/>
- <node id="C4YBIESWDUAIGU62GOSRXCRAAJDWVE3TKCPMURZE2LH5QHAF576A"/>
- <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ"/>
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ"/>
- <node id="C4YBIESWDUAIGU62GOSRXCRAAJDWVE3TKCPMURZE2LH5QHAF576A"/>
- </repository>
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ" name="node one">
- <address>a</address>
- </node>
- <node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
- <address>b</address>
- </node>
- <options>
- <rescanIntervalS>600</rescanIntervalS>
- </options>
- </configuration>
- `)
- v3data := []byte(`
- <configuration version="3">
- <repository id="test" directory="~/Sync" ro="true" ignorePerms="false">
- <node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" compression="false"></node>
- <node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" compression="false"></node>
- </repository>
- <node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" name="node one" compression="true">
- <address>a</address>
- </node>
- <node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="true">
- <address>b</address>
- </node>
- <options>
- <rescanIntervalS>600</rescanIntervalS>
- </options>
- </configuration>`)
- v4data := []byte(`
- <configuration version="4">
- <repository id="test" directory="~/Sync" ro="true" ignorePerms="false" rescanIntervalS="600">
- <node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR"></node>
- <node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2"></node>
- </repository>
- <node id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" name="node one" compression="true">
- <address>a</address>
- </node>
- <node id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="true">
- <address>b</address>
- </node>
- </configuration>`)
- for i, data := range [][]byte{v1data, v2data, v3data, v4data} {
- cfg, err := Load(bytes.NewReader(data), node1)
- if err != nil {
- t.Error(err)
- }
- expectedRepos := []RepositoryConfiguration{
- {
- ID: "test",
- Directory: "~/Sync",
- Nodes: []RepositoryNodeConfiguration{{NodeID: node1}, {NodeID: node4}},
- ReadOnly: true,
- RescanIntervalS: 600,
- },
- }
- expectedNodes := []NodeConfiguration{
- {
- NodeID: node1,
- Name: "node one",
- Addresses: []string{"a"},
- Compression: true,
- },
- {
- NodeID: node4,
- Name: "node two",
- Addresses: []string{"b"},
- Compression: true,
- },
- }
- expectedNodeIDs := []protocol.NodeID{node1, node4}
- if cfg.Version != 4 {
- t.Errorf("%d: Incorrect version %d != 3", i, cfg.Version)
- }
- if !reflect.DeepEqual(cfg.Repositories, expectedRepos) {
- t.Errorf("%d: Incorrect Repositories\n A: %#v\n E: %#v", i, cfg.Repositories, expectedRepos)
- }
- if !reflect.DeepEqual(cfg.Nodes, expectedNodes) {
- t.Errorf("%d: Incorrect Nodes\n A: %#v\n E: %#v", i, cfg.Nodes, expectedNodes)
- }
- if !reflect.DeepEqual(cfg.Repositories[0].NodeIDs(), expectedNodeIDs) {
- t.Errorf("%d: Incorrect NodeIDs\n A: %#v\n E: %#v", i, cfg.Repositories[0].NodeIDs(), expectedNodeIDs)
- }
- if len(cfg.NodeMap()) != len(expectedNodes) {
- t.Errorf("Unexpected number of NodeMap() entries")
- }
- if len(cfg.RepoMap()) != len(expectedRepos) {
- t.Errorf("Unexpected number of RepoMap() entries")
- }
- }
- }
- func TestNoListenAddress(t *testing.T) {
- data := []byte(`<configuration version="1">
- <options>
- <listenAddress></listenAddress>
- </options>
- </configuration>
- `)
- cfg, err := Load(bytes.NewReader(data), node1)
- if err != nil {
- t.Error(err)
- }
- expected := []string{""}
- if !reflect.DeepEqual(cfg.Options.ListenAddress, expected) {
- t.Errorf("Unexpected ListenAddress %#v", cfg.Options.ListenAddress)
- }
- }
- func TestOverriddenValues(t *testing.T) {
- data := []byte(`<configuration version="2">
- <options>
- <listenAddress>:23000</listenAddress>
- <allowDelete>false</allowDelete>
- <globalAnnounceServer>syncthing.nym.se:22026</globalAnnounceServer>
- <globalAnnounceEnabled>false</globalAnnounceEnabled>
- <localAnnounceEnabled>false</localAnnounceEnabled>
- <localAnnouncePort>42123</localAnnouncePort>
- <localAnnounceMCAddr>quux:3232</localAnnounceMCAddr>
- <parallelRequests>32</parallelRequests>
- <maxSendKbps>1234</maxSendKbps>
- <reconnectionIntervalS>6000</reconnectionIntervalS>
- <startBrowser>false</startBrowser>
- <upnpEnabled>false</upnpEnabled>
- <upnpLeaseMinutes>60</upnpLeaseMinutes>
- <upnpRenewalMinutes>15</upnpRenewalMinutes>
- </options>
- </configuration>
- `)
- expected := OptionsConfiguration{
- ListenAddress: []string{":23000"},
- GlobalAnnServer: "syncthing.nym.se:22026",
- GlobalAnnEnabled: false,
- LocalAnnEnabled: false,
- LocalAnnPort: 42123,
- LocalAnnMCAddr: "quux:3232",
- ParallelRequests: 32,
- MaxSendKbps: 1234,
- ReconnectIntervalS: 6000,
- StartBrowser: false,
- UPnPEnabled: false,
- UPnPLease: 60,
- UPnPRenewal: 15,
- }
- cfg, err := Load(bytes.NewReader(data), node1)
- if err != nil {
- t.Error(err)
- }
- if !reflect.DeepEqual(cfg.Options, expected) {
- t.Errorf("Overridden config differs;\n E: %#v\n A: %#v", expected, cfg.Options)
- }
- }
- func TestNodeAddressesDynamic(t *testing.T) {
- data := []byte(`
- <configuration version="2">
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ">
- <address></address>
- </node>
- <node id="GYRZZQBIRNPV4T7TC52WEQYJ3TFDQW6MWDFLMU4SSSU6EMFBK2VA">
- </node>
- <node id="LGFPDIT7SKNNJVJZA4FC7QNCRKCE753K72BW5QD2FOZ7FRFEP57Q">
- <address>dynamic</address>
- </node>
- </configuration>
- `)
- name, _ := os.Hostname()
- expected := []NodeConfiguration{
- {
- NodeID: node1,
- Addresses: []string{"dynamic"},
- Compression: true,
- },
- {
- NodeID: node2,
- Addresses: []string{"dynamic"},
- Compression: true,
- },
- {
- NodeID: node3,
- Addresses: []string{"dynamic"},
- Compression: true,
- },
- {
- NodeID: node4,
- Name: name, // Set when auto created
- Addresses: []string{"dynamic"},
- },
- }
- cfg, err := Load(bytes.NewReader(data), node4)
- if err != nil {
- t.Error(err)
- }
- if !reflect.DeepEqual(cfg.Nodes, expected) {
- t.Errorf("Nodes differ;\n E: %#v\n A: %#v", expected, cfg.Nodes)
- }
- }
- func TestNodeAddressesStatic(t *testing.T) {
- data := []byte(`
- <configuration version="3">
- <node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ">
- <address>192.0.2.1</address>
- <address>192.0.2.2</address>
- </node>
- <node id="GYRZZQBIRNPV4T7TC52WEQYJ3TFDQW6MWDFLMU4SSSU6EMFBK2VA">
- <address>192.0.2.3:6070</address>
- <address>[2001:db8::42]:4242</address>
- </node>
- <node id="LGFPDIT7SKNNJVJZA4FC7QNCRKCE753K72BW5QD2FOZ7FRFEP57Q">
- <address>[2001:db8::44]:4444</address>
- <address>192.0.2.4:6090</address>
- </node>
- </configuration>
- `)
- name, _ := os.Hostname()
- expected := []NodeConfiguration{
- {
- NodeID: node1,
- Addresses: []string{"192.0.2.1", "192.0.2.2"},
- },
- {
- NodeID: node2,
- Addresses: []string{"192.0.2.3:6070", "[2001:db8::42]:4242"},
- },
- {
- NodeID: node3,
- Addresses: []string{"[2001:db8::44]:4444", "192.0.2.4:6090"},
- },
- {
- NodeID: node4,
- Name: name, // Set when auto created
- Addresses: []string{"dynamic"},
- },
- }
- cfg, err := Load(bytes.NewReader(data), node4)
- if err != nil {
- t.Error(err)
- }
- if !reflect.DeepEqual(cfg.Nodes, expected) {
- t.Errorf("Nodes differ;\n E: %#v\n A: %#v", expected, cfg.Nodes)
- }
- }
- func TestVersioningConfig(t *testing.T) {
- data := []byte(`
- <configuration version="2">
- <repository id="test" directory="~/Sync" ro="true">
- <versioning type="simple">
- <param key="foo" val="bar"/>
- <param key="baz" val="quux"/>
- </versioning>
- </repository>
- </configuration>
- `)
- cfg, err := Load(bytes.NewReader(data), node4)
- if err != nil {
- t.Error(err)
- }
- vc := cfg.Repositories[0].Versioning
- if vc.Type != "simple" {
- t.Errorf(`vc.Type %q != "simple"`, vc.Type)
- }
- if l := len(vc.Params); l != 2 {
- t.Errorf("len(vc.Params) %d != 2", l)
- }
- expected := map[string]string{
- "foo": "bar",
- "baz": "quux",
- }
- if !reflect.DeepEqual(vc.Params, expected) {
- t.Errorf("vc.Params differ;\n E: %#v\n A: %#v", expected, vc.Params)
- }
- }
|