summaryrefslogtreecommitdiff
path: root/internal/eventloop_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-10-09 10:44:27 +0300
committerPaul Buetow <paul@buetow.org>2025-10-09 10:44:27 +0300
commit82f3c50dce5a26d828b9e9fd71bdf3c05adae968 (patch)
treed75439d32485c6586e0631d49d3e3d3b36a577e0 /internal/eventloop_test.go
parent91632ae9e2f49cb046b5899f190890b9d139ed89 (diff)
fix unit tests, initial hard exclude of not working yet syscalls
Diffstat (limited to 'internal/eventloop_test.go')
-rw-r--r--internal/eventloop_test.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/eventloop_test.go b/internal/eventloop_test.go
index 7a6ce9d..dc92bda 100644
--- a/internal/eventloop_test.go
+++ b/internal/eventloop_test.go
@@ -58,6 +58,7 @@ func TestEventloop(t *testing.T) {
"FcntlDupfdCloexecTest": makeFcntlDupfdCloexecTestData(t),
"FcntlErrorTest": makeFcntlErrorTestData(t),
"FcntlInvalidFdTest": makeFcntlInvalidFdTestData(t),
+ "NameToHandleAtTest": makeNameToHandleAtTestData(t),
// FD Lifecycle tests
"FdLifecycleTest": makeFdLifecycleTestData(t),
"FdDupTest": makeFdDupTestData(t),
@@ -1523,6 +1524,67 @@ func makeFcntlInvalidFdTestData(t *testing.T) (td testData) {
return td
}
+func makeEnterOpenByHandleAtEvent(t *testing.T, time uint64, pid, tid uint32, flags int32) (types.OpenByHandleAtEvent, []byte) {
+ ev := types.OpenByHandleAtEvent{
+ EventType: types.ENTER_OPEN_BY_HANDLE_AT_EVENT,
+ TraceId: types.SYS_ENTER_OPEN_BY_HANDLE_AT,
+ Time: time,
+ Pid: pid,
+ Tid: tid,
+ Flags: flags,
+ }
+
+ bytes, err := ev.Bytes()
+ if err != nil {
+ t.Error(err)
+ }
+ return ev, bytes
+}
+
+func makeNameToHandleAtTestData(t *testing.T) (td testData) {
+ pathname := "/tmp/handle_test.txt"
+ fd := int32(70)
+
+ // Step 1: name_to_handle_at syscall
+ _, enterNameBytes := makeEnterPathEvent(t, defaulTime, defaultPid, defaultTid, pathname, types.SYS_ENTER_NAME_TO_HANDLE_AT)
+ td.rawTracepoints = append(td.rawTracepoints, enterNameBytes)
+
+ _, exitNameBytes := makeExitRetEvent(t, defaulTime+100, defaultPid, defaultTid, types.SYS_EXIT_NAME_TO_HANDLE_AT, 0)
+ td.rawTracepoints = append(td.rawTracepoints, exitNameBytes)
+
+ // Step 2: open_by_handle_at syscall
+ _, enterOpenBytes := makeEnterOpenByHandleAtEvent(t, defaulTime+200, defaultPid, defaultTid, syscall.O_RDWR)
+ td.rawTracepoints = append(td.rawTracepoints, enterOpenBytes)
+
+ exitOpenEv, exitOpenBytes := makeExitRetEvent(t, defaulTime+300, defaultPid, defaultTid, types.SYS_EXIT_OPEN_BY_HANDLE_AT, int64(fd))
+ td.rawTracepoints = append(td.rawTracepoints, exitOpenBytes)
+
+ // Validate that the two syscalls are correlated and result in a single open event
+ td.validates = append(td.validates, func(t *testing.T, el *eventLoop, ep *event.Pair) {
+ if ep.EnterEv.GetTraceId() != types.SYS_ENTER_OPEN_BY_HANDLE_AT {
+ t.Errorf("Expected enter event to be SYS_ENTER_OPEN_BY_HANDLE_AT, but got %v", ep.EnterEv.GetTraceId())
+ }
+ if !exitOpenEv.Equals(ep.ExitEv) {
+ t.Errorf("Expected exit event '%v' but got '%v'", exitOpenEv, ep.ExitEv)
+ }
+ if ep.File == nil {
+ t.Errorf("Expected file to be set")
+ } else if ep.File.Name() != pathname {
+ t.Errorf("Expected file name '%v' but got '%v'", pathname, ep.File.Name())
+ }
+
+ // Verify that the fd is now tracked
+ verifyFileDescriptor(t, el, fd, pathname)
+
+ // Verify that the pending handle has been consumed
+ if _, ok := el.pendingHandles[defaultTid]; ok {
+ t.Errorf("Expected pending handle for tid %d to be consumed", defaultTid)
+ }
+ })
+
+ return td
+}
+
// Test open→read→write→close lifecycle
func makeFdLifecycleTestData(t *testing.T) (td testData) {
fd := int32(42)