// SPDX-License-Identifier: GPL-2.0
/*
 * Test support for libpfm4 event encodings.
 *
 * Copyright 2020 Google LLC.
 */
#include <errno.h>
#include "tests.h"
#include "util/debug.h"
#include "util/evlist.h"
#include "util/pfm.h"

#include <linux/kernel.h>

#ifdef HAVE_LIBPFM
static int count_pfm_events(struct perf_evlist *evlist)
{
	struct perf_evsel *evsel;
	int count = 0;

	perf_evlist__for_each_entry(evlist, evsel) {
		count++;
	}
	return count;
}

static int test__pfm_events(struct test_suite *test __maybe_unused,
			    int subtest __maybe_unused)
{
	struct evlist *evlist;
	struct option opt;
	size_t i;
	const struct {
		const char *events;
		int nr_events;
	} table[] = {
		{
			.events = "",
			.nr_events = 0,
		},
		{
			.events = "instructions",
			.nr_events = 1,
		},
		{
			.events = "instructions,cycles",
			.nr_events = 2,
		},
		{
			.events = "stereolab",
			.nr_events = 0,
		},
		{
			.events = "instructions,instructions",
			.nr_events = 2,
		},
		{
			.events = "stereolab,instructions",
			.nr_events = 0,
		},
		{
			.events = "instructions,stereolab",
			.nr_events = 1,
		},
	};

	for (i = 0; i < ARRAY_SIZE(table); i++) {
		evlist = evlist__new();
		if (evlist == NULL)
			return -ENOMEM;

		opt.value = &evlist;
		parse_libpfm_events_option(&opt,
					table[i].events,
					0);
		TEST_ASSERT_EQUAL(table[i].events,
				count_pfm_events(evlist__core(evlist)),
				table[i].nr_events);
		TEST_ASSERT_EQUAL(table[i].events,
				evlist__nr_groups(evlist),
				0);

		evlist__put(evlist);
	}
	return 0;
}

static int test__pfm_group(struct test_suite *test __maybe_unused,
			   int subtest __maybe_unused)
{
	struct evlist *evlist;
	struct option opt;
	size_t i;
	const struct {
		const char *events;
		int nr_events;
		int nr_groups;
	} table[] = {
		{
			.events = "{},",
			.nr_events = 0,
			.nr_groups = 0,
		},
		{
			.events = "{instructions}",
			.nr_events = 1,
			.nr_groups = 0,
		},
		{
			.events = "{instructions},{}",
			.nr_events = 1,
			.nr_groups = 0,
		},
		{
			.events = "{},{instructions}",
			.nr_events = 1,
			.nr_groups = 0,
		},
		{
			.events = "{instructions},{instructions}",
			.nr_events = 2,
			.nr_groups = 0,
		},
		{
			.events = "{instructions,cycles},{instructions,cycles}",
			.nr_events = 4,
			.nr_groups = 2,
		},
		{
			.events = "{stereolab}",
			.nr_events = 0,
			.nr_groups = 0,
		},
		{
			.events =
			"{instructions,cycles},{instructions,stereolab}",
			.nr_events = 3,
			.nr_groups = 1,
		},
		{
			.events = "instructions}",
			.nr_events = 1,
			.nr_groups = 0,
		},
		{
			.events = "{{instructions}}",
			.nr_events = 0,
			.nr_groups = 0,
		},
	};

	for (i = 0; i < ARRAY_SIZE(table); i++) {
		evlist = evlist__new();
		if (evlist == NULL)
			return -ENOMEM;

		opt.value = &evlist;
		parse_libpfm_events_option(&opt,
					table[i].events,
					0);
		TEST_ASSERT_EQUAL(table[i].events,
				count_pfm_events(evlist__core(evlist)),
				table[i].nr_events);
		TEST_ASSERT_EQUAL(table[i].events,
				evlist__nr_groups(evlist),
				table[i].nr_groups);

		evlist__put(evlist);
	}
	return 0;
}
#else
static int test__pfm_events(struct test_suite *test __maybe_unused,
			    int subtest __maybe_unused)
{
	return TEST_SKIP;
}

static int test__pfm_group(struct test_suite *test __maybe_unused,
			   int subtest __maybe_unused)
{
	return TEST_SKIP;
}
#endif

static struct test_case pfm_tests[] = {
	TEST_CASE_REASON("test of individual --pfm-events", pfm_events, "not compiled in"),
	TEST_CASE_REASON("test groups of --pfm-events", pfm_group, "not compiled in"),
	{ .name = NULL, }
};

struct test_suite suite__pfm = {
	.desc = "Test libpfm4 support",
	.test_cases = pfm_tests,
};
