diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-05-07 18:04:59 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-05-07 19:43:06 +0900 |
| commit | 8d72b9e5bd8d99cbd32ce0ebe2f5da8e9b1d88ce (patch) | |
| tree | 403a00ccd0d1ed98795a4e739b72f2de12b34102 /internal/pkg/exec_test.go | |
| parent | 8a3c3d145a560b91da1d9bce9070c20289b63502 (diff) | |
internal/pkg: optionally register binfmt
This transparently supports curing foreign exec artifacts.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/exec_test.go')
| -rw-r--r-- | internal/pkg/exec_test.go | 95 |
1 files changed, 86 insertions, 9 deletions
diff --git a/internal/pkg/exec_test.go b/internal/pkg/exec_test.go index 5d2905d4..73249a56 100644 --- a/internal/pkg/exec_test.go +++ b/internal/pkg/exec_test.go @@ -8,12 +8,15 @@ import ( "net" "os" "os/exec" + "path/filepath" "slices" "testing" "unique" "hakurei.app/check" + "hakurei.app/container" "hakurei.app/hst" + "hakurei.app/internal/info" "hakurei.app/internal/pkg" "hakurei.app/internal/stub" @@ -27,6 +30,17 @@ import ( //go:embed internal/testtool/testtool var testtoolBin []byte +func init() { + pathname, err := filepath.Abs("internal/testtool/testtool") + if err != nil { + panic(err) + } + pkg.RegisterArch("cafe", container.BinfmtEntry{ + Magic: expected.Magic, + Interpreter: check.MustAbs(pathname), + }) +} + func TestExec(t *testing.T) { t.Parallel() @@ -43,7 +57,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - "exec-offline", nil, 0, false, + "exec-offline", "", nil, 0, false, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -66,7 +80,7 @@ func TestExec(t *testing.T) { ), ignorePathname, wantOffline, nil}, {"error passthrough", pkg.NewExec( - "", nil, 0, true, + "", "", nil, 0, true, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -89,7 +103,7 @@ func TestExec(t *testing.T) { }}, {"invalid paths", pkg.NewExec( - "", nil, 0, false, + "", "", nil, 0, false, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -102,7 +116,7 @@ func TestExec(t *testing.T) { // check init failure passthrough var exitError *exec.ExitError if _, _, err := c.Cure(pkg.NewExec( - "", nil, 0, false, + "", "", nil, 0, false, pkg.AbsWork, nil, check.MustAbs("/opt/bin/testtool"), @@ -141,7 +155,7 @@ func TestExec(t *testing.T) { } cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - "exec-net", new(wantNet.hash()), 0, false, + "exec-net", "", new(wantNet.hash()), 0, false, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -188,7 +202,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - "exec-overlay-root", nil, 0, false, + "exec-overlay-root", "", nil, 0, false, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/opt/bin/testtool"), @@ -227,7 +241,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - "exec-overlay-work", nil, 0, false, + "exec-overlay-work", "", nil, 0, false, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/work/bin/testtool"), @@ -271,7 +285,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - "exec-multiple-layers", nil, 0, false, + "exec-multiple-layers", "", nil, 0, false, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/opt/bin/testtool"), @@ -342,7 +356,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - "exec-layer-promotion", nil, 0, true, + "exec-layer-promotion", "", nil, 0, true, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/opt/bin/testtool"), @@ -382,6 +396,69 @@ func TestExec(t *testing.T) { "temp": {Mode: fs.ModeDir | 0700}, "work": {Mode: fs.ModeDir | 0700}, }}, + + {"binfmt", pkg.CValidateKnown, nil, func(t *testing.T, base *check.Absolute, c *pkg.Cache) { + if info.CanDegrade && os.Getenv("ROSA_SKIP_BINFMT") != "" { + t.Skip("binfmt_misc test explicitly skipped") + } + + cureMany(t, c, []cureStep{ + {"container", pkg.NewExec( + "exec-binfmt", "cafe", nil, 0, true, + pkg.AbsWork, + []string{"HAKUREI_TEST=1", "HAKUREI_BINFMT=1"}, + check.MustAbs("/opt/bin/sample"), + []string{"sample"}, + + pkg.MustPath("/", true, &stubArtifact{ + kind: pkg.KindTar, + params: []byte("empty directory"), + cure: func(t *pkg.TContext) error { + return os.MkdirAll(t.GetWorkDir().String(), 0700) + }, + }), + pkg.MustPath("/opt", false, overrideIdent{pkg.ID{0xfe, 0xff}, &stubArtifact{ + kind: pkg.KindTar, + cure: func(t *pkg.TContext) error { + work := t.GetWorkDir() + if err := os.MkdirAll( + work.Append("bin").String(), + 0700, + ); err != nil { + return err + } + + return os.WriteFile(t.GetWorkDir().Append( + "bin", + "sample", + ).String(), []byte(expected.Full), 0500) + }, + }}), + ), ignorePathname, expectsFS{ + ".": {Mode: fs.ModeDir | 0500}, + + "check": {Mode: 0400, Data: []byte("binfmt")}, + }, nil}, + }) + }, expectsFS{ + ".": {Mode: fs.ModeDir | 0700}, + + "checksum": {Mode: fs.ModeDir | 0700}, + "checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV": {Mode: fs.ModeDir | 0500}, + "checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV/bin": {Mode: fs.ModeDir | 0700}, + "checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV/bin/sample": {Mode: 0500, Data: []byte("\xca\xfe\xba\xbe\xfd\xfd:3")}, + "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500}, + "checksum/UnDo4B5KneEUY5b4vRUk_y9MWgkWuw2N8f8a2XayO686xXur-aZmX2-7n_8tKMe3": {Mode: fs.ModeDir | 0500}, + "checksum/UnDo4B5KneEUY5b4vRUk_y9MWgkWuw2N8f8a2XayO686xXur-aZmX2-7n_8tKMe3/check": {Mode: 0400, Data: []byte("binfmt")}, + + "identifier": {Mode: fs.ModeDir | 0700}, + "identifier/6VQTJ1lI5BmVuI1YFYJ8ClO3MRORvTTrcWFDcUU-l5Ga8EofxCxGlSTYN-u8dKj_": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/UnDo4B5KneEUY5b4vRUk_y9MWgkWuw2N8f8a2XayO686xXur-aZmX2-7n_8tKMe3")}, + "identifier/_v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/5aevg3YpDxjqQZ-pdvXK7YqgkL5JKqcoStYQxeD96kuYar6K2mRQWMHib6NQRnpV")}, + "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, + + "temp": {Mode: fs.ModeDir | 0700}, + "work": {Mode: fs.ModeDir | 0700}, + }}, }) } |
