From 3e3e6f1c231fe367808c9a9bea4b41d8cd078b36 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Fri, 10 Mar 2017 16:24:12 +0100 Subject: [PATCH] [5078] Moved test unix socket to a library. It can be now used in other tests. --- configure.ac | 1 + src/lib/asiolink/Makefile.am | 2 +- src/lib/asiolink/tests/Makefile.am | 3 +- .../tests/unix_domain_socket_unittest.cc | 77 ++---------------- src/lib/asiolink/testutils/Makefile.am | 24 ++++++ .../testutils/test_server_unix_socket.cc | 65 +++++++++++++++ .../testutils/test_server_unix_socket.h | 80 +++++++++++++++++++ 7 files changed, 180 insertions(+), 72 deletions(-) create mode 100644 src/lib/asiolink/testutils/Makefile.am create mode 100644 src/lib/asiolink/testutils/test_server_unix_socket.cc create mode 100644 src/lib/asiolink/testutils/test_server_unix_socket.h diff --git a/configure.ac b/configure.ac index dae10aa6a4..e072ea5cac 100644 --- a/configure.ac +++ b/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 diff --git a/src/lib/asiolink/Makefile.am b/src/lib/asiolink/Makefile.am index edba478ed7..76e2262cc4 100644 --- a/src/lib/asiolink/Makefile.am +++ b/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) diff --git a/src/lib/asiolink/tests/Makefile.am b/src/lib/asiolink/tests/Makefile.am index 0b1611bc9a..4d6ce6b4e5 100644 --- a/src/lib/asiolink/tests/Makefile.am +++ b/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 diff --git a/src/lib/asiolink/tests/unix_domain_socket_unittest.cc b/src/lib/asiolink/tests/unix_domain_socket_unittest.cc index 4e125dfb73..2c7c57fc11 100644 --- a/src/lib/asiolink/tests/unix_domain_socket_unittest.cc +++ b/src/lib/asiolink/tests/unix_domain_socket_unittest.cc @@ -6,18 +6,15 @@ #include #include -#include #include #include -#include +#include #include #include #include #include #include -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(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 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_); diff --git a/src/lib/asiolink/testutils/Makefile.am b/src/lib/asiolink/testutils/Makefile.am new file mode 100644 index 0000000000..ec4d1815b8 --- /dev/null +++ b/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 diff --git a/src/lib/asiolink/testutils/test_server_unix_socket.cc b/src/lib/asiolink/testutils/test_server_unix_socket.cc new file mode 100644 index 0000000000..c4184df890 --- /dev/null +++ b/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 +#include + +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 diff --git a/src/lib/asiolink/testutils/test_server_unix_socket.h b/src/lib/asiolink/testutils/test_server_unix_socket.h new file mode 100644 index 0000000000..d659d191a0 --- /dev/null +++ b/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 +#include +#include +#include +#include +#include +#include + +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 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 -- 2.47.3