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 
8*50a7cedbSJoanne Koong static const char * const success_tests[] = {
9*50a7cedbSJoanne Koong 	"test_read_write",
10*50a7cedbSJoanne Koong 	"test_data_slice",
11*50a7cedbSJoanne Koong 	"test_ringbuf",
120cf7052aSJoanne Koong };
130cf7052aSJoanne Koong 
140cf7052aSJoanne Koong static void verify_success(const char *prog_name)
150cf7052aSJoanne Koong {
160cf7052aSJoanne Koong 	struct dynptr_success *skel;
170cf7052aSJoanne Koong 	struct bpf_program *prog;
180cf7052aSJoanne Koong 	struct bpf_link *link;
190cf7052aSJoanne Koong 
200cf7052aSJoanne Koong 	skel = dynptr_success__open();
210cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(skel, "dynptr_success__open"))
220cf7052aSJoanne Koong 		return;
230cf7052aSJoanne Koong 
240cf7052aSJoanne Koong 	skel->bss->pid = getpid();
250cf7052aSJoanne Koong 
260cf7052aSJoanne Koong 	dynptr_success__load(skel);
270cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(skel, "dynptr_success__load"))
280cf7052aSJoanne Koong 		goto cleanup;
290cf7052aSJoanne Koong 
300cf7052aSJoanne Koong 	prog = bpf_object__find_program_by_name(skel->obj, prog_name);
310cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))
320cf7052aSJoanne Koong 		goto cleanup;
330cf7052aSJoanne Koong 
340cf7052aSJoanne Koong 	link = bpf_program__attach(prog);
350cf7052aSJoanne Koong 	if (!ASSERT_OK_PTR(link, "bpf_program__attach"))
360cf7052aSJoanne Koong 		goto cleanup;
370cf7052aSJoanne Koong 
380cf7052aSJoanne Koong 	usleep(1);
390cf7052aSJoanne Koong 
400cf7052aSJoanne Koong 	ASSERT_EQ(skel->bss->err, 0, "err");
410cf7052aSJoanne Koong 
420cf7052aSJoanne Koong 	bpf_link__destroy(link);
430cf7052aSJoanne Koong 
440cf7052aSJoanne Koong cleanup:
450cf7052aSJoanne Koong 	dynptr_success__destroy(skel);
460cf7052aSJoanne Koong }
470cf7052aSJoanne Koong 
480cf7052aSJoanne Koong void test_dynptr(void)
490cf7052aSJoanne Koong {
500cf7052aSJoanne Koong 	int i;
510cf7052aSJoanne Koong 
52*50a7cedbSJoanne Koong 	for (i = 0; i < ARRAY_SIZE(success_tests); i++) {
53*50a7cedbSJoanne Koong 		if (!test__start_subtest(success_tests[i]))
540cf7052aSJoanne Koong 			continue;
550cf7052aSJoanne Koong 
56*50a7cedbSJoanne Koong 		verify_success(success_tests[i]);
570cf7052aSJoanne Koong 	}
5826c386ecSAndrii Nakryiko 
5926c386ecSAndrii Nakryiko 	RUN_TESTS(dynptr_fail);
600cf7052aSJoanne Koong }
61