It can be now used in other tests.
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
-SUBDIRS = . tests
+SUBDIRS = . testutils tests
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
AM_CPPFLAGS += $(BOOST_INCLUDES)
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
#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 {
///
/// 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.
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_);
// the socket is connected.
TEST_F(UnixDomainSocketTest, getNative) {
// Start the server.
- bindServerSocket();
+ test_socket_.bindServerSocket();
// Setup client side.
UnixDomainSocket socket(io_service_);
--- /dev/null
+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
--- /dev/null
+// 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
--- /dev/null
+// 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