brintos

brintos / linux-shallow public Read only

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