From b0d06b67dc85d79d104a6bdbea1f627aa09c79a8 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Wed, 6 May 2026 06:22:28 +0900 Subject: internal/pkg: centralise exec testdata checksums This significantly reduces maintenance burden. Signed-off-by: Ophestra --- .gitignore | 2 +- internal/pkg/exec_test.go | 25 +- internal/pkg/internal/testtool/expected/doc.go | 2 + .../pkg/internal/testtool/expected/sum_amd64.go | 10 + internal/pkg/internal/testtool/main.go | 256 +++++++++++++++++++++ internal/pkg/testdata/main.go | 254 -------------------- 6 files changed, 282 insertions(+), 267 deletions(-) create mode 100644 internal/pkg/internal/testtool/expected/doc.go create mode 100644 internal/pkg/internal/testtool/expected/sum_amd64.go create mode 100644 internal/pkg/internal/testtool/main.go delete mode 100644 internal/pkg/testdata/main.go diff --git a/.gitignore b/.gitignore index 96094d86..b9012eda 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ # go generate /cmd/hakurei/LICENSE /cmd/mbf/internal/pkgserver/ui/static -/internal/pkg/testdata/testtool +/internal/pkg/internal/testtool/testtool /internal/rosa/hakurei_current.tar.gz # cmd/dist default destination diff --git a/internal/pkg/exec_test.go b/internal/pkg/exec_test.go index 604c5022..5d2905d4 100644 --- a/internal/pkg/exec_test.go +++ b/internal/pkg/exec_test.go @@ -1,7 +1,5 @@ package pkg_test -//go:generate env CGO_ENABLED=0 go build -tags testtool -o testdata/testtool ./testdata - import ( _ "embed" "encoding/gob" @@ -18,12 +16,15 @@ import ( "hakurei.app/hst" "hakurei.app/internal/pkg" "hakurei.app/internal/stub" + + "hakurei.app/internal/pkg/internal/testtool/expected" ) // testtoolBin is the container test tool binary made available to the // execArtifact for testing its curing environment. // -//go:embed testdata/testtool +//go:generate env CGO_ENABLED=0 go build -tags testtool -o internal/testtool ./internal/testtool +//go:embed internal/testtool/testtool var testtoolBin []byte func TestExec(t *testing.T) { @@ -123,7 +124,7 @@ func TestExec(t *testing.T) { "identifier": {Mode: fs.ModeDir | 0700}, "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")}, - "identifier/dztPS6jRjiZtCF4_p8AzfnxGp6obkhrgFVsxdodbKWUoAEVtDz3MykepJB4kI_ks": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, + "identifier/" + expected.Offline: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "temp": {Mode: fs.ModeDir | 0700}, @@ -173,8 +174,8 @@ func TestExec(t *testing.T) { "checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W": {Mode: fs.ModeDir | 0500}, "checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W/check": {Mode: 0400, Data: []byte("net")}, - "identifier": {Mode: fs.ModeDir | 0700}, - "identifier/G8qPxD9puvvoOVV7lrT80eyDeIl3G_CCFoKw12c8mCjMdG1zF7NEPkwYpNubClK3": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W")}, + "identifier": {Mode: fs.ModeDir | 0700}, + "identifier/" + expected.Net: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/a1F_i9PVQI4qMcoHgTQkORuyWLkC1GLIxOhDt2JpU1NGAxWc5VJzdlfRK-PYBh3W")}, "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, @@ -213,8 +214,8 @@ func TestExec(t *testing.T) { "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}}, "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500}, - "identifier": {Mode: fs.ModeDir | 0700}, - "identifier/RdMA-mubnrHuu3Ky1wWyxauSYCO0ZH_zCPUj3uDHqkfwv5sGcByoF_g5PjlGiClb": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, + "identifier": {Mode: fs.ModeDir | 0700}, + "identifier/" + expected.OvlRoot: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "temp": {Mode: fs.ModeDir | 0700}, @@ -257,8 +258,8 @@ func TestExec(t *testing.T) { "checksum/" + wantOfflineEncode + "/check": {Mode: 0400, Data: []byte{0}}, "checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU": {Mode: fs.ModeDir | 0500}, - "identifier": {Mode: fs.ModeDir | 0700}, - "identifier/5hlaukCirnXE4W_RSLJFOZN47Z5RiHnacXzdFp_70cLgiJUGR6cSb_HaFftkzi0-": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, + "identifier": {Mode: fs.ModeDir | 0700}, + "identifier/" + expected.Work: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "temp": {Mode: fs.ModeDir | 0700}, @@ -329,7 +330,7 @@ func TestExec(t *testing.T) { "identifier": {Mode: fs.ModeDir | 0700}, "identifier/_gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb")}, "identifier/B-kc5iJMx8GtlCua4dz6BiJHnDAOUfPjgpbKq4e-QEn0_CZkSYs3fOA1ve06qMs2": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK")}, - "identifier/p1t_drXr34i-jZNuxDMLaMOdL6tZvQqhavNafGynGqxOZoXAUTSn7kqNh3Ovv3DT": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, + "identifier/" + expected.Layers: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "temp": {Mode: fs.ModeDir | 0700}, @@ -376,7 +377,7 @@ func TestExec(t *testing.T) { "identifier": {Mode: fs.ModeDir | 0700}, "identifier/kvJIqZo5DKFOxC2ZQ-8_nPaQzEAz9cIm3p6guO-uLqm-xaiPu7oRkSnsu411jd_U": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, "identifier/vjz1MHPcGBKV7sjcs8jQP3cqxJ1hgPTiQBMCEHP9BGXjGxd-tJmEmXKaStObo5gK": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU")}, - "identifier/xXTIYcXmgJWNLC91c417RRrNM9cjELwEZHpGvf8Fk_GNP5agRJp_SicD0w9aMeLJ": {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, + "identifier/" + expected.Promote: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantOfflineEncode)}, "temp": {Mode: fs.ModeDir | 0700}, "work": {Mode: fs.ModeDir | 0700}, diff --git a/internal/pkg/internal/testtool/expected/doc.go b/internal/pkg/internal/testtool/expected/doc.go new file mode 100644 index 00000000..53978d26 --- /dev/null +++ b/internal/pkg/internal/testtool/expected/doc.go @@ -0,0 +1,2 @@ +// Package expected contains expected identifiers for exec artifact tests. +package expected diff --git a/internal/pkg/internal/testtool/expected/sum_amd64.go b/internal/pkg/internal/testtool/expected/sum_amd64.go new file mode 100644 index 00000000..a9baee09 --- /dev/null +++ b/internal/pkg/internal/testtool/expected/sum_amd64.go @@ -0,0 +1,10 @@ +package expected + +const ( + Offline = "dztPS6jRjiZtCF4_p8AzfnxGp6obkhrgFVsxdodbKWUoAEVtDz3MykepJB4kI_ks" + OvlRoot = "RdMA-mubnrHuu3Ky1wWyxauSYCO0ZH_zCPUj3uDHqkfwv5sGcByoF_g5PjlGiClb" + Layers = "p1t_drXr34i-jZNuxDMLaMOdL6tZvQqhavNafGynGqxOZoXAUTSn7kqNh3Ovv3DT" + Net = "G8qPxD9puvvoOVV7lrT80eyDeIl3G_CCFoKw12c8mCjMdG1zF7NEPkwYpNubClK3" + Promote = "xXTIYcXmgJWNLC91c417RRrNM9cjELwEZHpGvf8Fk_GNP5agRJp_SicD0w9aMeLJ" + Work = "5hlaukCirnXE4W_RSLJFOZN47Z5RiHnacXzdFp_70cLgiJUGR6cSb_HaFftkzi0-" +) diff --git a/internal/pkg/internal/testtool/main.go b/internal/pkg/internal/testtool/main.go new file mode 100644 index 00000000..6b665d9d --- /dev/null +++ b/internal/pkg/internal/testtool/main.go @@ -0,0 +1,256 @@ +//go:build testtool + +package main + +import ( + "encoding/gob" + "log" + "net" + "os" + "path/filepath" + "reflect" + "runtime" + "slices" + "strconv" + "strings" + + "hakurei.app/fhs" + "hakurei.app/vfs" + + "hakurei.app/internal/pkg/internal/testtool/expected" +) + +func main() { + log.SetFlags(0) + log.SetPrefix("testtool: ") + + environ := slices.DeleteFunc(slices.Clone(os.Environ()), func(s string) bool { + return s == "CURE_JOBS="+strconv.Itoa(runtime.NumCPU()) + }) + + var hostNet, layers, promote bool + if len(os.Args) == 2 && os.Args[0] == "testtool" { + switch os.Args[1] { + case "net": + hostNet = true + log.SetPrefix("testtool(net): ") + break + + case "layers": + layers = true + log.SetPrefix("testtool(layers): ") + break + + case "promote": + promote = true + log.SetPrefix("testtool(promote): ") + + default: + log.Fatalf("Args: %q", os.Args) + return + } + } else if wantArgs := []string{"testtool"}; !slices.Equal(os.Args, wantArgs) { + log.Fatalf("Args: %q, want %q", os.Args, wantArgs) + } + + var overlayRoot bool + wantEnv := []string{"HAKUREI_TEST=1"} + if len(environ) == 2 { + overlayRoot = true + if !layers && !promote { + log.SetPrefix("testtool(overlay root): ") + } + wantEnv = []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"} + } + if !slices.Equal(wantEnv, environ) { + log.Fatalf("Environ: %q, want %q", environ, wantEnv) + } + + var overlayWork bool + const ( + wantExec = "/opt/bin/testtool" + wantExecWork = "/work/bin/testtool" + ) + var iftPath string + if got, err := os.Executable(); err != nil { + log.Fatalf("Executable: error = %v", err) + } else { + iftPath = filepath.Join(filepath.Dir(filepath.Dir(got)), "ift") + + if got != wantExec { + switch got { + case wantExecWork: + overlayWork = true + log.SetPrefix("testtool(overlay work): ") + + default: + log.Fatalf("Executable: %q, want %q", got, wantExec) + } + } + } + + wantHostname := "cure" + if hostNet { + wantHostname += "-net" + } + + if hostname, err := os.Hostname(); err != nil { + log.Fatalf("Hostname: error = %v", err) + } else if hostname != wantHostname { + log.Fatalf("Hostname: %q, want %q", hostname, wantHostname) + } + + var m *vfs.MountInfo + if f, err := os.Open(fhs.Proc + "self/mountinfo"); err != nil { + log.Fatalf("Open: error = %v", err) + } else { + err = vfs.NewMountInfoDecoder(f).Decode(&m) + closeErr := f.Close() + if err != nil { + log.Fatalf("Decode: error = %v", err) + } + if closeErr != nil { + log.Fatalf("Close: error = %v", err) + } + } + + if ift, err := net.Interfaces(); err != nil { + log.Fatal(err) + } else if !hostNet { + if len(ift) != 1 || ift[0].Name != "lo" { + log.Fatalln("got interfaces", strings.Join(slices.Collect(func(yield func(ifn string) bool) { + for _, ifi := range ift { + if !yield(ifi.Name) { + break + } + } + }), ", ")) + } + } else { + var iftParent []net.Interface + + var r *os.File + if r, err = os.Open(iftPath); err != nil { + log.Fatal(err) + } else { + err = gob.NewDecoder(r).Decode(&iftParent) + closeErr := r.Close() + if err != nil { + log.Fatal(err) + } + if closeErr != nil { + log.Fatal(closeErr) + } + } + + if !reflect.DeepEqual(ift, iftParent) { + log.Fatalf("Interfaces: %#v, want %#v", ift, iftParent) + } + } + + const checksumEmptyDir = "MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU" + ident := expected.Offline + log.Println(m) + next := func() { m = m.Next; log.Println(m) } + + if overlayRoot { + ident = expected.OvlRoot + + if m.Root != "/" || m.Target != "/" || + m.Source != "overlay" || m.FsType != "overlay" { + log.Fatal("unexpected root mount entry") + } + var lowerdir []string + for _, o := range strings.Split(m.FsOptstr, ",") { + const lowerdirKey = "lowerdir+=" + if strings.HasPrefix(o, lowerdirKey) { + lowerdir = append(lowerdir, o[len(lowerdirKey):]) + } + } + if !layers { + if len(lowerdir) != 1 || filepath.Base(lowerdir[0]) != checksumEmptyDir { + log.Fatal("unexpected artifact checksum") + } + } else { + ident = expected.Layers + + if len(lowerdir) != 2 || + filepath.Base(lowerdir[0]) != "MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU" || + filepath.Base(lowerdir[1]) != "nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK" { + log.Fatalf("unexpected lowerdirs %s", strings.Join(lowerdir, ", ")) + } + } + } else { + if hostNet { + ident = expected.Net + } + + if m.Root != "/sysroot" || m.Target != "/" { + log.Fatal("unexpected root mount entry") + } + + next() + if filepath.Base(m.Root) != "OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb" { + log.Fatal("unexpected file artifact checksum") + } + + next() + if filepath.Base(m.Root) != checksumEmptyDir { + log.Fatal("unexpected artifact checksum") + } + } + + if promote { + ident = expected.Promote + } + + next() // testtool artifact + + next() + if overlayWork { + ident = expected.Work + if m.Root != "/" || m.Target != "/work" || + m.Source != "overlay" || m.FsType != "overlay" { + log.Fatal("unexpected work mount entry") + } + } else { + if filepath.Base(m.Root) != ident || m.Target != "/work" { + log.Fatal("unexpected work mount entry") + } + } + + next() + if filepath.Base(m.Root) != ident || m.Target != "/tmp" { + log.Fatal("unexpected temp mount entry") + } + + next() + if m.Root != "/" || m.Target != "/proc" || m.Source != "proc" || m.FsType != "proc" { + log.Fatal("unexpected proc mount entry") + } + + next() + if m.Root != "/" || m.Target != "/dev" || m.Source != "devtmpfs" || m.FsType != "tmpfs" { + log.Fatal("unexpected dev mount entry") + } + + for i := 0; i < 9; i++ { // private /dev entries + next() + } + + if m.Next != nil { + log.Println("unexpected extra mount entries") + for m.Next != nil { + next() + } + os.Exit(1) + } + + checkData := []byte{0} + if hostNet { + checkData = []byte("net") + } + if err := os.WriteFile("check", checkData, 0400); err != nil { + log.Fatal(err) + } +} diff --git a/internal/pkg/testdata/main.go b/internal/pkg/testdata/main.go deleted file mode 100644 index 564a1736..00000000 --- a/internal/pkg/testdata/main.go +++ /dev/null @@ -1,254 +0,0 @@ -//go:build testtool - -package main - -import ( - "encoding/gob" - "log" - "net" - "os" - "path/filepath" - "reflect" - "runtime" - "slices" - "strconv" - "strings" - - "hakurei.app/fhs" - "hakurei.app/vfs" -) - -func main() { - log.SetFlags(0) - log.SetPrefix("testtool: ") - - environ := slices.DeleteFunc(slices.Clone(os.Environ()), func(s string) bool { - return s == "CURE_JOBS="+strconv.Itoa(runtime.NumCPU()) - }) - - var hostNet, layers, promote bool - if len(os.Args) == 2 && os.Args[0] == "testtool" { - switch os.Args[1] { - case "net": - hostNet = true - log.SetPrefix("testtool(net): ") - break - - case "layers": - layers = true - log.SetPrefix("testtool(layers): ") - break - - case "promote": - promote = true - log.SetPrefix("testtool(promote): ") - - default: - log.Fatalf("Args: %q", os.Args) - return - } - } else if wantArgs := []string{"testtool"}; !slices.Equal(os.Args, wantArgs) { - log.Fatalf("Args: %q, want %q", os.Args, wantArgs) - } - - var overlayRoot bool - wantEnv := []string{"HAKUREI_TEST=1"} - if len(environ) == 2 { - overlayRoot = true - if !layers && !promote { - log.SetPrefix("testtool(overlay root): ") - } - wantEnv = []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"} - } - if !slices.Equal(wantEnv, environ) { - log.Fatalf("Environ: %q, want %q", environ, wantEnv) - } - - var overlayWork bool - const ( - wantExec = "/opt/bin/testtool" - wantExecWork = "/work/bin/testtool" - ) - var iftPath string - if got, err := os.Executable(); err != nil { - log.Fatalf("Executable: error = %v", err) - } else { - iftPath = filepath.Join(filepath.Dir(filepath.Dir(got)), "ift") - - if got != wantExec { - switch got { - case wantExecWork: - overlayWork = true - log.SetPrefix("testtool(overlay work): ") - - default: - log.Fatalf("Executable: %q, want %q", got, wantExec) - } - } - } - - wantHostname := "cure" - if hostNet { - wantHostname += "-net" - } - - if hostname, err := os.Hostname(); err != nil { - log.Fatalf("Hostname: error = %v", err) - } else if hostname != wantHostname { - log.Fatalf("Hostname: %q, want %q", hostname, wantHostname) - } - - var m *vfs.MountInfo - if f, err := os.Open(fhs.Proc + "self/mountinfo"); err != nil { - log.Fatalf("Open: error = %v", err) - } else { - err = vfs.NewMountInfoDecoder(f).Decode(&m) - closeErr := f.Close() - if err != nil { - log.Fatalf("Decode: error = %v", err) - } - if closeErr != nil { - log.Fatalf("Close: error = %v", err) - } - } - - if ift, err := net.Interfaces(); err != nil { - log.Fatal(err) - } else if !hostNet { - if len(ift) != 1 || ift[0].Name != "lo" { - log.Fatalln("got interfaces", strings.Join(slices.Collect(func(yield func(ifn string) bool) { - for _, ifi := range ift { - if !yield(ifi.Name) { - break - } - } - }), ", ")) - } - } else { - var iftParent []net.Interface - - var r *os.File - if r, err = os.Open(iftPath); err != nil { - log.Fatal(err) - } else { - err = gob.NewDecoder(r).Decode(&iftParent) - closeErr := r.Close() - if err != nil { - log.Fatal(err) - } - if closeErr != nil { - log.Fatal(closeErr) - } - } - - if !reflect.DeepEqual(ift, iftParent) { - log.Fatalf("Interfaces: %#v, want %#v", ift, iftParent) - } - } - - const checksumEmptyDir = "MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU" - ident := "dztPS6jRjiZtCF4_p8AzfnxGp6obkhrgFVsxdodbKWUoAEVtDz3MykepJB4kI_ks" - log.Println(m) - next := func() { m = m.Next; log.Println(m) } - - if overlayRoot { - ident = "RdMA-mubnrHuu3Ky1wWyxauSYCO0ZH_zCPUj3uDHqkfwv5sGcByoF_g5PjlGiClb" - - if m.Root != "/" || m.Target != "/" || - m.Source != "overlay" || m.FsType != "overlay" { - log.Fatal("unexpected root mount entry") - } - var lowerdir []string - for _, o := range strings.Split(m.FsOptstr, ",") { - const lowerdirKey = "lowerdir+=" - if strings.HasPrefix(o, lowerdirKey) { - lowerdir = append(lowerdir, o[len(lowerdirKey):]) - } - } - if !layers { - if len(lowerdir) != 1 || filepath.Base(lowerdir[0]) != checksumEmptyDir { - log.Fatal("unexpected artifact checksum") - } - } else { - ident = "p1t_drXr34i-jZNuxDMLaMOdL6tZvQqhavNafGynGqxOZoXAUTSn7kqNh3Ovv3DT" - - if len(lowerdir) != 2 || - filepath.Base(lowerdir[0]) != "MGWmEfjut2QE2xPJwTsmUzpff4BN_FEnQ7T0j7gvUCCiugJQNwqt9m151fm9D1yU" || - filepath.Base(lowerdir[1]) != "nY_CUdiaUM1OL4cPr5TS92FCJ3rCRV7Hm5oVTzAvMXwC03_QnTRfQ5PPs7mOU9fK" { - log.Fatalf("unexpected lowerdirs %s", strings.Join(lowerdir, ", ")) - } - } - } else { - if hostNet { - ident = "G8qPxD9puvvoOVV7lrT80eyDeIl3G_CCFoKw12c8mCjMdG1zF7NEPkwYpNubClK3" - } - - if m.Root != "/sysroot" || m.Target != "/" { - log.Fatal("unexpected root mount entry") - } - - next() - if filepath.Base(m.Root) != "OLBgp1GsljhM2TJ-sbHjaiH9txEUvgdDTAzHv2P24donTt6_529l-9Ua0vFImLlb" { - log.Fatal("unexpected file artifact checksum") - } - - next() - if filepath.Base(m.Root) != checksumEmptyDir { - log.Fatal("unexpected artifact checksum") - } - } - - if promote { - ident = "xXTIYcXmgJWNLC91c417RRrNM9cjELwEZHpGvf8Fk_GNP5agRJp_SicD0w9aMeLJ" - } - - next() // testtool artifact - - next() - if overlayWork { - ident = "5hlaukCirnXE4W_RSLJFOZN47Z5RiHnacXzdFp_70cLgiJUGR6cSb_HaFftkzi0-" - if m.Root != "/" || m.Target != "/work" || - m.Source != "overlay" || m.FsType != "overlay" { - log.Fatal("unexpected work mount entry") - } - } else { - if filepath.Base(m.Root) != ident || m.Target != "/work" { - log.Fatal("unexpected work mount entry") - } - } - - next() - if filepath.Base(m.Root) != ident || m.Target != "/tmp" { - log.Fatal("unexpected temp mount entry") - } - - next() - if m.Root != "/" || m.Target != "/proc" || m.Source != "proc" || m.FsType != "proc" { - log.Fatal("unexpected proc mount entry") - } - - next() - if m.Root != "/" || m.Target != "/dev" || m.Source != "devtmpfs" || m.FsType != "tmpfs" { - log.Fatal("unexpected dev mount entry") - } - - for i := 0; i < 9; i++ { // private /dev entries - next() - } - - if m.Next != nil { - log.Println("unexpected extra mount entries") - for m.Next != nil { - next() - } - os.Exit(1) - } - - checkData := []byte{0} - if hostNet { - checkData = []byte("net") - } - if err := os.WriteFile("check", checkData, 0400); err != nil { - log.Fatal(err) - } -} -- cgit v1.3.1