// SPDX-License-Identifier: GPL-2.0
/*
 * Test dlfilter C API. A perf.data file is synthesized and then processed
 * by perf script with dlfilters named dlfilter-test-api-v*.so. Also a C file
 * is compiled to provide a dso to match the synthesized perf.data file.
 */

#include <linux/compiler.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/perf_event.h>
#include <internal/lib.h>
#include <subcmd/exec-cmd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <inttypes.h>
#include <libgen.h>
#include <string.h>
#include <errno.h>
#include "debug.h"
#include "tool.h"
#include "event.h"
#include "header.h"
#include "machine.h"
#include "dso.h"
#include "map.h"
#include "symbol.h"
#include "synthetic-events.h"
#include "util.h"
#include "archinsn.h"
#include "dlfilter.h"
#include "tests.h"
#include "util/sample.h"

#define MAP_START 0x400000

#define DLFILTER_TEST_NAME_MAX 128

struct test_data {
	struct perf_tool tool;
	struct machine *machine;
	int fd;
	u64 foo;
	u64 bar;
	u64 ip;
	u64 addr;
	char name[DLFILTER_TEST_NAME_MAX];
	char desc[DLFILTER_TEST_NAME_MAX];
	char perf[PATH_MAX];
	char perf_data_file_name[PATH_MAX];
	char c_file_name[PATH_MAX];
	char prog_file_name[PATH_MAX];
	char dlfilters[PATH_MAX];
};

static int test_result(const char *msg, int ret)
{
	pr_debug("%s\n", msg);
	return ret;
}

static int process(struct perf_tool *tool, union perf_event *event,
		   struct perf_sample *sample __maybe_unused,
		   struct machine *machine __maybe_unused)
{
	struct test_data *td = container_of(tool, struct test_data, tool);
	int fd = td->fd;

	if (writen(fd, event, event->header.size) != event->header.size)
		return -1;

	return 0;
}

#define MAXCMD 4096
#define REDIRECT_TO_DEV_NULL " >/dev/null 2>&1"

static __printf(1, 2) int system_cmd(const char *fmt, ...)
{
	char cmd[MAXCMD + sizeof(REDIRECT_TO_DEV_NULL)];
	int ret;

	va_list args;

	va_start(args, fmt);
	ret = vsnprintf(cmd, MAXCMD, fmt, args);
	va_end(args);

	if (ret <= 0 || ret >= MAXCMD)
		return -1;

	if (verbose <= 0)
		strcat(cmd, REDIRECT_TO_DEV_NULL);

	pr_debug("Command: %s\n", cmd);
	ret = system(cmd);
	if (ret)
		pr_debug("Failed with return value %d\n", ret);

	return ret;
}

static bool have_gcc(void)
{
	pr_debug("Checking for gcc\n");
	return !system_cmd("gcc --version");
}

static int write_attr(struct test_data *td, u64 sample_type, u64 *id)
{
	struct perf_event_attr attr = {
		.size = sizeof(attr),
		.type = PERF_TYPE_HARDWARE,
		.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS,
		.sample_type = sample_type,
		.sample_period = 1,
	};

	return perf_event__synthesize_attr(&td->tool, &attr, 1, id, process);
}

static int write_comm(int fd, pid_t pid, pid_t tid, const char *comm_str)
{
	struct perf_record_comm comm;
	ssize_t sz = sizeof(comm);

	comm.header.type = PERF_RECORD_COMM;
	comm.header.misc = PERF_RECORD_MISC_USER;
	comm.header.size = sz;

	comm.pid = pid;
	comm.tid = tid;
	strncpy(comm.comm, comm_str, 16);

	if (writen(fd, &comm, sz) != sz) {
		pr_debug("%s failed\n", __func__);
		return -1;
	}

	return 0;
}

static int write_mmap(int fd, pid_t pid, pid_t tid, u64 start, u64 len, u64 pgoff,
		      const char *filename)
{
	char buf[PERF_SAMPLE_MAX_SIZE];
	struct perf_record_mmap *mmap = (struct perf_record_mmap *)buf;
	size_t fsz = roundup(strlen(filename) + 1, 8);
	ssize_t sz = sizeof(*mmap) - sizeof(mmap->filename) + fsz;

	mmap->header.type = PERF_RECORD_MMAP;
	mmap->header.misc = PERF_RECORD_MISC_USER;
	mmap->header.size = sz;

	mmap->pid   = pid;
	mmap->tid   = tid;
	mmap->start = start;
	mmap->len   = len;
	mmap->pgoff = pgoff;
	strncpy(mmap->filename, filename, sizeof(mmap->filename));

	if (writen(fd, mmap, sz) != sz) {
		pr_debug("%s failed\n", __func__);
		return -1;
	}

	return 0;
}

static int write_sample(struct test_data *td, u64 sample_type, u64 id, pid_t pid, pid_t tid)
{
	char buf[PERF_SAMPLE_MAX_SIZE];
	union perf_event *event = (union perf_event *)buf;
	struct perf_sample sample = {
		.ip		= td->ip,
		.addr		= td->addr,
		.id		= id,
		.time		= 1234567890,
		.cpu		= 31,
		.pid		= pid,
		.tid		= tid,
		.period		= 543212345,
		.stream_id	= 101,
	};
	int err;

	event->header.type = PERF_RECORD_SAMPLE;
	event->header.misc = PERF_RECORD_MISC_USER;
	event->header.size = perf_event__sample_event_size(&sample, sample_type, 0);
	err = perf_event__synthesize_sample(event, sample_type, 0, &sample);
	if (err)
		return test_result("perf_event__synthesize_sample() failed", TEST_FAIL);

	err = process(&td->tool, event, &sample, td->machine);
	if (err)
		return test_result("Failed to write sample", TEST_FAIL);

	return TEST_OK;
}

static void close_fd(int fd)
{
	if (fd >= 0)
		close(fd);
}

static const char *prog = "int bar(){};int foo(){bar();};int main(){foo();return 0;}";

static int write_prog(char *file_name)
{
	int fd = creat(file_name, 0644);
	ssize_t n = strlen(prog);
	bool err = fd < 0 || writen(fd, prog, n) != n;

	close_fd(fd);
	return err ? -1 : 0;
}

static int get_dlfilters_path(const char *name, char *buf, size_t sz)
{
	char perf[PATH_MAX];
	char path[PATH_MAX];
	char *perf_path;
	char *exec_path;

	perf_exe(perf, sizeof(perf));
	perf_path = dirname(perf);
	snprintf(path, sizeof(path), "%s/dlfilters/%s", perf_path, name);
	if (access(path, R_OK)) {
		exec_path = get_argv_exec_path();
		if (!exec_path)
			return -1;
		snprintf(path, sizeof(path), "%s/dlfilters/%s", exec_path, name);
		free(exec_path);
		if (access(path, R_OK))
			return -1;
	}
	strlcpy(buf, dirname(path), sz);
	return 0;
}

static int check_filter_desc(struct test_data *td)
{
	char *long_desc = NULL;
	char *desc = NULL;
	int ret;

	if (get_filter_desc(td->dlfilters, td->name, &desc, &long_desc) &&
	    long_desc && !strcmp(long_desc, "Filter used by the 'dlfilter C API' perf test") &&
	    desc && !strcmp(desc, td->desc))
		ret = 0;
	else
		ret = -1;

	free(desc);
	free(long_desc);
	return ret;
}

static int get_ip_addr(struct test_data *td)
{
	struct map *map;
	struct symbol *sym;

	map = dso__new_map(td->prog_file_name);
	if (!map)
		return -1;

	sym = map__find_symbol_by_name(map, "foo");
	if (sym)
		td->foo = sym->start;

	sym = map__find_symbol_by_name(map, "bar");
	if (sym)
		td->bar = sym->start;

	map__put(map);

	td->ip = MAP_START + td->foo;
	td->addr = MAP_START + td->bar;

	return td->foo && td->bar ? 0 : -1;
}

static int do_run_perf_script(struct test_data *td, int do_early)
{
	return system_cmd("%s script -i %s "
			  "--dlfilter %s/%s "
			  "--dlarg first "
			  "--dlarg %d "
			  "--dlarg %" PRIu64 " "
			  "--dlarg %" PRIu64 " "
			  "--dlarg %d "
			  "--dlarg last",
			  td->perf, td->perf_data_file_name, td->dlfilters,
			  td->name, verbose, td->ip, td->addr, do_early);
}

static int run_perf_script(struct test_data *td)
{
	int do_early;
	int err;

	for (do_early = 0; do_early < 3; do_early++) {
		err = do_run_perf_script(td, do_early);
		if (err)
			return err;
	}
	return 0;
}

#define TEST_SAMPLE_TYPE (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \
			  PERF_SAMPLE_IDENTIFIER | PERF_SAMPLE_TIME | \
			  PERF_SAMPLE_ADDR | PERF_SAMPLE_CPU | \
			  PERF_SAMPLE_PERIOD | PERF_SAMPLE_STREAM_ID)

static int test__dlfilter_test(struct test_data *td)
{
	u64 sample_type = TEST_SAMPLE_TYPE;
	pid_t pid = 12345;
	pid_t tid = 12346;
	u64 id = 99;
	int err;

	if (get_dlfilters_path(td->name, td->dlfilters, PATH_MAX))
		return test_result("dlfilters not found", TEST_SKIP);

	if (check_filter_desc(td))
		return test_result("Failed to get expected filter description", TEST_FAIL);

	if (!have_gcc())
		return test_result("gcc not found", TEST_SKIP);

	pr_debug("dlfilters path: %s\n", td->dlfilters);

	if (write_prog(td->c_file_name))
		return test_result("Failed to write test C file", TEST_FAIL);

	if (verbose > 1)
		system_cmd("cat %s ; echo", td->c_file_name);

	if (system_cmd("gcc -g -o %s %s", td->prog_file_name, td->c_file_name))
		return TEST_FAIL;

	if (verbose > 2)
		system_cmd("objdump -x -dS %s", td->prog_file_name);

	if (get_ip_addr(td))
		return test_result("Failed to find program symbols", TEST_FAIL);

	pr_debug("Creating new host machine structure\n");
	td->machine = machine__new_host();
	td->machine->env = &perf_env;

	td->fd = creat(td->perf_data_file_name, 0644);
	if (td->fd < 0)
		return test_result("Failed to create test perf.data file", TEST_FAIL);

	err = perf_header__write_pipe(td->fd);
	if (err < 0)
		return test_result("perf_header__write_pipe() failed", TEST_FAIL);

	err = write_attr(td, sample_type, &id);
	if (err)
		return test_result("perf_event__synthesize_attr() failed", TEST_FAIL);

	if (write_comm(td->fd, pid, tid, "test-prog"))
		return TEST_FAIL;

	if (write_mmap(td->fd, pid, tid, MAP_START, 0x10000, 0, td->prog_file_name))
		return TEST_FAIL;

	if (write_sample(td, sample_type, id, pid, tid) != TEST_OK)
		return TEST_FAIL;

	if (verbose > 1)
		system_cmd("%s script -i %s -D", td->perf, td->perf_data_file_name);

	err = run_perf_script(td);
	if (err)
		return TEST_FAIL;

	return TEST_OK;
}

static void unlink_path(const char *path)
{
	if (*path)
		unlink(path);
}

static void test_data__free(struct test_data *td)
{
	machine__delete(td->machine);
	close_fd(td->fd);
	if (verbose <= 2) {
		unlink_path(td->c_file_name);
		unlink_path(td->prog_file_name);
		unlink_path(td->perf_data_file_name);
	}
}

static int test__dlfilter_ver(int ver)
{
	struct test_data td = {.fd = -1};
	int pid = getpid();
	int err;

	pr_debug("\n-- Testing version %d API --\n", ver);

	perf_exe(td.perf, sizeof(td.perf));

	snprintf(td.name, sizeof(td.name), "dlfilter-test-api-v%d.so", ver);
	snprintf(td.desc, sizeof(td.desc), "dlfilter to test v%d C API", ver);
	snprintf(td.perf_data_file_name, PATH_MAX, "/tmp/dlfilter-test-%u-perf-data", pid);
	snprintf(td.c_file_name, PATH_MAX, "/tmp/dlfilter-test-%u-prog.c", pid);
	snprintf(td.prog_file_name, PATH_MAX, "/tmp/dlfilter-test-%u-prog", pid);

	err = test__dlfilter_test(&td);
	test_data__free(&td);
	return err;
}

static int test__dlfilter(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
{
	int err = test__dlfilter_ver(0);

	if (err)
		return err;
	/* No test for version 1 */
	return test__dlfilter_ver(2);
}

DEFINE_SUITE("dlfilter C API", dlfilter);
