1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package integrationtests
import "testing"
// signalsTraceArgs restricts tracing to the SIGNALS-family syscalls the
// signals-basic workload issues, so the output is dominated by those calls.
// pause (noreturn-blocking) and rt_sigreturn (only reachable via handler
// return) are intentionally absent: the scenario never invokes them.
var signalsTraceArgs = []string{
"-trace-syscalls",
"rt_sigaction,rt_sigprocmask,rt_sigpending,sigaltstack,kill,tgkill,tkill,rt_sigqueueinfo,rt_sigtimedwait",
}
// TestSignalsBasic verifies the SIGNALS syscall family is traced end-to-end.
// The signals-basic workload self-directs every call (installs a handler,
// blocks SIGUSR1, sets an alternate stack, sends SIGUSR1 to itself four ways,
// queries pending signals, and reaps one with a short timeout), so it never
// touches another process. Each required syscall must appear as an enter event.
func TestSignalsBasic(t *testing.T) {
h := newTestHarness(t)
result, pid, err := h.RunWithIorArgs("signals-basic", defaultDuration, signalsTraceArgs)
if err != nil {
t.Fatalf("run scenario signals-basic: %v", err)
}
AssertNoUnexpectedPID(t, result, pid)
AssertNoUnexpectedComm(t, result, "ioworkload")
AssertEventsPresent(t, result, []ExpectedEvent{
{Tracepoint: "enter_rt_sigaction", Comm: "ioworkload", MinCount: 1},
{Tracepoint: "enter_rt_sigprocmask", Comm: "ioworkload", MinCount: 1},
{Tracepoint: "enter_rt_sigpending", Comm: "ioworkload", MinCount: 1},
{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},
})
// rt_sigtimedwait blocks (briefly) on its timeout, so the paired enter/exit
// must carry a positive duration — proof the exit tracepoint was correlated.
assertEventDurationPositive(t, result,
ExpectedEvent{Tracepoint: "enter_rt_sigtimedwait", Comm: "ioworkload"})
}
|