io_address_unittest.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 <gtest/gtest.h>
  16. #include <asiolink/io_error.h>
  17. #include <asiolink/io_address.h>
  18. #include <cstring>
  19. using namespace isc::asiolink;
  20. TEST(IOAddressTest, fromText) {
  21. IOAddress io_address_v4("192.0.2.1");
  22. EXPECT_EQ("192.0.2.1", io_address_v4.toText());
  23. IOAddress io_address_v6("2001:db8::1234");
  24. EXPECT_EQ("2001:db8::1234", io_address_v6.toText());
  25. // bogus IPv4 address-like input
  26. EXPECT_THROW(IOAddress("192.0.2.2.1"), IOError);
  27. // bogus IPv4 address-like input: out-of-range octet
  28. EXPECT_THROW(IOAddress("192.0.2.300"), IOError);
  29. // bogus IPv6 address-like input
  30. EXPECT_THROW(IOAddress("2001:db8:::1234"), IOError);
  31. // bogus IPv6 address-like input
  32. EXPECT_THROW(IOAddress("2001:db8::efgh"), IOError);
  33. }
  34. TEST(IOAddressTest, Equality) {
  35. EXPECT_TRUE(IOAddress("192.0.2.1") == IOAddress("192.0.2.1"));
  36. EXPECT_FALSE(IOAddress("192.0.2.1") != IOAddress("192.0.2.1"));
  37. EXPECT_TRUE(IOAddress("192.0.2.1") != IOAddress("192.0.2.2"));
  38. EXPECT_FALSE(IOAddress("192.0.2.1") == IOAddress("192.0.2.2"));
  39. EXPECT_TRUE(IOAddress("2001:db8::12") == IOAddress("2001:0DB8:0:0::0012"));
  40. EXPECT_FALSE(IOAddress("2001:db8::12") != IOAddress("2001:0DB8:0:0::0012"));
  41. EXPECT_TRUE(IOAddress("2001:db8::1234") != IOAddress("2001:db8::1235"));
  42. EXPECT_FALSE(IOAddress("2001:db8::1234") == IOAddress("2001:db8::1235"));
  43. EXPECT_TRUE(IOAddress("2001:db8::1234") != IOAddress("192.0.2.3"));
  44. EXPECT_FALSE(IOAddress("2001:db8::1234") == IOAddress("192.0.2.3"));
  45. }
  46. TEST(IOAddressTest, Family) {
  47. EXPECT_EQ(AF_INET, IOAddress("192.0.2.1").getFamily());
  48. EXPECT_EQ(AF_INET6, IOAddress("2001:0DB8:0:0::0012").getFamily());
  49. }
  50. TEST(IOAddressTest, from_bytes) {
  51. // 2001:db8:1::dead:beef
  52. uint8_t v6[] = {
  53. 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0, 0,
  54. 0, 0, 0, 0, 0xde, 0xad, 0xbe, 0xef };
  55. uint8_t v4[] = { 192, 0 , 2, 3 };
  56. IOAddress addr("::");
  57. EXPECT_NO_THROW({
  58. addr = IOAddress::from_bytes(AF_INET6, v6);
  59. });
  60. EXPECT_EQ("2001:db8:1::dead:beef", addr.toText());
  61. EXPECT_NO_THROW({
  62. addr = IOAddress::from_bytes(AF_INET, v4);
  63. });
  64. EXPECT_EQ(addr.toText(), IOAddress("192.0.2.3").toText());
  65. }
  66. TEST(IOAddressTest, uint32) {
  67. IOAddress addr1("192.0.2.5");
  68. // operator uint_32() is used here
  69. uint32_t tmp = addr1;
  70. uint32_t expected = (192U << 24) + (0U << 16) + (2U << 8) + 5U;
  71. EXPECT_EQ(expected, tmp);
  72. // now let's try opposite conversion
  73. IOAddress addr3 = IOAddress(expected);
  74. EXPECT_EQ(addr3.toText(), "192.0.2.5");
  75. }
  76. TEST(IOAddressTest, lessThanEqual) {
  77. IOAddress addr1("192.0.2.5");
  78. IOAddress addr2("192.0.2.6");
  79. IOAddress addr3("0.0.0.0");
  80. IOAddress addr4("::");
  81. IOAddress addr5("2001:db8::1");
  82. IOAddress addr6("2001:db8::1:0");
  83. IOAddress addr7("2001:db8::1:0"); // the same as 6
  84. // v4 comparisons
  85. EXPECT_TRUE(addr1 < addr2);
  86. EXPECT_FALSE(addr2 < addr1);
  87. EXPECT_FALSE(addr2 <= addr1);
  88. EXPECT_TRUE(addr3 < addr1);
  89. EXPECT_TRUE(addr3 < addr2);
  90. EXPECT_TRUE(addr3 <= addr2);
  91. // v6 comparisons
  92. EXPECT_TRUE(addr4 < addr5);
  93. EXPECT_TRUE(addr5 < addr6);
  94. EXPECT_FALSE(addr6 < addr5);
  95. EXPECT_FALSE(addr6 <= addr5);
  96. // v4 to v6 - v4 should always be smaller
  97. EXPECT_TRUE(addr1 < addr4);
  98. EXPECT_TRUE(addr3 < addr4);
  99. EXPECT_TRUE(addr2 < addr5);
  100. EXPECT_TRUE(addr6 <= addr7);
  101. }