diff --git a/tests/posix/eventfd/src/ioctl.c b/tests/posix/eventfd/src/ioctl.c new file mode 100644 index 00000000000000..28c2ce59e4acf9 --- /dev/null +++ b/tests/posix/eventfd/src/ioctl.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2024 Celina Sophie Kalus + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "_main.h" +#include + +#define EFD_IN_USE_INTERNAL 0x1 + +ZTEST_F(eventfd, test_set_flags) +{ + eventfd_t val; + int ret; + int flags; + short event; + + /* Get current flags; Expect blocking, non-semaphore. */ + flags = ioctl(fixture->fd, F_GETFL, 0); + zassert_equal(flags, 0, "flags == %d", flags); + + event = POLLIN; + ret = is_blocked(fixture->fd, &event); + zassert_equal(ret, 1, "eventfd read not blocked"); + + /* Try writing and reading. Should not fail. */ + ret = eventfd_write(fixture->fd, 3); + zassert_ok(ret); + + ret = eventfd_read(fixture->fd, &val); + zassert_ok(ret); + zassert_equal(val, 3, "val == %d", val); + + + /* Set nonblocking without reopening. */ + ret = ioctl(fixture->fd, F_SETFL, O_NONBLOCK); + zassert_ok(ret); + + flags = ioctl(fixture->fd, F_GETFL, 0); + zassert_equal(flags, O_NONBLOCK, "flags == %d", flags); + + event = POLLOUT; + ret = is_blocked(fixture->fd, &event); + zassert_equal(ret, 0, "eventfd write blocked"); + + + /* Try writing and reading again. */ + ret = eventfd_write(fixture->fd, 19); + zassert_ok(ret); + + ret = eventfd_read(fixture->fd, &val); + zassert_ok(ret); + zassert_equal(val, 19, "val == %d", val); + + + /* Set back to blocking. */ + ret = ioctl(fixture->fd, F_SETFL, 0); + zassert_ok(ret); + + flags = ioctl(fixture->fd, F_GETFL, 0); + zassert_equal(flags, 0, "flags == %d", flags); + + event = POLLIN; + ret = is_blocked(fixture->fd, &event); + zassert_equal(ret, 1, "eventfd read not blocked"); + + + /* Try writing and reading again. */ + ret = eventfd_write(fixture->fd, 10); + zassert_ok(ret); + + ret = eventfd_read(fixture->fd, &val); + zassert_ok(ret); + zassert_equal(val, 10, "val == %d", val); + + + /* Test setting internal in-use-flag. Should fail. */ + ret = ioctl(fixture->fd, F_SETFL, EFD_IN_USE_INTERNAL); + zassert_not_ok(ret); + + + /* File descriptor should still be valid and working. */ + ret = eventfd_write(fixture->fd, 97); + zassert_ok(ret); + + ret = eventfd_read(fixture->fd, &val); + zassert_ok(ret); + zassert_equal(val, 97, "val == %d", val); +}