]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3744] test blocking write socket
authorRazvan Becheriu <razvan@isc.org>
Thu, 6 Feb 2025 20:24:53 +0000 (22:24 +0200)
committerRazvan Becheriu <razvan@isc.org>
Thu, 6 Feb 2025 21:35:06 +0000 (23:35 +0200)
src/lib/log/tests/Makefile.am
src/lib/testutils/unix_control_client.cc
src/lib/testutils/unix_control_client.h
src/lib/util/state_model.cc

index 3abb45725afe49c153b1f40a25ea6f1034c70dcb..1d1bc8f3624714fc94c4b99fd0d6d563c7efb37e 100644 (file)
@@ -2,7 +2,7 @@ SUBDIRS = .
 
 # Define the flags used in each set of tests.
 AM_CPPFLAGS  = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
-AM_CPPFLAGS += -DTEMP_DIR=\"${build_dir}\"
+AM_CPPFLAGS += -DTEMP_DIR=\"$(top_builddir)\"
 AM_CPPFLAGS += $(BOOST_INCLUDES) $(GTEST_INCLUDES) $(LOG4CPLUS_INCLUDES)
 
 AM_CXXFLAGS = $(KEA_CXXFLAGS)
index 65cca400084960d1b685eebf3fa2d10d4f8d0d37..918bd42814eeb821442bf6076023312011541dc3 100644 (file)
@@ -77,6 +77,18 @@ bool UnixControlClient::sendCommand(const std::string& command) {
         ADD_FAILURE() << "send command with closed socket";
         return (false);
     }
+    switch (selectCheck(3, false, true)) {
+    case -1: {
+        const char* errmsg = strerror(errno);
+        ADD_FAILURE() << "sendCommand - select failed: " << errmsg;
+        return (false);
+    }
+    case 0:
+        return (false);
+
+    default:
+        break;
+    }
     // Send command
     int bytes_sent = send(socket_fd_, command.c_str(), command.length(), 0);
     if (bytes_sent < command.length()) {
@@ -95,7 +107,7 @@ bool UnixControlClient::getResponse(std::string& response,
     // Receive response
     char buf[65536];
     memset(buf, 0, sizeof(buf));
-    switch (selectCheck(timeout_sec)) {
+    switch (selectCheck(timeout_sec, true, false)) {
     case -1: {
         const char* errmsg = strerror(errno);
         ADD_FAILURE() << "getResponse - select failed: " << errmsg;
@@ -121,7 +133,9 @@ bool UnixControlClient::getResponse(std::string& response,
     return (true);
 }
 
-int UnixControlClient::selectCheck(const unsigned int timeout_sec) {
+int UnixControlClient::selectCheck(const unsigned int timeout_sec,
+                                   bool read_check,
+                                   bool write_check) {
     if (socket_fd_ < 0) {
         ADD_FAILURE() << "select check with closed socket";
         return -1;
@@ -135,15 +149,33 @@ int UnixControlClient::selectCheck(const unsigned int timeout_sec) {
     fd_set read_fds;
     FD_ZERO(&read_fds);
 
-    // Add this socket to listening set
-    FD_SET(socket_fd_, &read_fds);
+    fd_set write_fds;
+    FD_ZERO(&write_fds);
+
     maxfd = socket_fd_;
 
+    // Add this socket to read set
+    FD_SET(socket_fd_, &read_fds);
+
+    // Add this socket to write set
+    FD_SET(socket_fd_, &write_fds);
+
     struct timeval select_timeout;
     select_timeout.tv_sec = static_cast<time_t>(timeout_sec);
     select_timeout.tv_usec = 0;
 
-    return (select(maxfd + 1, &read_fds, NULL, NULL, &select_timeout));
+    fd_set* read_p = 0;
+    fd_set* write_p = 0;
+
+    if (read_check) {
+        read_p = &read_fds;
+    }
+
+    if (write_check) {
+        write_p = &write_fds;
+    }
+
+    return (select(maxfd + 1, read_p, write_p, NULL, &select_timeout));
 }
 
 }
index 2c7e665e3bcfc52e1ab9ed26fbe4d620272c67f2..1faaff4c48638ee6a0c4db7c5b2f0fb3297cece3 100644 (file)
@@ -52,8 +52,10 @@ public:
     /// @brief Uses select to poll the Control Channel for data waiting
     ///
     /// @param timeout_sec Select timeout in seconds
+    /// @param read_check flag to check socket for read ready state
+    /// @param write_check flag to check socket for write ready state
     /// @return -1 on error, 0 if no data is available,  1 if data is ready
-    int selectCheck(const unsigned int timeout_sec);
+    int selectCheck(const unsigned int timeout_sec, bool read_check, bool write_check);
 
     /// @brief Retains the fd of the open socket
     int socket_fd_;
index 6c9a13d8a24801e2e1b679afecf1c6912e673907..fecfc6e208c7f2e592579d205371ada469f0b1e8 100644 (file)
@@ -93,7 +93,7 @@ StateModel::StateModel() : events_(), states_(), dictionaries_initted_(false),
                            paused_(false), mutex_(new std::mutex) {
 }
 
-StateModel::~StateModel(){
+StateModel::~StateModel() {
 }
 
 void