1 /*
2 * Copyright (c) 2024 Celina Sophie Kalus
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include "_main.h"
8
9 #include <zephyr/posix/fcntl.h>
10 #include <zephyr/posix/sys/ioctl.h>
11
12 #define EFD_IN_USE_INTERNAL 0x1
13
ZTEST_F(eventfd,test_set_flags)14 ZTEST_F(eventfd, test_set_flags)
15 {
16 eventfd_t val;
17 int ret;
18 int flags;
19 short event;
20
21 /* Get current flags; Expect blocking, non-semaphore. */
22 flags = ioctl(fixture->fd, F_GETFL, 0);
23 zassert_equal(flags, 0, "flags == %d", flags);
24
25 event = POLLIN;
26 ret = is_blocked(fixture->fd, &event);
27 zassert_equal(ret, 1, "eventfd read not blocked");
28
29 /* Try writing and reading. Should not fail. */
30 ret = eventfd_write(fixture->fd, 3);
31 zassert_ok(ret);
32
33 ret = eventfd_read(fixture->fd, &val);
34 zassert_ok(ret);
35 zassert_equal(val, 3, "val == %d", val);
36
37
38 /* Set nonblocking without reopening. */
39 ret = ioctl(fixture->fd, F_SETFL, O_NONBLOCK);
40 zassert_ok(ret);
41
42 flags = ioctl(fixture->fd, F_GETFL, 0);
43 zassert_equal(flags, O_NONBLOCK, "flags == %d", flags);
44
45 event = POLLOUT;
46 ret = is_blocked(fixture->fd, &event);
47 zassert_equal(ret, 0, "eventfd write blocked");
48
49
50 /* Try writing and reading again. */
51 ret = eventfd_write(fixture->fd, 19);
52 zassert_ok(ret);
53
54 ret = eventfd_read(fixture->fd, &val);
55 zassert_ok(ret);
56 zassert_equal(val, 19, "val == %d", val);
57
58
59 /* Set back to blocking. */
60 ret = ioctl(fixture->fd, F_SETFL, 0);
61 zassert_ok(ret);
62
63 flags = ioctl(fixture->fd, F_GETFL, 0);
64 zassert_equal(flags, 0, "flags == %d", flags);
65
66 event = POLLIN;
67 ret = is_blocked(fixture->fd, &event);
68 zassert_equal(ret, 1, "eventfd read not blocked");
69
70
71 /* Try writing and reading again. */
72 ret = eventfd_write(fixture->fd, 10);
73 zassert_ok(ret);
74
75 ret = eventfd_read(fixture->fd, &val);
76 zassert_ok(ret);
77 zassert_equal(val, 10, "val == %d", val);
78
79
80 /* Test setting internal in-use-flag. Should fail. */
81 ret = ioctl(fixture->fd, F_SETFL, EFD_IN_USE_INTERNAL);
82 zassert_not_ok(ret);
83
84
85 /* File descriptor should still be valid and working. */
86 ret = eventfd_write(fixture->fd, 97);
87 zassert_ok(ret);
88
89 ret = eventfd_read(fixture->fd, &val);
90 zassert_ok(ret);
91 zassert_equal(val, 97, "val == %d", val);
92 }
93