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

	testdataFsys := 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: 01000000777, Data: []byte("/proc/nonexistent/libedac.so")},

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

		"work": {Mode: fs.ModeDir | 0700},
	}

	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},
	}))

	checkWithCache(t, []cacheTestCase{
		{"http", nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
			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),
			)
			wantChecksum := pkg.MustDecode(
				"yJlSb2A3jxaMLuKqwp1GwHOguAHddS9MjygF9ICEeegKfRvgLPdPmNh8mva47f8o",
			)
			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,
				})
			}
		}, pkg.MustDecode("lmVlYEGNFkwGVpzzS8KYjGBVB6FCyPtk9ViX88zen0GgTKLgGqO6eFxb4dpcP6bR")},
	})
}