Browse Source

[5078] Moved test unix socket to a library.

It can be now used in other tests.
Marcin Siodelski 8 years ago
parent
commit
3e3e6f1c23

+ 1 - 0
configure.ac

@@ -1722,6 +1722,7 @@ AC_CONFIG_FILES([Makefile
                  src/lib/asiodns/Makefile
                  src/lib/asiodns/tests/Makefile
                  src/lib/asiolink/Makefile
+                 src/lib/asiolink/testutils/Makefile
                  src/lib/asiolink/tests/Makefile
                  src/lib/cc/Makefile
                  src/lib/cc/tests/Makefile

+ 1 - 1
src/lib/asiolink/Makefile.am

@@ -1,4 +1,4 @@
-SUBDIRS = . tests
+SUBDIRS = . testutils tests
 
 AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
 AM_CPPFLAGS += $(BOOST_INCLUDES)

+ 2 - 1
src/lib/asiolink/tests/Makefile.am

@@ -33,7 +33,8 @@ run_unittests_SOURCES += unix_domain_socket_unittest.cc
 
 run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
 
-run_unittests_LDADD = $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
+run_unittests_LDADD  = $(top_builddir)/src/lib/asiolink/testutils/libasiolinktest.la
+run_unittests_LDADD += $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
 run_unittests_LDADD += $(top_builddir)/src/lib/log/libkea-log.la
 run_unittests_LDADD += $(top_builddir)/src/lib/util/threads/libkea-threads.la
 run_unittests_LDADD += $(top_builddir)/src/lib/util/unittests/libutil_unittests.la

+ 7 - 70
src/lib/asiolink/tests/unix_domain_socket_unittest.cc

@@ -6,18 +6,15 @@
 
 #include <config.h>
 #include <asiolink/asio_wrapper.h>
-#include <asiolink/interval_timer.h>
 #include <asiolink/io_service.h>
 #include <asiolink/unix_domain_socket.h>
-#include <boost/bind.hpp>
+#include <asiolink/testutils/test_server_unix_socket.h>
 #include <gtest/gtest.h>
 #include <array>
 #include <cstdio>
 #include <sstream>
 #include <string>
 
-using namespace boost::asio;
-using namespace boost::asio::local;
 using namespace isc::asiolink;
 
 namespace  {
@@ -36,13 +33,9 @@ public:
     ///
     /// Removes unix socket descriptor before the test.
     UnixDomainSocketTest() : io_service_(),
-                             server_endpoint_(unixSocketFilePath()),
-                             server_acceptor_(io_service_.get_io_service()),
-                             server_socket_(io_service_.get_io_service()),
-                             test_timer_(io_service_) {
+                             test_socket_(io_service_, unixSocketFilePath(),
+                                          TEST_TIMEOUT) {
         removeUnixSocketFile();
-        test_timer_.setup(boost::bind(&UnixDomainSocketTest::timeoutHandler, this),
-                                      TEST_TIMEOUT, IntervalTimer::ONE_SHOT);
     }
 
     /// @brief Destructor.
@@ -64,74 +57,18 @@ public:
         static_cast<void>(remove(unixSocketFilePath().c_str()));
     }
 
-    /// @brief Creates and binds server socket.
-    void bindServerSocket() {
-        server_acceptor_.open();
-        server_acceptor_.bind(server_endpoint_);
-        server_acceptor_.listen();
-        server_acceptor_.async_accept(server_socket_,
-                                      boost::bind(&UnixDomainSocketTest::
-                                                  acceptHandler, this, _1));
-    }
-
-    /// @brief Server acceptor handler.
-    ///
-    /// @param ec Error code.
-    void acceptHandler(const boost::system::error_code& ec) {
-        if (ec) {
-            ADD_FAILURE() << ec.message();
-        }
-        server_socket_.async_read_some(boost::asio::buffer(&raw_buf_[0],
-                                                           raw_buf_.size()),
-                                       boost::bind(&UnixDomainSocketTest::
-                                                   readHandler, this, _1, _2));
-    }
-
-    /// @brief Server read handler.
-    ///
-    /// @param ec Error code.
-    /// @param bytes_transferred Number of bytes read.
-    void readHandler(const boost::system::error_code& ec,
-                     size_t bytes_transferred) {
-        std::string received(&raw_buf_[0], bytes_transferred);
-        std::string response("received " + received);
-        boost::asio::write(server_socket_, boost::asio::buffer(response.c_str(),
-                                                               response.size()));
-        io_service_.stop();
-    }
-
-    /// @brief Callback function invoke upon test timeout.
-    ///
-    /// It stops the IO service and reports test timeout.
-    void timeoutHandler() {
-        ADD_FAILURE() << "Timeout occurred while running the test!";
-        io_service_.stop();
-    }
-
     /// @brief IO service used by the tests.
     IOService io_service_;
 
-    /// @brief Server endpoint.
-    local::stream_protocol::endpoint server_endpoint_;
-
-    /// @brief Server acceptor.
-    local::stream_protocol::acceptor server_acceptor_;
-
-    /// @brief Server side unix domain socket.
-    stream_protocol::socket server_socket_;
-
-    /// @brief Receive buffer.
-    std::array<char, 1024> raw_buf_;
-
-    /// @brief Asynchronous timer service to detect timeouts.
-    IntervalTimer test_timer_;
+    /// @brief Server side unix socket used in these tests.
+    test::TestServerUnixSocket test_socket_;
 };
 
 // This test verifies that the client can send data over the unix
 // domain socket and receive a response.
 TEST_F(UnixDomainSocketTest, sendReceive) {
     // Start the server.
-    bindServerSocket();
+    test_socket_.bindServerSocket();
 
     // Setup client side.
     UnixDomainSocket socket(io_service_);
@@ -176,7 +113,7 @@ TEST_F(UnixDomainSocketTest, clientErrors) {
 // the socket is connected.
 TEST_F(UnixDomainSocketTest, getNative) {
     // Start the server.
-    bindServerSocket();
+    test_socket_.bindServerSocket();
 
     // Setup client side.
     UnixDomainSocket socket(io_service_);

+ 24 - 0
src/lib/asiolink/testutils/Makefile.am

@@ -0,0 +1,24 @@
+SUBDIRS = .
+
+AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
+AM_CPPFLAGS += $(BOOST_INCLUDES)
+
+AM_CXXFLAGS = $(KEA_CXXFLAGS)
+
+CLEANFILES = *.gcno *.gcda
+
+if HAVE_GTEST
+
+noinst_LTLIBRARIES = libasiolinktest.la
+
+libasiolinktest_la_SOURCES  = test_server_unix_socket.cc test_server_unix_socket.h
+
+libasiolinktest_la_CXXFLAGS = $(AM_CXXFLAGS)
+libasiolinktest_la_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
+libasiolinktest_la_LDFLAGS  = $(AM_LDFLAGS)
+
+libasiolinktest_la_LIBADD  = $(top_builddir)/src/lib/asiolink/libkea-asiolink.la
+libasiolinktest_la_LIBADD += $(top_builddir)/src/lib/exceptions/libkea-exceptions.la
+libasiolinktest_la_LIBADD += $(BOOST_LIBS)
+
+endif

+ 65 - 0
src/lib/asiolink/testutils/test_server_unix_socket.cc

@@ -0,0 +1,65 @@
+// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <asiolink/asio_wrapper.h>
+#include <asiolink/testutils/test_server_unix_socket.h>
+
+namespace isc {
+namespace asiolink {
+namespace test {
+
+TestServerUnixSocket::TestServerUnixSocket(IOService& io_service,
+                                           const std::string& socket_file_path,
+                                           const long test_timeout)
+    : io_service_(io_service),
+      server_endpoint_(socket_file_path),
+      server_acceptor_(io_service_.get_io_service()),
+      server_socket_(io_service_.get_io_service()),
+      test_timer_(io_service_) {
+    test_timer_.setup(boost::bind(&TestServerUnixSocket::timeoutHandler, this),
+                      test_timeout, IntervalTimer::ONE_SHOT);
+}
+
+void
+TestServerUnixSocket::bindServerSocket() {
+    server_acceptor_.open();
+    server_acceptor_.bind(server_endpoint_);
+    server_acceptor_.listen();
+    server_acceptor_.async_accept(server_socket_,
+                                  boost::bind(&TestServerUnixSocket::
+                                              acceptHandler, this, _1));
+}
+
+void
+TestServerUnixSocket::acceptHandler(const boost::system::error_code& ec) {
+    if (ec) {
+        ADD_FAILURE() << ec.message();
+    }
+    server_socket_.async_read_some(boost::asio::buffer(&raw_buf_[0],
+                                                       raw_buf_.size()),
+                                   boost::bind(&TestServerUnixSocket::
+                                               readHandler, this, _1, _2));
+}
+
+void
+TestServerUnixSocket::readHandler(const boost::system::error_code& ec,
+                                  size_t bytes_transferred) {
+    std::string received(&raw_buf_[0], bytes_transferred);
+    std::string response("received " + received);
+    boost::asio::write(server_socket_, boost::asio::buffer(response.c_str(),
+                                                           response.size()));
+    io_service_.stop();
+}
+
+void
+TestServerUnixSocket::timeoutHandler() {
+    ADD_FAILURE() << "Timeout occurred while running the test!";
+    io_service_.stop();
+}
+
+} // end of namespace isc::asiolink::test
+} // end of namespace isc::asiolink
+} // end of namespace isc

+ 80 - 0
src/lib/asiolink/testutils/test_server_unix_socket.h

@@ -0,0 +1,80 @@
+// Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef TEST_SERVER_UNIX_SOCKET_H
+#define TEST_SERVER_UNIX_SOCKET_H
+
+#include <config.h>
+#include <asiolink/interval_timer.h>
+#include <asiolink/io_service.h>
+#include <boost/bind.hpp>
+#include <gtest/gtest.h>
+#include <array>
+#include <string>
+
+namespace isc {
+namespace asiolink {
+namespace test {
+
+/// @brief Provides unix domain socket functionality for unit tests.
+class TestServerUnixSocket {
+public: 
+
+    /// @brief Constructor.
+    ///
+    /// @param io_service IO service.
+    /// @param socket_file_path Socket file path.
+    /// @param test_timeout Test timeout in milliseconds.
+    TestServerUnixSocket(IOService& io_service,
+                         const std::string& socket_file_path,
+                         const long test_timeout);
+
+    /// @brief Creates and binds server socket.
+    void bindServerSocket();
+
+    /// @brief Server acceptor handler.
+    ///
+    /// @param ec Error code.
+    void acceptHandler(const boost::system::error_code& ec);
+
+    /// @brief Server read handler.
+    ///
+    /// @param ec Error code.
+    /// @param bytes_transferred Number of bytes read.
+    void readHandler(const boost::system::error_code& ec,
+                     size_t bytes_transferred);
+
+    /// @brief Callback function invoke upon test timeout.
+    ///
+    /// It stops the IO service and reports test timeout.
+    void timeoutHandler();
+
+private:
+
+    /// @brief IO service used by the tests.
+    IOService& io_service_;
+
+    /// @brief Server endpoint.
+    boost::asio::local::stream_protocol::endpoint server_endpoint_;
+
+    /// @brief Server acceptor.
+    boost::asio::local::stream_protocol::acceptor server_acceptor_;
+
+    /// @brief Server side unix domain socket.
+    boost::asio::local::stream_protocol::socket server_socket_;
+
+    /// @brief Receive buffer.
+    std::array<char, 1024> raw_buf_;
+
+    /// @brief Asynchronous timer service to detect timeouts.
+    IntervalTimer test_timer_;
+};
+
+} // end of namespace isc::asiolink::test
+} // end of namespace isc::asiolink
+} // end of namespace isc
+
+#endif // TEST_SERVER_UNIX_SOCKET_H