diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-06 09:57:12 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-06 09:57:12 +0300 |
| commit | 17cb27871a6cb5a1c21ca604c2285e7f072478a0 (patch) | |
| tree | 3665bdbd12fee118b4ee5c137b74c7344a8a6c11 | |
| parent | 381581b373329b67187be494118df49e5ec2acca (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>
| -rw-r--r-- | integrationtests/ipc_sysv_test.go | 9 | ||||
| -rw-r--r-- | integrationtests/pidfd_test.go | 12 | ||||
| -rw-r--r-- | integrationtests/sched_test.go | 1 | ||||
| -rw-r--r-- | integrationtests/signals_test.go | 2 |
4 files changed, 24 insertions, 0 deletions
diff --git a/integrationtests/ipc_sysv_test.go b/integrationtests/ipc_sysv_test.go index d5f4fa9..8f21567 100644 --- a/integrationtests/ipc_sysv_test.go +++ b/integrationtests/ipc_sysv_test.go @@ -68,6 +68,15 @@ func TestSysVMsgBasic(t *testing.T) { for _, tp := range []string{"enter_msgget", "enter_msgsnd", "enter_msgrcv", "enter_msgctl"} { assertEventDurationPositive(t, result, ExpectedEvent{Tracepoint: tp, Comm: "ioworkload"}) } + + // msgrcv is READ_CLASSIFIED: its exit handler reports ctx->ret, the number + // of bytes copied into the caller's buffer. The workload sends the literal + // "ior-sysv-msg" (12 bytes, scenario_sysv.go sysvMsgText) and reads it back, + // so the captured byte count must be at least the payload length. (msgsnd is + // UNCLASSIFIED, so only msgrcv carries a meaningful READ byte count.) + assertEventBytesAtLeast(t, result, + ExpectedEvent{Tracepoint: "enter_msgrcv", Comm: "ioworkload"}, + uint64(len("ior-sysv-msg"))) } // sysvSemTraceArgs restricts tracing to the SysV semaphore family so the 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{ { diff --git a/integrationtests/sched_test.go b/integrationtests/sched_test.go index 204db5a..025ae78 100644 --- a/integrationtests/sched_test.go +++ b/integrationtests/sched_test.go @@ -33,6 +33,7 @@ func TestSchedBasic(t *testing.T) { AssertEventsPresent(t, result, []ExpectedEvent{ {Tracepoint: "enter_sched_yield", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_sched_getaffinity", Comm: "ioworkload", MinCount: 1}, + {Tracepoint: "enter_sched_setaffinity", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_sched_getscheduler", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_sched_getparam", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_sched_rr_get_interval", Comm: "ioworkload", MinCount: 1}, diff --git a/integrationtests/signals_test.go b/integrationtests/signals_test.go index 98840aa..eaddb18 100644 --- a/integrationtests/signals_test.go +++ b/integrationtests/signals_test.go @@ -32,6 +32,8 @@ func TestSignalsBasic(t *testing.T) { {Tracepoint: "enter_sigaltstack", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_kill", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_tgkill", Comm: "ioworkload", MinCount: 1}, + {Tracepoint: "enter_tkill", Comm: "ioworkload", MinCount: 1}, + {Tracepoint: "enter_rt_sigqueueinfo", Comm: "ioworkload", MinCount: 1}, {Tracepoint: "enter_rt_sigtimedwait", Comm: "ioworkload", MinCount: 1}, }) |
