195 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Test support for libpfm4 event encodings.4 *5 * Copyright 2020 Google LLC.6 */7#include "tests.h"8#include "util/debug.h"9#include "util/evlist.h"10#include "util/pfm.h"11 12#include <linux/kernel.h>13 14#ifdef HAVE_LIBPFM15static int count_pfm_events(struct perf_evlist *evlist)16{17 struct perf_evsel *evsel;18 int count = 0;19 20 perf_evlist__for_each_entry(evlist, evsel) {21 count++;22 }23 return count;24}25 26static int test__pfm_events(struct test_suite *test __maybe_unused,27 int subtest __maybe_unused)28{29 struct evlist *evlist;30 struct option opt;31 size_t i;32 const struct {33 const char *events;34 int nr_events;35 } table[] = {36 {37 .events = "",38 .nr_events = 0,39 },40 {41 .events = "instructions",42 .nr_events = 1,43 },44 {45 .events = "instructions,cycles",46 .nr_events = 2,47 },48 {49 .events = "stereolab",50 .nr_events = 0,51 },52 {53 .events = "instructions,instructions",54 .nr_events = 2,55 },56 {57 .events = "stereolab,instructions",58 .nr_events = 0,59 },60 {61 .events = "instructions,stereolab",62 .nr_events = 1,63 },64 };65 66 for (i = 0; i < ARRAY_SIZE(table); i++) {67 evlist = evlist__new();68 if (evlist == NULL)69 return -ENOMEM;70 71 opt.value = evlist;72 parse_libpfm_events_option(&opt,73 table[i].events,74 0);75 TEST_ASSERT_EQUAL(table[i].events,76 count_pfm_events(&evlist->core),77 table[i].nr_events);78 TEST_ASSERT_EQUAL(table[i].events,79 evlist__nr_groups(evlist),80 0);81 82 evlist__delete(evlist);83 }84 return 0;85}86 87static int test__pfm_group(struct test_suite *test __maybe_unused,88 int subtest __maybe_unused)89{90 struct evlist *evlist;91 struct option opt;92 size_t i;93 const struct {94 const char *events;95 int nr_events;96 int nr_groups;97 } table[] = {98 {99 .events = "{},",100 .nr_events = 0,101 .nr_groups = 0,102 },103 {104 .events = "{instructions}",105 .nr_events = 1,106 .nr_groups = 0,107 },108 {109 .events = "{instructions},{}",110 .nr_events = 1,111 .nr_groups = 0,112 },113 {114 .events = "{},{instructions}",115 .nr_events = 1,116 .nr_groups = 0,117 },118 {119 .events = "{instructions},{instructions}",120 .nr_events = 2,121 .nr_groups = 0,122 },123 {124 .events = "{instructions,cycles},{instructions,cycles}",125 .nr_events = 4,126 .nr_groups = 2,127 },128 {129 .events = "{stereolab}",130 .nr_events = 0,131 .nr_groups = 0,132 },133 {134 .events =135 "{instructions,cycles},{instructions,stereolab}",136 .nr_events = 3,137 .nr_groups = 1,138 },139 {140 .events = "instructions}",141 .nr_events = 1,142 .nr_groups = 0,143 },144 {145 .events = "{{instructions}}",146 .nr_events = 0,147 .nr_groups = 0,148 },149 };150 151 for (i = 0; i < ARRAY_SIZE(table); i++) {152 evlist = evlist__new();153 if (evlist == NULL)154 return -ENOMEM;155 156 opt.value = evlist;157 parse_libpfm_events_option(&opt,158 table[i].events,159 0);160 TEST_ASSERT_EQUAL(table[i].events,161 count_pfm_events(&evlist->core),162 table[i].nr_events);163 TEST_ASSERT_EQUAL(table[i].events,164 evlist__nr_groups(evlist),165 table[i].nr_groups);166 167 evlist__delete(evlist);168 }169 return 0;170}171#else172static int test__pfm_events(struct test_suite *test __maybe_unused,173 int subtest __maybe_unused)174{175 return TEST_SKIP;176}177 178static int test__pfm_group(struct test_suite *test __maybe_unused,179 int subtest __maybe_unused)180{181 return TEST_SKIP;182}183#endif184 185static struct test_case pfm_tests[] = {186 TEST_CASE_REASON("test of individual --pfm-events", pfm_events, "not compiled in"),187 TEST_CASE_REASON("test groups of --pfm-events", pfm_group, "not compiled in"),188 { .name = NULL, }189};190 191struct test_suite suite__pfm = {192 .desc = "Test libpfm4 support",193 .test_cases = pfm_tests,194};195