]> git.karo-electronics.de Git - karo-tx-linux.git/blob - tools/perf/tests/parse-events.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[karo-tx-linux.git] / tools / perf / tests / parse-events.c
1
2 #include "parse-events.h"
3 #include "evsel.h"
4 #include "evlist.h"
5 #include "sysfs.h"
6 #include <lk/debugfs.h>
7 #include "tests.h"
8 #include <linux/hw_breakpoint.h>
9
10 #define TEST_ASSERT_VAL(text, cond) \
11 do { \
12         if (!(cond)) { \
13                 pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
14                 return -1; \
15         } \
16 } while (0)
17
18 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
19                              PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
20
21 static int test__checkevent_tracepoint(struct perf_evlist *evlist)
22 {
23         struct perf_evsel *evsel = perf_evlist__first(evlist);
24
25         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
26         TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
27         TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
28         TEST_ASSERT_VAL("wrong sample_type",
29                 PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
30         TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
31         return 0;
32 }
33
34 static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
35 {
36         struct perf_evsel *evsel;
37
38         TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
39         TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
40
41         list_for_each_entry(evsel, &evlist->entries, node) {
42                 TEST_ASSERT_VAL("wrong type",
43                         PERF_TYPE_TRACEPOINT == evsel->attr.type);
44                 TEST_ASSERT_VAL("wrong sample_type",
45                         PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
46                 TEST_ASSERT_VAL("wrong sample_period",
47                         1 == evsel->attr.sample_period);
48         }
49         return 0;
50 }
51
52 static int test__checkevent_raw(struct perf_evlist *evlist)
53 {
54         struct perf_evsel *evsel = perf_evlist__first(evlist);
55
56         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
57         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
58         TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
59         return 0;
60 }
61
62 static int test__checkevent_numeric(struct perf_evlist *evlist)
63 {
64         struct perf_evsel *evsel = perf_evlist__first(evlist);
65
66         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
67         TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
68         TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
69         return 0;
70 }
71
72 static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
73 {
74         struct perf_evsel *evsel = perf_evlist__first(evlist);
75
76         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
77         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
78         TEST_ASSERT_VAL("wrong config",
79                         PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
80         return 0;
81 }
82
83 static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
84 {
85         struct perf_evsel *evsel = perf_evlist__first(evlist);
86
87         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
88         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
89         TEST_ASSERT_VAL("wrong config",
90                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
91         TEST_ASSERT_VAL("wrong period",
92                         100000 == evsel->attr.sample_period);
93         TEST_ASSERT_VAL("wrong config1",
94                         0 == evsel->attr.config1);
95         TEST_ASSERT_VAL("wrong config2",
96                         1 == evsel->attr.config2);
97         return 0;
98 }
99
100 static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
101 {
102         struct perf_evsel *evsel = perf_evlist__first(evlist);
103
104         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
105         TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
106         TEST_ASSERT_VAL("wrong config",
107                         PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
108         return 0;
109 }
110
111 static int test__checkevent_genhw(struct perf_evlist *evlist)
112 {
113         struct perf_evsel *evsel = perf_evlist__first(evlist);
114
115         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
116         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
117         TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
118         return 0;
119 }
120
121 static int test__checkevent_breakpoint(struct perf_evlist *evlist)
122 {
123         struct perf_evsel *evsel = perf_evlist__first(evlist);
124
125         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
126         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
127         TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
128         TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
129                                          evsel->attr.bp_type);
130         TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
131                                         evsel->attr.bp_len);
132         return 0;
133 }
134
135 static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
136 {
137         struct perf_evsel *evsel = perf_evlist__first(evlist);
138
139         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
140         TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
141         TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
142         TEST_ASSERT_VAL("wrong bp_type",
143                         HW_BREAKPOINT_X == evsel->attr.bp_type);
144         TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
145         return 0;
146 }
147
148 static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
149 {
150         struct perf_evsel *evsel = perf_evlist__first(evlist);
151
152         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
153         TEST_ASSERT_VAL("wrong type",
154                         PERF_TYPE_BREAKPOINT == evsel->attr.type);
155         TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
156         TEST_ASSERT_VAL("wrong bp_type",
157                         HW_BREAKPOINT_R == evsel->attr.bp_type);
158         TEST_ASSERT_VAL("wrong bp_len",
159                         HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
160         return 0;
161 }
162
163 static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
164 {
165         struct perf_evsel *evsel = perf_evlist__first(evlist);
166
167         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
168         TEST_ASSERT_VAL("wrong type",
169                         PERF_TYPE_BREAKPOINT == evsel->attr.type);
170         TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
171         TEST_ASSERT_VAL("wrong bp_type",
172                         HW_BREAKPOINT_W == evsel->attr.bp_type);
173         TEST_ASSERT_VAL("wrong bp_len",
174                         HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
175         return 0;
176 }
177
178 static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist)
179 {
180         struct perf_evsel *evsel = perf_evlist__first(evlist);
181
182         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
183         TEST_ASSERT_VAL("wrong type",
184                         PERF_TYPE_BREAKPOINT == evsel->attr.type);
185         TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
186         TEST_ASSERT_VAL("wrong bp_type",
187                 (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
188         TEST_ASSERT_VAL("wrong bp_len",
189                         HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
190         return 0;
191 }
192
193 static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
194 {
195         struct perf_evsel *evsel = perf_evlist__first(evlist);
196
197         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
198         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
199         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
200         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
201
202         return test__checkevent_tracepoint(evlist);
203 }
204
205 static int
206 test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
207 {
208         struct perf_evsel *evsel;
209
210         TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
211
212         list_for_each_entry(evsel, &evlist->entries, node) {
213                 TEST_ASSERT_VAL("wrong exclude_user",
214                                 !evsel->attr.exclude_user);
215                 TEST_ASSERT_VAL("wrong exclude_kernel",
216                                 evsel->attr.exclude_kernel);
217                 TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
218                 TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
219         }
220
221         return test__checkevent_tracepoint_multi(evlist);
222 }
223
224 static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
225 {
226         struct perf_evsel *evsel = perf_evlist__first(evlist);
227
228         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
229         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
230         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
231         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
232
233         return test__checkevent_raw(evlist);
234 }
235
236 static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
237 {
238         struct perf_evsel *evsel = perf_evlist__first(evlist);
239
240         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
241         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
242         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
243         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
244
245         return test__checkevent_numeric(evlist);
246 }
247
248 static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
249 {
250         struct perf_evsel *evsel = perf_evlist__first(evlist);
251
252         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
253         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
254         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
255         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
256
257         return test__checkevent_symbolic_name(evlist);
258 }
259
260 static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
261 {
262         struct perf_evsel *evsel = perf_evlist__first(evlist);
263
264         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
265         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
266
267         return test__checkevent_symbolic_name(evlist);
268 }
269
270 static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
271 {
272         struct perf_evsel *evsel = perf_evlist__first(evlist);
273
274         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
275         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
276
277         return test__checkevent_symbolic_name(evlist);
278 }
279
280 static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
281 {
282         struct perf_evsel *evsel = perf_evlist__first(evlist);
283
284         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
285         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
286         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
287         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
288
289         return test__checkevent_symbolic_alias(evlist);
290 }
291
292 static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
293 {
294         struct perf_evsel *evsel = perf_evlist__first(evlist);
295
296         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
297         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
298         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
299         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
300
301         return test__checkevent_genhw(evlist);
302 }
303
304 static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
305 {
306         struct perf_evsel *evsel = perf_evlist__first(evlist);
307
308
309         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
310         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
311         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
312         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
313         TEST_ASSERT_VAL("wrong name",
314                         !strcmp(perf_evsel__name(evsel), "mem:0:u"));
315
316         return test__checkevent_breakpoint(evlist);
317 }
318
319 static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
320 {
321         struct perf_evsel *evsel = perf_evlist__first(evlist);
322
323         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
324         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
325         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
326         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
327         TEST_ASSERT_VAL("wrong name",
328                         !strcmp(perf_evsel__name(evsel), "mem:0:x:k"));
329
330         return test__checkevent_breakpoint_x(evlist);
331 }
332
333 static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
334 {
335         struct perf_evsel *evsel = perf_evlist__first(evlist);
336
337         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
338         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
339         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
340         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
341         TEST_ASSERT_VAL("wrong name",
342                         !strcmp(perf_evsel__name(evsel), "mem:0:r:hp"));
343
344         return test__checkevent_breakpoint_r(evlist);
345 }
346
347 static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
348 {
349         struct perf_evsel *evsel = perf_evlist__first(evlist);
350
351         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
352         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
353         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
354         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
355         TEST_ASSERT_VAL("wrong name",
356                         !strcmp(perf_evsel__name(evsel), "mem:0:w:up"));
357
358         return test__checkevent_breakpoint_w(evlist);
359 }
360
361 static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist)
362 {
363         struct perf_evsel *evsel = perf_evlist__first(evlist);
364
365         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
366         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
367         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
368         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
369         TEST_ASSERT_VAL("wrong name",
370                         !strcmp(perf_evsel__name(evsel), "mem:0:rw:kp"));
371
372         return test__checkevent_breakpoint_rw(evlist);
373 }
374
375 static int test__checkevent_pmu(struct perf_evlist *evlist)
376 {
377
378         struct perf_evsel *evsel = perf_evlist__first(evlist);
379
380         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
381         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
382         TEST_ASSERT_VAL("wrong config",    10 == evsel->attr.config);
383         TEST_ASSERT_VAL("wrong config1",    1 == evsel->attr.config1);
384         TEST_ASSERT_VAL("wrong config2",    3 == evsel->attr.config2);
385         TEST_ASSERT_VAL("wrong period",  1000 == evsel->attr.sample_period);
386
387         return 0;
388 }
389
390 static int test__checkevent_list(struct perf_evlist *evlist)
391 {
392         struct perf_evsel *evsel = perf_evlist__first(evlist);
393
394         TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
395
396         /* r1 */
397         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
398         TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
399         TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
400         TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
401         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
402         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
403         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
404         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
405
406         /* syscalls:sys_enter_open:k */
407         evsel = perf_evsel__next(evsel);
408         TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
409         TEST_ASSERT_VAL("wrong sample_type",
410                 PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
411         TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
412         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
413         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
414         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
415         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
416
417         /* 1:1:hp */
418         evsel = perf_evsel__next(evsel);
419         TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
420         TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
421         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
422         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
423         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
424         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
425
426         return 0;
427 }
428
429 static int test__checkevent_pmu_name(struct perf_evlist *evlist)
430 {
431         struct perf_evsel *evsel = perf_evlist__first(evlist);
432
433         /* cpu/config=1,name=krava/u */
434         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
435         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
436         TEST_ASSERT_VAL("wrong config",  1 == evsel->attr.config);
437         TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
438
439         /* cpu/config=2/u" */
440         evsel = perf_evsel__next(evsel);
441         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
442         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
443         TEST_ASSERT_VAL("wrong config",  2 == evsel->attr.config);
444         TEST_ASSERT_VAL("wrong name",
445                         !strcmp(perf_evsel__name(evsel), "cpu/config=2/u"));
446
447         return 0;
448 }
449
450 static int test__checkevent_pmu_events(struct perf_evlist *evlist)
451 {
452         struct perf_evsel *evsel;
453
454         evsel = list_entry(evlist->entries.next, struct perf_evsel, node);
455         TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
456         TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
457         TEST_ASSERT_VAL("wrong exclude_user",
458                         !evsel->attr.exclude_user);
459         TEST_ASSERT_VAL("wrong exclude_kernel",
460                         evsel->attr.exclude_kernel);
461         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
462         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
463
464         return 0;
465 }
466
467 static int test__checkterms_simple(struct list_head *terms)
468 {
469         struct parse_events_term *term;
470
471         /* config=10 */
472         term = list_entry(terms->next, struct parse_events_term, list);
473         TEST_ASSERT_VAL("wrong type term",
474                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
475         TEST_ASSERT_VAL("wrong type val",
476                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
477         TEST_ASSERT_VAL("wrong val", term->val.num == 10);
478         TEST_ASSERT_VAL("wrong config", !term->config);
479
480         /* config1 */
481         term = list_entry(term->list.next, struct parse_events_term, list);
482         TEST_ASSERT_VAL("wrong type term",
483                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
484         TEST_ASSERT_VAL("wrong type val",
485                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
486         TEST_ASSERT_VAL("wrong val", term->val.num == 1);
487         TEST_ASSERT_VAL("wrong config", !term->config);
488
489         /* config2=3 */
490         term = list_entry(term->list.next, struct parse_events_term, list);
491         TEST_ASSERT_VAL("wrong type term",
492                         term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
493         TEST_ASSERT_VAL("wrong type val",
494                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
495         TEST_ASSERT_VAL("wrong val", term->val.num == 3);
496         TEST_ASSERT_VAL("wrong config", !term->config);
497
498         /* umask=1*/
499         term = list_entry(term->list.next, struct parse_events_term, list);
500         TEST_ASSERT_VAL("wrong type term",
501                         term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
502         TEST_ASSERT_VAL("wrong type val",
503                         term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
504         TEST_ASSERT_VAL("wrong val", term->val.num == 1);
505         TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
506
507         return 0;
508 }
509
510 static int test__group1(struct perf_evlist *evlist)
511 {
512         struct perf_evsel *evsel, *leader;
513
514         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
515         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
516
517         /* instructions:k */
518         evsel = leader = perf_evlist__first(evlist);
519         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
520         TEST_ASSERT_VAL("wrong config",
521                         PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
522         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
523         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
524         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
525         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
526         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
527         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
528         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
529         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
530         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
531
532         /* cycles:upp */
533         evsel = perf_evsel__next(evsel);
534         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
535         TEST_ASSERT_VAL("wrong config",
536                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
537         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
538         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
539         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
540         /* use of precise requires exclude_guest */
541         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
542         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
543         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
544         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
545         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
546
547         return 0;
548 }
549
550 static int test__group2(struct perf_evlist *evlist)
551 {
552         struct perf_evsel *evsel, *leader;
553
554         TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
555         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
556
557         /* faults + :ku modifier */
558         evsel = leader = perf_evlist__first(evlist);
559         TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
560         TEST_ASSERT_VAL("wrong config",
561                         PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
562         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
563         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
564         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
565         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
566         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
567         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
568         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
569         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
570         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
571
572         /* cache-references + :u modifier */
573         evsel = perf_evsel__next(evsel);
574         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
575         TEST_ASSERT_VAL("wrong config",
576                         PERF_COUNT_HW_CACHE_REFERENCES == evsel->attr.config);
577         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
578         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
579         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
580         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
581         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
582         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
583         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
584         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
585
586         /* cycles:k */
587         evsel = perf_evsel__next(evsel);
588         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
589         TEST_ASSERT_VAL("wrong config",
590                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
591         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
592         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
593         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
594         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
595         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
596         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
597         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
598
599         return 0;
600 }
601
602 static int test__group3(struct perf_evlist *evlist __maybe_unused)
603 {
604         struct perf_evsel *evsel, *leader;
605
606         TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
607         TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
608
609         /* group1 syscalls:sys_enter_open:H */
610         evsel = leader = perf_evlist__first(evlist);
611         TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
612         TEST_ASSERT_VAL("wrong sample_type",
613                 PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
614         TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
615         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
616         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
617         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
618         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
619         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
620         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
621         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
622         TEST_ASSERT_VAL("wrong group name",
623                 !strcmp(leader->group_name, "group1"));
624         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
625         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
626
627         /* group1 cycles:kppp */
628         evsel = perf_evsel__next(evsel);
629         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
630         TEST_ASSERT_VAL("wrong config",
631                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
632         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
633         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
634         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
635         /* use of precise requires exclude_guest */
636         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
637         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
638         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);
639         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
640         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
641         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
642
643         /* group2 cycles + G modifier */
644         evsel = leader = perf_evsel__next(evsel);
645         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
646         TEST_ASSERT_VAL("wrong config",
647                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
648         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
649         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
650         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
651         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
652         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
653         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
654         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
655         TEST_ASSERT_VAL("wrong group name",
656                 !strcmp(leader->group_name, "group2"));
657         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
658         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
659
660         /* group2 1:3 + G modifier */
661         evsel = perf_evsel__next(evsel);
662         TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
663         TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config);
664         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
665         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
666         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
667         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
668         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
669         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
670         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
671         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
672
673         /* instructions:u */
674         evsel = perf_evsel__next(evsel);
675         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
676         TEST_ASSERT_VAL("wrong config",
677                         PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
678         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
679         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
680         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
681         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
682         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
683         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
684         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
685
686         return 0;
687 }
688
689 static int test__group4(struct perf_evlist *evlist __maybe_unused)
690 {
691         struct perf_evsel *evsel, *leader;
692
693         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
694         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
695
696         /* cycles:u + p */
697         evsel = leader = perf_evlist__first(evlist);
698         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
699         TEST_ASSERT_VAL("wrong config",
700                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
701         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
702         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
703         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
704         /* use of precise requires exclude_guest */
705         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
706         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
707         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);
708         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
709         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
710         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
711         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
712
713         /* instructions:kp + p */
714         evsel = perf_evsel__next(evsel);
715         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
716         TEST_ASSERT_VAL("wrong config",
717                         PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
718         TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
719         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
720         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
721         /* use of precise requires exclude_guest */
722         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
723         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
724         TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
725         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
726         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
727
728         return 0;
729 }
730
731 static int test__group5(struct perf_evlist *evlist __maybe_unused)
732 {
733         struct perf_evsel *evsel, *leader;
734
735         TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
736         TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
737
738         /* cycles + G */
739         evsel = leader = perf_evlist__first(evlist);
740         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
741         TEST_ASSERT_VAL("wrong config",
742                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
743         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
744         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
745         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
746         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
747         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
748         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
749         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
750         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
751         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
752         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
753
754         /* instructions + G */
755         evsel = perf_evsel__next(evsel);
756         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
757         TEST_ASSERT_VAL("wrong config",
758                         PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
759         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
760         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
761         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
762         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
763         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
764         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
765         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
766         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
767
768         /* cycles:G */
769         evsel = leader = perf_evsel__next(evsel);
770         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
771         TEST_ASSERT_VAL("wrong config",
772                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
773         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
774         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
775         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
776         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
777         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
778         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
779         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
780         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
781         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
782         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
783
784         /* instructions:G */
785         evsel = perf_evsel__next(evsel);
786         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
787         TEST_ASSERT_VAL("wrong config",
788                         PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
789         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
790         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
791         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
792         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
793         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
794         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
795         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
796         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
797
798         /* cycles */
799         evsel = perf_evsel__next(evsel);
800         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
801         TEST_ASSERT_VAL("wrong config",
802                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
803         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
804         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
805         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
806         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
807         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
808         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
809         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
810
811         return 0;
812 }
813
814 static int test__group_gh1(struct perf_evlist *evlist)
815 {
816         struct perf_evsel *evsel, *leader;
817
818         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
819         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
820
821         /* cycles + :H group modifier */
822         evsel = leader = perf_evlist__first(evlist);
823         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
824         TEST_ASSERT_VAL("wrong config",
825                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
826         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
827         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
828         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
829         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
830         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
831         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
832         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
833         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
834         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
835         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
836
837         /* cache-misses:G + :H group modifier */
838         evsel = perf_evsel__next(evsel);
839         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
840         TEST_ASSERT_VAL("wrong config",
841                         PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
842         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
843         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
844         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
845         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
846         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
847         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
848         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
849         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
850
851         return 0;
852 }
853
854 static int test__group_gh2(struct perf_evlist *evlist)
855 {
856         struct perf_evsel *evsel, *leader;
857
858         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
859         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
860
861         /* cycles + :G group modifier */
862         evsel = leader = perf_evlist__first(evlist);
863         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
864         TEST_ASSERT_VAL("wrong config",
865                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
866         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
867         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
868         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
869         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
870         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
871         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
872         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
873         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
874         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
875         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
876
877         /* cache-misses:H + :G group modifier */
878         evsel = perf_evsel__next(evsel);
879         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
880         TEST_ASSERT_VAL("wrong config",
881                         PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
882         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
883         TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
884         TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
885         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
886         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
887         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
888         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
889         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
890
891         return 0;
892 }
893
894 static int test__group_gh3(struct perf_evlist *evlist)
895 {
896         struct perf_evsel *evsel, *leader;
897
898         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
899         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
900
901         /* cycles:G + :u group modifier */
902         evsel = leader = perf_evlist__first(evlist);
903         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
904         TEST_ASSERT_VAL("wrong config",
905                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
906         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
907         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
908         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
909         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
910         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
911         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
912         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
913         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
914         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
915         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
916
917         /* cache-misses:H + :u group modifier */
918         evsel = perf_evsel__next(evsel);
919         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
920         TEST_ASSERT_VAL("wrong config",
921                         PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
922         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
923         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
924         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
925         TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
926         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
927         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
928         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
929         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
930
931         return 0;
932 }
933
934 static int test__group_gh4(struct perf_evlist *evlist)
935 {
936         struct perf_evsel *evsel, *leader;
937
938         TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
939         TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
940
941         /* cycles:G + :uG group modifier */
942         evsel = leader = perf_evlist__first(evlist);
943         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
944         TEST_ASSERT_VAL("wrong config",
945                         PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
946         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
947         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
948         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
949         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
950         TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
951         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
952         TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
953         TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
954         TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
955         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
956
957         /* cache-misses:H + :uG group modifier */
958         evsel = perf_evsel__next(evsel);
959         TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
960         TEST_ASSERT_VAL("wrong config",
961                         PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
962         TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
963         TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
964         TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
965         TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
966         TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
967         TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
968         TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
969         TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
970
971         return 0;
972 }
973
974 static int count_tracepoints(void)
975 {
976         char events_path[PATH_MAX];
977         struct dirent *events_ent;
978         DIR *events_dir;
979         int cnt = 0;
980
981         scnprintf(events_path, PATH_MAX, "%s/tracing/events",
982                   debugfs_find_mountpoint());
983
984         events_dir = opendir(events_path);
985
986         TEST_ASSERT_VAL("Can't open events dir", events_dir);
987
988         while ((events_ent = readdir(events_dir))) {
989                 char sys_path[PATH_MAX];
990                 struct dirent *sys_ent;
991                 DIR *sys_dir;
992
993                 if (!strcmp(events_ent->d_name, ".")
994                     || !strcmp(events_ent->d_name, "..")
995                     || !strcmp(events_ent->d_name, "enable")
996                     || !strcmp(events_ent->d_name, "header_event")
997                     || !strcmp(events_ent->d_name, "header_page"))
998                         continue;
999
1000                 scnprintf(sys_path, PATH_MAX, "%s/%s",
1001                           events_path, events_ent->d_name);
1002
1003                 sys_dir = opendir(sys_path);
1004                 TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
1005
1006                 while ((sys_ent = readdir(sys_dir))) {
1007                         if (!strcmp(sys_ent->d_name, ".")
1008                             || !strcmp(sys_ent->d_name, "..")
1009                             || !strcmp(sys_ent->d_name, "enable")
1010                             || !strcmp(sys_ent->d_name, "filter"))
1011                                 continue;
1012
1013                         cnt++;
1014                 }
1015
1016                 closedir(sys_dir);
1017         }
1018
1019         closedir(events_dir);
1020         return cnt;
1021 }
1022
1023 static int test__all_tracepoints(struct perf_evlist *evlist)
1024 {
1025         TEST_ASSERT_VAL("wrong events count",
1026                         count_tracepoints() == evlist->nr_entries);
1027
1028         return test__checkevent_tracepoint_multi(evlist);
1029 }
1030
1031 struct evlist_test {
1032         const char *name;
1033         __u32 type;
1034         int (*check)(struct perf_evlist *evlist);
1035 };
1036
1037 static struct evlist_test test__events[] = {
1038         [0] = {
1039                 .name  = "syscalls:sys_enter_open",
1040                 .check = test__checkevent_tracepoint,
1041         },
1042         [1] = {
1043                 .name  = "syscalls:*",
1044                 .check = test__checkevent_tracepoint_multi,
1045         },
1046         [2] = {
1047                 .name  = "r1a",
1048                 .check = test__checkevent_raw,
1049         },
1050         [3] = {
1051                 .name  = "1:1",
1052                 .check = test__checkevent_numeric,
1053         },
1054         [4] = {
1055                 .name  = "instructions",
1056                 .check = test__checkevent_symbolic_name,
1057         },
1058         [5] = {
1059                 .name  = "cycles/period=100000,config2/",
1060                 .check = test__checkevent_symbolic_name_config,
1061         },
1062         [6] = {
1063                 .name  = "faults",
1064                 .check = test__checkevent_symbolic_alias,
1065         },
1066         [7] = {
1067                 .name  = "L1-dcache-load-miss",
1068                 .check = test__checkevent_genhw,
1069         },
1070         [8] = {
1071                 .name  = "mem:0",
1072                 .check = test__checkevent_breakpoint,
1073         },
1074         [9] = {
1075                 .name  = "mem:0:x",
1076                 .check = test__checkevent_breakpoint_x,
1077         },
1078         [10] = {
1079                 .name  = "mem:0:r",
1080                 .check = test__checkevent_breakpoint_r,
1081         },
1082         [11] = {
1083                 .name  = "mem:0:w",
1084                 .check = test__checkevent_breakpoint_w,
1085         },
1086         [12] = {
1087                 .name  = "syscalls:sys_enter_open:k",
1088                 .check = test__checkevent_tracepoint_modifier,
1089         },
1090         [13] = {
1091                 .name  = "syscalls:*:u",
1092                 .check = test__checkevent_tracepoint_multi_modifier,
1093         },
1094         [14] = {
1095                 .name  = "r1a:kp",
1096                 .check = test__checkevent_raw_modifier,
1097         },
1098         [15] = {
1099                 .name  = "1:1:hp",
1100                 .check = test__checkevent_numeric_modifier,
1101         },
1102         [16] = {
1103                 .name  = "instructions:h",
1104                 .check = test__checkevent_symbolic_name_modifier,
1105         },
1106         [17] = {
1107                 .name  = "faults:u",
1108                 .check = test__checkevent_symbolic_alias_modifier,
1109         },
1110         [18] = {
1111                 .name  = "L1-dcache-load-miss:kp",
1112                 .check = test__checkevent_genhw_modifier,
1113         },
1114         [19] = {
1115                 .name  = "mem:0:u",
1116                 .check = test__checkevent_breakpoint_modifier,
1117         },
1118         [20] = {
1119                 .name  = "mem:0:x:k",
1120                 .check = test__checkevent_breakpoint_x_modifier,
1121         },
1122         [21] = {
1123                 .name  = "mem:0:r:hp",
1124                 .check = test__checkevent_breakpoint_r_modifier,
1125         },
1126         [22] = {
1127                 .name  = "mem:0:w:up",
1128                 .check = test__checkevent_breakpoint_w_modifier,
1129         },
1130         [23] = {
1131                 .name  = "r1,syscalls:sys_enter_open:k,1:1:hp",
1132                 .check = test__checkevent_list,
1133         },
1134         [24] = {
1135                 .name  = "instructions:G",
1136                 .check = test__checkevent_exclude_host_modifier,
1137         },
1138         [25] = {
1139                 .name  = "instructions:H",
1140                 .check = test__checkevent_exclude_guest_modifier,
1141         },
1142         [26] = {
1143                 .name  = "mem:0:rw",
1144                 .check = test__checkevent_breakpoint_rw,
1145         },
1146         [27] = {
1147                 .name  = "mem:0:rw:kp",
1148                 .check = test__checkevent_breakpoint_rw_modifier,
1149         },
1150         [28] = {
1151                 .name  = "{instructions:k,cycles:upp}",
1152                 .check = test__group1,
1153         },
1154         [29] = {
1155                 .name  = "{faults:k,cache-references}:u,cycles:k",
1156                 .check = test__group2,
1157         },
1158         [30] = {
1159                 .name  = "group1{syscalls:sys_enter_open:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
1160                 .check = test__group3,
1161         },
1162         [31] = {
1163                 .name  = "{cycles:u,instructions:kp}:p",
1164                 .check = test__group4,
1165         },
1166         [32] = {
1167                 .name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
1168                 .check = test__group5,
1169         },
1170         [33] = {
1171                 .name  = "*:*",
1172                 .check = test__all_tracepoints,
1173         },
1174         [34] = {
1175                 .name  = "{cycles,cache-misses:G}:H",
1176                 .check = test__group_gh1,
1177         },
1178         [35] = {
1179                 .name  = "{cycles,cache-misses:H}:G",
1180                 .check = test__group_gh2,
1181         },
1182         [36] = {
1183                 .name  = "{cycles:G,cache-misses:H}:u",
1184                 .check = test__group_gh3,
1185         },
1186         [37] = {
1187                 .name  = "{cycles:G,cache-misses:H}:uG",
1188                 .check = test__group_gh4,
1189         },
1190 };
1191
1192 static struct evlist_test test__events_pmu[] = {
1193         [0] = {
1194                 .name  = "cpu/config=10,config1,config2=3,period=1000/u",
1195                 .check = test__checkevent_pmu,
1196         },
1197         [1] = {
1198                 .name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
1199                 .check = test__checkevent_pmu_name,
1200         },
1201 };
1202
1203 struct terms_test {
1204         const char *str;
1205         __u32 type;
1206         int (*check)(struct list_head *terms);
1207 };
1208
1209 static struct terms_test test__terms[] = {
1210         [0] = {
1211                 .str   = "config=10,config1,config2=3,umask=1",
1212                 .check = test__checkterms_simple,
1213         },
1214 };
1215
1216 static int test_event(struct evlist_test *e)
1217 {
1218         struct perf_evlist *evlist;
1219         int ret;
1220
1221         evlist = perf_evlist__new();
1222         if (evlist == NULL)
1223                 return -ENOMEM;
1224
1225         ret = parse_events(evlist, e->name);
1226         if (ret) {
1227                 pr_debug("failed to parse event '%s', err %d\n",
1228                          e->name, ret);
1229                 return ret;
1230         }
1231
1232         ret = e->check(evlist);
1233         perf_evlist__delete(evlist);
1234
1235         return ret;
1236 }
1237
1238 static int test_events(struct evlist_test *events, unsigned cnt)
1239 {
1240         int ret1, ret2 = 0;
1241         unsigned i;
1242
1243         for (i = 0; i < cnt; i++) {
1244                 struct evlist_test *e = &events[i];
1245
1246                 pr_debug("running test %d '%s'\n", i, e->name);
1247                 ret1 = test_event(e);
1248                 if (ret1)
1249                         ret2 = ret1;
1250         }
1251
1252         return ret2;
1253 }
1254
1255 static int test_term(struct terms_test *t)
1256 {
1257         struct list_head *terms;
1258         int ret;
1259
1260         terms = malloc(sizeof(*terms));
1261         if (!terms)
1262                 return -ENOMEM;
1263
1264         INIT_LIST_HEAD(terms);
1265
1266         ret = parse_events_terms(terms, t->str);
1267         if (ret) {
1268                 pr_debug("failed to parse terms '%s', err %d\n",
1269                          t->str , ret);
1270                 return ret;
1271         }
1272
1273         ret = t->check(terms);
1274         parse_events__free_terms(terms);
1275
1276         return ret;
1277 }
1278
1279 static int test_terms(struct terms_test *terms, unsigned cnt)
1280 {
1281         int ret = 0;
1282         unsigned i;
1283
1284         for (i = 0; i < cnt; i++) {
1285                 struct terms_test *t = &terms[i];
1286
1287                 pr_debug("running test %d '%s'\n", i, t->str);
1288                 ret = test_term(t);
1289                 if (ret)
1290                         break;
1291         }
1292
1293         return ret;
1294 }
1295
1296 static int test_pmu(void)
1297 {
1298         struct stat st;
1299         char path[PATH_MAX];
1300         int ret;
1301
1302         snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
1303                  sysfs_find_mountpoint());
1304
1305         ret = stat(path, &st);
1306         if (ret)
1307                 pr_debug("omitting PMU cpu tests\n");
1308         return !ret;
1309 }
1310
1311 static int test_pmu_events(void)
1312 {
1313         struct stat st;
1314         char path[PATH_MAX];
1315         struct dirent *ent;
1316         DIR *dir;
1317         int ret;
1318
1319         snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
1320                  sysfs_find_mountpoint());
1321
1322         ret = stat(path, &st);
1323         if (ret) {
1324                 pr_debug("omitting PMU cpu events tests\n");
1325                 return 0;
1326         }
1327
1328         dir = opendir(path);
1329         if (!dir) {
1330                 pr_debug("can't open pmu event dir");
1331                 return -1;
1332         }
1333
1334         while (!ret && (ent = readdir(dir))) {
1335 #define MAX_NAME 100
1336                 struct evlist_test e;
1337                 char name[MAX_NAME];
1338
1339                 if (!strcmp(ent->d_name, ".") ||
1340                     !strcmp(ent->d_name, ".."))
1341                         continue;
1342
1343                 snprintf(name, MAX_NAME, "cpu/event=%s/u", ent->d_name);
1344
1345                 e.name  = name;
1346                 e.check = test__checkevent_pmu_events;
1347
1348                 ret = test_event(&e);
1349 #undef MAX_NAME
1350         }
1351
1352         closedir(dir);
1353         return ret;
1354 }
1355
1356 int test__parse_events(void)
1357 {
1358         int ret1, ret2 = 0;
1359
1360 #define TEST_EVENTS(tests)                              \
1361 do {                                                    \
1362         ret1 = test_events(tests, ARRAY_SIZE(tests));   \
1363         if (!ret2)                                      \
1364                 ret2 = ret1;                            \
1365 } while (0)
1366
1367         TEST_EVENTS(test__events);
1368
1369         if (test_pmu())
1370                 TEST_EVENTS(test__events_pmu);
1371
1372         if (test_pmu()) {
1373                 int ret = test_pmu_events();
1374                 if (ret)
1375                         return ret;
1376         }
1377
1378         ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
1379         if (!ret2)
1380                 ret2 = ret1;
1381
1382         return ret2;
1383 }