Commit c2e9d347 authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[2320] Missing unittests for hwaddr implemented.

parent 90f997d7
......@@ -188,9 +188,7 @@ void Dhcpv4Srv::copyDefaultFields(const Pkt4Ptr& question, Pkt4Ptr& answer) {
answer->setHops(question->getHops());
// copy MAC address
vector<uint8_t> 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());
......
......@@ -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) {
......
......@@ -274,6 +274,13 @@ public:
void setHWAddr(uint8_t hType, uint8_t hlen,
const std::vector<uint8_t>& 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
......
// 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 <config.h>
#include <asiolink/io_address.h>
#include <dhcp/hwaddr.h>
#include <dhcp/dhcp4.h>
#include <exceptions/exceptions.h>
#include <boost/scoped_ptr.hpp>
#include <gtest/gtest.h>
#include <iostream>
#include <sstream>
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<uint8_t> data2(data1, data1 + sizeof(data1));
scoped_ptr<HWAddr> hwaddr1(new HWAddr(data1, sizeof(data1), htype));
scoped_ptr<HWAddr> hwaddr2(new HWAddr(data2, htype));
scoped_ptr<HWAddr> 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<HWAddr> hw1(new HWAddr(data1, sizeof(data1), htype1));
scoped_ptr<HWAddr> hw2(new HWAddr(data2, sizeof(data2), htype1));
scoped_ptr<HWAddr> hw3(new HWAddr(data3, sizeof(data3), htype1));
scoped_ptr<HWAddr> hw4(new HWAddr(data4, sizeof(data4), htype1));
// MAC address the same as data1 and data4, but different hardware type
scoped_ptr<HWAddr> 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
......@@ -643,6 +643,23 @@ TEST(Pkt4Test, Timestamp) {
EXPECT_TRUE(ts_period.length().total_microseconds() >= 0);
}
TEST(Pkt4Test, hwaddr) {
scoped_ptr<Pkt4> 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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment