From c2d900ec74e03e9c782cfe7b7ce06ff62cda6601 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sat, 29 Aug 2026 18:58:06 +0900 Subject: pkg: move from internal Closes #43. Signed-off-by: Ophestra --- pkg/ir_test.go | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 pkg/ir_test.go (limited to 'pkg/ir_test.go') diff --git a/pkg/ir_test.go b/pkg/ir_test.go new file mode 100644 index 00000000..9cc024ae --- /dev/null +++ b/pkg/ir_test.go @@ -0,0 +1,170 @@ +package pkg_test + +import ( + "bytes" + "io" + "io/fs" + "reflect" + "testing" + + "hakurei.app/check" + "hakurei.app/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.NewTar(pkg.NewDecompress(pkg.NewHTTPGet( + nil, "file:///testdata", + pkg.Checksum(bytes.Repeat([]byte{0xff}, len(pkg.Checksum{}))), + ), pkg.Bzip2))}, + {"http get tar unaligned", pkg.NewTar(pkg.NewHTTPGet( + nil, "https://hakurei.app", + pkg.Checksum(bytes.Repeat([]byte{0xfe}, len(pkg.Checksum{}))), + ))}, + + {"exec offline", pkg.NewExec( + "exec-offline", "", nil, 0, false, 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.NewTar(pkg.NewHTTPGet( + nil, "file:///hakurei.tar", + pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))), + ))), pkg.MustPath("/opt", false, pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet( + nil, "file:///testtool.tar.gz", + pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))), + ), pkg.Gzip))), + )}, + + {"exec net", pkg.NewExec( + "exec-net", "", + (*pkg.Checksum)(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))), + 0, false, 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.NewTar(pkg.NewHTTPGet( + nil, "file:///hakurei.tar", + pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))), + ))), pkg.MustPath("/opt", false, pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet( + nil, "file:///testtool.tar.gz", + pkg.Checksum(bytes.Repeat([]byte{0xfc}, len(pkg.Checksum{}))), + ), pkg.Gzip))), + )}, + + {"exec measured", pkg.NewExec( + "exec-measured", "", + (*pkg.Checksum)(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))), + 0, false, false, + pkg.AbsWork, + []string{"HAKUREI_TEST=1"}, + check.MustAbs("/opt/bin/testtool"), + []string{"testtool", "measured"}, + + pkg.MustPath("/file", false, pkg.NewFile("file", []byte( + "stub file", + ))), pkg.MustPath("/.hakurei", false, pkg.NewTar(pkg.NewHTTPGet( + nil, "file:///hakurei.tar", + pkg.Checksum(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))), + ))), pkg.MustPath("/opt", false, pkg.NewTar(pkg.NewDecompress(pkg.NewHTTPGet( + nil, "file:///testtool.tar.gz", + pkg.Checksum(bytes.Repeat([]byte{0xfd}, len(pkg.Checksum{}))), + ), pkg.Gzip))), + )}, + + {"file anonymous", pkg.NewFile("", []byte{0})}, + {"file", pkg.NewFile("stub", []byte("stub"))}, + + {"decompress", pkg.NewDecompress(pkg.NewFile("", []byte{0}), pkg.Bzip2)}, + + {"archive", pkg.NewArchive(pkg.NewFile("", []byte{0}))}, + } + 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}, + "substitute": {Mode: fs.ModeDir | 0700}, + "work": {Mode: fs.ModeDir | 0700}, + }, + } + } + checkWithCache(t, testCasesCache) +} + +func TestRevision(t *testing.T) { + checkWithCache(t, []cacheTestCase{{"revision", 0, nil, + func(t *testing.T, base *check.Absolute, c *pkg.Cache) { + a := pkg.NewFile("", nil) + var buf bytes.Buffer + if err := c.EncodeAll(&buf, a); err != nil { + t.Fatal(err) + } + + if _, err := c.NewDecoder( + bytes.NewReader(buf.Bytes()), + ).Decode(); err != nil { + t.Fatalf("Decode: error = %v", err) + } + + p := buf.Bytes() + p[8] = 0xfd + wantErr := pkg.RevisionError{0xfd, 0} + if _, err := c.NewDecoder( + bytes.NewReader(p), + ).Decode(); !reflect.DeepEqual(err, wantErr) { + t.Fatalf("Decode: error = %v, want %v", err, wantErr) + } + }, expectsFS{ + ".": {Mode: fs.ModeDir | 0700}, + "checksum": {Mode: fs.ModeDir | 0700}, + "identifier": {Mode: fs.ModeDir | 0700}, + "substitute": {Mode: fs.ModeDir | 0700}, + "work": {Mode: fs.ModeDir | 0700}, + }, + }}) +} -- cgit v1.3.1