// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2021 Google LLC. */

#include <test_progs.h>
#include "test_snprintf.skel.h"
#include "test_snprintf_single.skel.h"

#define EXP_NUM_OUT  "-8 9 96 -424242 1337 DABBAD00"
#define EXP_NUM_RET  sizeof(EXP_NUM_OUT)

#define EXP_IP_OUT   "127.000.000.001 0000:0000:0000:0000:0000:0000:0000:0001"
#define EXP_IP_RET   sizeof(EXP_IP_OUT)

/* The third specifier, %pB, depends on compiler inlining so don't check it */
#define EXP_SYM_OUT  "schedule schedule+0x0/"
#define MIN_SYM_RET  sizeof(EXP_SYM_OUT)

/* The third specifier, %p, is a hashed pointer which changes on every reboot */
#define EXP_ADDR_OUT "0000000000000000 ffff00000add4e55 "
#define EXP_ADDR_RET sizeof(EXP_ADDR_OUT "unknownhashedptr")

#define EXP_STR_OUT  "str1         a  b c      d e longstr"
#define EXP_STR_RET  sizeof(EXP_STR_OUT)

#define EXP_OVER_OUT "%over"
#define EXP_OVER_RET 10

#define EXP_PAD_OUT "    4 000"
#define EXP_PAD_RET 900007

#define EXP_NO_ARG_OUT "simple case"
#define EXP_NO_ARG_RET 12

#define EXP_NO_BUF_RET 29

void test_snprintf_positive(void)
{
	char exp_addr_out[] = EXP_ADDR_OUT;
	char exp_sym_out[]  = EXP_SYM_OUT;
	struct test_snprintf *skel;

	skel = test_snprintf__open_and_load();
	if (!ASSERT_OK_PTR(skel, "skel_open"))
		return;

	skel->bss->pid = getpid();

	if (!ASSERT_OK(test_snprintf__attach(skel), "skel_attach"))
		goto cleanup;

	/* trigger tracepoint */
	usleep(1);

	ASSERT_STREQ(skel->bss->num_out, EXP_NUM_OUT, "num_out");
	ASSERT_EQ(skel->bss->num_ret, EXP_NUM_RET, "num_ret");

	ASSERT_STREQ(skel->bss->ip_out, EXP_IP_OUT, "ip_out");
	ASSERT_EQ(skel->bss->ip_ret, EXP_IP_RET, "ip_ret");

	ASSERT_OK(memcmp(skel->bss->sym_out, exp_sym_out,
			 sizeof(exp_sym_out) - 1), "sym_out");
	ASSERT_LT(MIN_SYM_RET, skel->bss->sym_ret, "sym_ret");

	ASSERT_OK(memcmp(skel->bss->addr_out, exp_addr_out,
			 sizeof(exp_addr_out) - 1), "addr_out");
	ASSERT_EQ(skel->bss->addr_ret, EXP_ADDR_RET, "addr_ret");

	ASSERT_STREQ(skel->bss->str_out, EXP_STR_OUT, "str_out");
	ASSERT_EQ(skel->bss->str_ret, EXP_STR_RET, "str_ret");

	ASSERT_STREQ(skel->bss->over_out, EXP_OVER_OUT, "over_out");
	ASSERT_EQ(skel->bss->over_ret, EXP_OVER_RET, "over_ret");

	ASSERT_STREQ(skel->bss->pad_out, EXP_PAD_OUT, "pad_out");
	ASSERT_EQ(skel->bss->pad_ret, EXP_PAD_RET, "pad_ret");

	ASSERT_STREQ(skel->bss->noarg_out, EXP_NO_ARG_OUT, "no_arg_out");
	ASSERT_EQ(skel->bss->noarg_ret, EXP_NO_ARG_RET, "no_arg_ret");

	ASSERT_EQ(skel->bss->nobuf_ret, EXP_NO_BUF_RET, "no_buf_ret");

cleanup:
	test_snprintf__destroy(skel);
}

#define min(a, b) ((a) < (b) ? (a) : (b))

/* Loads an eBPF object calling bpf_snprintf with up to 10 characters of fmt */
static int load_single_snprintf(char *fmt)
{
	struct test_snprintf_single *skel;
	int ret;

	skel = test_snprintf_single__open();
	if (!skel)
		return -EINVAL;

	memcpy(skel->rodata->fmt, fmt, min(strlen(fmt) + 1, 10));

	ret = test_snprintf_single__load(skel);
	test_snprintf_single__destroy(skel);

	return ret;
}

void test_snprintf_negative(void)
{
	ASSERT_OK(load_single_snprintf("valid %d"), "valid usage");

	ASSERT_ERR(load_single_snprintf("0123456789"), "no terminating zero");
	ASSERT_ERR(load_single_snprintf("%d %d"), "too many specifiers");
	ASSERT_ERR(load_single_snprintf("%pi5"), "invalid specifier 1");
	ASSERT_ERR(load_single_snprintf("%a"), "invalid specifier 2");
	ASSERT_ERR(load_single_snprintf("%"), "invalid specifier 3");
	ASSERT_ERR(load_single_snprintf("%12345678"), "invalid specifier 4");
	ASSERT_ERR(load_single_snprintf("%--------"), "invalid specifier 5");
	ASSERT_ERR(load_single_snprintf("%lc"), "invalid specifier 6");
	ASSERT_ERR(load_single_snprintf("%llc"), "invalid specifier 7");
	ASSERT_ERR(load_single_snprintf("\x80"), "non ascii character");
	ASSERT_ERR(load_single_snprintf("\x1"), "non printable character");
}

void test_snprintf(void)
{
	if (test__start_subtest("snprintf_positive"))
		test_snprintf_positive();
	if (test__start_subtest("snprintf_negative"))
		test_snprintf_negative();
}
