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