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