1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef TESTS_H |
3 | #define TESTS_H |
4 | |
5 | #include <stdbool.h> |
6 | |
7 | enum { |
8 | TEST_OK = 0, |
9 | TEST_FAIL = -1, |
10 | TEST_SKIP = -2, |
11 | }; |
12 | |
13 | #define TEST_ASSERT_VAL(text, cond) \ |
14 | do { \ |
15 | if (!(cond)) { \ |
16 | pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \ |
17 | return TEST_FAIL; \ |
18 | } \ |
19 | } while (0) |
20 | |
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); \ |
26 | return TEST_FAIL; \ |
27 | } \ |
28 | } while (0) |
29 | |
30 | struct test_suite; |
31 | |
32 | typedef int (*test_fnptr)(struct test_suite *, int); |
33 | |
34 | struct test_case { |
35 | const char *name; |
36 | const char *desc; |
37 | const char *skip_reason; |
38 | test_fnptr run_case; |
39 | }; |
40 | |
41 | struct test_suite { |
42 | const char *desc; |
43 | struct test_case *test_cases; |
44 | void *priv; |
45 | }; |
46 | |
47 | #define DECLARE_SUITE(name) \ |
48 | extern struct test_suite suite__##name; |
49 | |
50 | #define TEST_CASE(description, _name) \ |
51 | { \ |
52 | .name = #_name, \ |
53 | .desc = description, \ |
54 | .run_case = test__##_name, \ |
55 | } |
56 | |
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) \ |
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, \ |
73 | } |
74 | |
75 | /* Tests */ |
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); |
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); |
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); |
104 | DECLARE_SUITE(dwarf_unwind); |
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); |
116 | DECLARE_SUITE(bpf); |
117 | DECLARE_SUITE(session_topology); |
118 | DECLARE_SUITE(thread_map_synthesize); |
119 | DECLARE_SUITE(thread_map_remove); |
120 | DECLARE_SUITE(cpu_map); |
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); |
127 | DECLARE_SUITE(sdt_event); |
128 | DECLARE_SUITE(is_printable_array); |
129 | DECLARE_SUITE(bitmap_print); |
130 | DECLARE_SUITE(perf_hooks); |
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); |
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); |
145 | DECLARE_SUITE(sigtrap); |
146 | DECLARE_SUITE(event_groups); |
147 | DECLARE_SUITE(symbols); |
148 | DECLARE_SUITE(util); |
149 | |
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 |
170 | |
171 | #ifdef HAVE_DWARF_UNWIND_SUPPORT |
172 | struct thread; |
173 | struct perf_sample; |
174 | int test__arch_unwind_sample(struct perf_sample *sample, |
175 | struct thread *thread); |
176 | #endif |
177 | |
178 | #if defined(__arm__) |
179 | DECLARE_SUITE(vectors_page); |
180 | #endif |
181 | |
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); |
203 | DECLARE_WORKLOAD(thloop); |
204 | DECLARE_WORKLOAD(leafloop); |
205 | DECLARE_WORKLOAD(sqrtloop); |
206 | DECLARE_WORKLOAD(brstack); |
207 | DECLARE_WORKLOAD(datasym); |
208 | |
209 | extern const char *dso_to_test; |
210 | extern const char *test_objdump_path; |
211 | |
212 | #endif /* TESTS_H */ |
213 | |