aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/dir_test.go
blob: 7bc877d114527844f34f6a2c429051042abc715e (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
package pkg_test

import (
	"bytes"
	"io/fs"
	"reflect"
	"testing"
	"testing/fstest"

	"hakurei.app/internal/pkg"
)

func TestFlatten(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name    string
		fsys    fs.FS
		entries []pkg.FlatEntry
		sum     pkg.Checksum
	}{
		{"sample cache file", fstest.MapFS{
			".": {Mode: 020000000700},

			"checksum": {Mode: 020000000700},
			"checksum/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX": {Mode: 0400, Data: []byte{0}},
			"checksum/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq": {Mode: 0400, Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},

			"identifier": {Mode: 020000000700},
			"identifier/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX": {Mode: 0400, Data: []byte{0}},
			"identifier/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq": {Mode: 0400, Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
			"identifier/cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe": {Mode: 0400, Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
			"identifier/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef": {Mode: 0400, Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
		}, []pkg.FlatEntry{
			{Mode: 020000000700, Path: "."},

			{Mode: 020000000700, Path: "checksum"},
			{Mode: 0400, Path: "checksum/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq", Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
			{Mode: 0400, Path: "checksum/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX", Data: []byte{0}},

			{Mode: 020000000700, Path: "identifier"},
			{Mode: 0400, Path: "identifier/0bSFPu5Tnd-2Jj0Mv6co23PW2t3BmHc7eLFj9TgY3eIBg8zislo7xZYNBqovVLcq", Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
			{Mode: 0400, Path: "identifier/cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe", Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
			{Mode: 0400, Path: "identifier/deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", Data: []byte{0, 0, 0, 0, 0xad, 0xb, 0, 4, 0xfe, 0xfe, 0, 0, 0xfe, 0xca, 0, 0}},
			{Mode: 0400, Path: "identifier/vsAhtPNo4waRNOASwrQwcIPTqb3SBuJOXw2G4T1mNmVZM-wrQTRllmgXqcIIoRcX", Data: []byte{0}},
		}, pkg.MustDecode("ZNSQH-mjhtIbFvi51lQ0UjatjoS8_5ILrBPNWlO2LWTq9P6MJEnekYzP0esUJnVr")},
	}
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			t.Run("roundtrip", func(t *testing.T) {
				t.Parallel()

				var buf bytes.Buffer
				if _, err := pkg.Flatten(tc.fsys, ".", &buf); err != nil {
					t.Fatalf("Flatten: error = %v", err)
				}

				s := pkg.NewDirScanner(bytes.NewReader(buf.Bytes()))
				var got []pkg.FlatEntry
				for s.Scan() {
					got = append(got, *s.Entry())
				}
				if err := s.Err(); err != nil {
					t.Fatalf("Err: error = %v", err)
				}

				if !reflect.DeepEqual(got, tc.entries) {
					t.Fatalf("Scan: %#v, want %#v", got, tc.entries)
				}
			})

			t.Run("hash", func(t *testing.T) {
				t.Parallel()

				if got, err := pkg.HashFS(tc.fsys, "."); err != nil {
					t.Fatalf("HashFS: error = %v", err)
				} else if got != tc.sum {
					t.Fatalf("HashFS: %v", &pkg.ChecksumMismatchError{
						Got:  got,
						Want: tc.sum,
					})
				}
			})
		})
	}
}