|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | #ifndef TESTS_H | 
|  | #define TESTS_H | 
|  |  | 
|  | #include <stdbool.h> | 
|  |  | 
|  | #define TEST_ASSERT_VAL(text, cond)					 \ | 
|  | do {									 \ | 
|  | if (!(cond)) {							 \ | 
|  | pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \ | 
|  | return -1;						 \ | 
|  | }								 \ | 
|  | } while (0) | 
|  |  | 
|  | #define TEST_ASSERT_EQUAL(text, val, expected)				 \ | 
|  | do {									 \ | 
|  | if (val != expected) {						 \ | 
|  | pr_debug("FAILED %s:%d %s (%d != %d)\n",		 \ | 
|  | __FILE__, __LINE__, text, val, expected);	 \ | 
|  | return -1;						 \ | 
|  | }								 \ | 
|  | } while (0) | 
|  |  | 
|  | enum { | 
|  | TEST_OK   =  0, | 
|  | TEST_FAIL = -1, | 
|  | TEST_SKIP = -2, | 
|  | }; | 
|  |  | 
|  | struct test_suite; | 
|  |  | 
|  | typedef int (*test_fnptr)(struct test_suite *, int); | 
|  |  | 
|  | struct test_case { | 
|  | const char *name; | 
|  | const char *desc; | 
|  | const char *skip_reason; | 
|  | test_fnptr run_case; | 
|  | }; | 
|  |  | 
|  | struct test_suite { | 
|  | const char *desc; | 
|  | struct test_case *test_cases; | 
|  | void *priv; | 
|  | }; | 
|  |  | 
|  | #define DECLARE_SUITE(name) \ | 
|  | extern struct test_suite suite__##name; | 
|  |  | 
|  | #define TEST_CASE(description, _name)			\ | 
|  | {						\ | 
|  | .name = #_name,				\ | 
|  | .desc = description,			\ | 
|  | .run_case = test__##_name,		\ | 
|  | } | 
|  |  | 
|  | #define TEST_CASE_REASON(description, _name, _reason)	\ | 
|  | {						\ | 
|  | .name = #_name,				\ | 
|  | .desc = description,			\ | 
|  | .run_case = test__##_name,		\ | 
|  | .skip_reason = _reason,			\ | 
|  | } | 
|  |  | 
|  | #define DEFINE_SUITE(description, _name)		\ | 
|  | struct test_case tests__##_name[] = {           \ | 
|  | TEST_CASE(description, _name),		\ | 
|  | {	.name = NULL, }			\ | 
|  | };						\ | 
|  | struct test_suite suite__##_name = {		\ | 
|  | .desc = description,			\ | 
|  | .test_cases = tests__##_name,		\ | 
|  | } | 
|  |  | 
|  | /* Tests */ | 
|  | DECLARE_SUITE(vmlinux_matches_kallsyms); | 
|  | DECLARE_SUITE(openat_syscall_event); | 
|  | DECLARE_SUITE(openat_syscall_event_on_all_cpus); | 
|  | DECLARE_SUITE(basic_mmap); | 
|  | DECLARE_SUITE(PERF_RECORD); | 
|  | DECLARE_SUITE(perf_evsel__roundtrip_name_test); | 
|  | DECLARE_SUITE(perf_evsel__tp_sched_test); | 
|  | DECLARE_SUITE(syscall_openat_tp_fields); | 
|  | DECLARE_SUITE(pmu); | 
|  | DECLARE_SUITE(pmu_events); | 
|  | DECLARE_SUITE(attr); | 
|  | DECLARE_SUITE(dso_data); | 
|  | DECLARE_SUITE(dso_data_cache); | 
|  | DECLARE_SUITE(dso_data_reopen); | 
|  | DECLARE_SUITE(parse_events); | 
|  | DECLARE_SUITE(hists_link); | 
|  | DECLARE_SUITE(python_use); | 
|  | DECLARE_SUITE(bp_signal); | 
|  | DECLARE_SUITE(bp_signal_overflow); | 
|  | DECLARE_SUITE(bp_accounting); | 
|  | DECLARE_SUITE(wp); | 
|  | DECLARE_SUITE(task_exit); | 
|  | DECLARE_SUITE(mem); | 
|  | DECLARE_SUITE(sw_clock_freq); | 
|  | DECLARE_SUITE(code_reading); | 
|  | DECLARE_SUITE(sample_parsing); | 
|  | DECLARE_SUITE(keep_tracking); | 
|  | DECLARE_SUITE(parse_no_sample_id_all); | 
|  | DECLARE_SUITE(dwarf_unwind); | 
|  | DECLARE_SUITE(expr); | 
|  | DECLARE_SUITE(hists_filter); | 
|  | DECLARE_SUITE(mmap_thread_lookup); | 
|  | DECLARE_SUITE(thread_maps_share); | 
|  | DECLARE_SUITE(hists_output); | 
|  | DECLARE_SUITE(hists_cumulate); | 
|  | DECLARE_SUITE(switch_tracking); | 
|  | DECLARE_SUITE(fdarray__filter); | 
|  | DECLARE_SUITE(fdarray__add); | 
|  | DECLARE_SUITE(kmod_path__parse); | 
|  | DECLARE_SUITE(thread_map); | 
|  | DECLARE_SUITE(llvm); | 
|  | DECLARE_SUITE(bpf); | 
|  | DECLARE_SUITE(session_topology); | 
|  | DECLARE_SUITE(thread_map_synthesize); | 
|  | DECLARE_SUITE(thread_map_remove); | 
|  | DECLARE_SUITE(cpu_map_synthesize); | 
|  | DECLARE_SUITE(synthesize_stat_config); | 
|  | DECLARE_SUITE(synthesize_stat); | 
|  | DECLARE_SUITE(synthesize_stat_round); | 
|  | DECLARE_SUITE(event_update); | 
|  | DECLARE_SUITE(event_times); | 
|  | DECLARE_SUITE(backward_ring_buffer); | 
|  | DECLARE_SUITE(cpu_map_print); | 
|  | DECLARE_SUITE(cpu_map_merge); | 
|  | DECLARE_SUITE(sdt_event); | 
|  | DECLARE_SUITE(is_printable_array); | 
|  | DECLARE_SUITE(bitmap_print); | 
|  | DECLARE_SUITE(perf_hooks); | 
|  | DECLARE_SUITE(clang); | 
|  | DECLARE_SUITE(unit_number__scnprint); | 
|  | DECLARE_SUITE(mem2node); | 
|  | DECLARE_SUITE(maps__merge_in); | 
|  | DECLARE_SUITE(time_utils); | 
|  | DECLARE_SUITE(jit_write_elf); | 
|  | DECLARE_SUITE(api_io); | 
|  | DECLARE_SUITE(demangle_java); | 
|  | DECLARE_SUITE(demangle_ocaml); | 
|  | DECLARE_SUITE(pfm); | 
|  | DECLARE_SUITE(parse_metric); | 
|  | DECLARE_SUITE(pe_file_parsing); | 
|  | DECLARE_SUITE(expand_cgroup_events); | 
|  | DECLARE_SUITE(perf_time_to_tsc); | 
|  | DECLARE_SUITE(dlfilter); | 
|  | DECLARE_SUITE(sigtrap); | 
|  | DECLARE_SUITE(event_groups); | 
|  | DECLARE_SUITE(symbols); | 
|  |  | 
|  | /* | 
|  | * PowerPC and S390 do not support creation of instruction breakpoints using the | 
|  | * perf_event interface. | 
|  | * | 
|  | * ARM requires explicit rounding down of the instruction pointer in Thumb mode, | 
|  | * and then requires the single-step to be handled explicitly in the overflow | 
|  | * handler to avoid stepping into the SIGIO handler and getting stuck on the | 
|  | * breakpointed instruction. | 
|  | * | 
|  | * Since arm64 has the same issue with arm for the single-step handling, this | 
|  | * case also gets stuck on the breakpointed instruction. | 
|  | * | 
|  | * Just disable the test for these architectures until these issues are | 
|  | * resolved. | 
|  | */ | 
|  | #if defined(__powerpc__) || defined(__s390x__) || defined(__arm__) || defined(__aarch64__) | 
|  | #define BP_SIGNAL_IS_SUPPORTED 0 | 
|  | #else | 
|  | #define BP_SIGNAL_IS_SUPPORTED 1 | 
|  | #endif | 
|  |  | 
|  | #ifdef HAVE_DWARF_UNWIND_SUPPORT | 
|  | struct thread; | 
|  | struct perf_sample; | 
|  | int test__arch_unwind_sample(struct perf_sample *sample, | 
|  | struct thread *thread); | 
|  | #endif | 
|  |  | 
|  | #if defined(__arm__) | 
|  | DECLARE_SUITE(vectors_page); | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * Define test workloads to be used in test suites. | 
|  | */ | 
|  | typedef int (*workload_fnptr)(int argc, const char **argv); | 
|  |  | 
|  | struct test_workload { | 
|  | const char	*name; | 
|  | workload_fnptr	func; | 
|  | }; | 
|  |  | 
|  | #define DECLARE_WORKLOAD(work) \ | 
|  | extern struct test_workload workload__##work | 
|  |  | 
|  | #define DEFINE_WORKLOAD(work) \ | 
|  | struct test_workload workload__##work = {	\ | 
|  | .name = #work,				\ | 
|  | .func = work,				\ | 
|  | } | 
|  |  | 
|  | /* The list of test workloads */ | 
|  | DECLARE_WORKLOAD(noploop); | 
|  | DECLARE_WORKLOAD(thloop); | 
|  | DECLARE_WORKLOAD(leafloop); | 
|  | DECLARE_WORKLOAD(sqrtloop); | 
|  | DECLARE_WORKLOAD(brstack); | 
|  | DECLARE_WORKLOAD(datasym); | 
|  |  | 
|  | extern const char *dso_to_test; | 
|  |  | 
|  | #endif /* TESTS_H */ |