From 350ce06f549d0ab483f6b492a5b37c2c380890ad Mon Sep 17 00:00:00 2001 From: Razvan Becheriu Date: Sat, 1 Nov 2025 22:57:58 +0200 Subject: [PATCH] [#4141] addressed review comments --- .../util/tests/fd_event_handler_unittests.h | 133 +++++++++++++++++- 1 file changed, 131 insertions(+), 2 deletions(-) diff --git a/src/lib/util/tests/fd_event_handler_unittests.h b/src/lib/util/tests/fd_event_handler_unittests.h index 04e2ad8854..3084ebc6f5 100644 --- a/src/lib/util/tests/fd_event_handler_unittests.h +++ b/src/lib/util/tests/fd_event_handler_unittests.h @@ -14,7 +14,9 @@ #include +#include #include +#include using namespace isc; using namespace isc::util; @@ -55,8 +57,8 @@ TEST_F(FDEventHandlerTest, events) { EXPECT_THROW(handler_->add(-1), BadValue); - handler_->add(pipefd[0], true, false); - handler_->add(pipefd[1], false, true); + EXPECT_NO_THROW(handler_->add(pipefd[0], true, false)); + EXPECT_NO_THROW(handler_->add(pipefd[1], false, true)); EXPECT_FALSE(handler_->readReady(pipefd[0])); EXPECT_FALSE(handler_->writeReady(pipefd[0])); @@ -139,4 +141,131 @@ TEST_F(FDEventHandlerTest, events) { sigaction(SIGINT, &original, NULL); } +TEST_F(FDEventHandlerTest, badFD) { + int fd = open("/dev/zero", O_RDONLY, 0); + + ASSERT_GE(fd, 0); + + EXPECT_NO_THROW(handler_->add(fd)); + + EXPECT_EQ(1, handler_->waitEvent(0, 1000)); + + EXPECT_TRUE(handler_->readReady(fd)); + + close(fd); + + int len = 0; + int result = ioctl(fd, FIONREAD, &len); + + EXPECT_EQ(-1, result); + + EXPECT_EQ(0, len); + + EXPECT_EQ(EBADF, errno); + + errno = 0; + + EXPECT_EQ(-1, handler_->waitEvent(0, 1000)); + + EXPECT_EQ(EBADF, errno); + + EXPECT_TRUE(handler_->readReady(fd)); + + EXPECT_NO_THROW(handler_->clear()); + errno = 0; + + { + EXPECT_NO_THROW(handler_->add(pipefd[0], true, false)); + + std::thread tr([this]() { + usleep(500); + close(pipefd[1]); + }); + + EXPECT_EQ(1, handler_->waitEvent(1, 0)); + + EXPECT_EQ(0, errno); + + EXPECT_TRUE(handler_->readReady(pipefd[0])); + EXPECT_FALSE(handler_->writeReady(pipefd[0])); + + tr.join(); + + close(pipefd[0]); + pipe(pipefd); + } + + EXPECT_NO_THROW(handler_->clear()); + errno = 0; + + { + EXPECT_NO_THROW(handler_->add(pipefd[0], true, false)); + + std::thread tr([this]() { + usleep(500); + close(pipefd[0]); + }); + + EXPECT_EQ(1, handler_->waitEvent(1, 0)); + + EXPECT_EQ(0, errno); + + EXPECT_TRUE(handler_->readReady(pipefd[0])); + EXPECT_FALSE(handler_->writeReady(pipefd[0])); + + tr.join(); + + close(pipefd[1]); + pipe(pipefd); + } + + EXPECT_NO_THROW(handler_->clear()); + errno = 0; + + { + EXPECT_NO_THROW(handler_->add(pipefd[1], true, false)); + + std::thread tr([this]() { + usleep(500); + close(pipefd[1]); + }); + + EXPECT_EQ(1, handler_->waitEvent(1, 0)); + + EXPECT_EQ(0, errno); + + EXPECT_TRUE(handler_->readReady(pipefd[1])); + EXPECT_FALSE(handler_->writeReady(pipefd[1])); + + tr.join(); + + close(pipefd[0]); + pipe(pipefd); + } + + EXPECT_NO_THROW(handler_->clear()); + errno = 0; + + { + EXPECT_NO_THROW(handler_->add(pipefd[1], true, false)); + + std::thread tr([this]() { + usleep(500); + close(pipefd[0]); + }); + + EXPECT_EQ(1, handler_->waitEvent(1, 0)); + + EXPECT_EQ(0, errno); + + EXPECT_TRUE(handler_->readReady(pipefd[1])); + EXPECT_FALSE(handler_->writeReady(pipefd[1])); + + tr.join(); + + close(pipefd[1]); + pipe(pipefd); + } +} + } // end of anonymous namespace -- 2.47.3