Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | // SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2023 Meta Platforms, Inc. and affiliates. */ #include <errno.h> #include <sys/syscall.h> #include <unistd.h> #include "test_map_ops.skel.h" #include "test_progs.h" static void map_update(void) { (void)syscall(__NR_getpid); } static void map_delete(void) { (void)syscall(__NR_getppid); } static void map_push(void) { (void)syscall(__NR_getuid); } static void map_pop(void) { (void)syscall(__NR_geteuid); } static void map_peek(void) { (void)syscall(__NR_getgid); } static void map_for_each_pass(void) { (void)syscall(__NR_gettid); } static void map_for_each_fail(void) { (void)syscall(__NR_getpgid); } static int setup(struct test_map_ops **skel) { int err = 0; if (!skel) return -1; *skel = test_map_ops__open(); if (!ASSERT_OK_PTR(*skel, "test_map_ops__open")) return -1; (*skel)->rodata->pid = getpid(); err = test_map_ops__load(*skel); if (!ASSERT_OK(err, "test_map_ops__load")) return err; err = test_map_ops__attach(*skel); if (!ASSERT_OK(err, "test_map_ops__attach")) return err; return err; } static void teardown(struct test_map_ops **skel) { if (skel && *skel) test_map_ops__destroy(*skel); } static void map_ops_update_delete_subtest(void) { struct test_map_ops *skel; if (setup(&skel)) goto teardown; map_update(); ASSERT_OK(skel->bss->err, "map_update_initial"); map_update(); ASSERT_LT(skel->bss->err, 0, "map_update_existing"); ASSERT_EQ(skel->bss->err, -EEXIST, "map_update_existing"); map_delete(); ASSERT_OK(skel->bss->err, "map_delete_existing"); map_delete(); ASSERT_LT(skel->bss->err, 0, "map_delete_non_existing"); ASSERT_EQ(skel->bss->err, -ENOENT, "map_delete_non_existing"); teardown: teardown(&skel); } static void map_ops_push_peek_pop_subtest(void) { struct test_map_ops *skel; if (setup(&skel)) goto teardown; map_push(); ASSERT_OK(skel->bss->err, "map_push_initial"); map_push(); ASSERT_LT(skel->bss->err, 0, "map_push_when_full"); ASSERT_EQ(skel->bss->err, -E2BIG, "map_push_when_full"); map_peek(); ASSERT_OK(skel->bss->err, "map_peek"); map_pop(); ASSERT_OK(skel->bss->err, "map_pop"); map_peek(); ASSERT_LT(skel->bss->err, 0, "map_peek_when_empty"); ASSERT_EQ(skel->bss->err, -ENOENT, "map_peek_when_empty"); map_pop(); ASSERT_LT(skel->bss->err, 0, "map_pop_when_empty"); ASSERT_EQ(skel->bss->err, -ENOENT, "map_pop_when_empty"); teardown: teardown(&skel); } static void map_ops_for_each_subtest(void) { struct test_map_ops *skel; if (setup(&skel)) goto teardown; map_for_each_pass(); /* expect to iterate over 1 element */ ASSERT_EQ(skel->bss->err, 1, "map_for_each_no_flags"); map_for_each_fail(); ASSERT_LT(skel->bss->err, 0, "map_for_each_with_flags"); ASSERT_EQ(skel->bss->err, -EINVAL, "map_for_each_with_flags"); teardown: teardown(&skel); } void test_map_ops(void) { if (test__start_subtest("map_ops_update_delete")) map_ops_update_delete_subtest(); if (test__start_subtest("map_ops_push_peek_pop")) map_ops_push_peek_pop_subtest(); if (test__start_subtest("map_ops_for_each")) map_ops_for_each_subtest(); } |