aboutsummaryrefslogtreecommitdiff
path: root/backup/restore_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'backup/restore_test.go')
-rw-r--r--backup/restore_test.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/backup/restore_test.go b/backup/restore_test.go
new file mode 100644
index 0000000..1a88e5f
--- /dev/null
+++ b/backup/restore_test.go
@@ -0,0 +1,109 @@
+package backup
+
+import (
+ "bytes"
+ "code.laria.me/petrific/fs"
+ "code.laria.me/petrific/objects"
+ "code.laria.me/petrific/storage"
+ "io"
+ "testing"
+)
+
+func withChildOfType(t *testing.T, root fs.Dir, name string, ft fs.FileType, do func(*testing.T, fs.File)) {
+ f, err := root.GetChild(name)
+ if err != nil {
+ t.Errorf("Could not GetChild(%s): %s", name, err)
+ return
+ }
+
+ if f.Type() != ft {
+ t.Errorf("Child '%s' has type %s, expected %s", name, f.Type(), ft)
+ return
+ }
+
+ do(t, f)
+}
+
+func wantFileWithContent(want []byte, exec bool) func(*testing.T, fs.File) {
+ return func(t *testing.T, f fs.File) {
+ rf := f.(fs.RegularFile)
+
+ if rf.Executable() != exec {
+ t.Errorf("Child '%s' has executable bit %b, expected %b", f.Name(), rf.Executable(), exec)
+ }
+
+ rwc, err := rf.Open()
+ if err != nil {
+ t.Errorf("could not open child '%s': %s", f.Name(), err)
+ }
+ defer rwc.Close()
+
+ buf := new(bytes.Buffer)
+ if _, err := io.Copy(buf, rwc); err != nil {
+ t.Errorf("Could not read content of child '%s': %s", err)
+ return
+ }
+
+ have := buf.Bytes()
+ if !bytes.Equal(have, want) {
+ t.Errorf("Unexpected content of child '%s': %s", f.Name(), have)
+ }
+ }
+}
+
+func wantDir(n int, fx func(*testing.T, fs.Dir)) func(*testing.T, fs.File) {
+ return func(t *testing.T, f fs.File) {
+ d := f.(fs.Dir)
+
+ children, err := d.Readdir()
+ if err != nil {
+ t.Errorf("Could not Readdir() '%s': %s", f.Name(), err)
+ return
+ }
+
+ if len(children) != n {
+ t.Errorf("Expected '%s' to have %d children, got %d", f.Name(), n, len(children))
+ return
+ }
+
+ fx(t, d)
+ }
+}
+
+func TestRestoreDir(t *testing.T) {
+ s := storage.NewMemoryStorage()
+
+ s.Set(objid_emptyfile, objects.OTFile, obj_emptyfile)
+ s.Set(objid_fooblob, objects.OTBlob, obj_fooblob)
+ s.Set(objid_foofile, objects.OTFile, obj_foofile)
+ s.Set(objid_emptytree, objects.OTTree, obj_emptytree)
+ s.Set(objid_subtree, objects.OTTree, obj_subtree)
+ s.Set(objid_testtree, objects.OTTree, obj_testtree)
+
+ root := fs.NewMemoryFSRoot("")
+
+ if err := RestoreDir(s, objid_testtree, root); err != nil {
+ t.Fatalf("Unexpected error from RestoreDir(): %s", err)
+ }
+
+ wantDir(4, func(t *testing.T, root fs.Dir) {
+ withChildOfType(t, root, "foo", fs.FFile, wantFileWithContent([]byte("foo"), false))
+ withChildOfType(t, root, "bar", fs.FFile, wantFileWithContent([]byte{}, true))
+ withChildOfType(t, root, "baz", fs.FSymlink, func(t *testing.T, f fs.File) {
+ target, err := f.(fs.Symlink).Readlink()
+ if err != nil {
+ t.Errorf("Could not Readlink() child 'baz': %s", err)
+ return
+ }
+
+ if target != "foo" {
+ t.Errorf("Unexpected target for baz: %s", target)
+ }
+ })
+
+ withChildOfType(t, root, "sub", fs.FDir, wantDir(2, func(t *testing.T, d fs.Dir) {
+ withChildOfType(t, d, "a", fs.FFile, wantFileWithContent([]byte{}, false))
+ withChildOfType(t, d, "b", fs.FDir, wantDir(0, func(t *testing.T, d fs.Dir) {}))
+ }))
+ })(t, root)
+}