diff --git a/system_test/cluster_test.go b/system_test/cluster_test.go index 8170b4f7..58384266 100644 --- a/system_test/cluster_test.go +++ b/system_test/cluster_test.go @@ -1258,7 +1258,7 @@ func Test_MultiNodeCluster_Backup(t *testing.T) { backupFile := mustTempFile() defer os.Remove(backupFile) - if err := followers[0].Backup(backupFile); err != nil { + if err := followers[0].Backup(backupFile, false); err != nil { t.Fatalf("failed to get backup from follower: %s", err.Error()) } diff --git a/system_test/helpers.go b/system_test/helpers.go index 4ee1d45b..c07fb21f 100644 --- a/system_test/helpers.go +++ b/system_test/helpers.go @@ -198,8 +198,13 @@ func (n *Node) Load(filename string) (string, error) { } // Backup backs up the node's database to the given file. -func (n *Node) Backup(filename string) error { +func (n *Node) Backup(filename string, compress bool) error { v, _ := url.Parse("http://" + n.APIAddr + "/db/backup") + if compress { + q := v.Query() + q.Set("compress", "true") + v.RawQuery = q.Encode() + } resp, err := http.Get(v.String()) if err != nil { return err diff --git a/system_test/single_node_test.go b/system_test/single_node_test.go index 9110176b..6ea486e0 100644 --- a/system_test/single_node_test.go +++ b/system_test/single_node_test.go @@ -4,7 +4,9 @@ Package system runs system-level testing of rqlite. This includes testing of sin package system import ( + "compress/gzip" "fmt" + "io" "os" "path/filepath" "regexp" @@ -981,19 +983,17 @@ func Test_SingleNodeBackup(t *testing.T) { backup := mustTempFile() defer os.Remove(backup) - if err := node.Backup(backup); err != nil { + if err := node.Backup(backup, false); err != nil { t.Fatalf(`backup failed: %s`, err.Error()) } + // Create new node, and restore from backup. newNode := mustNewLeaderNode("leader2") defer newNode.Deprovision() - _, err = newNode.Boot(backup) if err != nil { t.Fatalf(`boot failed: %s`, err.Error()) } - - // check that the row is present in the new node r, err := newNode.Query(`SELECT * FROM foo`) if err != nil { t.Fatalf(`query failed: %s`, err.Error()) @@ -1001,6 +1001,49 @@ func Test_SingleNodeBackup(t *testing.T) { if r != `{"results":[{"columns":["id","name"],"types":["integer","text"],"values":[[1,"fiona"]]}]}` { t.Fatalf("test received wrong result got %s", r) } + + // Get a compressed backup, test it again. + if err := node.Backup(backup, true); err != nil { + t.Fatalf(`backup failed: %s`, err.Error()) + } + + // decompress backup and check it. + decompressedBackup := mustTempFile() + defer os.Remove(decompressedBackup) + + f, err := os.Open(backup) + if err != nil { + t.Fatalf(`failed to open backup: %s`, err.Error()) + } + defer f.Close() + gzr, err := gzip.NewReader(f) + if err != nil { + t.Fatalf(`failed to create gzip reader: %s`, err.Error()) + } + defer gzr.Close() + w, err := os.Create(decompressedBackup) + if err != nil { + t.Fatalf(`failed to create decompressed backup: %s`, err.Error()) + } + defer w.Close() + if _, err := io.Copy(w, gzr); err != nil { + t.Fatalf(`failed to decompress backup: %s`, err.Error()) + } + + // Create new node, and restore from backup. + newNode2 := mustNewLeaderNode("leader3") + defer newNode2.Deprovision() + _, err = newNode2.Boot(decompressedBackup) + if err != nil { + t.Fatalf(`boot failed: %s`, err.Error()) + } + r, err = newNode2.Query(`SELECT * FROM foo`) + if err != nil { + t.Fatalf(`query failed: %s`, err.Error()) + } + if r != `{"results":[{"columns":["id","name"],"types":["integer","text"],"values":[[1,"fiona"]]}]}` { + t.Fatalf("test received wrong result got %s", r) + } } func Test_SingleNodeNodes(t *testing.T) {