// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2023. Huawei Technologies Co., Ltd */
#define _GNU_SOURCE
#include <sched.h>
#include <pthread.h>
#include <stdbool.h>
#include <bpf/btf.h>
#include <test_progs.h>

#include "test_bpf_ma.skel.h"

void test_test_bpf_ma(void)
{
	struct test_bpf_ma *skel;
	struct btf *btf;
	int i, err;

	skel = test_bpf_ma__open();
	if (!ASSERT_OK_PTR(skel, "open"))
		return;

	btf = bpf_object__btf(skel->obj);
	if (!ASSERT_OK_PTR(btf, "btf"))
		goto out;

	for (i = 0; i < ARRAY_SIZE(skel->rodata->data_sizes); i++) {
		char name[32];
		int id;

		snprintf(name, sizeof(name), "bin_data_%u", skel->rodata->data_sizes[i]);
		id = btf__find_by_name_kind(btf, name, BTF_KIND_STRUCT);
		if (!ASSERT_GT(id, 0, "bin_data"))
			goto out;
		skel->rodata->data_btf_ids[i] = id;
	}

	err = test_bpf_ma__load(skel);
	if (!ASSERT_OK(err, "load"))
		goto out;

	err = test_bpf_ma__attach(skel);
	if (!ASSERT_OK(err, "attach"))
		goto out;

	skel->bss->pid = getpid();
	usleep(1);
	ASSERT_OK(skel->bss->err, "test error");
out:
	test_bpf_ma__destroy(skel);
}