pkt4o6_unittest.cc 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <config.h>
  15. #include <dhcp/dhcp6.h>
  16. #include <dhcp/option.h>
  17. #include <dhcp/pkt4.h>
  18. #include <dhcp/pkt6.h>
  19. #include <dhcp/pkt4o6.h>
  20. #include <boost/scoped_ptr.hpp>
  21. #include <gtest/gtest.h>
  22. using namespace isc::dhcp;
  23. namespace {
  24. class Pkt4o6Test : public ::testing::Test {
  25. protected:
  26. Pkt4o6Test() :
  27. data6_(6, 0),
  28. pkt6_(new Pkt6(&data6_[0], data6_.size())),
  29. pkt4_(new Pkt4(DHCPDISCOVER, 0x12345678))
  30. {
  31. pkt4_->pack();
  32. const uint8_t* cp = static_cast<const uint8_t*>(
  33. pkt4_->getBuffer().getData());
  34. buffer4_.assign(cp, cp + pkt4_->getBuffer().getLength());
  35. }
  36. protected:
  37. const std::vector<uint8_t> data6_;
  38. // commonly used test data
  39. Pkt6Ptr pkt6_;
  40. Pkt4Ptr pkt4_;
  41. OptionBuffer buffer4_;
  42. };
  43. TEST_F(Pkt4o6Test, construct) {
  44. // Construct 4o6 packet, unpack the data to examine it
  45. boost::scoped_ptr<Pkt4o6> pkt4o6(new Pkt4o6(buffer4_, pkt6_));
  46. pkt4o6->unpack();
  47. // Inspect its internal to confirm it's built as expected. We also test
  48. // isDhcp4o6() here.
  49. EXPECT_TRUE(pkt4o6->isDhcp4o6());
  50. EXPECT_EQ(pkt6_, pkt4o6->getPkt6());
  51. EXPECT_EQ(DHCPDISCOVER, pkt4o6->getType());
  52. // Same check for the other constructor. It relies on the internal
  53. // behavior of Pkt4's copy constructor, so we need to first unpack pkt4.
  54. pkt4_.reset(new Pkt4(&buffer4_[0], buffer4_.size()));
  55. pkt4_->unpack();
  56. pkt4o6.reset(new Pkt4o6(pkt4_, pkt6_));
  57. EXPECT_TRUE(pkt4o6->isDhcp4o6());
  58. EXPECT_EQ(pkt6_, pkt4o6->getPkt6());
  59. EXPECT_EQ(DHCPDISCOVER, pkt4o6->getType());
  60. }
  61. TEST_F(Pkt4o6Test, pack) {
  62. // prepare unpacked DHCPv4 packet (see the note in constructor test)
  63. pkt4_.reset(new Pkt4(&buffer4_[0], buffer4_.size()));
  64. pkt4_->unpack();
  65. // Construct 4o6 packet to be tested and pack the data.
  66. Pkt4o6 pkt4o6(pkt4_, pkt6_);
  67. pkt4o6.pack();
  68. // The packed data should be:
  69. // 4-byte DHCPv6 message header
  70. // 4-byte header part of DHCPv4 message option
  71. // Raw DHCPv4 message (data stored in buffer4_)
  72. EXPECT_EQ(4 + 4 + buffer4_.size(),
  73. pkt4o6.getPkt6()->getBuffer().getLength());
  74. // Check the DHCPv4 message option content (Pkt4o6 class is not responsible
  75. // for making it valid, so we won't examine it)
  76. const u_int8_t* cp = static_cast<const u_int8_t*>(
  77. pkt4o6.getPkt6()->getBuffer().getData());
  78. EXPECT_EQ(0, cp[4]);
  79. EXPECT_EQ(D6O_DHCPV4_MSG, cp[5]);
  80. EXPECT_EQ((buffer4_.size() >> 8) & 0xff, cp[6]);
  81. EXPECT_EQ(buffer4_.size() & 0xff, cp[7]);
  82. EXPECT_EQ(0, memcmp(&cp[8], &buffer4_[0], buffer4_.size()));
  83. }
  84. }