1// SPDX-License-Identifier: GPL-2.0
2#include "parse-events.h"
3#include "evsel.h"
4#include "evlist.h"
5#include <api/fs/fs.h>
6#include "tests.h"
7#include "debug.h"
8#include "pmu.h"
9#include <dirent.h>
10#include <errno.h>
11#include <sys/types.h>
12#include <sys/stat.h>
13#include <unistd.h>
14#include <linux/kernel.h>
15#include <linux/hw_breakpoint.h>
16#include <api/fs/tracing_path.h>
17
18#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
19			     PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
20
21#if defined(__s390x__)
22/* Return true if kvm module is available and loaded. Test this
23 * and retun success when trace point kvm_s390_create_vm
24 * exists. Otherwise this test always fails.
25 */
26static bool kvm_s390_create_vm_valid(void)
27{
28	char *eventfile;
29	bool rc = false;
30
31	eventfile = get_events_file("kvm-s390");
32
33	if (eventfile) {
34		DIR *mydir = opendir(eventfile);
35
36		if (mydir) {
37			rc = true;
38			closedir(mydir);
39		}
40		put_events_file(eventfile);
41	}
42
43	return rc;
44}
45#endif
46
47static int test__checkevent_tracepoint(struct evlist *evlist)
48{
49	struct evsel *evsel = evlist__first(evlist);
50
51	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
52	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
53	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
54	TEST_ASSERT_VAL("wrong sample_type",
55		PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
56	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
57	return 0;
58}
59
60static int test__checkevent_tracepoint_multi(struct evlist *evlist)
61{
62	struct evsel *evsel;
63
64	TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
65	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
66
67	evlist__for_each_entry(evlist, evsel) {
68		TEST_ASSERT_VAL("wrong type",
69			PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
70		TEST_ASSERT_VAL("wrong sample_type",
71			PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
72		TEST_ASSERT_VAL("wrong sample_period",
73			1 == evsel->core.attr.sample_period);
74	}
75	return 0;
76}
77
78static int test__checkevent_raw(struct evlist *evlist)
79{
80	struct evsel *evsel = evlist__first(evlist);
81
82	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
83	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
84	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
85	return 0;
86}
87
88static int test__checkevent_numeric(struct evlist *evlist)
89{
90	struct evsel *evsel = evlist__first(evlist);
91
92	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
93	TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
94	TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
95	return 0;
96}
97
98static int test__checkevent_symbolic_name(struct evlist *evlist)
99{
100	struct evsel *evsel = evlist__first(evlist);
101
102	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
103	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
104	TEST_ASSERT_VAL("wrong config",
105			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
106	return 0;
107}
108
109static int test__checkevent_symbolic_name_config(struct evlist *evlist)
110{
111	struct evsel *evsel = evlist__first(evlist);
112
113	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
114	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
115	TEST_ASSERT_VAL("wrong config",
116			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
117	/*
118	 * The period value gets configured within perf_evlist__config,
119	 * while this test executes only parse events method.
120	 */
121	TEST_ASSERT_VAL("wrong period",
122			0 == evsel->core.attr.sample_period);
123	TEST_ASSERT_VAL("wrong config1",
124			0 == evsel->core.attr.config1);
125	TEST_ASSERT_VAL("wrong config2",
126			1 == evsel->core.attr.config2);
127	return 0;
128}
129
130static int test__checkevent_symbolic_alias(struct evlist *evlist)
131{
132	struct evsel *evsel = evlist__first(evlist);
133
134	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
135	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
136	TEST_ASSERT_VAL("wrong config",
137			PERF_COUNT_SW_PAGE_FAULTS == evsel->core.attr.config);
138	return 0;
139}
140
141static int test__checkevent_genhw(struct evlist *evlist)
142{
143	struct evsel *evsel = evlist__first(evlist);
144
145	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
146	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->core.attr.type);
147	TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->core.attr.config);
148	return 0;
149}
150
151static int test__checkevent_breakpoint(struct evlist *evlist)
152{
153	struct evsel *evsel = evlist__first(evlist);
154
155	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
156	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
157	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
158	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
159					 evsel->core.attr.bp_type);
160	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
161					evsel->core.attr.bp_len);
162	return 0;
163}
164
165static int test__checkevent_breakpoint_x(struct evlist *evlist)
166{
167	struct evsel *evsel = evlist__first(evlist);
168
169	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
170	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
171	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
172	TEST_ASSERT_VAL("wrong bp_type",
173			HW_BREAKPOINT_X == evsel->core.attr.bp_type);
174	TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->core.attr.bp_len);
175	return 0;
176}
177
178static int test__checkevent_breakpoint_r(struct evlist *evlist)
179{
180	struct evsel *evsel = evlist__first(evlist);
181
182	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
183	TEST_ASSERT_VAL("wrong type",
184			PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
185	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
186	TEST_ASSERT_VAL("wrong bp_type",
187			HW_BREAKPOINT_R == evsel->core.attr.bp_type);
188	TEST_ASSERT_VAL("wrong bp_len",
189			HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
190	return 0;
191}
192
193static int test__checkevent_breakpoint_w(struct evlist *evlist)
194{
195	struct evsel *evsel = evlist__first(evlist);
196
197	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
198	TEST_ASSERT_VAL("wrong type",
199			PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
200	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
201	TEST_ASSERT_VAL("wrong bp_type",
202			HW_BREAKPOINT_W == evsel->core.attr.bp_type);
203	TEST_ASSERT_VAL("wrong bp_len",
204			HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
205	return 0;
206}
207
208static int test__checkevent_breakpoint_rw(struct evlist *evlist)
209{
210	struct evsel *evsel = evlist__first(evlist);
211
212	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
213	TEST_ASSERT_VAL("wrong type",
214			PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
215	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
216	TEST_ASSERT_VAL("wrong bp_type",
217		(HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->core.attr.bp_type);
218	TEST_ASSERT_VAL("wrong bp_len",
219			HW_BREAKPOINT_LEN_4 == evsel->core.attr.bp_len);
220	return 0;
221}
222
223static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
224{
225	struct evsel *evsel = evlist__first(evlist);
226
227	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
228	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
229	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
230	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
231
232	return test__checkevent_tracepoint(evlist);
233}
234
235static int
236test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
237{
238	struct evsel *evsel;
239
240	TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
241
242	evlist__for_each_entry(evlist, evsel) {
243		TEST_ASSERT_VAL("wrong exclude_user",
244				!evsel->core.attr.exclude_user);
245		TEST_ASSERT_VAL("wrong exclude_kernel",
246				evsel->core.attr.exclude_kernel);
247		TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
248		TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
249	}
250
251	return test__checkevent_tracepoint_multi(evlist);
252}
253
254static int test__checkevent_raw_modifier(struct evlist *evlist)
255{
256	struct evsel *evsel = evlist__first(evlist);
257
258	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
259	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
260	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
261	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
262
263	return test__checkevent_raw(evlist);
264}
265
266static int test__checkevent_numeric_modifier(struct evlist *evlist)
267{
268	struct evsel *evsel = evlist__first(evlist);
269
270	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
271	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
272	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
273	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
274
275	return test__checkevent_numeric(evlist);
276}
277
278static int test__checkevent_symbolic_name_modifier(struct evlist *evlist)
279{
280	struct evsel *evsel = evlist__first(evlist);
281
282	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
283	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
284	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
285	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
286
287	return test__checkevent_symbolic_name(evlist);
288}
289
290static int test__checkevent_exclude_host_modifier(struct evlist *evlist)
291{
292	struct evsel *evsel = evlist__first(evlist);
293
294	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
295	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
296
297	return test__checkevent_symbolic_name(evlist);
298}
299
300static int test__checkevent_exclude_guest_modifier(struct evlist *evlist)
301{
302	struct evsel *evsel = evlist__first(evlist);
303
304	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
305	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
306
307	return test__checkevent_symbolic_name(evlist);
308}
309
310static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist)
311{
312	struct evsel *evsel = evlist__first(evlist);
313
314	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
315	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
316	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
317	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
318
319	return test__checkevent_symbolic_alias(evlist);
320}
321
322static int test__checkevent_genhw_modifier(struct evlist *evlist)
323{
324	struct evsel *evsel = evlist__first(evlist);
325
326	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
327	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
328	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
329	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
330
331	return test__checkevent_genhw(evlist);
332}
333
334static int test__checkevent_exclude_idle_modifier(struct evlist *evlist)
335{
336	struct evsel *evsel = evlist__first(evlist);
337
338	TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle);
339	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
340	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
341	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
342	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
343	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
344	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
345
346	return test__checkevent_symbolic_name(evlist);
347}
348
349static int test__checkevent_exclude_idle_modifier_1(struct evlist *evlist)
350{
351	struct evsel *evsel = evlist__first(evlist);
352
353	TEST_ASSERT_VAL("wrong exclude idle", evsel->core.attr.exclude_idle);
354	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
355	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
356	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
357	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
358	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
359	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
360
361	return test__checkevent_symbolic_name(evlist);
362}
363
364static int test__checkevent_breakpoint_modifier(struct evlist *evlist)
365{
366	struct evsel *evsel = evlist__first(evlist);
367
368
369	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
370	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
371	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
372	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
373	TEST_ASSERT_VAL("wrong name",
374			!strcmp(evsel__name(evsel), "mem:0:u"));
375
376	return test__checkevent_breakpoint(evlist);
377}
378
379static int test__checkevent_breakpoint_x_modifier(struct evlist *evlist)
380{
381	struct evsel *evsel = evlist__first(evlist);
382
383	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
384	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
385	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
386	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
387	TEST_ASSERT_VAL("wrong name",
388			!strcmp(evsel__name(evsel), "mem:0:x:k"));
389
390	return test__checkevent_breakpoint_x(evlist);
391}
392
393static int test__checkevent_breakpoint_r_modifier(struct evlist *evlist)
394{
395	struct evsel *evsel = evlist__first(evlist);
396
397	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
398	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
399	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
400	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
401	TEST_ASSERT_VAL("wrong name",
402			!strcmp(evsel__name(evsel), "mem:0:r:hp"));
403
404	return test__checkevent_breakpoint_r(evlist);
405}
406
407static int test__checkevent_breakpoint_w_modifier(struct evlist *evlist)
408{
409	struct evsel *evsel = evlist__first(evlist);
410
411	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
412	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
413	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
414	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
415	TEST_ASSERT_VAL("wrong name",
416			!strcmp(evsel__name(evsel), "mem:0:w:up"));
417
418	return test__checkevent_breakpoint_w(evlist);
419}
420
421static int test__checkevent_breakpoint_rw_modifier(struct evlist *evlist)
422{
423	struct evsel *evsel = evlist__first(evlist);
424
425	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
426	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
427	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
428	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
429	TEST_ASSERT_VAL("wrong name",
430			!strcmp(evsel__name(evsel), "mem:0:rw:kp"));
431
432	return test__checkevent_breakpoint_rw(evlist);
433}
434
435static int test__checkevent_pmu(struct evlist *evlist)
436{
437
438	struct evsel *evsel = evlist__first(evlist);
439
440	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
441	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
442	TEST_ASSERT_VAL("wrong config",    10 == evsel->core.attr.config);
443	TEST_ASSERT_VAL("wrong config1",    1 == evsel->core.attr.config1);
444	TEST_ASSERT_VAL("wrong config2",    3 == evsel->core.attr.config2);
445	/*
446	 * The period value gets configured within perf_evlist__config,
447	 * while this test executes only parse events method.
448	 */
449	TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
450
451	return 0;
452}
453
454static int test__checkevent_list(struct evlist *evlist)
455{
456	struct evsel *evsel = evlist__first(evlist);
457
458	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
459
460	/* r1 */
461	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
462	TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
463	TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
464	TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
465	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
466	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
467	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
468	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
469
470	/* syscalls:sys_enter_openat:k */
471	evsel = evsel__next(evsel);
472	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
473	TEST_ASSERT_VAL("wrong sample_type",
474		PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
475	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
476	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
477	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
478	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
479	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
480
481	/* 1:1:hp */
482	evsel = evsel__next(evsel);
483	TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
484	TEST_ASSERT_VAL("wrong config", 1 == evsel->core.attr.config);
485	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
486	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
487	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
488	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
489
490	return 0;
491}
492
493static int test__checkevent_pmu_name(struct evlist *evlist)
494{
495	struct evsel *evsel = evlist__first(evlist);
496
497	/* cpu/config=1,name=krava/u */
498	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
499	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
500	TEST_ASSERT_VAL("wrong config",  1 == evsel->core.attr.config);
501	TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "krava"));
502
503	/* cpu/config=2/u" */
504	evsel = evsel__next(evsel);
505	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
506	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
507	TEST_ASSERT_VAL("wrong config",  2 == evsel->core.attr.config);
508	TEST_ASSERT_VAL("wrong name",
509			!strcmp(evsel__name(evsel), "cpu/config=2/u"));
510
511	return 0;
512}
513
514static int test__checkevent_pmu_partial_time_callgraph(struct evlist *evlist)
515{
516	struct evsel *evsel = evlist__first(evlist);
517
518	/* cpu/config=1,call-graph=fp,time,period=100000/ */
519	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
520	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
521	TEST_ASSERT_VAL("wrong config",  1 == evsel->core.attr.config);
522	/*
523	 * The period, time and callgraph value gets configured
524	 * within perf_evlist__config,
525	 * while this test executes only parse events method.
526	 */
527	TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
528	TEST_ASSERT_VAL("wrong callgraph",  !evsel__has_callchain(evsel));
529	TEST_ASSERT_VAL("wrong time",  !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type));
530
531	/* cpu/config=2,call-graph=no,time=0,period=2000/ */
532	evsel = evsel__next(evsel);
533	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
534	TEST_ASSERT_VAL("wrong config",  2 == evsel->core.attr.config);
535	/*
536	 * The period, time and callgraph value gets configured
537	 * within perf_evlist__config,
538	 * while this test executes only parse events method.
539	 */
540	TEST_ASSERT_VAL("wrong period",     0 == evsel->core.attr.sample_period);
541	TEST_ASSERT_VAL("wrong callgraph",  !evsel__has_callchain(evsel));
542	TEST_ASSERT_VAL("wrong time",  !(PERF_SAMPLE_TIME & evsel->core.attr.sample_type));
543
544	return 0;
545}
546
547static int test__checkevent_pmu_events(struct evlist *evlist)
548{
549	struct evsel *evsel = evlist__first(evlist);
550
551	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
552	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
553	TEST_ASSERT_VAL("wrong exclude_user",
554			!evsel->core.attr.exclude_user);
555	TEST_ASSERT_VAL("wrong exclude_kernel",
556			evsel->core.attr.exclude_kernel);
557	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
558	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
559	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
560	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
561
562	return 0;
563}
564
565
566static int test__checkevent_pmu_events_mix(struct evlist *evlist)
567{
568	struct evsel *evsel = evlist__first(evlist);
569
570	/* pmu-event:u */
571	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
572	TEST_ASSERT_VAL("wrong exclude_user",
573			!evsel->core.attr.exclude_user);
574	TEST_ASSERT_VAL("wrong exclude_kernel",
575			evsel->core.attr.exclude_kernel);
576	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
577	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
578	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
579	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
580
581	/* cpu/pmu-event/u*/
582	evsel = evsel__next(evsel);
583	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
584	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
585	TEST_ASSERT_VAL("wrong exclude_user",
586			!evsel->core.attr.exclude_user);
587	TEST_ASSERT_VAL("wrong exclude_kernel",
588			evsel->core.attr.exclude_kernel);
589	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
590	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
591	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
592	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.pinned);
593
594	return 0;
595}
596
597static int test__checkterms_simple(struct list_head *terms)
598{
599	struct parse_events_term *term;
600
601	/* config=10 */
602	term = list_entry(terms->next, struct parse_events_term, list);
603	TEST_ASSERT_VAL("wrong type term",
604			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
605	TEST_ASSERT_VAL("wrong type val",
606			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
607	TEST_ASSERT_VAL("wrong val", term->val.num == 10);
608	TEST_ASSERT_VAL("wrong config", !term->config);
609
610	/* config1 */
611	term = list_entry(term->list.next, struct parse_events_term, list);
612	TEST_ASSERT_VAL("wrong type term",
613			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
614	TEST_ASSERT_VAL("wrong type val",
615			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
616	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
617	TEST_ASSERT_VAL("wrong config", !term->config);
618
619	/* config2=3 */
620	term = list_entry(term->list.next, struct parse_events_term, list);
621	TEST_ASSERT_VAL("wrong type term",
622			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
623	TEST_ASSERT_VAL("wrong type val",
624			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
625	TEST_ASSERT_VAL("wrong val", term->val.num == 3);
626	TEST_ASSERT_VAL("wrong config", !term->config);
627
628	/* umask=1*/
629	term = list_entry(term->list.next, struct parse_events_term, list);
630	TEST_ASSERT_VAL("wrong type term",
631			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
632	TEST_ASSERT_VAL("wrong type val",
633			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
634	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
635	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
636
637	/*
638	 * read
639	 *
640	 * The perf_pmu__test_parse_init injects 'read' term into
641	 * perf_pmu_events_list, so 'read' is evaluated as read term
642	 * and not as raw event with 'ead' hex value.
643	 */
644	term = list_entry(term->list.next, struct parse_events_term, list);
645	TEST_ASSERT_VAL("wrong type term",
646			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
647	TEST_ASSERT_VAL("wrong type val",
648			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
649	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
650	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "read"));
651
652	/*
653	 * r0xead
654	 *
655	 * To be still able to pass 'ead' value with 'r' syntax,
656	 * we added support to parse 'r0xHEX' event.
657	 */
658	term = list_entry(term->list.next, struct parse_events_term, list);
659	TEST_ASSERT_VAL("wrong type term",
660			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
661	TEST_ASSERT_VAL("wrong type val",
662			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
663	TEST_ASSERT_VAL("wrong val", term->val.num == 0xead);
664	TEST_ASSERT_VAL("wrong config", !term->config);
665	return 0;
666}
667
668static int test__group1(struct evlist *evlist)
669{
670	struct evsel *evsel, *leader;
671
672	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
673	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
674
675	/* instructions:k */
676	evsel = leader = evlist__first(evlist);
677	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
678	TEST_ASSERT_VAL("wrong config",
679			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
680	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
681	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
682	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
683	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
684	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
685	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
686	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
687	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
688	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
689	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
690
691	/* cycles:upp */
692	evsel = evsel__next(evsel);
693	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
694	TEST_ASSERT_VAL("wrong config",
695			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
696	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
697	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
698	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
699	/* use of precise requires exclude_guest */
700	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
701	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
702	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
703	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
704	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
705	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
706
707	return 0;
708}
709
710static int test__group2(struct evlist *evlist)
711{
712	struct evsel *evsel, *leader;
713
714	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
715	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
716
717	/* faults + :ku modifier */
718	evsel = leader = evlist__first(evlist);
719	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
720	TEST_ASSERT_VAL("wrong config",
721			PERF_COUNT_SW_PAGE_FAULTS == evsel->core.attr.config);
722	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
723	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
724	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
725	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
726	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
727	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
728	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
729	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
730	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
731	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
732
733	/* cache-references + :u modifier */
734	evsel = evsel__next(evsel);
735	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
736	TEST_ASSERT_VAL("wrong config",
737			PERF_COUNT_HW_CACHE_REFERENCES == evsel->core.attr.config);
738	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
739	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
740	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
741	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
742	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
743	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
744	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
745	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
746	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
747
748	/* cycles:k */
749	evsel = evsel__next(evsel);
750	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
751	TEST_ASSERT_VAL("wrong config",
752			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
753	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
754	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
755	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
756	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
757	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
758	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
759	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
760	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
761
762	return 0;
763}
764
765static int test__group3(struct evlist *evlist __maybe_unused)
766{
767	struct evsel *evsel, *leader;
768
769	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries);
770	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
771
772	/* group1 syscalls:sys_enter_openat:H */
773	evsel = leader = evlist__first(evlist);
774	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
775	TEST_ASSERT_VAL("wrong sample_type",
776		PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
777	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->core.attr.sample_period);
778	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
779	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
780	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
781	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
782	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
783	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
784	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
785	TEST_ASSERT_VAL("wrong group name",
786		!strcmp(leader->group_name, "group1"));
787	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
788	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
789	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
790
791	/* group1 cycles:kppp */
792	evsel = evsel__next(evsel);
793	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
794	TEST_ASSERT_VAL("wrong config",
795			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
796	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
797	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
798	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
799	/* use of precise requires exclude_guest */
800	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
801	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
802	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 3);
803	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
804	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
805	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
806	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
807
808	/* group2 cycles + G modifier */
809	evsel = leader = evsel__next(evsel);
810	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
811	TEST_ASSERT_VAL("wrong config",
812			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
813	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
814	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
815	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
816	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
817	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
818	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
819	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
820	TEST_ASSERT_VAL("wrong group name",
821		!strcmp(leader->group_name, "group2"));
822	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
823	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
824	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
825
826	/* group2 1:3 + G modifier */
827	evsel = evsel__next(evsel);
828	TEST_ASSERT_VAL("wrong type", 1 == evsel->core.attr.type);
829	TEST_ASSERT_VAL("wrong config", 3 == evsel->core.attr.config);
830	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
831	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
832	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
833	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
834	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
835	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
836	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
837	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
838	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
839
840	/* instructions:u */
841	evsel = evsel__next(evsel);
842	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
843	TEST_ASSERT_VAL("wrong config",
844			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
845	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
846	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
847	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
848	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
849	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
850	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
851	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
852	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
853
854	return 0;
855}
856
857static int test__group4(struct evlist *evlist __maybe_unused)
858{
859	struct evsel *evsel, *leader;
860
861	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
862	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
863
864	/* cycles:u + p */
865	evsel = leader = evlist__first(evlist);
866	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
867	TEST_ASSERT_VAL("wrong config",
868			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
869	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
870	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
871	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
872	/* use of precise requires exclude_guest */
873	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
874	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
875	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 1);
876	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
877	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
878	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
879	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
880	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
881
882	/* instructions:kp + p */
883	evsel = evsel__next(evsel);
884	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
885	TEST_ASSERT_VAL("wrong config",
886			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
887	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
888	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
889	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
890	/* use of precise requires exclude_guest */
891	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
892	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
893	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip == 2);
894	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
895	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
896	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
897
898	return 0;
899}
900
901static int test__group5(struct evlist *evlist __maybe_unused)
902{
903	struct evsel *evsel, *leader;
904
905	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries);
906	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
907
908	/* cycles + G */
909	evsel = leader = evlist__first(evlist);
910	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
911	TEST_ASSERT_VAL("wrong config",
912			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
913	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
914	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
915	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
916	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
917	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
918	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
919	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
920	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
921	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
922	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
923	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
924
925	/* instructions + G */
926	evsel = evsel__next(evsel);
927	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
928	TEST_ASSERT_VAL("wrong config",
929			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
930	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
931	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
932	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
933	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
934	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
935	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
936	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
937	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
938	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
939
940	/* cycles:G */
941	evsel = leader = evsel__next(evsel);
942	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
943	TEST_ASSERT_VAL("wrong config",
944			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
945	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
946	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
947	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
948	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
949	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
950	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
951	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
952	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
953	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
954	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
955	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
956
957	/* instructions:G */
958	evsel = evsel__next(evsel);
959	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
960	TEST_ASSERT_VAL("wrong config",
961			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
962	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
963	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
964	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
965	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
966	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
967	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
968	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
969	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
970
971	/* cycles */
972	evsel = evsel__next(evsel);
973	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
974	TEST_ASSERT_VAL("wrong config",
975			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
976	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
977	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
978	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
979	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
980	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
981	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
982	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
983
984	return 0;
985}
986
987static int test__group_gh1(struct evlist *evlist)
988{
989	struct evsel *evsel, *leader;
990
991	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
992	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
993
994	/* cycles + :H group modifier */
995	evsel = leader = evlist__first(evlist);
996	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
997	TEST_ASSERT_VAL("wrong config",
998			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
999	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1000	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1001	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1002	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1003	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1004	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1005	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1006	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1007	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1008	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1009
1010	/* cache-misses:G + :H group modifier */
1011	evsel = evsel__next(evsel);
1012	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1013	TEST_ASSERT_VAL("wrong config",
1014			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1015	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1016	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1017	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1018	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1019	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1020	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1021	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1022	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1023
1024	return 0;
1025}
1026
1027static int test__group_gh2(struct evlist *evlist)
1028{
1029	struct evsel *evsel, *leader;
1030
1031	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
1032	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
1033
1034	/* cycles + :G group modifier */
1035	evsel = leader = evlist__first(evlist);
1036	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1037	TEST_ASSERT_VAL("wrong config",
1038			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
1039	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1040	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1041	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1042	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1043	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1044	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1045	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1046	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1047	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1048	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1049
1050	/* cache-misses:H + :G group modifier */
1051	evsel = evsel__next(evsel);
1052	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1053	TEST_ASSERT_VAL("wrong config",
1054			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1055	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1056	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1057	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1058	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1059	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1060	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1061	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1062	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1063
1064	return 0;
1065}
1066
1067static int test__group_gh3(struct evlist *evlist)
1068{
1069	struct evsel *evsel, *leader;
1070
1071	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
1072	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
1073
1074	/* cycles:G + :u group modifier */
1075	evsel = leader = evlist__first(evlist);
1076	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1077	TEST_ASSERT_VAL("wrong config",
1078			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
1079	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1080	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1081	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1082	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1083	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1084	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1085	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1086	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1087	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1088	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1089
1090	/* cache-misses:H + :u group modifier */
1091	evsel = evsel__next(evsel);
1092	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1093	TEST_ASSERT_VAL("wrong config",
1094			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1095	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1096	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1097	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1098	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1099	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1100	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1101	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1102	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1103
1104	return 0;
1105}
1106
1107static int test__group_gh4(struct evlist *evlist)
1108{
1109	struct evsel *evsel, *leader;
1110
1111	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
1112	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
1113
1114	/* cycles:G + :uG group modifier */
1115	evsel = leader = evlist__first(evlist);
1116	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1117	TEST_ASSERT_VAL("wrong config",
1118			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
1119	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1120	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1121	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1122	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1123	TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
1124	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1125	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1126	TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel));
1127	TEST_ASSERT_VAL("wrong core.nr_members", evsel->core.nr_members == 2);
1128	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 0);
1129
1130	/* cache-misses:H + :uG group modifier */
1131	evsel = evsel__next(evsel);
1132	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1133	TEST_ASSERT_VAL("wrong config",
1134			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1135	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1136	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1137	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1138	TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
1139	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1140	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1141	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1142	TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
1143
1144	return 0;
1145}
1146
1147static int test__leader_sample1(struct evlist *evlist)
1148{
1149	struct evsel *evsel, *leader;
1150
1151	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
1152
1153	/* cycles - sampling group leader */
1154	evsel = leader = evlist__first(evlist);
1155	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1156	TEST_ASSERT_VAL("wrong config",
1157			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
1158	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1159	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1160	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1161	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1162	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1163	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1164	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1165	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1166	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1167
1168	/* cache-misses - not sampling */
1169	evsel = evsel__next(evsel);
1170	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1171	TEST_ASSERT_VAL("wrong config",
1172			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1173	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1174	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1175	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1176	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1177	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1178	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1179	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1180	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1181
1182	/* branch-misses - not sampling */
1183	evsel = evsel__next(evsel);
1184	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1185	TEST_ASSERT_VAL("wrong config",
1186			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
1187	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1188	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
1189	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
1190	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1191	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1192	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1193	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1194	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1195	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1196
1197	return 0;
1198}
1199
1200static int test__leader_sample2(struct evlist *evlist __maybe_unused)
1201{
1202	struct evsel *evsel, *leader;
1203
1204	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
1205
1206	/* instructions - sampling group leader */
1207	evsel = leader = evlist__first(evlist);
1208	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1209	TEST_ASSERT_VAL("wrong config",
1210			PERF_COUNT_HW_INSTRUCTIONS == evsel->core.attr.config);
1211	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1212	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1213	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1214	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1215	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1216	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1217	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1218	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1219	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1220
1221	/* branch-misses - not sampling */
1222	evsel = evsel__next(evsel);
1223	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1224	TEST_ASSERT_VAL("wrong config",
1225			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
1226	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1227	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1228	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1229	TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
1230	TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
1231	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1232	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1233	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1234	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
1235
1236	return 0;
1237}
1238
1239static int test__checkevent_pinned_modifier(struct evlist *evlist)
1240{
1241	struct evsel *evsel = evlist__first(evlist);
1242
1243	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1244	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1245	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1246	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
1247	TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
1248
1249	return test__checkevent_symbolic_name(evlist);
1250}
1251
1252static int test__pinned_group(struct evlist *evlist)
1253{
1254	struct evsel *evsel, *leader;
1255
1256	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
1257
1258	/* cycles - group leader */
1259	evsel = leader = evlist__first(evlist);
1260	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1261	TEST_ASSERT_VAL("wrong config",
1262			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
1263	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1264	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1265	TEST_ASSERT_VAL("wrong pinned", evsel->core.attr.pinned);
1266
1267	/* cache-misses - can not be pinned, but will go on with the leader */
1268	evsel = evsel__next(evsel);
1269	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1270	TEST_ASSERT_VAL("wrong config",
1271			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1272	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
1273
1274	/* branch-misses - ditto */
1275	evsel = evsel__next(evsel);
1276	TEST_ASSERT_VAL("wrong config",
1277			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
1278	TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
1279
1280	return 0;
1281}
1282
1283static int test__checkevent_exclusive_modifier(struct evlist *evlist)
1284{
1285	struct evsel *evsel = evlist__first(evlist);
1286
1287	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1288	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1289	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1290	TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
1291	TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
1292
1293	return test__checkevent_symbolic_name(evlist);
1294}
1295
1296static int test__exclusive_group(struct evlist *evlist)
1297{
1298	struct evsel *evsel, *leader;
1299
1300	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
1301
1302	/* cycles - group leader */
1303	evsel = leader = evlist__first(evlist);
1304	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1305	TEST_ASSERT_VAL("wrong config",
1306			PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
1307	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
1308	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
1309	TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
1310
1311	/* cache-misses - can not be pinned, but will go on with the leader */
1312	evsel = evsel__next(evsel);
1313	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
1314	TEST_ASSERT_VAL("wrong config",
1315			PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
1316	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
1317
1318	/* branch-misses - ditto */
1319	evsel = evsel__next(evsel);
1320	TEST_ASSERT_VAL("wrong config",
1321			PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
1322	TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
1323
1324	return 0;
1325}
1326static int test__checkevent_breakpoint_len(struct evlist *evlist)
1327{
1328	struct evsel *evsel = evlist__first(evlist);
1329
1330	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
1331	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
1332	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
1333	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
1334					 evsel->core.attr.bp_type);
1335	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_1 ==
1336					evsel->core.attr.bp_len);
1337
1338	return 0;
1339}
1340
1341static int test__checkevent_breakpoint_len_w(struct evlist *evlist)
1342{
1343	struct evsel *evsel = evlist__first(evlist);
1344
1345	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
1346	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type);
1347	TEST_ASSERT_VAL("wrong config", 0 == evsel->core.attr.config);
1348	TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W ==
1349					 evsel->core.attr.bp_type);
1350	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_2 ==
1351					evsel->core.attr.bp_len);
1352
1353	return 0;
1354}
1355
1356static int
1357test__checkevent_breakpoint_len_rw_modifier(struct evlist *evlist)
1358{
1359	struct evsel *evsel = evlist__first(evlist);
1360
1361	TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
1362	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1363	TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
1364	TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
1365
1366	return test__checkevent_breakpoint_rw(evlist);
1367}
1368
1369static int test__checkevent_precise_max_modifier(struct evlist *evlist)
1370{
1371	struct evsel *evsel = evlist__first(evlist);
1372
1373	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
1374	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
1375	TEST_ASSERT_VAL("wrong config",
1376			PERF_COUNT_SW_TASK_CLOCK == evsel->core.attr.config);
1377	return 0;
1378}
1379
1380static int test__checkevent_config_symbol(struct evlist *evlist)
1381{
1382	struct evsel *evsel = evlist__first(evlist);
1383
1384	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "insn") == 0);
1385	return 0;
1386}
1387
1388static int test__checkevent_config_raw(struct evlist *evlist)
1389{
1390	struct evsel *evsel = evlist__first(evlist);
1391
1392	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "rawpmu") == 0);
1393	return 0;
1394}
1395
1396static int test__checkevent_config_num(struct evlist *evlist)
1397{
1398	struct evsel *evsel = evlist__first(evlist);
1399
1400	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "numpmu") == 0);
1401	return 0;
1402}
1403
1404static int test__checkevent_config_cache(struct evlist *evlist)
1405{
1406	struct evsel *evsel = evlist__first(evlist);
1407
1408	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "cachepmu") == 0);
1409	return 0;
1410}
1411
1412static bool test__intel_pt_valid(void)
1413{
1414	return !!perf_pmu__find("intel_pt");
1415}
1416
1417static int test__intel_pt(struct evlist *evlist)
1418{
1419	struct evsel *evsel = evlist__first(evlist);
1420
1421	TEST_ASSERT_VAL("wrong name setting", strcmp(evsel->name, "intel_pt//u") == 0);
1422	return 0;
1423}
1424
1425static int test__checkevent_complex_name(struct evlist *evlist)
1426{
1427	struct evsel *evsel = evlist__first(evlist);
1428
1429	TEST_ASSERT_VAL("wrong complex name parsing", strcmp(evsel->name, "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks") == 0);
1430	return 0;
1431}
1432
1433static int test__checkevent_raw_pmu(struct evlist *evlist)
1434{
1435	struct evsel *evsel = evlist__first(evlist);
1436
1437	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
1438	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
1439	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->core.attr.config);
1440	return 0;
1441}
1442
1443static int test__sym_event_slash(struct evlist *evlist)
1444{
1445	struct evsel *evsel = evlist__first(evlist);
1446
1447	TEST_ASSERT_VAL("wrong type", evsel->core.attr.type == PERF_TYPE_HARDWARE);
1448	TEST_ASSERT_VAL("wrong config", evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES);
1449	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
1450	return 0;
1451}
1452
1453static int test__sym_event_dc(struct evlist *evlist)
1454{
1455	struct evsel *evsel = evlist__first(evlist);
1456
1457	TEST_ASSERT_VAL("wrong type", evsel->core.attr.type == PERF_TYPE_HARDWARE);
1458	TEST_ASSERT_VAL("wrong config", evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES);
1459	TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
1460	return 0;
1461}
1462
1463static int count_tracepoints(void)
1464{
1465	struct dirent *events_ent;
1466	DIR *events_dir;
1467	int cnt = 0;
1468
1469	events_dir = tracing_events__opendir();
1470
1471	TEST_ASSERT_VAL("Can't open events dir", events_dir);
1472
1473	while ((events_ent = readdir(events_dir))) {
1474		char *sys_path;
1475		struct dirent *sys_ent;
1476		DIR *sys_dir;
1477
1478		if (!strcmp(events_ent->d_name, ".")
1479		    || !strcmp(events_ent->d_name, "..")
1480		    || !strcmp(events_ent->d_name, "enable")
1481		    || !strcmp(events_ent->d_name, "header_event")
1482		    || !strcmp(events_ent->d_name, "header_page"))
1483			continue;
1484
1485		sys_path = get_events_file(events_ent->d_name);
1486		TEST_ASSERT_VAL("Can't get sys path", sys_path);
1487
1488		sys_dir = opendir(sys_path);
1489		TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
1490
1491		while ((sys_ent = readdir(sys_dir))) {
1492			if (!strcmp(sys_ent->d_name, ".")
1493			    || !strcmp(sys_ent->d_name, "..")
1494			    || !strcmp(sys_ent->d_name, "enable")
1495			    || !strcmp(sys_ent->d_name, "filter"))
1496				continue;
1497
1498			cnt++;
1499		}
1500
1501		closedir(sys_dir);
1502		put_events_file(sys_path);
1503	}
1504
1505	closedir(events_dir);
1506	return cnt;
1507}
1508
1509static int test__all_tracepoints(struct evlist *evlist)
1510{
1511	TEST_ASSERT_VAL("wrong events count",
1512			count_tracepoints() == evlist->core.nr_entries);
1513
1514	return test__checkevent_tracepoint_multi(evlist);
1515}
1516
1517struct evlist_test {
1518	const char *name;
1519	__u32 type;
1520	const int id;
1521	bool (*valid)(void);
1522	int (*check)(struct evlist *evlist);
1523};
1524
1525static struct evlist_test test__events[] = {
1526	{
1527		.name  = "syscalls:sys_enter_openat",
1528		.check = test__checkevent_tracepoint,
1529		.id    = 0,
1530	},
1531	{
1532		.name  = "syscalls:*",
1533		.check = test__checkevent_tracepoint_multi,
1534		.id    = 1,
1535	},
1536	{
1537		.name  = "r1a",
1538		.check = test__checkevent_raw,
1539		.id    = 2,
1540	},
1541	{
1542		.name  = "1:1",
1543		.check = test__checkevent_numeric,
1544		.id    = 3,
1545	},
1546	{
1547		.name  = "instructions",
1548		.check = test__checkevent_symbolic_name,
1549		.id    = 4,
1550	},
1551	{
1552		.name  = "cycles/period=100000,config2/",
1553		.check = test__checkevent_symbolic_name_config,
1554		.id    = 5,
1555	},
1556	{
1557		.name  = "faults",
1558		.check = test__checkevent_symbolic_alias,
1559		.id    = 6,
1560	},
1561	{
1562		.name  = "L1-dcache-load-miss",
1563		.check = test__checkevent_genhw,
1564		.id    = 7,
1565	},
1566	{
1567		.name  = "mem:0",
1568		.check = test__checkevent_breakpoint,
1569		.id    = 8,
1570	},
1571	{
1572		.name  = "mem:0:x",
1573		.check = test__checkevent_breakpoint_x,
1574		.id    = 9,
1575	},
1576	{
1577		.name  = "mem:0:r",
1578		.check = test__checkevent_breakpoint_r,
1579		.id    = 10,
1580	},
1581	{
1582		.name  = "mem:0:w",
1583		.check = test__checkevent_breakpoint_w,
1584		.id    = 11,
1585	},
1586	{
1587		.name  = "syscalls:sys_enter_openat:k",
1588		.check = test__checkevent_tracepoint_modifier,
1589		.id    = 12,
1590	},
1591	{
1592		.name  = "syscalls:*:u",
1593		.check = test__checkevent_tracepoint_multi_modifier,
1594		.id    = 13,
1595	},
1596	{
1597		.name  = "r1a:kp",
1598		.check = test__checkevent_raw_modifier,
1599		.id    = 14,
1600	},
1601	{
1602		.name  = "1:1:hp",
1603		.check = test__checkevent_numeric_modifier,
1604		.id    = 15,
1605	},
1606	{
1607		.name  = "instructions:h",
1608		.check = test__checkevent_symbolic_name_modifier,
1609		.id    = 16,
1610	},
1611	{
1612		.name  = "faults:u",
1613		.check = test__checkevent_symbolic_alias_modifier,
1614		.id    = 17,
1615	},
1616	{
1617		.name  = "L1-dcache-load-miss:kp",
1618		.check = test__checkevent_genhw_modifier,
1619		.id    = 18,
1620	},
1621	{
1622		.name  = "mem:0:u",
1623		.check = test__checkevent_breakpoint_modifier,
1624		.id    = 19,
1625	},
1626	{
1627		.name  = "mem:0:x:k",
1628		.check = test__checkevent_breakpoint_x_modifier,
1629		.id    = 20,
1630	},
1631	{
1632		.name  = "mem:0:r:hp",
1633		.check = test__checkevent_breakpoint_r_modifier,
1634		.id    = 21,
1635	},
1636	{
1637		.name  = "mem:0:w:up",
1638		.check = test__checkevent_breakpoint_w_modifier,
1639		.id    = 22,
1640	},
1641	{
1642		.name  = "r1,syscalls:sys_enter_openat:k,1:1:hp",
1643		.check = test__checkevent_list,
1644		.id    = 23,
1645	},
1646	{
1647		.name  = "instructions:G",
1648		.check = test__checkevent_exclude_host_modifier,
1649		.id    = 24,
1650	},
1651	{
1652		.name  = "instructions:H",
1653		.check = test__checkevent_exclude_guest_modifier,
1654		.id    = 25,
1655	},
1656	{
1657		.name  = "mem:0:rw",
1658		.check = test__checkevent_breakpoint_rw,
1659		.id    = 26,
1660	},
1661	{
1662		.name  = "mem:0:rw:kp",
1663		.check = test__checkevent_breakpoint_rw_modifier,
1664		.id    = 27,
1665	},
1666	{
1667		.name  = "{instructions:k,cycles:upp}",
1668		.check = test__group1,
1669		.id    = 28,
1670	},
1671	{
1672		.name  = "{faults:k,cache-references}:u,cycles:k",
1673		.check = test__group2,
1674		.id    = 29,
1675	},
1676	{
1677		.name  = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
1678		.check = test__group3,
1679		.id    = 30,
1680	},
1681	{
1682		.name  = "{cycles:u,instructions:kp}:p",
1683		.check = test__group4,
1684		.id    = 31,
1685	},
1686	{
1687		.name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
1688		.check = test__group5,
1689		.id    = 32,
1690	},
1691	{
1692		.name  = "*:*",
1693		.check = test__all_tracepoints,
1694		.id    = 33,
1695	},
1696	{
1697		.name  = "{cycles,cache-misses:G}:H",
1698		.check = test__group_gh1,
1699		.id    = 34,
1700	},
1701	{
1702		.name  = "{cycles,cache-misses:H}:G",
1703		.check = test__group_gh2,
1704		.id    = 35,
1705	},
1706	{
1707		.name  = "{cycles:G,cache-misses:H}:u",
1708		.check = test__group_gh3,
1709		.id    = 36,
1710	},
1711	{
1712		.name  = "{cycles:G,cache-misses:H}:uG",
1713		.check = test__group_gh4,
1714		.id    = 37,
1715	},
1716	{
1717		.name  = "{cycles,cache-misses,branch-misses}:S",
1718		.check = test__leader_sample1,
1719		.id    = 38,
1720	},
1721	{
1722		.name  = "{instructions,branch-misses}:Su",
1723		.check = test__leader_sample2,
1724		.id    = 39,
1725	},
1726	{
1727		.name  = "instructions:uDp",
1728		.check = test__checkevent_pinned_modifier,
1729		.id    = 40,
1730	},
1731	{
1732		.name  = "{cycles,cache-misses,branch-misses}:D",
1733		.check = test__pinned_group,
1734		.id    = 41,
1735	},
1736	{
1737		.name  = "mem:0/1",
1738		.check = test__checkevent_breakpoint_len,
1739		.id    = 42,
1740	},
1741	{
1742		.name  = "mem:0/2:w",
1743		.check = test__checkevent_breakpoint_len_w,
1744		.id    = 43,
1745	},
1746	{
1747		.name  = "mem:0/4:rw:u",
1748		.check = test__checkevent_breakpoint_len_rw_modifier,
1749		.id    = 44
1750	},
1751#if defined(__s390x__)
1752	{
1753		.name  = "kvm-s390:kvm_s390_create_vm",
1754		.check = test__checkevent_tracepoint,
1755		.valid = kvm_s390_create_vm_valid,
1756		.id    = 100,
1757	},
1758#endif
1759	{
1760		.name  = "instructions:I",
1761		.check = test__checkevent_exclude_idle_modifier,
1762		.id    = 45,
1763	},
1764	{
1765		.name  = "instructions:kIG",
1766		.check = test__checkevent_exclude_idle_modifier_1,
1767		.id    = 46,
1768	},
1769	{
1770		.name  = "task-clock:P,cycles",
1771		.check = test__checkevent_precise_max_modifier,
1772		.id    = 47,
1773	},
1774	{
1775		.name  = "instructions/name=insn/",
1776		.check = test__checkevent_config_symbol,
1777		.id    = 48,
1778	},
1779	{
1780		.name  = "r1234/name=rawpmu/",
1781		.check = test__checkevent_config_raw,
1782		.id    = 49,
1783	},
1784	{
1785		.name  = "4:0x6530160/name=numpmu/",
1786		.check = test__checkevent_config_num,
1787		.id    = 50,
1788	},
1789	{
1790		.name  = "L1-dcache-misses/name=cachepmu/",
1791		.check = test__checkevent_config_cache,
1792		.id    = 51,
1793	},
1794	{
1795		.name  = "intel_pt//u",
1796		.valid = test__intel_pt_valid,
1797		.check = test__intel_pt,
1798		.id    = 52,
1799	},
1800	{
1801		.name  = "cycles/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks'/Duk",
1802		.check = test__checkevent_complex_name,
1803		.id    = 53
1804	},
1805	{
1806		.name  = "cycles//u",
1807		.check = test__sym_event_slash,
1808		.id    = 54,
1809	},
1810	{
1811		.name  = "cycles:k",
1812		.check = test__sym_event_dc,
1813		.id    = 55,
1814	},
1815	{
1816		.name  = "instructions:uep",
1817		.check = test__checkevent_exclusive_modifier,
1818		.id    = 56,
1819	},
1820	{
1821		.name  = "{cycles,cache-misses,branch-misses}:e",
1822		.check = test__exclusive_group,
1823		.id    = 57,
1824	},
1825};
1826
1827static struct evlist_test test__events_pmu[] = {
1828	{
1829		.name  = "cpu/config=10,config1,config2=3,period=1000/u",
1830		.check = test__checkevent_pmu,
1831		.id    = 0,
1832	},
1833	{
1834		.name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
1835		.check = test__checkevent_pmu_name,
1836		.id    = 1,
1837	},
1838	{
1839		.name  = "cpu/config=1,call-graph=fp,time,period=100000/,cpu/config=2,call-graph=no,time=0,period=2000/",
1840		.check = test__checkevent_pmu_partial_time_callgraph,
1841		.id    = 2,
1842	},
1843	{
1844		.name  = "cpu/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks',period=0x1,event=0x2/ukp",
1845		.check = test__checkevent_complex_name,
1846		.id    = 3,
1847	},
1848	{
1849		.name  = "software/r1a/",
1850		.check = test__checkevent_raw_pmu,
1851		.id    = 4,
1852	},
1853	{
1854		.name  = "software/r0x1a/",
1855		.check = test__checkevent_raw_pmu,
1856		.id    = 4,
1857	},
1858};
1859
1860struct terms_test {
1861	const char *str;
1862	__u32 type;
1863	int (*check)(struct list_head *terms);
1864};
1865
1866static struct terms_test test__terms[] = {
1867	[0] = {
1868		.str   = "config=10,config1,config2=3,umask=1,read,r0xead",
1869		.check = test__checkterms_simple,
1870	},
1871};
1872
1873static int test_event(struct evlist_test *e)
1874{
1875	struct parse_events_error err;
1876	struct evlist *evlist;
1877	int ret;
1878
1879	bzero(&err, sizeof(err));
1880	if (e->valid && !e->valid()) {
1881		pr_debug("... SKIP");
1882		return 0;
1883	}
1884
1885	evlist = evlist__new();
1886	if (evlist == NULL)
1887		return -ENOMEM;
1888
1889	ret = parse_events(evlist, e->name, &err);
1890	if (ret) {
1891		pr_debug("failed to parse event '%s', err %d, str '%s'\n",
1892			 e->name, ret, err.str);
1893		parse_events_print_error(&err, e->name);
1894	} else {
1895		ret = e->check(evlist);
1896	}
1897
1898	evlist__delete(evlist);
1899
1900	return ret;
1901}
1902
1903static int test_events(struct evlist_test *events, unsigned cnt)
1904{
1905	int ret1, ret2 = 0;
1906	unsigned i;
1907
1908	for (i = 0; i < cnt; i++) {
1909		struct evlist_test *e = &events[i];
1910
1911		pr_debug("running test %d '%s'", e->id, e->name);
1912		ret1 = test_event(e);
1913		if (ret1)
1914			ret2 = ret1;
1915		pr_debug("\n");
1916	}
1917
1918	return ret2;
1919}
1920
1921static int test_term(struct terms_test *t)
1922{
1923	struct list_head terms;
1924	int ret;
1925
1926	INIT_LIST_HEAD(&terms);
1927
1928	/*
1929	 * The perf_pmu__test_parse_init prepares perf_pmu_events_list
1930	 * which gets freed in parse_events_terms.
1931	 */
1932	if (perf_pmu__test_parse_init())
1933		return -1;
1934
1935	ret = parse_events_terms(&terms, t->str);
1936	if (ret) {
1937		pr_debug("failed to parse terms '%s', err %d\n",
1938			 t->str , ret);
1939		return ret;
1940	}
1941
1942	ret = t->check(&terms);
1943	parse_events_terms__purge(&terms);
1944
1945	return ret;
1946}
1947
1948static int test_terms(struct terms_test *terms, unsigned cnt)
1949{
1950	int ret = 0;
1951	unsigned i;
1952
1953	for (i = 0; i < cnt; i++) {
1954		struct terms_test *t = &terms[i];
1955
1956		pr_debug("running test %d '%s'\n", i, t->str);
1957		ret = test_term(t);
1958		if (ret)
1959			break;
1960	}
1961
1962	return ret;
1963}
1964
1965static int test_pmu(void)
1966{
1967	struct stat st;
1968	char path[PATH_MAX];
1969	int ret;
1970
1971	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
1972		 sysfs__mountpoint());
1973
1974	ret = stat(path, &st);
1975	if (ret)
1976		pr_debug("omitting PMU cpu tests\n");
1977	return !ret;
1978}
1979
1980static int test_pmu_events(void)
1981{
1982	struct stat st;
1983	char path[PATH_MAX];
1984	struct dirent *ent;
1985	DIR *dir;
1986	int ret;
1987
1988	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
1989		 sysfs__mountpoint());
1990
1991	ret = stat(path, &st);
1992	if (ret) {
1993		pr_debug("omitting PMU cpu events tests\n");
1994		return 0;
1995	}
1996
1997	dir = opendir(path);
1998	if (!dir) {
1999		pr_debug("can't open pmu event dir");
2000		return -1;
2001	}
2002
2003	while (!ret && (ent = readdir(dir))) {
2004		struct evlist_test e = { .id = 0, };
2005		char name[2 * NAME_MAX + 1 + 12 + 3];
2006
2007		/* Names containing . are special and cannot be used directly */
2008		if (strchr(ent->d_name, '.'))
2009			continue;
2010
2011		snprintf(name, sizeof(name), "cpu/event=%s/u", ent->d_name);
2012
2013		e.name  = name;
2014		e.check = test__checkevent_pmu_events;
2015
2016		ret = test_event(&e);
2017		if (ret)
2018			break;
2019		snprintf(name, sizeof(name), "%s:u,cpu/event=%s/u", ent->d_name, ent->d_name);
2020		e.name  = name;
2021		e.check = test__checkevent_pmu_events_mix;
2022		ret = test_event(&e);
2023	}
2024
2025	closedir(dir);
2026	return ret;
2027}
2028
2029int test__parse_events(struct test *test __maybe_unused, int subtest __maybe_unused)
2030{
2031	int ret1, ret2 = 0;
2032
2033#define TEST_EVENTS(tests)				\
2034do {							\
2035	ret1 = test_events(tests, ARRAY_SIZE(tests));	\
2036	if (!ret2)					\
2037		ret2 = ret1;				\
2038} while (0)
2039
2040	TEST_EVENTS(test__events);
2041
2042	if (test_pmu())
2043		TEST_EVENTS(test__events_pmu);
2044
2045	if (test_pmu()) {
2046		int ret = test_pmu_events();
2047		if (ret)
2048			return ret;
2049	}
2050
2051	ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
2052	if (!ret2)
2053		ret2 = ret1;
2054
2055	return ret2;
2056}
2057