From: Marcin Siodelski Date: Sun, 1 Nov 2015 03:29:36 +0000 (+0900) Subject: [4106] Added unit test for the DHCP4o6 IPC. X-Git-Tag: trac4296_base~3^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ef97b3354ad60bac2fcbaebec0d135e06f52cce;p=thirdparty%2Fkea.git [4106] Added unit test for the DHCP4o6 IPC. --- diff --git a/src/lib/dhcpsrv/dhcp4o6_ipc.cc b/src/lib/dhcpsrv/dhcp4o6_ipc.cc index 19ac9c5e79..c2d83959be 100644 --- a/src/lib/dhcpsrv/dhcp4o6_ipc.cc +++ b/src/lib/dhcpsrv/dhcp4o6_ipc.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -140,6 +141,7 @@ Pkt6Ptr Dhcp4o6IpcBase::receive() { // Get interface name and remote address pkt->unpack(); + OptionVendorPtr vendor = boost::dynamic_pointer_cast(pkt->getOption(D6O_VENDOR_OPTS)); if (!vendor || vendor->getVendorId() != ENTERPRISE_ID_ISC) { @@ -154,19 +156,15 @@ Pkt6Ptr Dhcp4o6IpcBase::receive() { if (!iface) { return (Pkt6Ptr()); } - Option6AddrLstPtr srcs = - boost::dynamic_pointer_cast(vendor->getOption(ISC_V6_4O6_SRC_ADDRESS)); + OptionCustomPtr srcs = + boost::dynamic_pointer_cast(vendor->getOption(ISC_V6_4O6_SRC_ADDRESS)); if (!srcs) { return (Pkt6Ptr()); } - Option6AddrLst::AddressContainer addrs = srcs->getAddresses(); - if (addrs.size() != 1) { - return (Pkt6Ptr()); - } // Update the packet and return it static_cast(pkt->delOption(D6O_VENDOR_OPTS)); - pkt->setRemoteAddr(addrs[0]); + pkt->setRemoteAddr(srcs->readAddress()); pkt->setIface(iface->getName()); pkt->setIndex(iface->getIndex()); return (pkt); diff --git a/src/lib/dhcpsrv/tests/Makefile.am b/src/lib/dhcpsrv/tests/Makefile.am index 2c295e5091..7957e1009c 100644 --- a/src/lib/dhcpsrv/tests/Makefile.am +++ b/src/lib/dhcpsrv/tests/Makefile.am @@ -82,6 +82,7 @@ libdhcpsrv_unittests_SOURCES += d2_udp_unittest.cc libdhcpsrv_unittests_SOURCES += daemon_unittest.cc libdhcpsrv_unittests_SOURCES += database_connection_unittest.cc libdhcpsrv_unittests_SOURCES += dbaccess_parser_unittest.cc +libdhcpsrv_unittests_SOURCES += dhcp4o6_ipc_unittest.cc libdhcpsrv_unittests_SOURCES += expiration_config_parser_unittest.cc libdhcpsrv_unittests_SOURCES += host_mgr_unittest.cc libdhcpsrv_unittests_SOURCES += host_unittest.cc diff --git a/src/lib/dhcpsrv/tests/dhcp4o6_ipc_unittest.cc b/src/lib/dhcpsrv/tests/dhcp4o6_ipc_unittest.cc new file mode 100644 index 0000000000..a179806a69 --- /dev/null +++ b/src/lib/dhcpsrv/tests/dhcp4o6_ipc_unittest.cc @@ -0,0 +1,102 @@ +// Copyright (C) 2014, 2015 Internet Systems Consortium, Inc. ("ISC") +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include +#include +#include +#include +#include +#include +#include + +using namespace isc::dhcp; +using namespace isc::dhcp::test; + +namespace { + +const uint16_t TEST_PORT = 12345; + +class TestIpc : public Dhcp4o6IpcBase { +public: + + TestIpc(const uint16_t port, const int side); + + virtual void open(); + + Pkt6Ptr getPktReceived() const { + return (pkt_received_); + } + +private: + + void receiveHandler(); + + uint16_t port_; + int side_; + Pkt6Ptr pkt_received_; + +}; + +TestIpc::TestIpc(const uint16_t port, const int side) + : port_(port), side_(side), pkt_received_() { +} + +void +TestIpc::open() { + socket_fd_ = Dhcp4o6IpcBase::open(port_, side_); + if (socket_fd_ >= 0) { + IfaceMgr::instance().addExternalSocket(socket_fd_, + boost::bind(&TestIpc::receiveHandler, this)); + } +} + +void +TestIpc::receiveHandler() { + pkt_received_ = receive(); +} + +class Dhcp4o6IpcBaseTest : public ::testing::Test { +public: + + Dhcp4o6IpcBaseTest(); + +private: + + IfaceMgrTestConfig iface_mgr_test_config_; + +}; + +Dhcp4o6IpcBaseTest::Dhcp4o6IpcBaseTest() + : iface_mgr_test_config_(true) { +} + +TEST_F(Dhcp4o6IpcBaseTest, basic) { + TestIpc ipc4(TEST_PORT, 4); + TestIpc ipc6(TEST_PORT, 6); + + ASSERT_NO_THROW(ipc4.open()); + ASSERT_NO_THROW(ipc6.open()); + + Pkt6Ptr pkt(new Pkt6(DHCPV6_DHCPV4_QUERY, 1234)); + pkt->setIface("eth0"); + + ASSERT_NO_THROW(ipc6.send(pkt)); + + ASSERT_NO_THROW(IfaceMgr::instance().receive6(1, 0)); + + Pkt6Ptr pkt_received = ipc4.getPktReceived(); + ASSERT_TRUE(pkt_received); +} + +} // end of anonymous namespace