hwaddr_unittest.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright (C) 2012 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 <asiolink/io_address.h>
  16. #include <dhcp/hwaddr.h>
  17. #include <dhcp/dhcp4.h>
  18. #include <exceptions/exceptions.h>
  19. #include <boost/scoped_ptr.hpp>
  20. #include <gtest/gtest.h>
  21. #include <iostream>
  22. #include <sstream>
  23. using namespace std;
  24. using namespace isc;
  25. using namespace isc::dhcp;
  26. using namespace isc::asiolink;
  27. using boost::scoped_ptr;
  28. namespace {
  29. // This test verifies if the constructors are working as expected
  30. // and process passed parameters.
  31. TEST(HWAddrTest, constructor) {
  32. const uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6};
  33. const uint8_t htype = HTYPE_ETHER;
  34. vector<uint8_t> data2(data1, data1 + sizeof(data1));
  35. // Over the limit data
  36. vector<uint8_t> big_data_vector(HWAddr::MAX_HWADDR_LEN + 1, 0);
  37. scoped_ptr<HWAddr> hwaddr1(new HWAddr(data1, sizeof(data1), htype));
  38. scoped_ptr<HWAddr> hwaddr2(new HWAddr(data2, htype));
  39. scoped_ptr<HWAddr> hwaddr3(new HWAddr());
  40. EXPECT_TRUE(data2 == hwaddr1->hwaddr_);
  41. EXPECT_EQ(htype, hwaddr1->htype_);
  42. EXPECT_TRUE(data2 == hwaddr2->hwaddr_);
  43. EXPECT_EQ(htype, hwaddr2->htype_);
  44. EXPECT_EQ(0, hwaddr3->hwaddr_.size());
  45. EXPECT_EQ(htype, hwaddr3->htype_);
  46. // Check that over the limit data length throws exception
  47. EXPECT_THROW(HWAddr(&big_data_vector[0], big_data_vector.size(), HTYPE_ETHER),
  48. InvalidParameter);
  49. // Check that over the limit vector throws exception
  50. EXPECT_THROW(HWAddr(big_data_vector, HTYPE_ETHER), InvalidParameter);
  51. }
  52. // This test checks if the comparison operators are sane.
  53. TEST(HWAddrTest, operators) {
  54. uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6};
  55. uint8_t data2[] = {0, 1, 2, 3, 4};
  56. uint8_t data3[] = {0, 1, 2, 3, 4, 5, 7}; // last digit different
  57. uint8_t data4[] = {0, 1, 2, 3, 4, 5, 6}; // the same as 1
  58. uint8_t htype1 = HTYPE_ETHER;
  59. uint8_t htype2 = HTYPE_FDDI;
  60. scoped_ptr<HWAddr> hw1(new HWAddr(data1, sizeof(data1), htype1));
  61. scoped_ptr<HWAddr> hw2(new HWAddr(data2, sizeof(data2), htype1));
  62. scoped_ptr<HWAddr> hw3(new HWAddr(data3, sizeof(data3), htype1));
  63. scoped_ptr<HWAddr> hw4(new HWAddr(data4, sizeof(data4), htype1));
  64. // MAC address the same as data1 and data4, but different hardware type
  65. scoped_ptr<HWAddr> hw5(new HWAddr(data4, sizeof(data4), htype2));
  66. EXPECT_TRUE(*hw1 == *hw4);
  67. EXPECT_FALSE(*hw1 == *hw2);
  68. EXPECT_FALSE(*hw1 == *hw3);
  69. EXPECT_FALSE(*hw1 != *hw4);
  70. EXPECT_TRUE(*hw1 != *hw2);
  71. EXPECT_TRUE(*hw1 != *hw3);
  72. EXPECT_FALSE(*hw1 == *hw5);
  73. EXPECT_FALSE(*hw4 == *hw5);
  74. EXPECT_TRUE(*hw1 != *hw5);
  75. EXPECT_TRUE(*hw4 != *hw5);
  76. }
  77. // Checks that toText() method produces appropriate text representation
  78. TEST(HWAddrTest, toText) {
  79. uint8_t data[] = {0, 1, 2, 3, 4, 5};
  80. uint8_t htype = 15;
  81. HWAddrPtr hw(new HWAddr(data, sizeof(data), htype));
  82. EXPECT_EQ("hwtype=15 00:01:02:03:04:05", hw->toText());
  83. }
  84. TEST(HWAddrTest, stringConversion) {
  85. // Check that an empty vector returns an appropriate string
  86. HWAddr hwaddr;
  87. std::string result = hwaddr.toText();
  88. EXPECT_EQ(std::string("hwtype=1 "), result);
  89. // ... that a single-byte string is OK
  90. hwaddr.hwaddr_.push_back(0xc3);
  91. result = hwaddr.toText();
  92. EXPECT_EQ(std::string("hwtype=1 c3"), result);
  93. // ... and that a multi-byte string works
  94. hwaddr.hwaddr_.push_back(0x7);
  95. hwaddr.hwaddr_.push_back(0xa2);
  96. hwaddr.hwaddr_.push_back(0xe8);
  97. hwaddr.hwaddr_.push_back(0x42);
  98. result = hwaddr.toText();
  99. EXPECT_EQ(std::string("hwtype=1 c3:07:a2:e8:42"), result);
  100. }
  101. } // end of anonymous namespace