Browse Source

lib/config: Repair versioning XML serialization (fixes #6859, ref #6693)

Jakob Borg 5 years ago
parent
commit
62cff26edf
2 changed files with 39 additions and 1 deletions
  1. 34 0
      lib/config/config_test.go
  2. 5 1
      lib/config/versioningconfiguration.go

+ 34 - 0
lib/config/config_test.go

@@ -9,6 +9,7 @@ package config
 import (
 	"bytes"
 	"encoding/json"
+	"encoding/xml"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -1173,3 +1174,36 @@ func load(path string, myID protocol.DeviceID) (Wrapper, error) {
 func wrap(path string, cfg Configuration) Wrapper {
 	return Wrap(path, cfg, events.NoopLogger)
 }
+
+func TestInternalVersioningConfiguration(t *testing.T) {
+	// Verify that the versioning configuration XML seralizes to something
+	// reasonable.
+
+	cfg := New(device1)
+	cfg.Folders = append(cfg.Folders, NewFolderConfiguration(device1, "default", "default", fs.FilesystemTypeBasic, "/tmp"))
+	cfg.Folders[0].Versioning = VersioningConfiguration{
+		Type:             "foo",
+		Params:           map[string]string{"bar": "baz"},
+		CleanupIntervalS: 42,
+	}
+
+	// These things should all be present in the serialized version.
+	expected := []string{
+		`<versioning type="foo">`,
+		`<param key="bar" val="baz"`,
+		`<cleanupIntervalS>42<`,
+		`</versioning>`,
+	}
+
+	bs, err := xml.MarshalIndent(cfg, "", "  ")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	for _, exp := range expected {
+		if !strings.Contains(string(bs), exp) {
+			t.Logf("%s", bs)
+			t.Fatal("bad serializion of versioning parameters")
+		}
+	}
+}

+ 5 - 1
lib/config/versioningconfiguration.go

@@ -60,7 +60,11 @@ func (c *VersioningConfiguration) UnmarshalXML(d *xml.Decoder, start xml.StartEl
 }
 
 func (c *VersioningConfiguration) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
-	return e.Encode(c.toInternal())
+	// Using EncodeElement instead of plain Encode ensures that we use the
+	// outer tag name from the VersioningConfiguration (i.e.,
+	// `<versioning>`) rather than whatever the internal representation
+	// would otherwise be.
+	return e.EncodeElement(c.toInternal(), start)
 }
 
 func (c *VersioningConfiguration) toInternal() internalVersioningConfiguration {