1 // SPDX-License-Identifier: GPL-2.0
7 #include "metricgroup.h"
8 #include "parse-events.h"
9 #include "pmu-events/pmu-events.h"
11 #include <subcmd/parse-options.h>
16 static int test_expand_events(struct evlist
*evlist
,
17 struct rblist
*metric_events
)
19 int i
, ret
= TEST_FAIL
;
22 int nr_members
; /* for the first evsel only */
23 const char cgrp_str
[] = "A,B,C";
24 const char *cgrp_name
[] = { "A", "B", "C" };
25 int nr_cgrps
= ARRAY_SIZE(cgrp_name
);
29 TEST_ASSERT_VAL("evlist is empty", !evlist__empty(evlist
));
31 nr_events
= evlist
->core
.nr_entries
;
32 ev_name
= calloc(nr_events
, sizeof(*ev_name
));
33 if (ev_name
== NULL
) {
34 pr_debug("memory allocation failure\n");
38 evlist__for_each_entry(evlist
, evsel
) {
39 ev_name
[i
] = strdup(evsel
->name
);
40 if (ev_name
[i
] == NULL
) {
41 pr_debug("memory allocation failure\n");
46 /* remember grouping info */
47 was_group_event
= evsel__is_group_event(evlist__first(evlist
));
48 nr_members
= evlist__first(evlist
)->core
.nr_members
;
50 ret
= evlist__expand_cgroup(evlist
, cgrp_str
, metric_events
, false);
52 pr_debug("failed to expand events for cgroups\n");
57 if (evlist
->core
.nr_entries
!= nr_events
* nr_cgrps
) {
58 pr_debug("event count doesn't match\n");
63 evlist__for_each_entry(evlist
, evsel
) {
64 if (!evsel__name_is(evsel
, ev_name
[i
% nr_events
])) {
65 pr_debug("event name doesn't match:\n");
66 pr_debug(" evsel[%d]: %s\n expected: %s\n",
67 i
, evsel
->name
, ev_name
[i
% nr_events
]);
70 if (strcmp(evsel
->cgrp
->name
, cgrp_name
[i
/ nr_events
])) {
71 pr_debug("cgroup name doesn't match:\n");
72 pr_debug(" evsel[%d]: %s\n expected: %s\n",
73 i
, evsel
->cgrp
->name
, cgrp_name
[i
/ nr_events
]);
77 if ((i
% nr_events
) == 0) {
78 if (evsel__is_group_event(evsel
) != was_group_event
) {
79 pr_debug("event group doesn't match: got %s, expect %s\n",
80 evsel__is_group_event(evsel
) ? "true" : "false",
81 was_group_event
? "true" : "false");
84 if (evsel
->core
.nr_members
!= nr_members
) {
85 pr_debug("event group member doesn't match: %d vs %d\n",
86 evsel
->core
.nr_members
, nr_members
);
94 out
: for (i
= 0; i
< nr_events
; i
++)
100 static int expand_default_events(void)
103 struct rblist metric_events
;
104 struct evlist
*evlist
= evlist__new_default();
106 TEST_ASSERT_VAL("failed to get evlist", evlist
);
108 rblist__init(&metric_events
);
109 ret
= test_expand_events(evlist
, &metric_events
);
110 evlist__delete(evlist
);
114 static int expand_group_events(void)
117 struct evlist
*evlist
;
118 struct rblist metric_events
;
119 struct parse_events_error err
;
120 const char event_str
[] = "{cycles,instructions}";
122 symbol_conf
.event_group
= true;
124 evlist
= evlist__new();
125 TEST_ASSERT_VAL("failed to get evlist", evlist
);
127 parse_events_error__init(&err
);
128 ret
= parse_events(evlist
, event_str
, &err
);
130 pr_debug("failed to parse event '%s', err %d\n", event_str
, ret
);
131 parse_events_error__print(&err
, event_str
);
135 rblist__init(&metric_events
);
136 ret
= test_expand_events(evlist
, &metric_events
);
138 parse_events_error__exit(&err
);
139 evlist__delete(evlist
);
143 static int expand_libpfm_events(void)
146 struct evlist
*evlist
;
147 struct rblist metric_events
;
148 const char event_str
[] = "CYCLES";
149 struct option opt
= {
153 symbol_conf
.event_group
= true;
155 evlist
= evlist__new();
156 TEST_ASSERT_VAL("failed to get evlist", evlist
);
158 ret
= parse_libpfm_events_option(&opt
, event_str
, 0);
160 pr_debug("failed to parse libpfm event '%s', err %d\n",
164 if (evlist__empty(evlist
)) {
165 pr_debug("libpfm was not enabled\n");
169 rblist__init(&metric_events
);
170 ret
= test_expand_events(evlist
, &metric_events
);
172 evlist__delete(evlist
);
176 static int expand_metric_events(void)
179 struct evlist
*evlist
;
180 struct rblist metric_events
;
181 const char metric_str
[] = "CPI";
182 const struct pmu_metrics_table
*pme_test
;
184 evlist
= evlist__new();
185 TEST_ASSERT_VAL("failed to get evlist", evlist
);
187 rblist__init(&metric_events
);
188 pme_test
= find_core_metrics_table("testarch", "testcpu");
189 ret
= metricgroup__parse_groups_test(evlist
, pme_test
, metric_str
, &metric_events
);
191 pr_debug("failed to parse '%s' metric\n", metric_str
);
195 ret
= test_expand_events(evlist
, &metric_events
);
198 metricgroup__rblist_exit(&metric_events
);
199 evlist__delete(evlist
);
203 static int test__expand_cgroup_events(struct test_suite
*test __maybe_unused
,
204 int subtest __maybe_unused
)
208 ret
= expand_default_events();
209 TEST_ASSERT_EQUAL("failed to expand default events", ret
, 0);
211 ret
= expand_group_events();
212 TEST_ASSERT_EQUAL("failed to expand event group", ret
, 0);
214 ret
= expand_libpfm_events();
215 TEST_ASSERT_EQUAL("failed to expand event group", ret
, 0);
217 ret
= expand_metric_events();
218 TEST_ASSERT_EQUAL("failed to expand metric events", ret
, 0);
223 DEFINE_SUITE("Event expansion for cgroups", expand_cgroup_events
);