4 * Builtin regression testing command: ever growing number of sanity tests
11 #include "parse-options.h"
19 .desc
= "vmlinux symtab matches kallsyms",
20 .func
= test__vmlinux_matches_kallsyms
,
23 .desc
= "detect open syscall event",
24 .func
= test__open_syscall_event
,
27 .desc
= "detect open syscall event on all cpus",
28 .func
= test__open_syscall_event_on_all_cpus
,
31 .desc
= "read samples using the mmap interface",
32 .func
= test__basic_mmap
,
35 .desc
= "parse events tests",
36 .func
= test__parse_events
,
38 #if defined(__x86_64__) || defined(__i386__)
40 .desc
= "x86 rdpmc test",
45 .desc
= "Validate PERF_RECORD_* events & perf_sample fields",
46 .func
= test__PERF_RECORD
,
49 .desc
= "Test perf pmu format parsing",
53 .desc
= "Test dso data interface",
54 .func
= test__dso_data
,
57 .desc
= "roundtrip evsel->name check",
58 .func
= test__perf_evsel__roundtrip_name_test
,
61 .desc
= "Check parsing of sched tracepoints fields",
62 .func
= test__perf_evsel__tp_sched_test
,
65 .desc
= "Generate and check syscalls:sys_enter_open event fields",
66 .func
= test__syscall_open_tp_fields
,
69 .desc
= "struct perf_event_attr setup",
73 .desc
= "Test matching and linking multiple hists",
74 .func
= test__hists_link
,
77 .desc
= "Try 'use perf' in python, checking link problems",
78 .func
= test__python_use
,
81 .desc
= "Test breakpoint overflow signal handler",
82 .func
= test__bp_signal
,
85 .desc
= "Test breakpoint overflow sampling",
86 .func
= test__bp_signal_overflow
,
89 .desc
= "Test number of exit event of a simple workload",
90 .func
= test__task_exit
,
93 .desc
= "Test software clock events have valid period values",
94 .func
= test__sw_clock_freq
,
96 #if defined(__x86_64__) || defined(__i386__)
98 .desc
= "Test converting perf time to TSC",
99 .func
= test__perf_time_to_tsc
,
103 .desc
= "Test object code reading",
104 .func
= test__code_reading
,
107 .desc
= "Test sample parsing",
108 .func
= test__sample_parsing
,
111 .desc
= "Test using a dummy software event to keep tracking",
112 .func
= test__keep_tracking
,
115 .desc
= "Test parsing with no sample_id_all bit set",
116 .func
= test__parse_no_sample_id_all
,
123 static bool perf_test__matches(int curr
, int argc
, const char *argv
[])
130 for (i
= 0; i
< argc
; ++i
) {
132 long nr
= strtoul(argv
[i
], &end
, 10);
140 if (strstr(tests
[curr
].desc
, argv
[i
]))
147 static int __cmd_test(int argc
, const char *argv
[], struct intlist
*skiplist
)
152 while (tests
[i
].func
) {
153 int len
= strlen(tests
[i
].desc
);
161 while (tests
[i
].func
) {
164 if (!perf_test__matches(curr
, argc
, argv
))
167 pr_info("%2d: %-*s:", i
, width
, tests
[curr
].desc
);
169 if (intlist__find(skiplist
, i
)) {
170 color_fprintf(stderr
, PERF_COLOR_YELLOW
, " Skip (user override)\n");
174 pr_debug("\n--- start ---\n");
175 err
= tests
[curr
].func();
176 pr_debug("---- end ----\n%s:", tests
[curr
].desc
);
183 color_fprintf(stderr
, PERF_COLOR_YELLOW
, " Skip\n");
187 color_fprintf(stderr
, PERF_COLOR_RED
, " FAILED!\n");
195 static int perf_test__list(int argc
, const char **argv
)
199 while (tests
[i
].func
) {
202 if (argc
> 1 && !strstr(tests
[curr
].desc
, argv
[1]))
205 pr_info("%2d: %s\n", i
, tests
[curr
].desc
);
211 int cmd_test(int argc
, const char **argv
, const char *prefix __maybe_unused
)
213 const char * const test_usage
[] = {
214 "perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]",
217 const char *skip
= NULL
;
218 const struct option test_options
[] = {
219 OPT_STRING('s', "skip", &skip
, "tests", "tests to skip"),
220 OPT_INCR('v', "verbose", &verbose
,
221 "be more verbose (show symbol address, etc)"),
224 struct intlist
*skiplist
= NULL
;
226 argc
= parse_options(argc
, argv
, test_options
, test_usage
, 0);
227 if (argc
>= 1 && !strcmp(argv
[0], "list"))
228 return perf_test__list(argc
, argv
);
230 symbol_conf
.priv_size
= sizeof(int);
231 symbol_conf
.sort_by_name
= true;
232 symbol_conf
.try_vmlinux_path
= true;
234 if (symbol__init() < 0)
238 skiplist
= intlist__new(skip
);
240 return __cmd_test(argc
, argv
, skiplist
);