addr_utilities_unittest.cc 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright (C) 2010 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 <stdint.h>
  16. #include <stdlib.h>
  17. #include <gtest/gtest.h>
  18. #include <vector>
  19. #include <dhcp/addr_utilities.h>
  20. using namespace std;
  21. using namespace isc::dhcp;
  22. using namespace isc::asiolink;
  23. // This test verifies that lastAddrInPrefix is able to handle IPv4 operations.
  24. TEST(AddrUtilitiesTest, lastAddrInPrefix4) {
  25. IOAddress addr1("192.0.2.1");
  26. // Prefixes rounded to addresses are easy...
  27. EXPECT_EQ("192.255.255.255", lastAddrInPrefix(addr1, 8).toText());
  28. EXPECT_EQ("192.0.255.255", lastAddrInPrefix(addr1, 16).toText());
  29. EXPECT_EQ("192.0.2.255", lastAddrInPrefix(addr1, 24).toText());
  30. // these are trickier
  31. EXPECT_EQ("192.0.2.127", lastAddrInPrefix(addr1, 25).toText());
  32. EXPECT_EQ("192.0.2.63", lastAddrInPrefix(addr1, 26).toText());
  33. EXPECT_EQ("192.0.2.31", lastAddrInPrefix(addr1, 27).toText());
  34. EXPECT_EQ("192.0.2.15", lastAddrInPrefix(addr1, 28).toText());
  35. EXPECT_EQ("192.0.2.7", lastAddrInPrefix(addr1, 29).toText());
  36. EXPECT_EQ("192.0.2.3", lastAddrInPrefix(addr1, 30).toText());
  37. // that doesn't make much sense as /31 subnet consists of network address
  38. // and a broadcast address, with 0 usable addresses.
  39. EXPECT_EQ("192.0.2.1", lastAddrInPrefix(addr1, 31).toText());
  40. EXPECT_EQ("192.0.2.1", lastAddrInPrefix(addr1, 32).toText());
  41. // Let's check extreme cases
  42. IOAddress anyAddr("0.0.0.0");
  43. EXPECT_EQ("127.255.255.255", lastAddrInPrefix(anyAddr, 1).toText());
  44. EXPECT_EQ("255.255.255.255", lastAddrInPrefix(anyAddr, 0).toText());
  45. EXPECT_EQ("0.0.0.0", lastAddrInPrefix(anyAddr, 32).toText());
  46. }
  47. // This test checks if firstAddrInPrefix is able to handle IPv4 operations.
  48. TEST(AddrUtilitiesTest, firstAddrInPrefix4) {
  49. IOAddress addr1("192.223.2.255");
  50. // Prefixes rounded to addresses are easy...
  51. EXPECT_EQ("192.0.0.0", firstAddrInPrefix(addr1, 8).toText());
  52. EXPECT_EQ("192.223.0.0", firstAddrInPrefix(addr1, 16).toText());
  53. EXPECT_EQ("192.223.2.0", firstAddrInPrefix(addr1, 24).toText());
  54. // these are trickier
  55. EXPECT_EQ("192.223.2.128", firstAddrInPrefix(addr1, 25).toText());
  56. EXPECT_EQ("192.223.2.192", firstAddrInPrefix(addr1, 26).toText());
  57. EXPECT_EQ("192.223.2.224", firstAddrInPrefix(addr1, 27).toText());
  58. EXPECT_EQ("192.223.2.240", firstAddrInPrefix(addr1, 28).toText());
  59. EXPECT_EQ("192.223.2.248", firstAddrInPrefix(addr1, 29).toText());
  60. EXPECT_EQ("192.223.2.252", firstAddrInPrefix(addr1, 30).toText());
  61. // that doesn't make much sense as /31 subnet consists of network address
  62. // and a broadcast address, with 0 usable addresses.
  63. EXPECT_EQ("192.223.2.254", firstAddrInPrefix(addr1, 31).toText());
  64. EXPECT_EQ("192.223.2.255", firstAddrInPrefix(addr1, 32).toText());
  65. // Let's check extreme cases.
  66. IOAddress bcast("255.255.255.255");
  67. EXPECT_EQ("128.0.0.0", firstAddrInPrefix(bcast, 1).toText());
  68. EXPECT_EQ("0.0.0.0", firstAddrInPrefix(bcast, 0).toText());
  69. EXPECT_EQ("255.255.255.255", firstAddrInPrefix(bcast, 32).toText());
  70. }
  71. /// This test checks if lastAddrInPrefix properly supports IPv6 operations
  72. TEST(AddrUtilitiesTest, lastAddrInPrefix6) {
  73. IOAddress addr1("2001:db8:1:1234:5678:abcd:1234:beef");
  74. // Prefixes rounded to nibbles are easy...
  75. EXPECT_EQ("2001:db8:1:1234:5678:abcd:1234:ffff",
  76. lastAddrInPrefix(addr1, 112).toText());
  77. EXPECT_EQ("2001:db8:1:1234:5678:abcd:123f:ffff",
  78. lastAddrInPrefix(addr1, 108).toText());
  79. EXPECT_EQ("2001:db8:1:1234:5678:abcd:12ff:ffff",
  80. lastAddrInPrefix(addr1, 104).toText());
  81. EXPECT_EQ("2001:db8:1:1234:ffff:ffff:ffff:ffff",
  82. lastAddrInPrefix(addr1, 64).toText());
  83. IOAddress addr2("2001::");
  84. // These are tricker, though, as they are done in 1 bit increments
  85. // the last address in 2001::/127 pool should be 2001::1
  86. EXPECT_EQ("2001::1", lastAddrInPrefix(addr2, 127).toText());
  87. EXPECT_EQ("2001::3", lastAddrInPrefix(addr2, 126).toText());
  88. EXPECT_EQ("2001::7", lastAddrInPrefix(addr2, 125).toText());
  89. EXPECT_EQ("2001::f", lastAddrInPrefix(addr2, 124).toText());
  90. EXPECT_EQ("2001::1f", lastAddrInPrefix(addr2, 123).toText());
  91. EXPECT_EQ("2001::3f", lastAddrInPrefix(addr2, 122).toText());
  92. EXPECT_EQ("2001::7f", lastAddrInPrefix(addr2, 121).toText());
  93. EXPECT_EQ("2001::ff", lastAddrInPrefix(addr2, 120).toText());
  94. // Let's check extreme cases
  95. IOAddress anyAddr("::");
  96. EXPECT_EQ("7fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
  97. lastAddrInPrefix(anyAddr, 1).toText());
  98. EXPECT_EQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
  99. lastAddrInPrefix(anyAddr, 0).toText());
  100. EXPECT_EQ("::", lastAddrInPrefix(anyAddr, 128).toText());
  101. }
  102. /// This test checks if firstAddrInPrefix properly supports IPv6 operations
  103. TEST(AddrUtilitiesTest, firstAddrInPrefix6) {
  104. IOAddress addr1("2001:db8:1:1234:5678:1234:abcd:beef");
  105. // Prefixes rounded to nibbles are easy...
  106. EXPECT_EQ("2001:db8:1:1234:5678:1234::",
  107. firstAddrInPrefix(addr1, 96).toText());
  108. EXPECT_EQ("2001:db8:1:1234:5678:1230::",
  109. firstAddrInPrefix(addr1, 92).toText());
  110. EXPECT_EQ("2001:db8:1:1234:5678:1200::",
  111. firstAddrInPrefix(addr1, 88).toText());
  112. EXPECT_EQ("2001:db8:1:1234::",
  113. firstAddrInPrefix(addr1, 64).toText());
  114. IOAddress addr2("2001::ffff");
  115. // These are tricker, though, as they are done in 1 bit increments
  116. // the first address in 2001::/127 pool should be 2001::1
  117. EXPECT_EQ("2001::fffe", firstAddrInPrefix(addr2, 127).toText());
  118. EXPECT_EQ("2001::fffc", firstAddrInPrefix(addr2, 126).toText());
  119. EXPECT_EQ("2001::fff8", firstAddrInPrefix(addr2, 125).toText());
  120. EXPECT_EQ("2001::fff0", firstAddrInPrefix(addr2, 124).toText());
  121. EXPECT_EQ("2001::ffe0", firstAddrInPrefix(addr2, 123).toText());
  122. EXPECT_EQ("2001::ffc0", firstAddrInPrefix(addr2, 122).toText());
  123. EXPECT_EQ("2001::ff80", firstAddrInPrefix(addr2, 121).toText());
  124. EXPECT_EQ("2001::ff00", firstAddrInPrefix(addr2, 120).toText());
  125. }