aboutsummaryrefslogtreecommitdiff
path: root/backup/backup_test.go
blob: 2fee26e5cf059b392c7b5343a97b6473c48f3fe6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package backup

import (
	"bytes"
	"code.laria.me/petrific/cache"
	"code.laria.me/petrific/fs"
	"code.laria.me/petrific/objects"
	"code.laria.me/petrific/storage"
	"testing"
)

func wantObject(
	t *testing.T,
	s storage.Storage,
	id_str string,
	want []byte,
) {
	id, err := objects.ParseObjectId(id_str)
	if err != nil {
		t.Errorf("Could not parse id: %s", err)
		return
	}

	have, err := s.Get(id)
	if err != nil {
		t.Errorf("Could not get %s: %s", id, err)
		return
	}

	if !bytes.Equal(want, have) {
		t.Errorf("Wrong result for %s: (size=%d) %#s", id, len(have), have)
	}
}

func TestWriteLargeFile(t *testing.T) {
	s := storage.NewMemoryStorage()

	id, err := WriteFile(s, bytes.NewReader(make([]byte, 2*BlobChunkSize+100)))
	if err != nil {
		t.Fatalf("Unexpected error when writing file: %s", err)
	}

	if id.String() != "sha3-256:ab7907ee6b45b343422a0354de500bcf99f5ff69fe8125be84e43d421803c34e" {
		t.Errorf("Unexpected file id: %s", id)
	}

	want_large_blob := append([]byte("blob 16777216\n"), make([]byte, BlobChunkSize)...)
	want_small_blob := append([]byte("blob 100\n"), make([]byte, 100)...)
	want_file := []byte("file 274\n" +
		"blob=sha3-256:7287cbb09bdd8a0d96a6f6297413cd9d09a2763814636245a5a44120e6351be3&size=16777216\n" +
		"blob=sha3-256:7287cbb09bdd8a0d96a6f6297413cd9d09a2763814636245a5a44120e6351be3&size=16777216\n" +
		"blob=sha3-256:ddf124464f7b80e95f4a9c704f79e7037ff5d731648ba6b40c769893b428128c&size=100\n")

	wantObject(t, s, "sha3-256:ab7907ee6b45b343422a0354de500bcf99f5ff69fe8125be84e43d421803c34e", want_file)
	wantObject(t, s, "sha3-256:7287cbb09bdd8a0d96a6f6297413cd9d09a2763814636245a5a44120e6351be3", want_large_blob)
	wantObject(t, s, "sha3-256:ddf124464f7b80e95f4a9c704f79e7037ff5d731648ba6b40c769893b428128c", want_small_blob)
}

func mkfile(t *testing.T, d fs.Dir, name string, exec bool, content []byte) {
	f, err := d.CreateChildFile(name, exec)
	if err != nil {
		t.Fatalf("Could not create file %s: %s", name, err)
	}

	rwc, err := f.Open()
	if err != nil {
		t.Fatalf("Could not create file %s: %s", name, err)
	}
	defer rwc.Close()

	if _, err := rwc.Write(content); err != nil {
		t.Fatalf("Could not create file %s: %s", name, err)
	}
}

func TestWriteDir(t *testing.T) {
	s := storage.NewMemoryStorage()

	root := fs.NewMemoryFSRoot("root")

	mkfile(t, root, "foo", false, []byte("foo"))
	mkfile(t, root, "bar", true, []byte(""))
	if _, err := root.CreateChildSymlink("baz", "foo"); err != nil {
		t.Fatalf("Failed creating symlink baz: %s", err)
	}
	d, err := root.CreateChildDir("sub")
	if err != nil {
		t.Fatalf("Failed creating dir: %s", err)
	}
	mkfile(t, d, "a", false, []byte(""))
	if _, err = d.CreateChildDir("b"); err != nil {
		t.Fatalf("Failed creating dir: %s", err)
	}

	id, err := WriteDir(s, "", root, cache.NopCache{})
	if err != nil {
		t.Fatalf("Could not WriteDir: %s", err)
	}

	if id.String() != "sha3-256:09e881f57befa1eacec744e3857a36f0d9d5dd1fa72ba96564b467a3d7d0c0d5" {
		t.Errorf("Unexpected dir id: %s", id)
	}

	//4a10682307d5b5dc072d1b862497296640176109347b149aad38cd640000491b
	obj_emptyfile := []byte("file 0\n")

	//ba632076629ff33238850c870fcb51e4b7b67b3d9dcb66314adbcf1770a5fea7
	obj_fooblob := []byte("blob 3\nfoo")
	//fa50ca1fc739852528ecc149b424a8ccbdf84b73c8718cde4525f2a410d79244
	obj_foofile := []byte("file 86\nblob=sha3-256:ba632076629ff33238850c870fcb51e4b7b67b3d9dcb66314adbcf1770a5fea7&size=3\n")

	//1dc6fae780ae4a1e823a5b8e26266356a2e1d22e5904b0652dcff6e3c0e72067
	obj_emptytree := []byte("tree 0\n")

	//f1716a1b0cad23b6faab9712243402b8f8e7919c377fc5d5d87bd465cef056d7
	obj_subdir := []byte("tree 239\n" +
		"acl=u::rw-,g::r--,o::r--&name=a&ref=sha3-256:4a10682307d5b5dc072d1b862497296640176109347b149aad38cd640000491b&type=file\n" +
		"acl=u::rwx,g::r-x,o::r-x&name=b&ref=sha3-256:1dc6fae780ae4a1e823a5b8e26266356a2e1d22e5904b0652dcff6e3c0e72067&type=dir\n")

	//09e881f57befa1eacec744e3857a36f0d9d5dd1fa72ba96564b467a3d7d0c0d5
	obj_dir := []byte("tree 423\n" +
		"acl=u::rw-,g::r--,o::r--&name=baz&target=foo&type=symlink\n" +
		"acl=u::rw-,g::r--,o::r--&name=foo&ref=sha3-256:fa50ca1fc739852528ecc149b424a8ccbdf84b73c8718cde4525f2a410d79244&type=file\n" +
		"acl=u::rwx,g::r-x,o::r-x&name=bar&ref=sha3-256:4a10682307d5b5dc072d1b862497296640176109347b149aad38cd640000491b&type=file\n" +
		"acl=u::rwx,g::r-x,o::r-x&name=sub&ref=sha3-256:f1716a1b0cad23b6faab9712243402b8f8e7919c377fc5d5d87bd465cef056d7&type=dir\n")

	wantObject(t, s, "sha3-256:4a10682307d5b5dc072d1b862497296640176109347b149aad38cd640000491b", obj_emptyfile)
	wantObject(t, s, "sha3-256:ba632076629ff33238850c870fcb51e4b7b67b3d9dcb66314adbcf1770a5fea7", obj_fooblob)
	wantObject(t, s, "sha3-256:fa50ca1fc739852528ecc149b424a8ccbdf84b73c8718cde4525f2a410d79244", obj_foofile)
	wantObject(t, s, "sha3-256:1dc6fae780ae4a1e823a5b8e26266356a2e1d22e5904b0652dcff6e3c0e72067", obj_emptytree)
	wantObject(t, s, "sha3-256:f1716a1b0cad23b6faab9712243402b8f8e7919c377fc5d5d87bd465cef056d7", obj_subdir) //!
	wantObject(t, s, "sha3-256:09e881f57befa1eacec744e3857a36f0d9d5dd1fa72ba96564b467a3d7d0c0d5", obj_dir)    //!
}