Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aacc97f3 authored by Tianyu Jiang's avatar Tianyu Jiang
Browse files

Add more BufferHubEventFd tests

It checks that epollfd is able to recieve signaled BufferHubEventFd.
It checks that epollfd is able to receive consecutive signals from
BufferHubEventFd and duplicated BufferHubEventFd.

Test: BufferHub_test
Bug: None
Change-Id: Ia3bf8c56f2e858bb144c37b1daf75bd2c1363da7
parent 6dbc3f6c
Loading
Loading
Loading
Loading
+92 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ namespace {

const int kTimeout = 100;
const std::chrono::milliseconds kTimeoutMs(kTimeout);
const int kTestRuns = 5;

using ::testing::Contains;
using BufferHubEventFdTest = ::testing::Test;
@@ -46,21 +47,111 @@ TEST_F(BufferHubEventFdTest, EventFd_testSingleEpollFd) {
    ASSERT_TRUE(eventFd.isValid());

    base::unique_fd epollFd(epoll_create(64));
    ASSERT_GE(epollFd.get(), 0);

    epoll_event e = {.events = EPOLLIN | EPOLLET, .data = {.u32 = 0}};
    ASSERT_EQ(epoll_ctl(epollFd.get(), EPOLL_CTL_ADD, eventFd.get(), &e), 0);

    std::array<epoll_event, 1> events;
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);

    eventFd.signal();
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);

    // The epoll fd is edge triggered, so it only responds to the eventFd once.
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);

    // Check that it can receive consecutive signal.
    eventFd.signal();
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);

    // Check that it can receive consecutive signal from a duplicated eventfd.
    BufferHubEventFd dupEventFd(dup(eventFd.get()));
    ASSERT_TRUE(dupEventFd.isValid());
    dupEventFd.signal();
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
    dupEventFd.signal();
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
}

TEST_F(BufferHubEventFdTest, EventFd_testCreateEpollFdAndAddSignaledEventFd) {
    BufferHubEventFd eventFd;
    ASSERT_TRUE(eventFd.isValid());
    eventFd.signal();

    base::unique_fd epollFd(epoll_create(64));
    ASSERT_GE(epollFd.get(), 0);
    ASSERT_EQ(epoll_ctl(epollFd.get(), EPOLL_CTL_ADD, eventFd.get(), &e), 0);

    // Make sure that the epoll set has not been signal yet.
    std::array<epoll_event, 1> events;
    ASSERT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);

    // Check that adding an signaled fd into this epoll set will trigger the epoll set.
    epoll_event e = {.events = EPOLLIN | EPOLLET, .data = {.u32 = 0}};
    ASSERT_EQ(epoll_ctl(epollFd.get(), EPOLL_CTL_ADD, eventFd.get(), &e), 0);
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);

    // The epoll fd is edge triggered, so it only responds to the eventFd once.
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
}

TEST_F(BufferHubEventFdTest, EventFd_testAddSignaledEventFdToEpollFd) {
    BufferHubEventFd eventFd;
    ASSERT_TRUE(eventFd.isValid());

    base::unique_fd epollFd(epoll_create(64));
    ASSERT_GE(epollFd.get(), 0);

    eventFd.signal();

    epoll_event e = {.events = EPOLLIN | EPOLLET, .data = {.u32 = 0}};
    ASSERT_EQ(epoll_ctl(epollFd.get(), EPOLL_CTL_ADD, eventFd.get(), &e), 0);

    std::array<epoll_event, 1> events;
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);

    // The epoll fd is edge triggered, so it only responds to the eventFd once.
    EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
}

TEST_F(BufferHubEventFdTest, EventFd_testConsecutiveSignalsFromAEventFd) {
    BufferHubEventFd eventFd;
    ASSERT_TRUE(eventFd.isValid());
    base::unique_fd epollFd(epoll_create(64));
    ASSERT_GE(epollFd.get(), 0);
    epoll_event e = {.events = EPOLLIN | EPOLLET, .data = {.u32 = 0}};
    ASSERT_EQ(epoll_ctl(epollFd.get(), EPOLL_CTL_ADD, eventFd.get(), &e), 0);

    std::array<epoll_event, 1> events;
    for (int i = 0; i < kTestRuns; ++i) {
        eventFd.signal();
        EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);
        EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
    }
}

TEST_F(BufferHubEventFdTest, EventFd_testConsecutiveSignalsFromADuplicatedEventFd) {
    BufferHubEventFd eventFd;
    ASSERT_TRUE(eventFd.isValid());
    base::unique_fd epollFd(epoll_create(64));
    ASSERT_GE(epollFd.get(), 0);
    epoll_event e = {.events = EPOLLIN | EPOLLET, .data = {.u32 = 0}};
    ASSERT_EQ(epoll_ctl(epollFd.get(), EPOLL_CTL_ADD, eventFd.get(), &e), 0);

    BufferHubEventFd dupEventFd(dup(eventFd.get()));
    ASSERT_TRUE(dupEventFd.isValid());

    std::array<epoll_event, 1> events;
    for (int i = 0; i < kTestRuns; ++i) {
        dupEventFd.signal();
        EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 1);
        EXPECT_EQ(epoll_wait(epollFd.get(), events.data(), events.size(), 0), 0);
    }
}

TEST_F(BufferHubEventFdTest, EventFd_testClear) {
    BufferHubEventFd eventFd;
    ASSERT_TRUE(eventFd.isValid());