diff options
Diffstat (limited to 'tools/perf/tests/builtin-test.c')
-rw-r--r-- | tools/perf/tests/builtin-test.c | 273 |
1 files changed, 168 insertions, 105 deletions
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index 820fc1ae2210..b2cbc12a70a2 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -30,29 +30,20 @@ static bool dont_fork; -struct test __weak arch_tests[] = { - { - .func = NULL, - }, +struct test *__weak arch_tests[] = { + NULL, }; -#define DEFINE_SUITE(description, name) \ - { \ - .desc = description, \ - .func = test__##name, \ - } - -static struct test generic_tests[] = { -DEFINE_SUITE("vmlinux symtab matches kallsyms", vmlinux_matches_kallsyms), -DEFINE_SUITE("Detect openat syscall event", openat_syscall_event), -DEFINE_SUITE("Detect openat syscall event on all cpus", openat_syscall_event_on_all_cpus), -DEFINE_SUITE("Read samples using the mmap interface", basic_mmap), -DEFINE_SUITE("Test data source output", mem), -DEFINE_SUITE("Parse event definition strings", parse_events), -DEFINE_SUITE("Simple expression parser", expr), -DEFINE_SUITE("PERF_RECORD_* events & perf_sample fields", PERF_RECORD), -DEFINE_SUITE("Parse perf pmu format", pmu), -{ +DEFINE_SUITE("vmlinux symtab matches kallsyms", vmlinux_matches_kallsyms); +DEFINE_SUITE("Detect openat syscall event", openat_syscall_event); +DEFINE_SUITE("Detect openat syscall event on all cpus", openat_syscall_event_on_all_cpus); +DEFINE_SUITE("Read samples using the mmap interface", basic_mmap); +DEFINE_SUITE("Test data source output", mem); +DEFINE_SUITE("Parse event definition strings", parse_events); +DEFINE_SUITE("Simple expression parser", expr); +DEFINE_SUITE("PERF_RECORD_* events & perf_sample fields", PERF_RECORD); +DEFINE_SUITE("Parse perf pmu format", pmu); +static struct test pmu_events = { .desc = "PMU events", .func = test__pmu_events, .subtest = { @@ -61,33 +52,32 @@ DEFINE_SUITE("Parse perf pmu format", pmu), .get_desc = test__pmu_events_subtest_get_desc, .skip_reason = test__pmu_events_subtest_skip_reason, }, - -}, -DEFINE_SUITE("DSO data read", dso_data), -DEFINE_SUITE("DSO data cache", dso_data_cache), -DEFINE_SUITE("DSO data reopen", dso_data_reopen), -DEFINE_SUITE("Roundtrip evsel->name", perf_evsel__roundtrip_name_test), -DEFINE_SUITE("Parse sched tracepoints fields", perf_evsel__tp_sched_test), -DEFINE_SUITE("syscalls:sys_enter_openat event fields", syscall_openat_tp_fields), -DEFINE_SUITE("Setup struct perf_event_attr", attr), -DEFINE_SUITE("Match and link multiple hists", hists_link), -DEFINE_SUITE("'import perf' in python", python_use), -{ +}; +DEFINE_SUITE("DSO data read", dso_data); +DEFINE_SUITE("DSO data cache", dso_data_cache); +DEFINE_SUITE("DSO data reopen", dso_data_reopen); +DEFINE_SUITE("Roundtrip evsel->name", perf_evsel__roundtrip_name_test); +DEFINE_SUITE("Parse sched tracepoints fields", perf_evsel__tp_sched_test); +DEFINE_SUITE("syscalls:sys_enter_openat event fields", syscall_openat_tp_fields); +DEFINE_SUITE("Setup struct perf_event_attr", attr); +DEFINE_SUITE("Match and link multiple hists", hists_link); +DEFINE_SUITE("'import perf' in python", python_use); +static struct test bp_signal = { .desc = "Breakpoint overflow signal handler", .func = test__bp_signal, .is_supported = test__bp_signal_is_supported, -}, -{ +}; +static struct test bp_signal_overflow = { .desc = "Breakpoint overflow sampling", .func = test__bp_signal_overflow, .is_supported = test__bp_signal_is_supported, -}, -{ +}; +static struct test bp_accounting = { .desc = "Breakpoint accounting", .func = test__bp_accounting, .is_supported = test__bp_account_is_supported, -}, -{ +}; +static struct test wp = { .desc = "Watchpoint", .func = test__wp, .is_supported = test__wp_is_supported, @@ -97,24 +87,24 @@ DEFINE_SUITE("'import perf' in python", python_use), .get_desc = test__wp_subtest_get_desc, .skip_reason = test__wp_subtest_skip_reason, }, -}, -DEFINE_SUITE("Number of exit events of a simple workload", task_exit), -DEFINE_SUITE("Software clock events period values", sw_clock_freq), -DEFINE_SUITE("Object code reading", code_reading), -DEFINE_SUITE("Sample parsing", sample_parsing), -DEFINE_SUITE("Use a dummy software event to keep tracking", keep_tracking), -DEFINE_SUITE("Parse with no sample_id_all bit set", parse_no_sample_id_all), -DEFINE_SUITE("Filter hist entries", hists_filter), -DEFINE_SUITE("Lookup mmap thread", mmap_thread_lookup), -DEFINE_SUITE("Share thread maps", thread_maps_share), -DEFINE_SUITE("Sort output of hist entries", hists_output), -DEFINE_SUITE("Cumulate child hist entries", hists_cumulate), -DEFINE_SUITE("Track with sched_switch", switch_tracking), -DEFINE_SUITE("Filter fds with revents mask in a fdarray", fdarray__filter), -DEFINE_SUITE("Add fd to a fdarray, making it autogrow", fdarray__add), -DEFINE_SUITE("kmod_path__parse", kmod_path__parse), -DEFINE_SUITE("Thread map", thread_map), -{ +}; +DEFINE_SUITE("Number of exit events of a simple workload", task_exit); +DEFINE_SUITE("Software clock events period values", sw_clock_freq); +DEFINE_SUITE("Object code reading", code_reading); +DEFINE_SUITE("Sample parsing", sample_parsing); +DEFINE_SUITE("Use a dummy software event to keep tracking", keep_tracking); +DEFINE_SUITE("Parse with no sample_id_all bit set", parse_no_sample_id_all); +DEFINE_SUITE("Filter hist entries", hists_filter); +DEFINE_SUITE("Lookup mmap thread", mmap_thread_lookup); +DEFINE_SUITE("Share thread maps", thread_maps_share); +DEFINE_SUITE("Sort output of hist entries", hists_output); +DEFINE_SUITE("Cumulate child hist entries", hists_cumulate); +DEFINE_SUITE("Track with sched_switch", switch_tracking); +DEFINE_SUITE("Filter fds with revents mask in a fdarray", fdarray__filter); +DEFINE_SUITE("Add fd to a fdarray, making it autogrow", fdarray__add); +DEFINE_SUITE("kmod_path__parse", kmod_path__parse); +DEFINE_SUITE("Thread map", thread_map); +static struct test llvm = { .desc = "LLVM search and compile", .func = test__llvm, .subtest = { @@ -122,9 +112,9 @@ DEFINE_SUITE("Thread map", thread_map), .get_nr = test__llvm_subtest_get_nr, .get_desc = test__llvm_subtest_get_desc, }, -}, -DEFINE_SUITE("Session topology", session_topology), -{ +}; +DEFINE_SUITE("Session topology", session_topology); +static struct test bpf = { .desc = "BPF filter", .func = test__bpf, .subtest = { @@ -132,23 +122,23 @@ DEFINE_SUITE("Session topology", session_topology), .get_nr = test__bpf_subtest_get_nr, .get_desc = test__bpf_subtest_get_desc, }, -}, -DEFINE_SUITE("Synthesize thread map", thread_map_synthesize), -DEFINE_SUITE("Remove thread map", thread_map_remove), -DEFINE_SUITE("Synthesize cpu map", cpu_map_synthesize), -DEFINE_SUITE("Synthesize stat config", synthesize_stat_config), -DEFINE_SUITE("Synthesize stat", synthesize_stat), -DEFINE_SUITE("Synthesize stat round", synthesize_stat_round), -DEFINE_SUITE("Synthesize attr update", event_update), -DEFINE_SUITE("Event times", event_times), -DEFINE_SUITE("Read backward ring buffer", backward_ring_buffer), -DEFINE_SUITE("Print cpu map", cpu_map_print), -DEFINE_SUITE("Merge cpu map", cpu_map_merge), -DEFINE_SUITE("Probe SDT events", sdt_event), -DEFINE_SUITE("is_printable_array", is_printable_array), -DEFINE_SUITE("Print bitmap", bitmap_print), -DEFINE_SUITE("perf hooks", perf_hooks), -{ +}; +DEFINE_SUITE("Synthesize thread map", thread_map_synthesize); +DEFINE_SUITE("Remove thread map", thread_map_remove); +DEFINE_SUITE("Synthesize cpu map", cpu_map_synthesize); +DEFINE_SUITE("Synthesize stat config", synthesize_stat_config); +DEFINE_SUITE("Synthesize stat", synthesize_stat); +DEFINE_SUITE("Synthesize stat round", synthesize_stat_round); +DEFINE_SUITE("Synthesize attr update", event_update); +DEFINE_SUITE("Event times", event_times); +DEFINE_SUITE("Read backward ring buffer", backward_ring_buffer); +DEFINE_SUITE("Print cpu map", cpu_map_print); +DEFINE_SUITE("Merge cpu map", cpu_map_merge); +DEFINE_SUITE("Probe SDT events", sdt_event); +DEFINE_SUITE("is_printable_array", is_printable_array); +DEFINE_SUITE("Print bitmap", bitmap_print); +DEFINE_SUITE("perf hooks", perf_hooks); +static struct test clang = { .desc = "builtin clang support", .func = test__clang, .subtest = { @@ -156,12 +146,12 @@ DEFINE_SUITE("perf hooks", perf_hooks), .get_nr = test__clang_subtest_get_nr, .get_desc = test__clang_subtest_get_desc, } -}, -DEFINE_SUITE("unit_number__scnprintf", unit_number__scnprint), -DEFINE_SUITE("mem2node", mem2node), -DEFINE_SUITE("time utils", time_utils), -DEFINE_SUITE("Test jit_write_elf", jit_write_elf), -{ +}; +DEFINE_SUITE("unit_number__scnprintf", unit_number__scnprint); +DEFINE_SUITE("mem2node", mem2node); +DEFINE_SUITE("time utils", time_utils); +DEFINE_SUITE("Test jit_write_elf", jit_write_elf); +static struct test pfm = { .desc = "Test libpfm4 support", .func = test__pfm, .subtest = { @@ -169,26 +159,99 @@ DEFINE_SUITE("Test jit_write_elf", jit_write_elf), .get_nr = test__pfm_subtest_get_nr, .get_desc = test__pfm_subtest_get_desc, } -}, -DEFINE_SUITE("Test api io", api_io), -DEFINE_SUITE("maps__merge_in", maps__merge_in), -DEFINE_SUITE("Demangle Java", demangle_java), -DEFINE_SUITE("Demangle OCaml", demangle_ocaml), -DEFINE_SUITE("Parse and process metrics", parse_metric), -DEFINE_SUITE("PE file support", pe_file_parsing), -DEFINE_SUITE("Event expansion for cgroups", expand_cgroup_events), -{ +}; +DEFINE_SUITE("Test api io", api_io); +DEFINE_SUITE("maps__merge_in", maps__merge_in); +DEFINE_SUITE("Demangle Java", demangle_java); +DEFINE_SUITE("Demangle OCaml", demangle_ocaml); +DEFINE_SUITE("Parse and process metrics", parse_metric); +DEFINE_SUITE("PE file support", pe_file_parsing); +DEFINE_SUITE("Event expansion for cgroups", expand_cgroup_events); +static struct test perf_time_to_tsc = { .desc = "Convert perf time to TSC", .func = test__perf_time_to_tsc, .is_supported = test__tsc_is_supported, -}, -DEFINE_SUITE("dlfilter C API", dlfilter), -{ - .func = NULL, -}, +}; +DEFINE_SUITE("dlfilter C API", dlfilter); + + +static struct test *generic_tests[] = { + &vmlinux_matches_kallsyms, + &openat_syscall_event, + &openat_syscall_event_on_all_cpus, + &basic_mmap, + &mem, + &parse_events, + &expr, + &PERF_RECORD, + &pmu, + &pmu_events, + &dso_data, + &dso_data_cache, + &dso_data_reopen, + &perf_evsel__roundtrip_name_test, + &perf_evsel__tp_sched_test, + &syscall_openat_tp_fields, + &attr, + &hists_link, + &python_use, + &bp_signal, + &bp_signal_overflow, + &bp_accounting, + &wp, + &task_exit, + &sw_clock_freq, + &code_reading, + &sample_parsing, + &keep_tracking, + &parse_no_sample_id_all, + &hists_filter, + &mmap_thread_lookup, + &thread_maps_share, + &hists_output, + &hists_cumulate, + &switch_tracking, + &fdarray__filter, + &fdarray__add, + &kmod_path__parse, + &thread_map, + &llvm, + &session_topology, + &bpf, + &thread_map_synthesize, + &thread_map_remove, + &cpu_map_synthesize, + &synthesize_stat_config, + &synthesize_stat, + &synthesize_stat_round, + &event_update, + &event_times, + &backward_ring_buffer, + &cpu_map_print, + &cpu_map_merge, + &sdt_event, + &is_printable_array, + &bitmap_print, + &perf_hooks, + &clang, + &unit_number__scnprint, + &mem2node, + &time_utils, + &jit_write_elf, + &pfm, + &api_io, + &maps__merge_in, + &demangle_java, + &demangle_ocaml, + &parse_metric, + &pe_file_parsing, + &expand_cgroup_events, + &perf_time_to_tsc, + &dlfilter, + NULL, }; -static struct test *tests[] = { +static struct test **tests[] = { generic_tests, arch_tests, }; @@ -269,9 +332,9 @@ static int run_test(struct test *test, int subtest) return err; } -#define for_each_test(j, t) \ +#define for_each_test(j, k, t) \ for (j = 0; j < ARRAY_SIZE(tests); j++) \ - for (t = &tests[j][0]; t->func; t++) + for (k = 0, t = tests[j][k]; tests[j][k]; k++, t = tests[j][k]) static int test_and_print(struct test *t, bool force_skip, int subtest) { @@ -470,18 +533,18 @@ static int run_shell_tests(int argc, const char *argv[], int i, int width, static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist) { struct test *t; - unsigned int j; + unsigned int j, k; int i = 0; int width = shell_tests__max_desc_width(); - for_each_test(j, t) { + for_each_test(j, k, t) { int len = strlen(t->desc); if (width < len) width = len; } - for_each_test(j, t) { + for_each_test(j, k, t) { int curr = i++, err; int subi; @@ -597,11 +660,11 @@ static int perf_test__list_shell(int argc, const char **argv, int i) static int perf_test__list(int argc, const char **argv) { - unsigned int j; + unsigned int j, k; struct test *t; int i = 0; - for_each_test(j, t) { + for_each_test(j, k, t) { int curr = i++; if (!perf_test__matches(t->desc, curr, argc, argv) || |