From: Tomek Mrugalski Date: Thu, 27 Dec 2012 18:45:00 +0000 (+0100) Subject: [2320] Missing unittests for hwaddr implemented. X-Git-Tag: bind10-1.0.0-rc-release~95^2~16^2~2^2~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c2e9d347dcd2fdb0f9092dc4b04579d1c412de46;p=thirdparty%2Fkea.git [2320] Missing unittests for hwaddr implemented. --- diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 59edc01fe1..08781c96ec 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -188,9 +188,7 @@ void Dhcpv4Srv::copyDefaultFields(const Pkt4Ptr& question, Pkt4Ptr& answer) { answer->setHops(question->getHops()); // copy MAC address - vector mac(question->getChaddr(), - question->getChaddr() + Pkt4::MAX_CHADDR_LEN); - answer->setHWAddr(question->getHtype(), question->getHlen(), mac); + answer->setHWAddr(question->getHWAddr()); // relay address answer->setGiaddr(question->getGiaddr()); diff --git a/src/lib/dhcp/pkt4.cc b/src/lib/dhcp/pkt4.cc index da0110fbbc..9710fe5b63 100644 --- a/src/lib/dhcp/pkt4.cc +++ b/src/lib/dhcp/pkt4.cc @@ -268,6 +268,14 @@ Pkt4::setHWAddr(uint8_t hType, uint8_t hlen, hwaddr_ = HWAddrPtr(new HWAddr(mac_addr, hType)); } +void +Pkt4::setHWAddr(const HWAddrPtr& addr) { + if (!addr) { + isc_throw(BadValue, "Setting hw address to NULL is forbidden"); + } + hwaddr_ = addr; +} + void Pkt4::setSname(const uint8_t* sname, size_t snameLen /*= MAX_SNAME_LEN*/) { if (snameLen > MAX_SNAME_LEN) { diff --git a/src/lib/dhcp/pkt4.h b/src/lib/dhcp/pkt4.h index 5dab1eba5d..7d7c97ecc2 100644 --- a/src/lib/dhcp/pkt4.h +++ b/src/lib/dhcp/pkt4.h @@ -274,6 +274,13 @@ public: void setHWAddr(uint8_t hType, uint8_t hlen, const std::vector& mac_addr); + /// @brief Sets hardware address + /// + /// Sets hardware address, based on existing HWAddr structure + /// @param addr already filled in HWAddr structure + /// @throw BadValue if addr is null + void setHWAddr(const HWAddrPtr& addr); + /// Returns htype field /// /// @return hardware type diff --git a/src/lib/dhcp/tests/hwaddr_unittest.cc b/src/lib/dhcp/tests/hwaddr_unittest.cc new file mode 100644 index 0000000000..8a97da12a7 --- /dev/null +++ b/src/lib/dhcp/tests/hwaddr_unittest.cc @@ -0,0 +1,93 @@ +// Copyright (C) 2012 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 + +#include +#include + +using namespace std; +using namespace isc; +using namespace isc::dhcp; +using namespace isc::asiolink; + +using boost::scoped_ptr; + +namespace { + +// This test verifies if the constructors are working as expected +// and process passed parameters. +TEST(HWAddrTest, constructor) { + + const uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6}; + const uint8_t htype = HTYPE_ETHER; + + vector data2(data1, data1 + sizeof(data1)); + + scoped_ptr hwaddr1(new HWAddr(data1, sizeof(data1), htype)); + scoped_ptr hwaddr2(new HWAddr(data2, htype)); + scoped_ptr hwaddr3(new HWAddr()); + + EXPECT_TRUE(data2 == hwaddr1->hwaddr_); + EXPECT_EQ(htype, hwaddr1->htype_); + + EXPECT_TRUE(data2 == hwaddr2->hwaddr_); + EXPECT_EQ(htype, hwaddr2->htype_); + + EXPECT_EQ(0, hwaddr3->hwaddr_.size()); + EXPECT_EQ(htype, hwaddr3->htype_); +} + +// This test checks if the comparison operators are sane. +TEST(HWAddrTest, operators) { + uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6}; + uint8_t data2[] = {0, 1, 2, 3, 4}; + uint8_t data3[] = {0, 1, 2, 3, 4, 5, 7}; // last digit different + uint8_t data4[] = {0, 1, 2, 3, 4, 5, 6}; // the same as 1 + + uint8_t htype1 = HTYPE_ETHER; + uint8_t htype2 = HTYPE_FDDI; + + scoped_ptr hw1(new HWAddr(data1, sizeof(data1), htype1)); + scoped_ptr hw2(new HWAddr(data2, sizeof(data2), htype1)); + scoped_ptr hw3(new HWAddr(data3, sizeof(data3), htype1)); + scoped_ptr hw4(new HWAddr(data4, sizeof(data4), htype1)); + + // MAC address the same as data1 and data4, but different hardware type + scoped_ptr hw5(new HWAddr(data4, sizeof(data4), htype2)); + + EXPECT_TRUE(*hw1 == *hw4); + EXPECT_FALSE(*hw1 == *hw2); + EXPECT_FALSE(*hw1 == *hw3); + + EXPECT_FALSE(*hw1 != *hw4); + EXPECT_TRUE(*hw1 != *hw2); + EXPECT_TRUE(*hw1 != *hw3); + + EXPECT_FALSE(*hw1 == *hw5); + EXPECT_FALSE(*hw4 == *hw5); + + EXPECT_TRUE(*hw1 != *hw5); + EXPECT_TRUE(*hw4 != *hw5); +} + +} // end of anonymous namespace diff --git a/src/lib/dhcp/tests/pkt4_unittest.cc b/src/lib/dhcp/tests/pkt4_unittest.cc index 3a88408eab..3fb277c81c 100644 --- a/src/lib/dhcp/tests/pkt4_unittest.cc +++ b/src/lib/dhcp/tests/pkt4_unittest.cc @@ -643,6 +643,23 @@ TEST(Pkt4Test, Timestamp) { EXPECT_TRUE(ts_period.length().total_microseconds() >= 0); } +TEST(Pkt4Test, hwaddr) { + scoped_ptr pkt(new Pkt4(DHCPOFFER, 1234)); + const uint8_t hw[] = { 2, 4, 6, 8, 10, 12 }; // MAC + const uint8_t hw_type = 123; // hardware type + + HWAddrPtr hwaddr(new HWAddr(hw, sizeof(hw), hw_type)); + + // setting NULL hardware address is not allowed + EXPECT_THROW(pkt->setHWAddr(HWAddrPtr()), BadValue); + + pkt->setHWAddr(hwaddr); + EXPECT_EQ(hw_type, pkt->getHtype()); + + EXPECT_EQ(sizeof(hw), pkt->getHlen()); + + EXPECT_TRUE(hwaddr == pkt->getHWAddr()); +} } // end of anonymous namespace