1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2025 ChinaTelecom */ 3 #include <test_progs.h> 4 #include "fsession_test.skel.h" 5 6 static int check_result(struct fsession_test *skel) 7 { 8 LIBBPF_OPTS(bpf_test_run_opts, topts); 9 int err, prog_fd; 10 11 /* Trigger test function calls */ 12 prog_fd = bpf_program__fd(skel->progs.test1); 13 err = bpf_prog_test_run_opts(prog_fd, &topts); 14 if (!ASSERT_OK(err, "test_run_opts err")) 15 return err; 16 if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 17 return topts.retval; 18 19 for (int i = 0; i < sizeof(*skel->bss) / sizeof(__u64); i++) { 20 if (!ASSERT_EQ(((__u64 *)skel->bss)[i], 1, "test_result")) 21 return -EINVAL; 22 } 23 24 return 0; 25 } 26 27 static void test_fsession_basic(void) 28 { 29 struct fsession_test *skel = NULL; 30 int err; 31 32 skel = fsession_test__open(); 33 if (!ASSERT_OK_PTR(skel, "fsession_test__open")) 34 return; 35 36 err = fsession_test__load(skel); 37 if (err == -EOPNOTSUPP) { 38 test__skip(); 39 goto cleanup; 40 } 41 if (!ASSERT_OK(err, "fsession_test__load")) 42 goto cleanup; 43 44 err = fsession_test__attach(skel); 45 if (!ASSERT_OK(err, "fsession_attach")) 46 goto cleanup; 47 48 check_result(skel); 49 cleanup: 50 fsession_test__destroy(skel); 51 } 52 53 static void test_fsession_reattach(void) 54 { 55 struct fsession_test *skel = NULL; 56 int err; 57 58 skel = fsession_test__open(); 59 if (!ASSERT_OK_PTR(skel, "fsession_test__open")) 60 return; 61 62 err = fsession_test__load(skel); 63 if (err == -EOPNOTSUPP) { 64 test__skip(); 65 goto cleanup; 66 } 67 if (!ASSERT_OK(err, "fsession_test__load")) 68 goto cleanup; 69 70 /* first attach */ 71 err = fsession_test__attach(skel); 72 if (!ASSERT_OK(err, "fsession_first_attach")) 73 goto cleanup; 74 75 if (check_result(skel)) 76 goto cleanup; 77 78 /* detach */ 79 fsession_test__detach(skel); 80 81 /* reset counters */ 82 memset(skel->bss, 0, sizeof(*skel->bss)); 83 84 /* second attach */ 85 err = fsession_test__attach(skel); 86 if (!ASSERT_OK(err, "fsession_second_attach")) 87 goto cleanup; 88 89 if (check_result(skel)) 90 goto cleanup; 91 92 cleanup: 93 fsession_test__destroy(skel); 94 } 95 96 static void test_fsession_cookie(void) 97 { 98 struct fsession_test *skel = NULL; 99 int err; 100 101 skel = fsession_test__open(); 102 if (!ASSERT_OK_PTR(skel, "fsession_test__open")) 103 goto cleanup; 104 105 /* 106 * The test_fsession_basic() will test the session cookie with 107 * bpf_get_func_ip() case, so we need only check 108 * the cookie without bpf_get_func_ip() case here 109 */ 110 bpf_program__set_autoload(skel->progs.test6, false); 111 112 err = fsession_test__load(skel); 113 if (err == -EOPNOTSUPP) { 114 test__skip(); 115 goto cleanup; 116 } 117 if (!ASSERT_OK(err, "fsession_test__load")) 118 goto cleanup; 119 120 err = fsession_test__attach(skel); 121 if (!ASSERT_OK(err, "fsession_attach")) 122 goto cleanup; 123 124 skel->bss->test6_entry_result = 1; 125 skel->bss->test6_exit_result = 1; 126 127 check_result(skel); 128 cleanup: 129 fsession_test__destroy(skel); 130 } 131 132 void test_fsession_test(void) 133 { 134 if (test__start_subtest("fsession_test")) 135 test_fsession_basic(); 136 if (test__start_subtest("fsession_reattach")) 137 test_fsession_reattach(); 138 if (test__start_subtest("fsession_cookie")) 139 test_fsession_cookie(); 140 } 141