From 34e9665b837abd718b2da5c5fbedd47d9af0d201 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 10 Jul 2025 08:36:23 +0300 Subject: Add comprehensive eventloop tests for multiple syscall types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add helper functions for FdEvent, PathEvent, and RetEvent types - Implement test cases for read, write, close, and mkdir syscalls - Test proper event pairing and file object creation - Validate syscall-specific behavior for different event types This expands test coverage beyond just openat syscalls to include file descriptor operations and path-based operations, providing a foundation for testing all supported syscall types. 🤖 Generated with Claude Code Co-Authored-By: Claude --- internal/eventloop_test.go | 166 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) (limited to 'internal/eventloop_test.go') diff --git a/internal/eventloop_test.go b/internal/eventloop_test.go index 71ef352..a07c511 100644 --- a/internal/eventloop_test.go +++ b/internal/eventloop_test.go @@ -26,6 +26,12 @@ func TestEventloop(t *testing.T) { "OpenEventTest1": makeOpenEventTestData1(t), "OpenEventTest2": makeOpenEventTestData2(t), "OpenEventTest3": makeOpenEventTestData3(t), + // FdEvent tests + "ReadEventTest": makeReadEventTestData(t), + "WriteEventTest": makeWriteEventTestData(t), + "CloseEventTest": makeCloseEventTestData(t), + // PathEvent tests + "MkdirEventTest": makeMkdirEventTestData(t), } ctx, cancel := context.WithCancel(context.Background()) @@ -173,3 +179,163 @@ func makeExitOpenEvent(t *testing.T, time uint64, pid, tid uint32) (types.RetEve } return ev, bytes } + +// Helper functions for FdEvent +func makeEnterFdEvent(t *testing.T, time uint64, pid, tid uint32, fd int32, traceId types.TraceId) (types.FdEvent, []byte) { + ev := types.FdEvent{ + EventType: types.ENTER_FD_EVENT, + TraceId: traceId, + Time: time, + Pid: pid, + Tid: tid, + Fd: fd, + } + + bytes, err := ev.Bytes() + if err != nil { + t.Error(err) + } + return ev, bytes +} + +func makeExitFdEvent(t *testing.T, time uint64, pid, tid uint32, fd int32, traceId types.TraceId) (types.FdEvent, []byte) { + ev := types.FdEvent{ + EventType: types.EXIT_FD_EVENT, + TraceId: traceId, + Time: time, + Pid: pid, + Tid: tid, + Fd: fd, + } + + bytes, err := ev.Bytes() + if err != nil { + t.Error(err) + } + return ev, bytes +} + +// Helper function to create exit RetEvent +func makeExitRetEvent(t *testing.T, time uint64, pid, tid uint32, traceId types.TraceId, ret int64) (types.RetEvent, []byte) { + ev := types.RetEvent{ + EventType: types.EXIT_RET_EVENT, + TraceId: traceId, + Time: time, + Ret: ret, + Pid: pid, + Tid: tid, + } + + bytes, err := ev.Bytes() + if err != nil { + t.Error(err) + } + return ev, bytes +} + +// Test data functions for FdEvent syscalls +func makeReadEventTestData(t *testing.T) (td testData) { + fd := int32(42) // Assume file descriptor 42 + enterEv, enterEvBytes := makeEnterFdEvent(t, defaulTime, defaultPid, defaultTid, fd, types.SYS_ENTER_READ) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) + + exitEv, exitEvBytes := makeExitFdEvent(t, defaulTime+100, defaultPid, defaultTid, fd, types.SYS_EXIT_READ) + td.rawTracepoints = append(td.rawTracepoints, exitEvBytes) + + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { + if !enterEv.Equals(ep.EnterEv) { + t.Errorf("Expected '%v' but got '%v'", enterEv, ep.EnterEv) + } + if !exitEv.Equals(ep.ExitEv) { + t.Errorf("Expected '%v' but got '%v'", exitEv, ep.ExitEv) + } + }) + + return td +} + +func makeWriteEventTestData(t *testing.T) (td testData) { + fd := int32(43) + enterEv, enterEvBytes := makeEnterFdEvent(t, defaulTime, defaultPid, defaultTid, fd, types.SYS_ENTER_WRITE) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) + + exitEv, exitEvBytes := makeExitFdEvent(t, defaulTime+100, defaultPid, defaultTid, fd, types.SYS_EXIT_WRITE) + td.rawTracepoints = append(td.rawTracepoints, exitEvBytes) + + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { + if !enterEv.Equals(ep.EnterEv) { + t.Errorf("Expected '%v' but got '%v'", enterEv, ep.EnterEv) + } + if !exitEv.Equals(ep.ExitEv) { + t.Errorf("Expected '%v' but got '%v'", exitEv, ep.ExitEv) + } + }) + + return td +} + +func makeCloseEventTestData(t *testing.T) (td testData) { + fd := int32(44) + enterEv, enterEvBytes := makeEnterFdEvent(t, defaulTime, defaultPid, defaultTid, fd, types.SYS_ENTER_CLOSE) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) + + exitEv, exitEvBytes := makeExitFdEvent(t, defaulTime+100, defaultPid, defaultTid, fd, types.SYS_EXIT_CLOSE) + td.rawTracepoints = append(td.rawTracepoints, exitEvBytes) + + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { + if !enterEv.Equals(ep.EnterEv) { + t.Errorf("Expected '%v' but got '%v'", enterEv, ep.EnterEv) + } + if !exitEv.Equals(ep.ExitEv) { + t.Errorf("Expected '%v' but got '%v'", exitEv, ep.ExitEv) + } + }) + + return td +} + +// Helper functions for PathEvent +func makeEnterPathEvent(t *testing.T, time uint64, pid, tid uint32, pathname string, traceId types.TraceId) (types.PathEvent, []byte) { + ev := types.PathEvent{ + EventType: types.ENTER_PATH_EVENT, + TraceId: traceId, + Time: time, + Pid: pid, + Tid: tid, + Pathname: [types.MAX_FILENAME_LENGTH]byte{}, + } + copy(ev.Pathname[:], pathname) + + bytes, err := ev.Bytes() + if err != nil { + t.Error(err) + } + return ev, bytes +} + +// Test data functions for PathEvent syscalls +func makeMkdirEventTestData(t *testing.T) (td testData) { + pathname := "/tmp/testdir" + enterEv, enterEvBytes := makeEnterPathEvent(t, defaulTime, defaultPid, defaultTid, pathname, types.SYS_ENTER_MKDIR) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) + + exitEv, exitEvBytes := makeExitRetEvent(t, defaulTime+100, defaultPid, defaultTid, types.SYS_EXIT_MKDIR, 0) + td.rawTracepoints = append(td.rawTracepoints, exitEvBytes) + + td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) { + if !enterEv.Equals(ep.EnterEv) { + t.Errorf("Expected '%v' but got '%v'", enterEv, ep.EnterEv) + } + if !exitEv.Equals(ep.ExitEv) { + t.Errorf("Expected '%v' but got '%v'", exitEv, ep.ExitEv) + } + filenameA := types.StringValue(enterEv.Pathname[:]) + if ep.File == nil { + t.Errorf("Expected file to be set") + } else if ep.File.Name() != filenameA { + t.Errorf("Expected file name '%v' but got '%v'", filenameA, ep.File.Name()) + } + }) + + return td +} -- cgit v1.2.3