10cf7052aSJoanne Koong // SPDX-License-Identifier: GPL-2.0
20cf7052aSJoanne Koong /* Copyright (c) 2022 Facebook */
30cf7052aSJoanne Koong 
40cf7052aSJoanne Koong #include <test_progs.h>
50cf7052aSJoanne Koong #include "dynptr_fail.skel.h"
60cf7052aSJoanne Koong #include "dynptr_success.skel.h"
70cf7052aSJoanne Koong 
80cf7052aSJoanne Koong static struct {
90cf7052aSJoanne Koong 	const char *prog_name;
100cf7052aSJoanne Koong 	const char *expected_err_msg;
110cf7052aSJoanne Koong } dynptr_tests[] = {
120cf7052aSJoanne Koong 	/* success cases */
130cf7052aSJoanne Koong 	{"test_read_write", NULL},
140cf7052aSJoanne Koong 	{"test_data_slice", NULL},
150cf7052aSJoanne Koong 	{"test_ringbuf", NULL},
160cf7052aSJoanne Koong };
170cf7052aSJoanne Koong 
180cf7052aSJoanne Koong static void verify_success(const char *prog_name)
190cf7052aSJoanne Koong {
200cf7052aSJoanne Koong 	struct dynptr_success *skel;
210cf7052aSJoanne Koong 	struct bpf_program *prog;
220cf7052aSJoanne Koong 	struct bpf_link *link;
230cf7052aSJoanne Koong 
240cf7052aSJoanne Koong 	skel = dynptr_success__open();
250cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(skel, "dynptr_success__open"))
260cf7052aSJoanne Koong 		return;
270cf7052aSJoanne Koong 
280cf7052aSJoanne Koong 	skel->bss->pid = getpid();
290cf7052aSJoanne Koong 
300cf7052aSJoanne Koong 	dynptr_success__load(skel);
310cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(skel, "dynptr_success__load"))
320cf7052aSJoanne Koong 		goto cleanup;
330cf7052aSJoanne Koong 
340cf7052aSJoanne Koong 	prog = bpf_object__find_program_by_name(skel->obj, prog_name);
350cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
360cf7052aSJoanne Koong 		goto cleanup;
370cf7052aSJoanne Koong 
380cf7052aSJoanne Koong 	link = bpf_program__attach(prog);
390cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(link, "bpf_program__attach"))
400cf7052aSJoanne Koong 		goto cleanup;
410cf7052aSJoanne Koong 
420cf7052aSJoanne Koong 	usleep(1);
430cf7052aSJoanne Koong 
440cf7052aSJoanne Koong 	ASSERT_EQ(skel->bss->err, 0, "err");
450cf7052aSJoanne Koong 
460cf7052aSJoanne Koong 	bpf_link__destroy(link);
470cf7052aSJoanne Koong 
480cf7052aSJoanne Koong cleanup:
490cf7052aSJoanne Koong 	dynptr_success__destroy(skel);
500cf7052aSJoanne Koong }
510cf7052aSJoanne Koong 
520cf7052aSJoanne Koong void test_dynptr(void)
530cf7052aSJoanne Koong {
540cf7052aSJoanne Koong 	int i;
550cf7052aSJoanne Koong 
560cf7052aSJoanne Koong 	for (i = 0; i < ARRAY_SIZE(dynptr_tests); i++) {
570cf7052aSJoanne Koong 		if (!test__start_subtest(dynptr_tests[i].prog_name))
580cf7052aSJoanne Koong 			continue;
590cf7052aSJoanne Koong 
600cf7052aSJoanne Koong 		verify_success(dynptr_tests[i].prog_name);
610cf7052aSJoanne Koong 	}
62*26c386ecSAndrii Nakryiko 
63*26c386ecSAndrii Nakryiko 	RUN_TESTS(dynptr_fail);
640cf7052aSJoanne Koong }
65