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

import (
	"archive/tar"
	"bytes"
	"compress/gzip"
	"crypto/sha512"
	"io/fs"
	"net/http"
	"testing"
	"testing/fstest"

	"hakurei.app/container/check"
	"hakurei.app/internal/pkg"
)

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

	checkWithCache(t, []cacheTestCase{
		{"http", nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
			checkTarHTTP(t, base, c, fstest.MapFS{
				".": {Mode: fs.ModeDir | 0700},

				"checksum": {Mode: fs.ModeDir | 0700},
				"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP":                {Mode: fs.ModeDir | 0700},
				"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/check":          {Mode: 0400, Data: []byte{0, 0}},
				"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib":            {Mode: fs.ModeDir | 0700},
				"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/pkgconfig":  {Mode: fs.ModeDir | 0700},
				"checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP/lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},

				"identifier": {Mode: fs.ModeDir | 0700},
				"identifier/HnySzeLQvSBZuTUcvfmLEX_OmH4yJWWH788NxuLuv7kVn8_uPM6Ks4rqFWM2NZJY": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},
				"identifier/Zx5ZG9BAwegNT3zQwCySuI2ktCXxNgxirkGLFjW4FW06PtojYVaCdtEw8yuntPLa": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/1TL00Qb8dcqayX7wTO8WNaraHvY6b-KCsctLDTrb64QBCmxj_-byK1HdIUwMaFEP")},

				"work": {Mode: fs.ModeDir | 0700},
			}, pkg.MustDecode(
				"cTw0h3AmYe7XudSoyEMByduYXqGi-N5ZkTZ0t9K5elsu3i_jNIVF5T08KR1roBFM",
			))
		}, pkg.MustDecode("PrNWkHqtSmdtVecctlI9Xf63dQPIyyLBIMCtRAP2-VqF9u1oQ8ydV7-WPbzEvMkG")},

		{"http expand", nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
			checkTarHTTP(t, base, c, fstest.MapFS{
				".": {Mode: fs.ModeDir | 0700},

				"lib":            {Mode: fs.ModeDir | 0700},
				"lib/libedac.so": {Mode: fs.ModeSymlink | 0777, Data: []byte("/proc/nonexistent/libedac.so")},
			}, pkg.MustDecode(
				"CH3AiUrCCcVOjOYLaMKKK1Da78989JtfHeIsxMzWOQFiN4mrCLDYpoDxLWqJWCUN",
			))
		}, pkg.MustDecode("YZUoGdMwmfW5sQWto9hQgMKah648rHKck8Ds_GGnqgCBpTAiZKOefpHCKnvktfYh")},
	})
}

func checkTarHTTP(
	t *testing.T,
	base *check.Absolute,
	c *pkg.Cache,
	testdataFsys fs.FS,
	wantChecksum pkg.Checksum,
) {
	var testdata string
	{
		var buf bytes.Buffer
		w := tar.NewWriter(&buf)
		if err := w.AddFS(testdataFsys); err != nil {
			t.Fatalf("AddFS: error = %v", err)
		}
		if err := w.Close(); err != nil {
			t.Fatalf("Close: error = %v", err)
		}

		var zbuf bytes.Buffer
		gw := gzip.NewWriter(&zbuf)
		if _, err := gw.Write(buf.Bytes()); err != nil {
			t.Fatalf("Write: error = %v", err)
		}
		if err := gw.Close(); err != nil {
			t.Fatalf("Close: error = %v", err)
		}
		testdata = zbuf.String()
	}

	testdataChecksum := func() pkg.Checksum {
		h := sha512.New384()
		h.Write([]byte(testdata))
		return (pkg.Checksum)(h.Sum(nil))
	}()

	var transport http.Transport
	client := http.Client{Transport: &transport}
	transport.RegisterProtocol("file", http.NewFileTransportFS(fstest.MapFS{
		"testdata": {Data: []byte(testdata), Mode: 0400},
	}))

	wantIdent := func() pkg.ID {
		h := sha512.New384()
		h.Write([]byte{byte(pkg.KindTar), 0, 0, 0, 0, 0, 0, 0})
		h.Write([]byte{pkg.TarGzip, 0, 0, 0, 0, 0, 0, 0})
		h.Write([]byte{byte(pkg.KindHTTPGet), 0, 0, 0, 0, 0, 0, 0})
		httpIdent := pkg.KindHTTPGet.Ident([]byte("file:///testdata"))
		h.Write(httpIdent[:])
		return pkg.ID(h.Sum(nil))
	}()

	a := pkg.NewHTTPGetTar(
		t.Context(),
		&client,
		"file:///testdata",
		testdataChecksum,
		pkg.TarGzip,
	)

	if id := pkg.Ident(a); id != wantIdent {
		t.Fatalf("Ident: %s, want %s", pkg.Encode(id), pkg.Encode(wantIdent))
	}

	wantPathname := base.Append(
		"identifier",
		pkg.Encode(wantIdent),
	)
	if pathname, checksum, err := c.Cure(a); err != nil {
		t.Fatalf("Cure: error = %v", err)
	} else if !pathname.Is(wantPathname) {
		t.Fatalf("Cure: %q, want %q", pathname, wantPathname)
	} else if checksum != wantChecksum {
		t.Fatalf("Cure: %v", &pkg.ChecksumMismatchError{
			Got:  checksum,
			Want: wantChecksum,
		})
	}
}