diff --git a/container/initplace.go b/container/initplace.go index ce7ad86..9114694 100644 --- a/container/initplace.go +++ b/container/initplace.go @@ -4,7 +4,6 @@ import ( "encoding/gob" "fmt" "os" - "slices" . "syscall" ) @@ -73,7 +72,8 @@ func (t *TmpfileOp) apply(state *setupState) error { func (t *TmpfileOp) Is(op Op) bool { vt, ok := op.(*TmpfileOp) - return ok && t.Path == vt.Path && slices.Equal(t.Data, vt.Data) + return ok && t.Path != nil && vt.Path != nil && t.Path.Is(vt.Path) && + string(t.Data) == string(vt.Data) } func (*TmpfileOp) prefix() string { return "placing" } func (t *TmpfileOp) String() string { diff --git a/container/initplace_test.go b/container/initplace_test.go new file mode 100644 index 0000000..e1d8163 --- /dev/null +++ b/container/initplace_test.go @@ -0,0 +1,56 @@ +package container + +import "testing" + +func TestTmpfileOp(t *testing.T) { + checkOpsBuilder(t, []opsBuilderTestCase{ + {"noref", new(Ops).Place(MustAbs("/etc/passwd"), []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`)), Ops{ + &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, + }}, + + {"ref", new(Ops).PlaceP(MustAbs("/etc/passwd"), new(*[]byte)), Ops{ + &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte{}, + }, + }}, + }) + + checkOpIs(t, []opIsTestCase{ + {"zero", new(TmpfileOp), new(TmpfileOp), false}, + + {"differs path", &TmpfileOp{ + Path: MustAbs("/etc/group"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, false}, + + {"differs data", &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh` + "\x00"), + }, &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, false}, + + {"equals", &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, true}, + }) + + checkOpMeta(t, []opMetaTestCase{ + {"passwd", &TmpfileOp{ + Path: MustAbs("/etc/passwd"), + Data: []byte(`chronos:x:65534:65534:Hakurei:/var/empty:/bin/zsh`), + }, "placing", `tmpfile "/etc/passwd" (49 bytes)`}, + }) +}