aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/container_test.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-08-22 22:07:19 +0900
committerOphestra <cat@gensokyo.uk>2025-08-22 22:07:19 +0900
commit141a18999f36d3e6211d99b24a355d8ea908f32a (patch)
tree44a5826bd0bbde7fd09897b2ac327896300e12df /container/container_test.go
parentafe23600d286cf0879717cb8b55c52ef432fce7a (diff)
container: move integration test helpers
With the new instrumentation it is now possible to run init code outside integration tests. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'container/container_test.go')
-rw-r--r--container/container_test.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/container/container_test.go b/container/container_test.go
index 036d06ec..5dd510e6 100644
--- a/container/container_test.go
+++ b/container/container_test.go
@@ -14,12 +14,16 @@ import (
"strings"
"syscall"
"testing"
+ "time"
"hakurei.app/command"
"hakurei.app/container"
"hakurei.app/container/seccomp"
"hakurei.app/container/vfs"
"hakurei.app/hst"
+ "hakurei.app/internal"
+ "hakurei.app/internal/hlog"
+ "hakurei.app/ldd"
)
const (
@@ -510,3 +514,61 @@ func init() {
})
})
}
+
+const (
+ envDoCheck = "HAKUREI_TEST_DO_CHECK"
+
+ helperDefaultTimeout = 5 * time.Second
+ helperInnerPath = "/usr/bin/helper"
+)
+
+var (
+ absHelperInnerPath = container.MustAbs(helperInnerPath)
+)
+
+var helperCommands []func(c command.Command)
+
+func TestMain(m *testing.M) {
+ container.TryArgv0(hlog.Output{}, hlog.Prepare, internal.InstallOutput)
+
+ if os.Getenv(envDoCheck) == "1" {
+ c := command.New(os.Stderr, log.Printf, "helper", func(args []string) error {
+ log.SetFlags(0)
+ log.SetPrefix("helper: ")
+ return nil
+ })
+ for _, f := range helperCommands {
+ f(c)
+ }
+ c.MustParse(os.Args[1:], func(err error) {
+ if err != nil {
+ log.Fatal(err.Error())
+ }
+ })
+ return
+ }
+
+ os.Exit(m.Run())
+}
+
+func helperNewContainerLibPaths(ctx context.Context, libPaths *[]*container.Absolute, args ...string) (c *container.Container) {
+ c = container.NewCommand(ctx, absHelperInnerPath, "helper", args...)
+ c.Env = append(c.Env, envDoCheck+"=1")
+ c.Bind(container.MustAbs(os.Args[0]), absHelperInnerPath, 0)
+
+ // in case test has cgo enabled
+ if entries, err := ldd.Exec(ctx, os.Args[0]); err != nil {
+ log.Fatalf("ldd: %v", err)
+ } else {
+ *libPaths = ldd.Path(entries)
+ }
+ for _, name := range *libPaths {
+ c.Bind(name, name, 0)
+ }
+
+ return
+}
+
+func helperNewContainer(ctx context.Context, args ...string) (c *container.Container) {
+ return helperNewContainerLibPaths(ctx, new([]*container.Absolute), args...)
+}