Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1// SPDX-License-Identifier: GPL-2.0
  2/* 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}