4 * Builtin regression testing command: ever growing number of sanity tests
14 #include "parse-options.h"
22 .desc
= "vmlinux symtab matches kallsyms",
23 .func
= test__vmlinux_matches_kallsyms
,
26 .desc
= "detect open syscall event",
27 .func
= test__open_syscall_event
,
30 .desc
= "detect open syscall event on all cpus",
31 .func
= test__open_syscall_event_on_all_cpus
,
34 .desc
= "read samples using the mmap interface",
35 .func
= test__basic_mmap
,
38 .desc
= "parse events tests",
39 .func
= test__parse_events
,
41 #if defined(__x86_64__) || defined(__i386__)
43 .desc
= "x86 rdpmc test",
48 .desc
= "Validate PERF_RECORD_* events & perf_sample fields",
49 .func
= test__PERF_RECORD
,
52 .desc
= "Test perf pmu format parsing",
56 .desc
= "Test dso data read",
57 .func
= test__dso_data
,
60 .desc
= "Test dso data cache",
61 .func
= test__dso_data_cache
,
64 .desc
= "Test dso data reopen",
65 .func
= test__dso_data_reopen
,
68 .desc
= "roundtrip evsel->name check",
69 .func
= test__perf_evsel__roundtrip_name_test
,
72 .desc
= "Check parsing of sched tracepoints fields",
73 .func
= test__perf_evsel__tp_sched_test
,
76 .desc
= "Generate and check syscalls:sys_enter_open event fields",
77 .func
= test__syscall_open_tp_fields
,
80 .desc
= "struct perf_event_attr setup",
84 .desc
= "Test matching and linking multiple hists",
85 .func
= test__hists_link
,
88 .desc
= "Try 'import perf' in python, checking link problems",
89 .func
= test__python_use
,
92 .desc
= "Test breakpoint overflow signal handler",
93 .func
= test__bp_signal
,
96 .desc
= "Test breakpoint overflow sampling",
97 .func
= test__bp_signal_overflow
,
100 .desc
= "Test number of exit event of a simple workload",
101 .func
= test__task_exit
,
104 .desc
= "Test software clock events have valid period values",
105 .func
= test__sw_clock_freq
,
107 #if defined(__x86_64__) || defined(__i386__)
109 .desc
= "Test converting perf time to TSC",
110 .func
= test__perf_time_to_tsc
,
114 .desc
= "Test object code reading",
115 .func
= test__code_reading
,
118 .desc
= "Test sample parsing",
119 .func
= test__sample_parsing
,
122 .desc
= "Test using a dummy software event to keep tracking",
123 .func
= test__keep_tracking
,
126 .desc
= "Test parsing with no sample_id_all bit set",
127 .func
= test__parse_no_sample_id_all
,
129 #if defined(__x86_64__) || defined(__i386__) || defined(__arm__)
130 #ifdef HAVE_DWARF_UNWIND_SUPPORT
132 .desc
= "Test dwarf unwind",
133 .func
= test__dwarf_unwind
,
138 .desc
= "Test filtering hist entries",
139 .func
= test__hists_filter
,
142 .desc
= "Test mmap thread lookup",
143 .func
= test__mmap_thread_lookup
,
146 .desc
= "Test thread mg sharing",
147 .func
= test__thread_mg_share
,
150 .desc
= "Test output sorting of hist entries",
151 .func
= test__hists_output
,
154 .desc
= "Test cumulation of child hist entries",
155 .func
= test__hists_cumulate
,
158 .desc
= "Test tracking with sched_switch",
159 .func
= test__switch_tracking
,
162 .desc
= "Filter fds with revents mask in a fdarray",
163 .func
= test__fdarray__filter
,
166 .desc
= "Add fd to a fdarray, making it autogrow",
167 .func
= test__fdarray__add
,
174 static bool perf_test__matches(int curr
, int argc
, const char *argv
[])
181 for (i
= 0; i
< argc
; ++i
) {
183 long nr
= strtoul(argv
[i
], &end
, 10);
191 if (strstr(tests
[curr
].desc
, argv
[i
]))
198 static int run_test(struct test
*test
)
200 int status
, err
= -1, child
= fork();
201 char sbuf
[STRERR_BUFSIZE
];
204 pr_err("failed to fork test: %s\n",
205 strerror_r(errno
, sbuf
, sizeof(sbuf
)));
210 pr_debug("test child forked, pid %d\n", getpid());
217 if (WIFEXITED(status
)) {
218 err
= WEXITSTATUS(status
);
219 pr_debug("test child finished with %d\n", err
);
220 } else if (WIFSIGNALED(status
)) {
222 pr_debug("test child interrupted\n");
228 static int __cmd_test(int argc
, const char *argv
[], struct intlist
*skiplist
)
233 while (tests
[i
].func
) {
234 int len
= strlen(tests
[i
].desc
);
242 while (tests
[i
].func
) {
245 if (!perf_test__matches(curr
, argc
, argv
))
248 pr_info("%2d: %-*s:", i
, width
, tests
[curr
].desc
);
250 if (intlist__find(skiplist
, i
)) {
251 color_fprintf(stderr
, PERF_COLOR_YELLOW
, " Skip (user override)\n");
255 pr_debug("\n--- start ---\n");
256 err
= run_test(&tests
[curr
]);
257 pr_debug("---- end ----\n%s:", tests
[curr
].desc
);
264 color_fprintf(stderr
, PERF_COLOR_YELLOW
, " Skip\n");
268 color_fprintf(stderr
, PERF_COLOR_RED
, " FAILED!\n");
276 static int perf_test__list(int argc
, const char **argv
)
280 while (tests
[i
].func
) {
283 if (argc
> 1 && !strstr(tests
[curr
].desc
, argv
[1]))
286 pr_info("%2d: %s\n", i
, tests
[curr
].desc
);
292 int cmd_test(int argc
, const char **argv
, const char *prefix __maybe_unused
)
294 const char * const test_usage
[] = {
295 "perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]",
298 const char *skip
= NULL
;
299 const struct option test_options
[] = {
300 OPT_STRING('s', "skip", &skip
, "tests", "tests to skip"),
301 OPT_INCR('v', "verbose", &verbose
,
302 "be more verbose (show symbol address, etc)"),
305 struct intlist
*skiplist
= NULL
;
306 int ret
= hists__init();
311 argc
= parse_options(argc
, argv
, test_options
, test_usage
, 0);
312 if (argc
>= 1 && !strcmp(argv
[0], "list"))
313 return perf_test__list(argc
, argv
);
315 symbol_conf
.priv_size
= sizeof(int);
316 symbol_conf
.sort_by_name
= true;
317 symbol_conf
.try_vmlinux_path
= true;
319 if (symbol__init(NULL
) < 0)
323 skiplist
= intlist__new(skip
);
325 return __cmd_test(argc
, argv
, skiplist
);