diff options
Diffstat (limited to 'internal/pkg/ir_test.go')
| -rw-r--r-- | internal/pkg/ir_test.go | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/internal/pkg/ir_test.go b/internal/pkg/ir_test.go new file mode 100644 index 00000000..c5ffc6dc --- /dev/null +++ b/internal/pkg/ir_test.go @@ -0,0 +1,114 @@ +package pkg_test + +import ( + "bytes" + "io" + "reflect" + "testing" + + "hakurei.app/container/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, 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) + } + }, pkg.MustDecode( + "E4vEZKhCcL2gPZ2Tt59FS3lDng-d_2SKa2i5G_RbDfwGn6EemptFaGLPUDiOa94C", + ), + } + } + checkWithCache(t, testCasesCache) +} |
