diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-21 13:59:39 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-21 13:59:39 +0200 |
| commit | b5792f8e23d1599dcce49bc83e5d128abee484f3 (patch) | |
| tree | ef07039e4e05b23a6b41adf6b663abd0109a436b /internal/eventloop_test.go | |
| parent | 114f0cb9e6e5487fccaafb7d7065b611c8c14402 (diff) | |
Enable name_to_handle_at and io_uring fd attribution
Amp-Thread-ID: https://ampcode.com/threads/T-019c7fec-eec9-706a-8338-3ce674802680
Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'internal/eventloop_test.go')
| -rw-r--r-- | internal/eventloop_test.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/internal/eventloop_test.go b/internal/eventloop_test.go index f53e6f3..3b9cb9a 100644 --- a/internal/eventloop_test.go +++ b/internal/eventloop_test.go @@ -51,6 +51,8 @@ func TestEventloop(t *testing.T) { "SyncEventTest": makeSyncEventTestData(t), "IoUringSetupEventTest": makeIoUringSetupEventTestData(t), "IoUringSetupFailureTest": makeIoUringSetupFailureTestData(t), + "IoUringEnterEventTest": makeIoUringEnterEventTestData(t), + "IoUringRegisterEventTest": makeIoUringRegisterEventTestData(t), // Dup3Event tests "Dup3EventTest": makeDup3EventTestData(t), "Dup3WithCloexecTest": makeDup3WithCloexecTestData(t), @@ -62,6 +64,7 @@ func TestEventloop(t *testing.T) { "FcntlErrorTest": makeFcntlErrorTestData(t), "FcntlInvalidFdTest": makeFcntlInvalidFdTestData(t), "NameToHandleAtTest": makeNameToHandleAtTestData(t), + "NameToHandleAtFailureTest": makeNameToHandleAtFailureTestData(t), // FD Lifecycle tests "FdLifecycleTest": makeFdLifecycleTestData(t), "FdDupTest": makeFdDupTestData(t), @@ -939,6 +942,58 @@ func makeIoUringSetupFailureTestData(t *testing.T) (td testData) { return td } +func makeIoUringEnterEventTestData(t *testing.T) (td testData) { + fd := int32(52) + enterEv, enterEvBytes := makeEnterFdEvent(t, defaulTime, defaultPid, defaultTid, fd, types.SYS_ENTER_IO_URING_ENTER) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) + + exitEv, exitEvBytes := makeExitRetEvent(t, defaulTime+100, defaultPid, defaultTid, types.SYS_EXIT_IO_URING_ENTER, 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) + } + if ep.File == nil { + t.Errorf("Expected io_uring_enter to have a file") + } + if _, ok := el.files[fd]; ok { + t.Errorf("Expected io_uring_enter to not track fd %d", fd) + } + }) + + return td +} + +func makeIoUringRegisterEventTestData(t *testing.T) (td testData) { + fd := int32(53) + enterEv, enterEvBytes := makeEnterFdEvent(t, defaulTime, defaultPid, defaultTid, fd, types.SYS_ENTER_IO_URING_REGISTER) + td.rawTracepoints = append(td.rawTracepoints, enterEvBytes) + + exitEv, exitEvBytes := makeExitRetEvent(t, defaulTime+100, defaultPid, defaultTid, types.SYS_EXIT_IO_URING_REGISTER, 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) + } + if ep.File == nil { + t.Errorf("Expected io_uring_register to have a file") + } + if _, ok := el.files[fd]; ok { + t.Errorf("Expected io_uring_register to not track fd %d", fd) + } + }) + + return td +} + // Test data functions for Dup3Event syscalls func makeDup3EventTestData(t *testing.T) (td testData) { oldFd := int32(49) @@ -1772,6 +1827,43 @@ func makeNameToHandleAtTestData(t *testing.T) (td testData) { return td } +func makeNameToHandleAtFailureTestData(t *testing.T) (td testData) { + pathname := "/tmp/handle_failure.txt" + + _, 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, -1) + td.rawTracepoints = append(td.rawTracepoints, exitNameBytes) + + fd := int32(71) + _, 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) + + 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 open_by_handle_at to not use failed name_to_handle_at path") + } + + if _, ok := el.pendingHandles[defaultTid]; ok { + t.Errorf("Expected no pending handle for tid %d after failure", defaultTid) + } + }) + + return td +} + // Test open→read→write→close lifecycle func makeFdLifecycleTestData(t *testing.T) (td testData) { fd := int32(42) |
