summaryrefslogtreecommitdiff
path: root/integrationtests/pidfd_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-06-06 09:57:12 +0300
committerPaul Buetow <paul@buetow.org>2026-06-06 09:57:12 +0300
commit17cb27871a6cb5a1c21ca604c2285e7f072478a0 (patch)
tree3665bdbd12fee118b4ee5c137b74c7344a8a6c11 /integrationtests/pidfd_test.go
parent381581b373329b67187be494118df49e5ec2acca (diff)
test: close issued-but-unasserted gaps (signals, sched, sysv msgrcv) + fix pidfd_getfd path expectation
signals: TestSignalsBasic issued but never asserted enter_tkill and enter_rt_sigqueueinfo (both genuinely emitted by sendSelfSignals); add both MinCount>=1 enter assertions. Both tracepoints were already in signalsTraceArgs. sched: TestSchedBasic omitted enter_sched_setaffinity even though scenario_sched.go re-applies its affinity mask via SchedSetaffinity and the tracepoint is in schedTraceArgs; add the MinCount>=1 enter assertion. sysv: TestSysVMsgBasic only checked enter presence + duration for msgrcv. msgrcv is READ_CLASSIFIED, so add assertEventBytesAtLeast >= 12 ("ior-sysv-msg") mirroring the recvfrom/recvmsg byte assertions. pidfd: verified TestPidfdGetfdSuccess already PASSES deterministically with PathContains "pidfd-getfd-source.txt". The path is correct and meaningful: pidfd_getfd is an fd-transfer op, so at exit applyFdTransferOp re-points the event to the RETURNED dup fd, which for a self-pidfd refers to the same open source file. Kept the assertion and added a comment explaining why it resolves to the source file rather than the pidfd's anon_inode. No BPF/handler change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'integrationtests/pidfd_test.go')
-rw-r--r--integrationtests/pidfd_test.go12
1 files changed, 12 insertions, 0 deletions
diff --git a/integrationtests/pidfd_test.go b/integrationtests/pidfd_test.go
index 6116035..8df2e13 100644
--- a/integrationtests/pidfd_test.go
+++ b/integrationtests/pidfd_test.go
@@ -4,6 +4,18 @@ import "testing"
var pidfdTraceArgs = []string{"-trace-syscalls", "pidfd_open,pidfd_getfd,openat,write,close"}
+// TestPidfdGetfdSuccess asserts the resolved path of the pidfd_getfd event is
+// the duplicated source file, NOT the pidfd's anon_inode.
+//
+// The BPF enter handler captures args[0] = the pidfd (correct: the pidfd is the
+// operand being acted on). One might therefore expect the resolved path to be
+// the self-pidfd's "anon_inode:[pidfd]". It is not, and the PathContains below
+// is deterministic and meaningful for a concrete reason: pidfd_getfd is an
+// fd-transfer op. At exit, applyFdTransferOp (internal/eventloop_exit.go) drops
+// the pidfd and re-points the event's file to the RETURNED fd (the duplicate of
+// the source fd). For a self-pidfd that returned fd lives in this same process
+// and refers to the very same open file, so /proc/<pid>/fd/<newfd> readlinks to
+// "pidfd-getfd-source.txt". Verified deterministic across repeated runs.
func TestPidfdGetfdSuccess(t *testing.T) {
runScenarioResultWithIorArgs(t, "pidfd-getfd-success", []ExpectedEvent{
{