summaryrefslogtreecommitdiff
path: root/internal/eventloop_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/eventloop_test.go')
-rw-r--r--internal/eventloop_test.go92
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)