Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
0a4e1ae6 JO |
2 | #ifndef TESTS_H |
3 | #define TESTS_H | |
4 | ||
e8c6d500 WN |
5 | #include <stdbool.h> |
6 | ||
8680999d ACM |
7 | enum { |
8 | TEST_OK = 0, | |
9 | TEST_FAIL = -1, | |
10 | TEST_SKIP = -2, | |
11 | }; | |
12 | ||
450ac18d JO |
13 | #define TEST_ASSERT_VAL(text, cond) \ |
14 | do { \ | |
15 | if (!(cond)) { \ | |
16 | pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \ | |
8680999d | 17 | return TEST_FAIL; \ |
450ac18d JO |
18 | } \ |
19 | } while (0) | |
20 | ||
8f196013 ACM |
21 | #define TEST_ASSERT_EQUAL(text, val, expected) \ |
22 | do { \ | |
23 | if (val != expected) { \ | |
24 | pr_debug("FAILED %s:%d %s (%d != %d)\n", \ | |
25 | __FILE__, __LINE__, text, val, expected); \ | |
8680999d | 26 | return TEST_FAIL; \ |
8f196013 ACM |
27 | } \ |
28 | } while (0) | |
29 | ||
f832044c IR |
30 | struct test_suite; |
31 | ||
32 | typedef int (*test_fnptr)(struct test_suite *, int); | |
33 | ||
78244d2e IR |
34 | struct test_case { |
35 | const char *name; | |
36 | const char *desc; | |
9be56d30 | 37 | const char *skip_reason; |
78244d2e IR |
38 | test_fnptr run_case; |
39 | }; | |
40 | ||
33f44bfd | 41 | struct test_suite { |
31b6753f | 42 | const char *desc; |
78244d2e | 43 | struct test_case *test_cases; |
1209b273 | 44 | void *priv; |
31b6753f MF |
45 | }; |
46 | ||
fe90d378 | 47 | #define DECLARE_SUITE(name) \ |
33f44bfd | 48 | extern struct test_suite suite__##name; |
fe90d378 | 49 | |
78244d2e IR |
50 | #define TEST_CASE(description, _name) \ |
51 | { \ | |
52 | .name = #_name, \ | |
53 | .desc = description, \ | |
54 | .run_case = test__##_name, \ | |
55 | } | |
56 | ||
9be56d30 IR |
57 | #define TEST_CASE_REASON(description, _name, _reason) \ |
58 | { \ | |
59 | .name = #_name, \ | |
60 | .desc = description, \ | |
61 | .run_case = test__##_name, \ | |
62 | .skip_reason = _reason, \ | |
63 | } | |
64 | ||
65 | #define DEFINE_SUITE(description, _name) \ | |
78244d2e IR |
66 | struct test_case tests__##_name[] = { \ |
67 | TEST_CASE(description, _name), \ | |
68 | { .name = NULL, } \ | |
69 | }; \ | |
70 | struct test_suite suite__##_name = { \ | |
71 | .desc = description, \ | |
72 | .test_cases = tests__##_name, \ | |
df225205 IR |
73 | } |
74 | ||
d3b59a38 | 75 | /* Tests */ |
fe90d378 IR |
76 | DECLARE_SUITE(vmlinux_matches_kallsyms); |
77 | DECLARE_SUITE(openat_syscall_event); | |
78 | DECLARE_SUITE(openat_syscall_event_on_all_cpus); | |
79 | DECLARE_SUITE(basic_mmap); | |
80 | DECLARE_SUITE(PERF_RECORD); | |
81 | DECLARE_SUITE(perf_evsel__roundtrip_name_test); | |
82 | DECLARE_SUITE(perf_evsel__tp_sched_test); | |
83 | DECLARE_SUITE(syscall_openat_tp_fields); | |
84 | DECLARE_SUITE(pmu); | |
85 | DECLARE_SUITE(pmu_events); | |
fe90d378 IR |
86 | DECLARE_SUITE(attr); |
87 | DECLARE_SUITE(dso_data); | |
88 | DECLARE_SUITE(dso_data_cache); | |
89 | DECLARE_SUITE(dso_data_reopen); | |
90 | DECLARE_SUITE(parse_events); | |
91 | DECLARE_SUITE(hists_link); | |
92 | DECLARE_SUITE(python_use); | |
93 | DECLARE_SUITE(bp_signal); | |
94 | DECLARE_SUITE(bp_signal_overflow); | |
95 | DECLARE_SUITE(bp_accounting); | |
96 | DECLARE_SUITE(wp); | |
fe90d378 IR |
97 | DECLARE_SUITE(task_exit); |
98 | DECLARE_SUITE(mem); | |
99 | DECLARE_SUITE(sw_clock_freq); | |
100 | DECLARE_SUITE(code_reading); | |
101 | DECLARE_SUITE(sample_parsing); | |
102 | DECLARE_SUITE(keep_tracking); | |
103 | DECLARE_SUITE(parse_no_sample_id_all); | |
d68f0365 | 104 | DECLARE_SUITE(dwarf_unwind); |
fe90d378 IR |
105 | DECLARE_SUITE(expr); |
106 | DECLARE_SUITE(hists_filter); | |
107 | DECLARE_SUITE(mmap_thread_lookup); | |
108 | DECLARE_SUITE(thread_maps_share); | |
109 | DECLARE_SUITE(hists_output); | |
110 | DECLARE_SUITE(hists_cumulate); | |
111 | DECLARE_SUITE(switch_tracking); | |
112 | DECLARE_SUITE(fdarray__filter); | |
113 | DECLARE_SUITE(fdarray__add); | |
114 | DECLARE_SUITE(kmod_path__parse); | |
115 | DECLARE_SUITE(thread_map); | |
fe90d378 | 116 | DECLARE_SUITE(bpf); |
fe90d378 IR |
117 | DECLARE_SUITE(session_topology); |
118 | DECLARE_SUITE(thread_map_synthesize); | |
119 | DECLARE_SUITE(thread_map_remove); | |
5cebb33f | 120 | DECLARE_SUITE(cpu_map); |
fe90d378 IR |
121 | DECLARE_SUITE(synthesize_stat_config); |
122 | DECLARE_SUITE(synthesize_stat); | |
123 | DECLARE_SUITE(synthesize_stat_round); | |
124 | DECLARE_SUITE(event_update); | |
125 | DECLARE_SUITE(event_times); | |
126 | DECLARE_SUITE(backward_ring_buffer); | |
fe90d378 IR |
127 | DECLARE_SUITE(sdt_event); |
128 | DECLARE_SUITE(is_printable_array); | |
129 | DECLARE_SUITE(bitmap_print); | |
130 | DECLARE_SUITE(perf_hooks); | |
fe90d378 IR |
131 | DECLARE_SUITE(unit_number__scnprint); |
132 | DECLARE_SUITE(mem2node); | |
133 | DECLARE_SUITE(maps__merge_in); | |
134 | DECLARE_SUITE(time_utils); | |
135 | DECLARE_SUITE(jit_write_elf); | |
136 | DECLARE_SUITE(api_io); | |
137 | DECLARE_SUITE(demangle_java); | |
138 | DECLARE_SUITE(demangle_ocaml); | |
139 | DECLARE_SUITE(pfm); | |
fe90d378 IR |
140 | DECLARE_SUITE(parse_metric); |
141 | DECLARE_SUITE(pe_file_parsing); | |
142 | DECLARE_SUITE(expand_cgroup_events); | |
143 | DECLARE_SUITE(perf_time_to_tsc); | |
144 | DECLARE_SUITE(dlfilter); | |
5504f679 | 145 | DECLARE_SUITE(sigtrap); |
9d9b22be | 146 | DECLARE_SUITE(event_groups); |
1b69346e | 147 | DECLARE_SUITE(symbols); |
8a55c1e2 | 148 | DECLARE_SUITE(util); |
d3b59a38 | 149 | |
4935e2cd IR |
150 | /* |
151 | * PowerPC and S390 do not support creation of instruction breakpoints using the | |
152 | * perf_event interface. | |
153 | * | |
154 | * ARM requires explicit rounding down of the instruction pointer in Thumb mode, | |
155 | * and then requires the single-step to be handled explicitly in the overflow | |
156 | * handler to avoid stepping into the SIGIO handler and getting stuck on the | |
157 | * breakpointed instruction. | |
158 | * | |
159 | * Since arm64 has the same issue with arm for the single-step handling, this | |
160 | * case also gets stuck on the breakpointed instruction. | |
161 | * | |
162 | * Just disable the test for these architectures until these issues are | |
163 | * resolved. | |
164 | */ | |
165 | #if defined(__powerpc__) || defined(__s390x__) || defined(__arm__) || defined(__aarch64__) | |
166 | #define BP_SIGNAL_IS_SUPPORTED 0 | |
167 | #else | |
168 | #define BP_SIGNAL_IS_SUPPORTED 1 | |
169 | #endif | |
598762cf | 170 | |
9ff125d1 | 171 | #ifdef HAVE_DWARF_UNWIND_SUPPORT |
aa16b81f JO |
172 | struct thread; |
173 | struct perf_sample; | |
174 | int test__arch_unwind_sample(struct perf_sample *sample, | |
175 | struct thread *thread); | |
176 | #endif | |
21327c78 FF |
177 | |
178 | #if defined(__arm__) | |
fe90d378 | 179 | DECLARE_SUITE(vectors_page); |
21327c78 FF |
180 | #endif |
181 | ||
f215054d NK |
182 | /* |
183 | * Define test workloads to be used in test suites. | |
184 | */ | |
185 | typedef int (*workload_fnptr)(int argc, const char **argv); | |
186 | ||
187 | struct test_workload { | |
188 | const char *name; | |
189 | workload_fnptr func; | |
190 | }; | |
191 | ||
192 | #define DECLARE_WORKLOAD(work) \ | |
193 | extern struct test_workload workload__##work | |
194 | ||
195 | #define DEFINE_WORKLOAD(work) \ | |
196 | struct test_workload workload__##work = { \ | |
197 | .name = #work, \ | |
198 | .func = work, \ | |
199 | } | |
200 | ||
201 | /* The list of test workloads */ | |
202 | DECLARE_WORKLOAD(noploop); | |
69b35292 | 203 | DECLARE_WORKLOAD(thloop); |
41522f74 | 204 | DECLARE_WORKLOAD(leafloop); |
39281709 | 205 | DECLARE_WORKLOAD(sqrtloop); |
a104f0ea | 206 | DECLARE_WORKLOAD(brstack); |
3dfc01fe | 207 | DECLARE_WORKLOAD(datasym); |
f215054d | 208 | |
1b69346e | 209 | extern const char *dso_to_test; |
33ce9fc4 | 210 | extern const char *test_objdump_path; |
1b69346e | 211 | |
0a4e1ae6 | 212 | #endif /* TESTS_H */ |