// SPDX-License-Identifier: GPL-2.0
#include <test_progs.h>

struct bss {
	unsigned did_run;
	unsigned iters;
	unsigned sum;
};

struct rdonly_map_subtest {
	const char *subtest_name;
	const char *prog_name;
	unsigned exp_iters;
	unsigned exp_sum;
};

void test_rdonly_maps(void)
{
	const char *file = "test_rdonly_maps.bpf.o";
	struct rdonly_map_subtest subtests[] = {
		{ "skip loop", "skip_loop", 0, 0 },
		{ "part loop", "part_loop", 3, 2 + 3 + 4 },
		{ "full loop", "full_loop", 4, 2 + 3 + 4 + 5 },
	};
	int i, err, zero = 0, duration = 0;
	struct bpf_link *link = NULL;
	struct bpf_program *prog;
	struct bpf_map *bss_map;
	struct bpf_object *obj;
	struct bss bss;

	obj = bpf_object__open_file(file, NULL);
	if (!ASSERT_OK_PTR(obj, "obj_open"))
		return;

	err = bpf_object__load(obj);
	if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno))
		goto cleanup;

	bss_map = bpf_object__find_map_by_name(obj, ".bss");
	if (CHECK(!bss_map, "find_bss_map", "failed\n"))
		goto cleanup;

	for (i = 0; i < ARRAY_SIZE(subtests); i++) {
		const struct rdonly_map_subtest *t = &subtests[i];

		if (!test__start_subtest(t->subtest_name))
			continue;

		prog = bpf_object__find_program_by_name(obj, t->prog_name);
		if (CHECK(!prog, "find_prog", "prog '%s' not found\n",
			  t->prog_name))
			goto cleanup;

		memset(&bss, 0, sizeof(bss));
		err = bpf_map_update_elem(bpf_map__fd(bss_map), &zero, &bss, 0);
		if (CHECK(err, "set_bss", "failed to set bss data: %d\n", err))
			goto cleanup;

		link = bpf_program__attach_raw_tracepoint(prog, "sys_enter");
		if (!ASSERT_OK_PTR(link, "attach_prog"))
			goto cleanup;

		/* trigger probe */
		usleep(1);

		bpf_link__destroy(link);
		link = NULL;

		err = bpf_map_lookup_elem(bpf_map__fd(bss_map), &zero, &bss);
		if (CHECK(err, "get_bss", "failed to get bss data: %d\n", err))
			goto cleanup;
		if (CHECK(bss.did_run == 0, "check_run",
			  "prog '%s' didn't run?\n", t->prog_name))
			goto cleanup;
		if (CHECK(bss.iters != t->exp_iters, "check_iters",
			  "prog '%s' iters: %d, expected: %d\n",
			  t->prog_name, bss.iters, t->exp_iters))
			goto cleanup;
		if (CHECK(bss.sum != t->exp_sum, "check_sum",
			  "prog '%s' sum: %d, expected: %d\n",
			  t->prog_name, bss.sum, t->exp_sum))
			goto cleanup;
	}

cleanup:
	bpf_link__destroy(link);
	bpf_object__close(obj);
}
