projects/linux·blob master · refs

112 lines · 2.5 KiB

1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2#include "debug.h"
3#include "evlist.h"
4#include "parse-events.h"
5#include "tests.h"
6#include "tool_pmu.h"
7
8static int do_test(enum tool_pmu_event ev, bool with_pmu)
9{
10 struct evlist *evlist = evlist__new();
11 struct evsel *evsel;
12 struct parse_events_error err;
13 int ret;
14 char str[128];
15 bool found = false;
16
17 if (!evlist) {
18 pr_err("evlist allocation failed\n");
19 return TEST_FAIL;
20 }
21
22 if (with_pmu)
23 snprintf(str, sizeof(str), "tool/%s/", tool_pmu__event_to_str(ev));
24 else
25 snprintf(str, sizeof(str), "%s", tool_pmu__event_to_str(ev));
26
27 parse_events_error__init(&err);
28 ret = parse_events(evlist, str, &err);
29 if (ret) {
30 if (!tool_pmu__event_to_str(ev)) {
31 ret = TEST_OK;
32 goto out;
33 }
34
35 pr_debug("FAILED %s:%d failed to parse event '%s', err %d\n",
36 __FILE__, __LINE__, str, ret);
37 parse_events_error__print(&err, str);
38 ret = TEST_FAIL;
39 goto out;
40 }
41
42 ret = TEST_OK;
43 if (with_pmu ? (evlist__nr_entries(evlist) != 1)
44 : (evlist__nr_entries(evlist) < 1)) {
45 pr_debug("FAILED %s:%d Unexpected number of events for '%s' of %d\n",
46 __FILE__, __LINE__, str, evlist__nr_entries(evlist));
47 ret = TEST_FAIL;
48 goto out;
49 }
50
51 evlist__for_each_entry(evlist, evsel) {
52 if (perf_pmu__is_tool(evsel->pmu)) {
53 if (evsel->core.attr.config != ev) {
54 pr_debug("FAILED %s:%d Unexpected config for '%s', %lld != %d\n",
55 __FILE__, __LINE__, str, evsel->core.attr.config, ev);
56 ret = TEST_FAIL;
57 goto out;
58 }
59 found = true;
60 }
61 }
62
63 if (!found && tool_pmu__event_to_str(ev)) {
64 pr_debug("FAILED %s:%d Didn't find tool event '%s' in parsed evsels\n",
65 __FILE__, __LINE__, str);
66 ret = TEST_FAIL;
67 }
68
69out:
70 parse_events_error__exit(&err);
71 evlist__put(evlist);
72 return ret;
73}
74
75static int test__tool_pmu_without_pmu(struct test_suite *test __maybe_unused,
76 int subtest __maybe_unused)
77{
78 int i;
79
80 tool_pmu__for_each_event(i) {
81 int ret = do_test(i, /*with_pmu=*/false);
82
83 if (ret != TEST_OK)
84 return ret;
85 }
86 return TEST_OK;
87}
88
89static int test__tool_pmu_with_pmu(struct test_suite *test __maybe_unused,
90 int subtest __maybe_unused)
91{
92 int i;
93
94 tool_pmu__for_each_event(i) {
95 int ret = do_test(i, /*with_pmu=*/true);
96
97 if (ret != TEST_OK)
98 return ret;
99 }
100 return TEST_OK;
101}
102
103static struct test_case tests__tool_pmu[] = {
104 TEST_CASE("Parsing without PMU name", tool_pmu_without_pmu),
105 TEST_CASE("Parsing with PMU name", tool_pmu_with_pmu),
106 { .name = NULL, }
107};
108
109struct test_suite suite__tool_pmu = {
110 .desc = "Tool PMU",
111 .test_cases = tests__tool_pmu,
112};