aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--cmd/hakurei/testsuite/main.go224
-rw-r--r--internal/acl/acl_test.go98
-rw-r--r--internal/testsuite/ptrace.go3
-rw-r--r--internal/testsuite/testsuite.go2
4 files changed, 162 insertions, 165 deletions
diff --git a/cmd/hakurei/testsuite/main.go b/cmd/hakurei/testsuite/main.go
index bc93c944..61c2833e 100644
--- a/cmd/hakurei/testsuite/main.go
+++ b/cmd/hakurei/testsuite/main.go
@@ -696,7 +696,7 @@ func main() {
_policy := policy
checkHakurei(
ctx, &wg, &cred, dbusEnv,
- "setscheduler-"+strconv.Itoa(int(policy)), "setscheduler",
+ "setscheduler-"+strconv.Itoa(int(policy)), "setscheduler "+strconv.Quote(policy.String()),
true, false, false, 0, func(c *hst.Config) {
c.SchedPolicy = _policy
}, func(p hst.State, pid int) error {
@@ -754,137 +754,137 @@ func main() {
return nil
}, nil,
)
+ }
- wg.Go(func() {
- defer log.Println("validated revert type selection")
-
- c := newConfig("rts 0", "sleep", "infinity")
- c.Container.Flags |= hst.FShareRuntime
- uid := hst.ToUser(0, c.Identity)
+ wg.Go(func() {
+ defer log.Println("validated revert type selection")
- onDone := func(err error, output string) {
- if err == nil {
- log.Fatal("revert type selection test process " +
- "terminated unexpectedly")
- } else if e, ok := errors.AsType[*exec.ExitError](err); !ok {
- log.Fatalf("revert type selection: %v\n%s", err, output)
- } else if e.ExitCode() != 130 {
- log.Fatalf("revert type selection: %v\n%s", e, output)
- }
+ c := newConfig("rts 0", "sleep", "infinity")
+ c.Container.Flags |= hst.FShareRuntime
+ uid := hst.ToUser(0, c.Identity)
- if output != "" {
- log.Fatalf("unexpected output\n%s", output)
- }
+ onDone := func(err error, output string) {
+ if err == nil {
+ log.Fatal("revert type selection test process " +
+ "terminated unexpectedly")
+ } else if e, ok := errors.AsType[*exec.ExitError](err); !ok {
+ log.Fatalf("revert type selection: %v\n%s", err, output)
+ } else if e.ExitCode() != 130 {
+ log.Fatalf("revert type selection: %v\n%s", e, output)
}
- validatePresent := func() {
- testsuite.AssertOutput(
- "validating ACLs for rts present",
- "user::rwx\n"+
- "user:"+strconv.Itoa(uid)+":rwx\n"+
- "group::---\n"+
- "mask::rwx\n"+
- "other::---\n"+
- "\n",
- "",
- )(testsuite.MustOutput(
- ctx, &cred, nil, 0, "getfacl rts present",
- "getfacl",
- "--absolute-names",
- "--omit-header",
- "--numeric",
- "/tmp/hakurei.0/runtime/"+strconv.Itoa(c.Identity),
- ))
- }
- validateReverted := func() {
- testsuite.AssertOutput(
- "validating ACLs for rts reverted",
- "user::rwx\n"+
- "group::---\n"+
- "mask::---\n"+
- "other::---\n"+
- "\n",
- "",
- )(testsuite.MustOutput(
- ctx, &cred, nil, 0, "getfacl rts present",
- "getfacl",
- "--absolute-names",
- "--omit-header",
- "--numeric",
- "/tmp/hakurei.0/runtime/"+strconv.Itoa(c.Identity),
- ))
+ if output != "" {
+ log.Fatalf("unexpected output\n%s", output)
}
+ }
- p0, pid0 := testsuite.MustStartHakurei(
- ctx, &wg, &cred, dbusEnv, onDone,
- true, false, false, false, c,
- )
- validatePresent()
+ validatePresent := func() {
+ testsuite.AssertOutput(
+ "validating ACLs for rts present",
+ "user::rwx\n"+
+ "user:"+strconv.Itoa(uid)+":rwx\n"+
+ "group::---\n"+
+ "mask::rwx\n"+
+ "other::---\n"+
+ "\n",
+ "",
+ )(testsuite.MustOutput(
+ ctx, &cred, nil, 0, "getfacl rts present",
+ "getfacl",
+ "--absolute-names",
+ "--omit-header",
+ "--numeric",
+ "/tmp/hakurei.0/runtime/"+strconv.Itoa(c.Identity),
+ ))
+ }
+ validateReverted := func() {
+ testsuite.AssertOutput(
+ "validating ACLs for rts reverted",
+ "user::rwx\n"+
+ "group::---\n"+
+ "mask::---\n"+
+ "other::---\n"+
+ "\n",
+ "",
+ )(testsuite.MustOutput(
+ ctx, &cred, nil, 0, "getfacl rts present",
+ "getfacl",
+ "--absolute-names",
+ "--omit-header",
+ "--numeric",
+ "/tmp/hakurei.0/runtime/"+strconv.Itoa(c.Identity),
+ ))
+ }
- p1, pid1 := testsuite.MustStartHakurei(
- ctx, &wg, &cred, dbusEnv, onDone,
- true, false, false, false, c,
- )
- validatePresent()
+ p0, pid0 := testsuite.MustStartHakurei(
+ ctx, &wg, &cred, dbusEnv, onDone,
+ true, false, false, false, c,
+ )
+ validatePresent()
- testsuite.MustRun(
- &cred, testsuite.SessionEnv(dbusEnv),
- "hakurei", "kill", p1.ID.String(),
- )
- testsuite.PollPID("revert type selection 1", pid1)
- validatePresent()
+ p1, pid1 := testsuite.MustStartHakurei(
+ ctx, &wg, &cred, dbusEnv, onDone,
+ true, false, false, false, c,
+ )
+ validatePresent()
- testsuite.MustRun(
- &cred, testsuite.SessionEnv(dbusEnv),
- "hakurei", "kill", p0.ID.String(),
- )
- testsuite.PollPID("revert type selection 0", pid0)
- validateReverted()
- })
+ testsuite.MustRun(
+ &cred, testsuite.SessionEnv(dbusEnv),
+ "hakurei", "kill", p1.ID.String(),
+ )
+ testsuite.PollPID("revert type selection 1", pid1)
+ validatePresent()
- wg.Wait()
+ testsuite.MustRun(
+ &cred, testsuite.SessionEnv(dbusEnv),
+ "hakurei", "kill", p0.ID.String(),
+ )
+ testsuite.PollPID("revert type selection 0", pid0)
+ validateReverted()
+ })
- if dents, err := os.ReadDir(fhs.Tmp); err != nil {
- log.Fatal(err)
- } else {
- for _, dent := range dents {
- if name := dent.Name(); strings.HasPrefix(name, ".hakurei-shim-") {
- log.Fatalf("leftover shim work dir %q", name)
- }
- }
- }
+ wg.Wait()
- if dents, err := os.ReadDir(testsuite.HakureiPrefix); err != nil {
- log.Fatal(err)
- } else {
- if len(dents) != 3 {
- log.Fatal("leftover hakurei work directories")
+ if dents, err := os.ReadDir(fhs.Tmp); err != nil {
+ log.Fatal(err)
+ } else {
+ for _, dent := range dents {
+ if name := dent.Name(); strings.HasPrefix(name, ".hakurei-shim-") {
+ log.Fatalf("leftover shim work dir %q", name)
}
}
+ }
- if err := filepath.WalkDir(testsuite.HakureiPrefix+"state", func(
- path string,
- d fs.DirEntry,
- err error,
- ) error {
- if err != nil {
- return err
- }
+ if dents, err := os.ReadDir(testsuite.HakureiPrefix); err != nil {
+ log.Fatal(err)
+ } else {
+ if len(dents) != 3 {
+ log.Fatal("leftover hakurei work directories")
+ }
+ }
- if d.IsDir() {
- return nil
- }
+ if err := filepath.WalkDir(testsuite.HakureiPrefix+"state", func(
+ path string,
+ d fs.DirEntry,
+ err error,
+ ) error {
+ if err != nil {
+ return err
+ }
- if !d.Type().IsRegular() {
- return fmt.Errorf("strange entry at %q: %s", path, d.Type())
- }
- if d.Name() != "lock" {
- return fmt.Errorf("leftover entry at %q", path)
- }
+ if d.IsDir() {
return nil
- }); err != nil {
- log.Fatal(err)
}
+
+ if !d.Type().IsRegular() {
+ return fmt.Errorf("strange entry at %q: %s", path, d.Type())
+ }
+ if d.Name() != "lock" {
+ return fmt.Errorf("leftover entry at %q", path)
+ }
+ return nil
+ }); err != nil {
+ log.Fatal(err)
}
var identifiers []hst.ID
diff --git a/internal/acl/acl_test.go b/internal/acl/acl_test.go
index 6e84e832..14f0ca18 100644
--- a/internal/acl/acl_test.go
+++ b/internal/acl/acl_test.go
@@ -18,13 +18,23 @@ import (
"hakurei.app/internal/info"
)
-const testFileName = "acl.test"
-
var (
uid = os.Geteuid()
cred = int32(uid)
)
+// testFile returns the pathname of a newly created test file.
+func testFile(t *testing.T) string {
+ name := filepath.Join(t.TempDir(), "f")
+ f, err := os.Create(name)
+ if err != nil {
+ t.Fatal(err)
+ } else if err = f.Close(); err != nil {
+ t.Fatal(err)
+ }
+ return name
+}
+
func TestUpdate(t *testing.T) {
if info.CanDegrade {
name := filepath.Join(t.TempDir(), "check-degrade")
@@ -36,82 +46,63 @@ func TestUpdate(t *testing.T) {
}
}
- testFilePath := filepath.Join(t.TempDir(), testFileName)
+ t.Parallel()
- if f, err := os.Create(testFilePath); err != nil {
- t.Fatalf("Create: error = %v", err)
- } else {
- if err = f.Close(); err != nil {
- t.Fatalf("Close: error = %v", err)
- }
+ pathname := testFile(t)
+ cur := getfacl(t, pathname)
+ if len(cur) != 3 {
+ t.Fatalf("unexpected test file acl length %d", len(cur))
}
- defer func() {
- if err := os.Remove(testFilePath); err != nil {
- t.Fatalf("Remove: error = %v", err)
- }
- }()
-
- cur := getfacl(t, testFilePath)
-
- t.Run("default entry count", func(t *testing.T) {
- if len(cur) != 3 {
- t.Fatalf("unexpected test file acl length %d", len(cur))
- }
- })
- t.Run("default clear mask", func(t *testing.T) {
- if err := acl.Update(testFilePath, uid, 0); err != nil {
- t.Fatalf("Update: error = %v", err)
- }
- if cur = getfacl(t, testFilePath); len(cur) != 4 {
- t.Fatalf("Update: %v", cur)
- }
- })
+ if err := acl.Update(pathname, uid, 0); err != nil {
+ t.Fatalf("(clear) Update: error = %v", err)
+ }
+ if cur = getfacl(t, pathname); len(cur) != 4 {
+ t.Fatalf("(clear) Update: %v", cur)
+ }
- t.Run("default clear consistency", func(t *testing.T) {
- if err := acl.Update(testFilePath, uid, 0); err != nil {
- t.Fatalf("Update: error = %v", err)
- }
- if val := getfacl(t, testFilePath); !reflect.DeepEqual(val, cur) {
- t.Fatalf("Update: %v, want %v", val, cur)
- }
- })
+ if err := acl.Update(pathname, uid, 0); err != nil {
+ t.Fatalf("(clear*) Update: error = %v", err)
+ }
+ if val := getfacl(t, pathname); !reflect.DeepEqual(val, cur) {
+ t.Fatalf("(clear*) Update: %v, want %v", val, cur)
+ }
- testUpdate(t, testFilePath, "r--", "", cur, acl.Read, true)
- testUpdate(t, testFilePath, "-w-", "", cur, acl.Write, true)
- testUpdate(t, testFilePath, "--x", "", cur, acl.Execute, true)
+ testUpdate(t, "r--", "", cur, acl.Read, true)
+ testUpdate(t, "-w-", "", cur, acl.Write, true)
+ testUpdate(t, "--x", "", cur, acl.Execute, true)
testUpdate(
- t, testFilePath, "-wx", "", cur,
+ t, "-wx", "", cur,
acl.Write|acl.Execute,
true,
)
testUpdate(
- t, testFilePath, "r-x", "", cur,
+ t, "r-x", "", cur,
acl.Read|acl.Execute,
true,
)
testUpdate(
- t, testFilePath, "rw-", "", cur,
+ t, "rw-", "", cur,
acl.Read|acl.Write,
true,
)
testUpdate(
- t, testFilePath, "rwx", "", cur,
+ t, "rwx", "", cur,
acl.Read|acl.Write|acl.Execute,
true,
)
for i := range 16 {
testUpdate(
- t, testFilePath, "r-x", " "+strconv.Itoa(i), cur,
+ t, "r-x", " "+strconv.Itoa(i), cur,
acl.Read|acl.Execute,
false,
)
}
testUpdate(
- t, testFilePath, "rwx", " cleanup", cur,
+ t, "rwx", " cleanup", cur,
acl.Read|acl.Write|acl.Execute,
true,
)
@@ -119,27 +110,30 @@ func TestUpdate(t *testing.T) {
func testUpdate(
t *testing.T,
- testFilePath, name, suffix string,
+ name, suffix string,
cur []*getFACLResp,
perms acl.Perm,
cleanup bool,
) {
t.Run(name+suffix, func(t *testing.T) {
+ t.Parallel()
+
+ pathname := testFile(t)
if cleanup {
t.Cleanup(func() {
- if err := acl.Update(testFilePath, uid, 0); err != nil {
+ if err := acl.Update(pathname, uid, 0); err != nil {
t.Fatalf("Update: error = %v", err)
}
- if v := getfacl(t, testFilePath); !reflect.DeepEqual(v, cur) {
+ if v := getfacl(t, pathname); !reflect.DeepEqual(v, cur) {
t.Fatalf("Update: %v, want %v", v, cur)
}
})
}
- if err := acl.Update(testFilePath, uid, perms); err != nil {
+ if err := acl.Update(pathname, uid, perms); err != nil {
t.Fatalf("Update: error = %v", err)
}
- r := respByCred(getfacl(t, testFilePath), fAclTypeUser, cred)
+ r := respByCred(getfacl(t, pathname), fAclTypeUser, cred)
if r == nil {
t.Fatalf("Update did not add an ACL entry")
}
diff --git a/internal/testsuite/ptrace.go b/internal/testsuite/ptrace.go
index ccf0900c..b35816ec 100644
--- a/internal/testsuite/ptrace.go
+++ b/internal/testsuite/ptrace.go
@@ -119,6 +119,9 @@ func CheckFilter(pid, index int, sum [sha512.Size]byte) (err error) {
defer func() {
if detachErr := ptraceDetach(pid); err == nil {
err = detachErr
+ if errors.Is(err, syscall.ESRCH) {
+ err = nil
+ }
}
}()
diff --git a/internal/testsuite/testsuite.go b/internal/testsuite/testsuite.go
index 367cb4c0..b7805380 100644
--- a/internal/testsuite/testsuite.go
+++ b/internal/testsuite/testsuite.go
@@ -798,7 +798,7 @@ func StartHakurei(
"hakurei", "--json", "ps", "--short",
)
if !slices.Contains(identifiers, id) {
- log.Fatal("instance not present in ps output")
+ log.Fatalf("(%s) instance not present in ps output", c.Container.Hostname)
}
var got hst.State