// Copyright (C) 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 #include using namespace isc::dhcp; namespace { class Pkt4o6Test : public ::testing::Test { protected: Pkt4o6Test() : data6_(6, 0), pkt6_(new Pkt6(&data6_[0], data6_.size())), pkt4_(new Pkt4(DHCPDISCOVER, 0x12345678)) { pkt4_->pack(); const uint8_t* cp = static_cast( pkt4_->getBuffer().getData()); buffer4_.assign(cp, cp + pkt4_->getBuffer().getLength()); } protected: const std::vector data6_; // commonly used test data Pkt6Ptr pkt6_; Pkt4Ptr pkt4_; OptionBuffer buffer4_; }; TEST_F(Pkt4o6Test, construct) { // Construct 4o6 packet, unpack the data to examine it boost::scoped_ptr pkt4o6(new Pkt4o6(buffer4_, pkt6_)); pkt4o6->unpack(); // Inspect its internal to confirm it's built as expected. We also test // isDhcp4o6() here. EXPECT_TRUE(pkt4o6->isDhcp4o6()); EXPECT_EQ(pkt6_, pkt4o6->getPkt6()); EXPECT_EQ(DHCPDISCOVER, pkt4o6->getType()); // Same check for the other constructor. It relies on the internal // behavior of Pkt4's copy constructor, so we need to first unpack pkt4. pkt4_.reset(new Pkt4(&buffer4_[0], buffer4_.size())); pkt4_->unpack(); pkt4o6.reset(new Pkt4o6(pkt4_, pkt6_)); EXPECT_TRUE(pkt4o6->isDhcp4o6()); EXPECT_EQ(pkt6_, pkt4o6->getPkt6()); EXPECT_EQ(DHCPDISCOVER, pkt4o6->getType()); } TEST_F(Pkt4o6Test, pack) { // prepare unpacked DHCPv4 packet (see the note in constructor test) pkt4_.reset(new Pkt4(&buffer4_[0], buffer4_.size())); pkt4_->unpack(); // Construct 4o6 packet to be tested and pack the data. Pkt4o6 pkt4o6(pkt4_, pkt6_); pkt4o6.pack(); // The packed data should be: // 4-byte DHCPv6 message header // 4-byte header part of DHCPv4 message option // Raw DHCPv4 message (data stored in buffer4_) EXPECT_EQ(4 + 4 + buffer4_.size(), pkt4o6.getPkt6()->getBuffer().getLength()); // Check the DHCPv4 message option content (Pkt4o6 class is not responsible // for making it valid, so we won't examine it) const u_int8_t* cp = static_cast( pkt4o6.getPkt6()->getBuffer().getData()); EXPECT_EQ(0, cp[4]); EXPECT_EQ(D6O_DHCPV4_MSG, cp[5]); EXPECT_EQ((buffer4_.size() >> 8) & 0xff, cp[6]); EXPECT_EQ(buffer4_.size() & 0xff, cp[7]); EXPECT_EQ(0, memcmp(&cp[8], &buffer4_[0], buffer4_.size())); } }