mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-08 22:31:04 +00:00
8f3effed32
New node ID:s contain four Luhn check digits and are grouped differently. Code uses NodeID type instead of string, so it's formatted homogenously everywhere.
326 lines
8.3 KiB
Go
326 lines
8.3 KiB
Go
// Copyright (C) 2014 Jakob Borg and other contributors. 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/calmh/syncthing/files"
|
|
"github.com/calmh/syncthing/protocol"
|
|
"github.com/calmh/syncthing/scanner"
|
|
)
|
|
|
|
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:22025",
|
|
GlobalAnnEnabled: true,
|
|
LocalAnnEnabled: true,
|
|
LocalAnnPort: 21025,
|
|
ParallelRequests: 16,
|
|
MaxSendKbps: 0,
|
|
RescanIntervalS: 60,
|
|
ReconnectIntervalS: 60,
|
|
MaxChangeKbps: 10000,
|
|
StartBrowser: true,
|
|
UPnPEnabled: true,
|
|
}
|
|
|
|
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>
|
|
</repository>
|
|
<options>
|
|
<readOnly>true</readOnly>
|
|
</options>
|
|
</configuration>
|
|
`)
|
|
|
|
v2data := []byte(`
|
|
<configuration version="2">
|
|
<repository id="test" directory="~/Sync" ro="true">
|
|
<node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ"/>
|
|
<node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ"/>
|
|
</repository>
|
|
<node id="AIR6LPZ7K4PTTUXQSMUUCPQ5YWOEDFIIQJUG7772YQXXR5YD6AWQ" name="node one">
|
|
<address>a</address>
|
|
</node>
|
|
<node id="P56IOI7MZJNU2IQGDREYDM2MGTMGL3BXNPQ6W5BTBBZ4TJXZWICQ" name="node two">
|
|
<address>b</address>
|
|
</node>
|
|
</configuration>
|
|
`)
|
|
|
|
for i, data := range [][]byte{v1data, v2data} {
|
|
cfg, err := Load(bytes.NewReader(data), node1)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
expectedRepos := []RepositoryConfiguration{
|
|
{
|
|
ID: "test",
|
|
Directory: "~/Sync",
|
|
Nodes: []NodeConfiguration{{NodeID: node1}, {NodeID: node4}},
|
|
ReadOnly: true,
|
|
},
|
|
}
|
|
expectedNodes := []NodeConfiguration{
|
|
{
|
|
NodeID: node1,
|
|
Name: "node one",
|
|
Addresses: []string{"a"},
|
|
},
|
|
{
|
|
NodeID: node4,
|
|
Name: "node two",
|
|
Addresses: []string{"b"},
|
|
},
|
|
}
|
|
expectedNodeIDs := []protocol.NodeID{node1, node4}
|
|
|
|
if cfg.Version != 2 {
|
|
t.Errorf("%d: Incorrect version %d != 2", 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)
|
|
}
|
|
}
|
|
}
|
|
|
|
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:22025</globalAnnounceServer>
|
|
<globalAnnounceEnabled>false</globalAnnounceEnabled>
|
|
<localAnnounceEnabled>false</localAnnounceEnabled>
|
|
<localAnnouncePort>42123</localAnnouncePort>
|
|
<parallelRequests>32</parallelRequests>
|
|
<maxSendKbps>1234</maxSendKbps>
|
|
<rescanIntervalS>600</rescanIntervalS>
|
|
<reconnectionIntervalS>6000</reconnectionIntervalS>
|
|
<maxChangeKbps>2345</maxChangeKbps>
|
|
<startBrowser>false</startBrowser>
|
|
<upnpEnabled>false</upnpEnabled>
|
|
</options>
|
|
</configuration>
|
|
`)
|
|
|
|
expected := OptionsConfiguration{
|
|
ListenAddress: []string{":23000"},
|
|
GlobalAnnServer: "syncthing.nym.se:22025",
|
|
GlobalAnnEnabled: false,
|
|
LocalAnnEnabled: false,
|
|
LocalAnnPort: 42123,
|
|
ParallelRequests: 32,
|
|
MaxSendKbps: 1234,
|
|
RescanIntervalS: 600,
|
|
ReconnectIntervalS: 6000,
|
|
MaxChangeKbps: 2345,
|
|
StartBrowser: false,
|
|
UPnPEnabled: false,
|
|
}
|
|
|
|
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 TestNodeAddresses(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"},
|
|
},
|
|
{
|
|
NodeID: node2,
|
|
Addresses: []string{"dynamic"},
|
|
},
|
|
{
|
|
NodeID: node3,
|
|
Addresses: []string{"dynamic"},
|
|
},
|
|
{
|
|
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 TestSyncOrders(t *testing.T) {
|
|
data := []byte(`
|
|
<configuration version="2">
|
|
<repository directory="~/Sync">
|
|
<syncorder>
|
|
<pattern pattern="\.jpg$" priority="1" />
|
|
</syncorder>
|
|
</repository>
|
|
</configuration>
|
|
`)
|
|
|
|
expected := []SyncOrderPattern{
|
|
{
|
|
Pattern: "\\.jpg$",
|
|
Priority: 1,
|
|
},
|
|
}
|
|
|
|
cfg, err := Load(bytes.NewReader(data), node1)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
for i := range expected {
|
|
if !reflect.DeepEqual(cfg.Repositories[0].SyncOrderPatterns[i], expected[i]) {
|
|
t.Errorf("Patterns[%d] differ;\n E: %#v\n A: %#v", i, expected[i], cfg.Repositories[0].SyncOrderPatterns[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFileSorter(t *testing.T) {
|
|
rcfg := RepositoryConfiguration{
|
|
SyncOrderPatterns: []SyncOrderPattern{
|
|
{"\\.jpg$", 10, nil},
|
|
{"\\.mov$", 5, nil},
|
|
{"^camera-uploads", 100, nil},
|
|
},
|
|
}
|
|
|
|
f := []scanner.File{
|
|
{Name: "bar.mov"},
|
|
{Name: "baz.txt"},
|
|
{Name: "foo.jpg"},
|
|
{Name: "frew/foo.jpg"},
|
|
{Name: "frew/lol.go"},
|
|
{Name: "frew/rofl.copter"},
|
|
{Name: "frew/bar.mov"},
|
|
{Name: "camera-uploads/foo.jpg"},
|
|
{Name: "camera-uploads/hurr.pl"},
|
|
{Name: "camera-uploads/herp.mov"},
|
|
{Name: "camera-uploads/wee.txt"},
|
|
}
|
|
|
|
files.SortBy(rcfg.FileRanker()).Sort(f)
|
|
|
|
expected := []scanner.File{
|
|
{Name: "camera-uploads/foo.jpg"},
|
|
{Name: "camera-uploads/herp.mov"},
|
|
{Name: "camera-uploads/hurr.pl"},
|
|
{Name: "camera-uploads/wee.txt"},
|
|
{Name: "foo.jpg"},
|
|
{Name: "frew/foo.jpg"},
|
|
{Name: "bar.mov"},
|
|
{Name: "frew/bar.mov"},
|
|
{Name: "frew/lol.go"},
|
|
{Name: "baz.txt"},
|
|
{Name: "frew/rofl.copter"},
|
|
}
|
|
|
|
if !reflect.DeepEqual(f, expected) {
|
|
t.Errorf(
|
|
"\n\nexpected:\n" +
|
|
formatFiles(expected) + "\n" +
|
|
"got:\n" +
|
|
formatFiles(f) + "\n\n",
|
|
)
|
|
}
|
|
}
|
|
|
|
func formatFiles(f []scanner.File) string {
|
|
ret := ""
|
|
|
|
for _, v := range f {
|
|
ret += " " + v.Name + "\n"
|
|
}
|
|
|
|
return ret
|
|
}
|