diff --git a/internal/system/op.go b/internal/system/op.go index 67a637b..fcfc29b 100644 --- a/internal/system/op.go +++ b/internal/system/op.go @@ -65,6 +65,20 @@ func (sys *I) UID() int { return sys.uid } +func (sys *I) Equal(v *I) bool { + if v == nil || sys.uid != v.uid || len(sys.ops) != len(v.ops) { + return false + } + + for i, o := range sys.ops { + if !o.Is(v.ops[i]) { + return false + } + } + + return true +} + func (sys *I) Commit() error { sys.lock.Lock() defer sys.lock.Unlock() diff --git a/internal/system/op_test.go b/internal/system/op_test.go index 50f260a..e1419d0 100644 --- a/internal/system/op_test.go +++ b/internal/system/op_test.go @@ -51,3 +51,79 @@ func TestTypeString(t *testing.T) { }) } } + +func TestI_Equal(t *testing.T) { + testCases := []struct { + name string + sys *system.I + v *system.I + want bool + }{ + { + "simple UID", + system.New(150), + system.New(150), + true, + }, + { + "simple UID differ", + system.New(150), + system.New(151), + false, + }, + { + "simple UID nil", + system.New(150), + nil, + false, + }, + { + "op length mismatch", + system.New(150). + ChangeHosts("chronos"), + system.New(150). + ChangeHosts("chronos"). + Ensure("/run", 0755), + false, + }, + { + "op value mismatch", + system.New(150). + ChangeHosts("chronos"). + Ensure("/run", 0644), + system.New(150). + ChangeHosts("chronos"). + Ensure("/run", 0755), + false, + }, + { + "op type mismatch", + system.New(150). + ChangeHosts("chronos"). + CopyFile("/tmp/fortify.1971/30c9543e0a2c9621a8bfecb9d874c347/pulse-cookie", "/home/ophestra/xdg/config/pulse/cookie"), + system.New(150). + ChangeHosts("chronos"). + Ensure("/run", 0755), + false, + }, + { + "op equals", + system.New(150). + ChangeHosts("chronos"). + Ensure("/run", 0755), + system.New(150). + ChangeHosts("chronos"). + Ensure("/run", 0755), + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + if tc.sys.Equal(tc.v) != tc.want { + t.Errorf("Equal: got %v; want %v", + !tc.want, tc.want) + } + }) + } +}