return err;
}
-static int test__parsing(struct test_suite *test __maybe_unused,
- int subtest __maybe_unused)
+static int test__parsing(struct test_suite *test, int subtest)
{
int failures = 0;
+ const struct pmu_metrics_table *table = NULL;
- pmu_for_each_core_metric(test__parsing_callback, &failures);
- pmu_for_each_sys_metric(test__parsing_callback, &failures);
+ if (test->test_cases)
+ table = test->test_cases[subtest].priv;
+
+ if (table) {
+ pmu_metrics_table__for_each_metric(table, test__parsing_callback, &failures);
+ } else {
+ pmu_for_each_core_metric(test__parsing_callback, &failures);
+ pmu_for_each_sys_metric(test__parsing_callback, &failures);
+ }
return failures == 0 ? TEST_OK : TEST_FAIL;
}
* Parse all the metrics for current architecture, or all defined cpus via the
* 'fake_pmu' in parse_events.
*/
-static int test__parsing_fake(struct test_suite *test __maybe_unused,
- int subtest __maybe_unused)
+static int test__parsing_fake_static(struct test_suite *test __maybe_unused,
+ int subtest __maybe_unused)
{
int err = 0;
return err;
}
+ return 0;
+}
+
+static int test__parsing_fake(struct test_suite *test, int subtest)
+{
+ int err = 0;
+ const struct pmu_metrics_table *table = NULL;
+
+ if (test->test_cases)
+ table = test->test_cases[subtest].priv;
+
+ if (table)
+ return pmu_metrics_table__for_each_metric(table, test__parsing_fake_callback, NULL);
+
+ for (size_t i = 0; i < ARRAY_SIZE(metrics); i++) {
+ err = metric_parse_fake("", metrics[i].str);
+ if (err)
+ return err;
+ }
+
err = pmu_for_each_core_metric(test__parsing_fake_callback, NULL);
if (err)
return err;
return pmu_for_each_sys_metric(test__parsing_threshold_callback, NULL);
}
+struct populate_cb_data {
+ struct test_case *test_cases;
+ size_t curr;
+};
+
+static int count_metrics_tables_cb(const struct pmu_metrics_table *table __maybe_unused, void *data)
+{
+ size_t *count = data;
+ (*count)++;
+ return 0;
+}
+
+static int populate_metrics_tables_cb(const struct pmu_metrics_table *table, void *data)
+{
+ struct populate_cb_data *cb_data = data;
+ const char *table_name = pmu_metrics_table__name(table);
+ char *desc_real, *desc_fake;
+
+ if (!table_name)
+ table_name = "unknown";
+
+ if (asprintf(&desc_real, "PMU metric parsing: %s", table_name) < 0)
+ return -ENOMEM;
+ if (asprintf(&desc_fake, "PMU metric parsing with fake PMU: %s", table_name) < 0) {
+ free(desc_real);
+ return -ENOMEM;
+ }
+
+ cb_data->test_cases[cb_data->curr++] = (struct test_case){
+ .name = "parsing",
+ .desc = desc_real,
+ .run_case = test__parsing,
+ .priv = (void *)table,
+ .skip_reason = "some metrics failed",
+ };
+
+ cb_data->test_cases[cb_data->curr++] = (struct test_case){
+ .name = "parsing_fake",
+ .desc = desc_fake,
+ .run_case = test__parsing_fake,
+ .priv = (void *)table,
+ };
+
+ return 0;
+}
+
+static struct test_case pmu_events_tests[];
+
+static int setup_pmu_events_suite(struct test_suite *suite)
+{
+ size_t num_tables = 0;
+ size_t num_fixed_tests = 4;
+ size_t tests_per_table = 2;
+ size_t total_tests;
+ struct test_case *test_cases;
+ size_t curr = 0;
+ struct populate_cb_data cb_data;
+ int ret;
+
+ if (suite->test_cases != pmu_events_tests)
+ return 0;
+
+ ret = pmu_metrics_table__iterate_tables(count_metrics_tables_cb, &num_tables);
+ if (ret)
+ return ret;
+
+ total_tests = num_fixed_tests + (num_tables * tests_per_table) + 1;
+
+ test_cases = calloc(total_tests, sizeof(*test_cases));
+ if (!test_cases)
+ return -ENOMEM;
+
+ test_cases[curr++] = (struct test_case){
+ .name = "pmu_event_table",
+ .desc = "PMU event table sanity",
+ .run_case = test__pmu_event_table,
+ };
+ test_cases[curr++] = (struct test_case){
+ .name = "aliases",
+ .desc = "PMU event map aliases",
+ .run_case = test__aliases,
+ };
+ test_cases[curr++] = (struct test_case){
+ .name = "parsing_fake_static",
+ .desc = "Parsing of static metrics with fake PMU",
+ .run_case = test__parsing_fake_static,
+ };
+ test_cases[curr++] = (struct test_case){
+ .name = "parsing_threshold",
+ .desc = "Parsing of metric thresholds with fake PMU",
+ .run_case = test__parsing_threshold,
+ };
+
+ cb_data = (struct populate_cb_data){
+ .test_cases = test_cases,
+ .curr = curr,
+ };
+
+ ret = pmu_metrics_table__iterate_tables(populate_metrics_tables_cb, &cb_data);
+ if (ret) {
+ size_t i;
+
+ for (i = num_fixed_tests; i < cb_data.curr; i++)
+ free((char *)test_cases[i].desc);
+ free(test_cases);
+ return ret;
+ }
+
+ suite->test_cases = test_cases;
+ return 0;
+}
+
static struct test_case pmu_events_tests[] = {
TEST_CASE("PMU event table sanity", pmu_event_table),
TEST_CASE("PMU event map aliases", aliases),
TEST_CASE_REASON("Parsing of PMU event table metrics", parsing,
"some metrics failed"),
- TEST_CASE("Parsing of PMU event table metrics with fake PMUs", parsing_fake),
- TEST_CASE("Parsing of metric thresholds with fake PMUs", parsing_threshold),
+ TEST_CASE("Parsing of PMU event table metrics with fake PMU", parsing_fake),
+ TEST_CASE("Parsing of metric thresholds with fake PMU", parsing_threshold),
{ .name = NULL, }
};
struct test_suite suite__pmu_events = {
.desc = "PMU JSON event tests",
.test_cases = pmu_events_tests,
+ .setup = setup_pmu_events_suite,
};