blob: 6ff4decd0c4caca7311102f60a4fdccfc4c61747 [file] [log] [blame]
/*
* Copyright (c) 2020 Tobias Svehagen
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "_main.h"
ZTEST_F(eventfd, test_write_then_read)
{
eventfd_t val;
int ret;
ret = eventfd_write(fixture->fd, 3);
zassert_true(ret == 0, "write ret %d", ret);
ret = eventfd_write(fixture->fd, 2);
zassert_true(ret == 0, "write ret %d", ret);
ret = eventfd_read(fixture->fd, &val);
zassert_true(ret == 0, "read ret %d", ret);
zassert_true(val == 5, "val == %d", val);
/* Test EFD_SEMAPHORE */
reopen(&fixture->fd, 0, EFD_SEMAPHORE);
ret = eventfd_write(fixture->fd, 3);
zassert_true(ret == 0, "write ret %d", ret);
ret = eventfd_write(fixture->fd, 2);
zassert_true(ret == 0, "write ret %d", ret);
ret = eventfd_read(fixture->fd, &val);
zassert_true(ret == 0, "read ret %d", ret);
zassert_true(val == 1, "val == %d", val);
}
ZTEST_F(eventfd, test_zero_shall_not_unblock)
{
short event;
int ret;
ret = eventfd_write(fixture->fd, 0);
zassert_equal(ret, 0, "fd == %d", fixture->fd);
event = POLLIN;
ret = is_blocked(fixture->fd, &event);
zassert_equal(ret, 1, "eventfd unblocked by zero");
}
ZTEST_F(eventfd, test_poll_timeout)
{
struct pollfd pfd;
int ret;
pfd.fd = fixture->fd;
pfd.events = POLLIN;
ret = poll(&pfd, 1, 500);
zassert_true(ret == 0, "poll ret %d", ret);
}
ZTEST_F(eventfd, test_set_poll_event_block)
{
reopen(&fixture->fd, TESTVAL, 0);
eventfd_poll_set_common(fixture->fd);
}
ZTEST_F(eventfd, test_unset_poll_event_block)
{
eventfd_poll_unset_common(fixture->fd);
}
K_THREAD_STACK_DEFINE(thread_stack, CONFIG_TEST_STACK_SIZE);
static struct k_thread thread;
static void thread_eventfd_read_42(void *arg1, void *arg2, void *arg3)
{
eventfd_t value;
struct eventfd_fixture *fixture = arg1;
zassert_ok(eventfd_read(fixture->fd, &value));
zassert_equal(value, 42);
}
ZTEST_F(eventfd, test_read_then_write_block)
{
k_thread_create(&thread, thread_stack, K_THREAD_STACK_SIZEOF(thread_stack),
thread_eventfd_read_42, fixture, NULL, NULL, 0, 0, K_NO_WAIT);
k_msleep(100);
/* this write never occurs */
zassert_ok(eventfd_write(fixture->fd, 42));
/* unreachable code */
k_thread_join(&thread, K_FOREVER);
}
static void thread_eventfd_write(void *arg1, void *arg2, void *arg3)
{
struct eventfd_fixture *fixture = arg1;
zassert_ok(eventfd_write(fixture->fd, 71));
}
ZTEST_F(eventfd, test_write_while_pollin)
{
struct zsock_pollfd fds[] = {
{
.fd = fixture->fd,
.events = ZSOCK_POLLIN,
},
};
eventfd_t value;
int ret;
k_thread_create(&thread, thread_stack, K_THREAD_STACK_SIZEOF(thread_stack),
thread_eventfd_write, fixture, NULL, NULL, 0, 0, K_MSEC(100));
/* Expect 1 event */
ret = zsock_poll(fds, ARRAY_SIZE(fds), 200);
zassert_equal(ret, 1);
zassert_equal(fds[0].revents, ZSOCK_POLLIN);
/* Check value */
zassert_ok(eventfd_read(fixture->fd, &value));
zassert_equal(value, 71);
zassert_ok(k_thread_join(&thread, K_FOREVER));
}
static void thread_eventfd_read(void *arg1, void *arg2, void *arg3)
{
eventfd_t value;
struct eventfd_fixture *fixture = arg1;
zassert_ok(eventfd_read(fixture->fd, &value));
}
ZTEST_F(eventfd, test_read_while_pollout)
{
struct zsock_pollfd fds[] = {
{
.fd = fixture->fd,
.events = ZSOCK_POLLOUT,
},
};
int ret;
zassert_ok(eventfd_write(fixture->fd, UINT64_MAX - 1));
k_thread_create(&thread, thread_stack, K_THREAD_STACK_SIZEOF(thread_stack),
thread_eventfd_read, fixture, NULL, NULL, 0, 0, K_MSEC(100));
/* Expect 1 event */
ret = zsock_poll(fds, ARRAY_SIZE(fds), 200);
zassert_equal(ret, 1);
zassert_equal(fds[0].revents, ZSOCK_POLLOUT);
zassert_ok(k_thread_join(&thread, K_FOREVER));
}