Copy configuration struct when sending Changed() events

Avoids data race. Copy() must be called with lock held.
This commit is contained in:
Jakob Borg
2015-04-05 17:36:52 +02:00
parent a5edb6807e
commit bf4eb4b269
4 changed files with 147 additions and 11 deletions

View File

@@ -7,6 +7,8 @@
package config
import (
"bytes"
"encoding/json"
"fmt"
"os"
"reflect"
@@ -438,3 +440,42 @@ func TestRequiresRestart(t *testing.T) {
t.Error("Changing GUI options requires restart")
}
}
func TestCopy(t *testing.T) {
wrapper, err := Load("testdata/example.xml", device1)
if err != nil {
t.Fatal(err)
}
cfg := wrapper.Raw()
bsOrig, err := json.MarshalIndent(cfg, "", " ")
if err != nil {
t.Fatal(err)
}
copy := cfg.Copy()
cfg.Devices[0].Addresses[0] = "wrong"
cfg.Folders[0].Devices[0].DeviceID = protocol.DeviceID{0, 1, 2, 3}
cfg.Options.ListenAddress[0] = "wrong"
cfg.GUI.APIKey = "wrong"
bsChanged, err := json.MarshalIndent(cfg, "", " ")
if err != nil {
t.Fatal(err)
}
bsCopy, err := json.MarshalIndent(copy, "", " ")
if err != nil {
t.Fatal(err)
}
if bytes.Compare(bsOrig, bsChanged) == 0 {
t.Error("Config should have changed")
}
if bytes.Compare(bsOrig, bsCopy) != 0 {
//ioutil.WriteFile("a", bsOrig, 0644)
//ioutil.WriteFile("b", bsCopy, 0644)
t.Error("Copy should be unchanged")
}
}