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

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

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

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

	testCases := []struct {
		name string
		a    pkg.Artifact
	}{
		{"http get aligned", pkg.NewHTTPGet(
			nil, "file:///testdata",
			pkg.Checksum(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))),
		)},
		{"http get unaligned", pkg.NewHTTPGet(
			nil, "https://hakurei.app",
			pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
		)},

		{"http get tar", pkg.NewHTTPGetTar(
			nil, "file:///testdata",
			pkg.Checksum(bytes.Repeat([]byte{0xff}, len(pkg.Checksum{}))),
			pkg.TarBzip2,
		)},
		{"http get tar unaligned", pkg.NewHTTPGetTar(
			nil, "https://hakurei.app",
			pkg.Checksum(bytes.Repeat([]byte{0xfe}, len(pkg.Checksum{}))),
			pkg.TarUncompressed,
		)},

		{"exec offline", pkg.NewExec(
			"exec-offline", "", nil, 0, false,
			pkg.AbsWork,
			[]string{"HAKUREI_TEST=1"},
			check.MustAbs("/opt/bin/testtool"),
			[]string{"testtool"},

			pkg.MustPath("/file", false, pkg.NewFile("file", []byte(
				"stub file",
			))), pkg.MustPath("/.hakurei", false, pkg.NewHTTPGetTar(
				nil, "file:///hakurei.tar",
				pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
				pkg.TarUncompressed,
			)), pkg.MustPath("/opt", false, pkg.NewHTTPGetTar(
				nil, "file:///testtool.tar.gz",
				pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
				pkg.TarGzip,
			)),
		)},

		{"exec net", pkg.NewExec(
			"exec-net", "",
			(*pkg.Checksum)(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
			0, false,
			pkg.AbsWork,
			[]string{"HAKUREI_TEST=1"},
			check.MustAbs("/opt/bin/testtool"),
			[]string{"testtool", "net"},

			pkg.MustPath("/file", false, pkg.NewFile("file", []byte(
				"stub file",
			))), pkg.MustPath("/.hakurei", false, pkg.NewHTTPGetTar(
				nil, "file:///hakurei.tar",
				pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
				pkg.TarUncompressed,
			)), pkg.MustPath("/opt", false, pkg.NewHTTPGetTar(
				nil, "file:///testtool.tar.gz",
				pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))),
				pkg.TarGzip,
			)),
		)},

		{"file anonymous", pkg.NewFile("", []byte{0})},
		{"file", pkg.NewFile("stub", []byte("stub"))},
	}
	testCasesCache := make([]cacheTestCase, len(testCases))
	for i, tc := range testCases {
		want := tc.a
		testCasesCache[i] = cacheTestCase{tc.name, 0, nil,
			func(t *testing.T, base *check.Absolute, c *pkg.Cache) {
				r, w := io.Pipe()

				done := make(chan error, 1)
				go func() {
					t.Helper()
					done <- c.EncodeAll(w, want)
					_ = w.Close()
				}()

				if got, err := c.NewDecoder(r).Decode(); err != nil {
					t.Fatalf("Decode: error = %v", err)
				} else if !reflect.DeepEqual(got, want) {
					t.Fatalf("Decode: %#v, want %#v", got, want)
				}

				if err := <-done; err != nil {
					t.Fatalf("EncodeAll: error = %v", err)
				}
			}, expectsFS{
				".":          {Mode: fs.ModeDir | 0700},
				"checksum":   {Mode: fs.ModeDir | 0700},
				"identifier": {Mode: fs.ModeDir | 0700},
				"work":       {Mode: fs.ModeDir | 0700},
			},
		}
	}
	checkWithCache(t, testCasesCache)
}