duid_unittest.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright (C) 2011 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/duid.h>
  17. #include <exceptions/exceptions.h>
  18. #include <boost/scoped_ptr.hpp>
  19. #include <gtest/gtest.h>
  20. #include <iostream>
  21. #include <sstream>
  22. #include <arpa/inet.h>
  23. using namespace std;
  24. using namespace isc;
  25. using namespace isc::dhcp;
  26. using namespace isc::asiolink;
  27. // don't import the entire boost namespace. It will unexpectedly hide uint8_t
  28. // for some systems.
  29. using boost::scoped_ptr;
  30. namespace {
  31. // This test verifies if the constructors are working as expected
  32. // and process passed parameters.
  33. TEST(DuidTest, constructor) {
  34. uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6};
  35. vector<uint8_t> data2(data1, data1 + sizeof(data1));
  36. scoped_ptr<DUID> duid1(new DUID(data1, sizeof(data1)));
  37. scoped_ptr<DUID> duid2(new DUID(data2));
  38. vector<uint8_t> vecdata = duid1->getDuid();
  39. EXPECT_TRUE(data2 == vecdata);
  40. EXPECT_EQ(DUID::DUID_LLT, duid1->getType());
  41. vecdata = duid2->getDuid();
  42. EXPECT_TRUE(data2 == vecdata);
  43. EXPECT_EQ(DUID::DUID_LLT, duid2->getType());
  44. }
  45. // This test verifies if DUID size restrictions are implemented
  46. // properly.
  47. TEST(DuidTest, size) {
  48. const int MAX_DUID_SIZE = 128;
  49. uint8_t data[MAX_DUID_SIZE + 1];
  50. vector<uint8_t> data2;
  51. for (uint8_t i = 0; i < MAX_DUID_SIZE + 1; ++i) {
  52. data[i] = i;
  53. if (i < MAX_DUID_SIZE)
  54. data2.push_back(i);
  55. }
  56. ASSERT_EQ(data2.size(), MAX_DUID_SIZE);
  57. scoped_ptr<DUID> duidmaxsize1(new DUID(data, MAX_DUID_SIZE));
  58. scoped_ptr<DUID> duidmaxsize2(new DUID(data2));
  59. EXPECT_THROW(
  60. scoped_ptr<DUID> toolarge1(new DUID(data, MAX_DUID_SIZE + 1)),
  61. OutOfRange);
  62. // that's one too much
  63. data2.push_back(128);
  64. EXPECT_THROW(
  65. scoped_ptr<DUID> toolarge2(new DUID(data2)),
  66. OutOfRange);
  67. }
  68. // This test verifies if the implementation supports all defined
  69. // DUID types.
  70. TEST(DuidTest, getType) {
  71. uint8_t llt[] = {0, 1, 2, 3, 4, 5, 6};
  72. uint8_t en[] = {0, 2, 2, 3, 4, 5, 6};
  73. uint8_t ll[] = {0, 3, 2, 3, 4, 5, 6};
  74. uint8_t uuid[] = {0, 4, 2, 3, 4, 5, 6};
  75. uint8_t invalid[] = {0,55, 2, 3, 4, 5, 6};
  76. scoped_ptr<DUID> duid_llt(new DUID(llt, sizeof(llt)));
  77. scoped_ptr<DUID> duid_en(new DUID(en, sizeof(en)));
  78. scoped_ptr<DUID> duid_ll(new DUID(ll, sizeof(ll)));
  79. scoped_ptr<DUID> duid_uuid(new DUID(uuid, sizeof(uuid)));
  80. scoped_ptr<DUID> duid_invalid(new DUID(invalid, sizeof(invalid)));
  81. EXPECT_EQ(DUID::DUID_LLT, duid_llt->getType());
  82. EXPECT_EQ(DUID::DUID_EN, duid_en->getType());
  83. EXPECT_EQ(DUID::DUID_LL, duid_ll->getType());
  84. EXPECT_EQ(DUID::DUID_UUID, duid_uuid->getType());
  85. EXPECT_EQ(DUID::DUID_UNKNOWN, duid_invalid->getType());
  86. }
  87. // This test checks if the comparison operators are sane.
  88. TEST(DuidTest, operators) {
  89. uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6};
  90. uint8_t data2[] = {0, 1, 2, 3, 4};
  91. uint8_t data3[] = {0, 1, 2, 3, 4, 5, 7}; // last digit different
  92. uint8_t data4[] = {0, 1, 2, 3, 4, 5, 6}; // the same as 1
  93. scoped_ptr<DUID> duid1(new DUID(data1, sizeof(data1)));
  94. scoped_ptr<DUID> duid2(new DUID(data2, sizeof(data2)));
  95. scoped_ptr<DUID> duid3(new DUID(data3, sizeof(data3)));
  96. scoped_ptr<DUID> duid4(new DUID(data4, sizeof(data4)));
  97. EXPECT_TRUE(*duid1 == *duid4);
  98. EXPECT_FALSE(*duid1 == *duid2);
  99. EXPECT_FALSE(*duid1 == *duid3);
  100. EXPECT_FALSE(*duid1 != *duid4);
  101. EXPECT_TRUE(*duid1 != *duid2);
  102. EXPECT_TRUE(*duid1 != *duid3);
  103. }
  104. // This test verifies if the ClientId constructors are working properly
  105. // and passed parameters are used
  106. TEST(ClientIdTest, constructor) {
  107. IOAddress addr2("192.0.2.1");
  108. IOAddress addr3("2001:db8:1::1");
  109. uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6};
  110. vector<uint8_t> data2(data1, data1 + sizeof(data1));
  111. // checks for C-style construtor (uint8_t * + len)
  112. scoped_ptr<ClientId> id1(new ClientId(data1, sizeof(data1)));
  113. vector<uint8_t> vecdata = id1->getClientId();
  114. EXPECT_TRUE(data2 == vecdata);
  115. // checks for vector-based constructor
  116. scoped_ptr<ClientId> id2(new ClientId(data2));
  117. vecdata = id2->getClientId();
  118. EXPECT_TRUE(data2 == vecdata);
  119. }
  120. // This test checks if the comparison operators are sane.
  121. TEST(ClientIdTest, operators) {
  122. uint8_t data1[] = {0, 1, 2, 3, 4, 5, 6};
  123. uint8_t data2[] = {0, 1, 2, 3, 4};
  124. uint8_t data3[] = {0, 1, 2, 3, 4, 5, 7}; // last digit different
  125. uint8_t data4[] = {0, 1, 2, 3, 4, 5, 6}; // the same as 1
  126. scoped_ptr<ClientId> id1(new ClientId(data1, sizeof(data1)));
  127. scoped_ptr<ClientId> id2(new ClientId(data2, sizeof(data2)));
  128. scoped_ptr<ClientId> id3(new ClientId(data3, sizeof(data3)));
  129. scoped_ptr<ClientId> id4(new ClientId(data4, sizeof(data4)));
  130. EXPECT_TRUE(*id1 == *id4);
  131. EXPECT_FALSE(*id1 == *id2);
  132. EXPECT_FALSE(*id1 == *id3);
  133. EXPECT_FALSE(*id1 != *id4);
  134. EXPECT_TRUE(*id1 != *id2);
  135. EXPECT_TRUE(*id1 != *id3);
  136. }
  137. // Test checks if the toText() returns valid texual representation
  138. TEST(ClientIdTest, toText) {
  139. uint8_t data1[] = {0, 1, 2, 3, 4, 0xff, 0xfe};
  140. DUID duid(data1, sizeof(data1));
  141. EXPECT_EQ("00:01:02:03:04:ff:fe", duid.toText());
  142. }
  143. } // end of anonymous namespace