Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/ip_address.h" | 5 #include "net/base/ip_address.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 11 |
| 12 namespace net { | 12 namespace net { |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 // Helper to stringize an IP number (used to define expectations). | 16 // Helper to stringize an IP address (used to define expectations). |
| 17 std::string DumpIPAddress(const IPAddress& v) { | 17 std::string DumpIPAddress(const IPAddress& v) { |
| 18 std::string out; | 18 std::string out; |
| 19 for (size_t i = 0; i < v.bytes().size(); ++i) { | 19 for (size_t i = 0; i < v.bytes().size(); ++i) { |
| 20 if (i != 0) | 20 if (i != 0) |
| 21 out.append(","); | 21 out.append(","); |
| 22 out.append(base::UintToString(v.bytes()[i])); | 22 out.append(base::UintToString(v.bytes()[i])); |
| 23 } | 23 } |
| 24 return out; | 24 return out; |
| 25 } | 25 } |
| 26 | 26 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 uint8_t addr2[4] = {192, 168, 0, 1}; | 90 uint8_t addr2[4] = {192, 168, 0, 1}; |
| 91 IPAddress ip_address2(addr2); | 91 IPAddress ip_address2(addr2); |
| 92 EXPECT_EQ("192.168.0.1", ip_address2.ToString()); | 92 EXPECT_EQ("192.168.0.1", ip_address2.ToString()); |
| 93 | 93 |
| 94 uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; | 94 uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; |
| 95 IPAddress ip_address3(addr3); | 95 IPAddress ip_address3(addr3); |
| 96 EXPECT_EQ("fedc:ba98::", ip_address3.ToString()); | 96 EXPECT_EQ("fedc:ba98::", ip_address3.ToString()); |
| 97 } | 97 } |
| 98 | 98 |
| 99 // Test that invalid IP literals fail to parse. | 99 // Test that invalid IP literals fail to parse. |
| 100 TEST(IPAddressTest, FromIPLiteral_FailParse) { | 100 TEST(IPAddressTest, AssignFromIPLiteral_FailParse) { |
| 101 IPAddress address; | 101 IPAddress address; |
| 102 | 102 |
| 103 EXPECT_FALSE(IPAddress::FromIPLiteral("bad value", &address)); | 103 EXPECT_FALSE(address.AssignFromIPLiteral("bad value")); |
| 104 EXPECT_FALSE(IPAddress::FromIPLiteral("bad:value", &address)); | 104 EXPECT_FALSE(address.AssignFromIPLiteral("bad:value")); |
| 105 EXPECT_FALSE(IPAddress::FromIPLiteral(std::string(), &address)); | 105 EXPECT_FALSE(address.AssignFromIPLiteral(std::string())); |
| 106 EXPECT_FALSE(IPAddress::FromIPLiteral("192.168.0.1:30", &address)); | 106 EXPECT_FALSE(address.AssignFromIPLiteral("192.168.0.1:30")); |
| 107 EXPECT_FALSE(IPAddress::FromIPLiteral(" 192.168.0.1 ", &address)); | 107 EXPECT_FALSE(address.AssignFromIPLiteral(" 192.168.0.1 ")); |
| 108 EXPECT_FALSE(IPAddress::FromIPLiteral("[::1]", &address)); | 108 EXPECT_FALSE(address.AssignFromIPLiteral("[::1]")); |
| 109 } | 109 } |
| 110 | 110 |
| 111 // Test parsing an IPv4 literal. | 111 // Test parsing an IPv4 literal. |
| 112 TEST(IPAddressTest, FromIPLiteral_IPv4) { | 112 TEST(IPAddressTest, AssignFromIPLiteral_IPv4) { |
| 113 IPAddress address; | 113 IPAddress address; |
| 114 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &address)); | 114 EXPECT_TRUE(address.AssignFromIPLiteral("192.168.0.1")); |
| 115 EXPECT_EQ("192,168,0,1", DumpIPAddress(address)); | 115 EXPECT_EQ("192,168,0,1", DumpIPAddress(address)); |
| 116 EXPECT_EQ("192.168.0.1", address.ToString()); | 116 EXPECT_EQ("192.168.0.1", address.ToString()); |
| 117 } | 117 } |
| 118 | 118 |
| 119 // Test parsing an IPv6 literal. | 119 // Test parsing an IPv6 literal. |
| 120 TEST(IPAddressTest, FromIPLiteral_IPv6) { | 120 TEST(IPAddressTest, AssignFromIPLiteral_IPv6) { |
| 121 IPAddress address; | 121 IPAddress address; |
| 122 EXPECT_TRUE(IPAddress::FromIPLiteral("1:abcd::3:4:ff", &address)); | 122 EXPECT_TRUE(address.AssignFromIPLiteral("1:abcd::3:4:ff")); |
| 123 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address)); | 123 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPAddress(address)); |
| 124 EXPECT_EQ("1:abcd::3:4:ff", address.ToString()); | 124 EXPECT_EQ("1:abcd::3:4:ff", address.ToString()); |
| 125 } | 125 } |
| 126 | 126 |
| 127 TEST(IPAddressTest, IsIPv4MappedIPv6) { | 127 TEST(IPAddressTest, IsIPv4MappedIPv6) { |
| 128 IPAddress ipv4_address; | 128 IPAddress ipv4_address; |
| 129 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address)); | 129 EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("192.168.0.1")); |
| 130 EXPECT_FALSE(ipv4_address.IsIPv4MappedIPv6()); | 130 EXPECT_FALSE(ipv4_address.IsIPv4MappedIPv6()); |
| 131 | 131 |
| 132 IPAddress ipv6_address; | 132 IPAddress ipv6_address; |
| 133 EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv4_address)); | 133 EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("::1")); |
|
martijnc
2016/02/07 20:18:54
I think this one was wrong before.
eroman
2016/02/08 20:38:23
Indeed, good catch!
| |
| 134 EXPECT_FALSE(ipv6_address.IsIPv4MappedIPv6()); | 134 EXPECT_FALSE(ipv6_address.IsIPv4MappedIPv6()); |
| 135 | 135 |
| 136 IPAddress ipv4mapped_address; | 136 IPAddress ipv4mapped_address; |
| 137 EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address)); | 137 EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:0101:1")); |
| 138 EXPECT_TRUE(ipv4mapped_address.IsIPv4MappedIPv6()); | 138 EXPECT_TRUE(ipv4mapped_address.IsIPv4MappedIPv6()); |
| 139 } | 139 } |
| 140 | 140 |
| 141 TEST(IPAddressTest, IsEqual) { | 141 TEST(IPAddressTest, IsEqual) { |
| 142 IPAddress ip_address1; | 142 IPAddress ip_address1; |
| 143 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1)); | 143 EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1")); |
| 144 IPAddress ip_address2; | 144 IPAddress ip_address2; |
| 145 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2)); | 145 EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42")); |
| 146 IPAddress ip_address3; | 146 IPAddress ip_address3; |
| 147 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3)); | 147 EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1")); |
| 148 | 148 |
| 149 EXPECT_FALSE(ip_address1 == ip_address2); | 149 EXPECT_FALSE(ip_address1 == ip_address2); |
| 150 EXPECT_TRUE(ip_address1 == ip_address3); | 150 EXPECT_TRUE(ip_address1 == ip_address3); |
| 151 } | 151 } |
| 152 | 152 |
| 153 TEST(IPAddressTest, LessThan) { | 153 TEST(IPAddressTest, LessThan) { |
| 154 // IPv4 vs IPv6 | 154 // IPv4 vs IPv6 |
| 155 IPAddress ip_address1; | 155 IPAddress ip_address1; |
| 156 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1)); | 156 EXPECT_TRUE(ip_address1.AssignFromIPLiteral("127.0.0.1")); |
| 157 IPAddress ip_address2; | 157 IPAddress ip_address2; |
| 158 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2)); | 158 EXPECT_TRUE(ip_address2.AssignFromIPLiteral("2001:db8:0::42")); |
| 159 EXPECT_TRUE(ip_address1 < ip_address2); | 159 EXPECT_TRUE(ip_address1 < ip_address2); |
| 160 EXPECT_FALSE(ip_address2 < ip_address1); | 160 EXPECT_FALSE(ip_address2 < ip_address1); |
| 161 | 161 |
| 162 // Compare equivalent addresses. | 162 // Compare equivalent addresses. |
| 163 IPAddress ip_address3; | 163 IPAddress ip_address3; |
| 164 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3)); | 164 EXPECT_TRUE(ip_address3.AssignFromIPLiteral("127.0.0.1")); |
| 165 EXPECT_FALSE(ip_address1 < ip_address3); | 165 EXPECT_FALSE(ip_address1 < ip_address3); |
| 166 EXPECT_FALSE(ip_address3 < ip_address1); | 166 EXPECT_FALSE(ip_address3 < ip_address1); |
| 167 } | 167 } |
| 168 | 168 |
| 169 TEST(IPAddressTest, IPAddressToStringWithPort) { | 169 TEST(IPAddressTest, IPAddressToStringWithPort) { |
| 170 IPAddress address1; | 170 IPAddress address1; |
| 171 EXPECT_TRUE(IPAddress::FromIPLiteral("0.0.0.0", &address1)); | 171 EXPECT_TRUE(address1.AssignFromIPLiteral("0.0.0.0")); |
| 172 EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(address1, 3)); | 172 EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(address1, 3)); |
| 173 | 173 |
| 174 IPAddress address2; | 174 IPAddress address2; |
| 175 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &address2)); | 175 EXPECT_TRUE(address2.AssignFromIPLiteral("192.168.0.1")); |
| 176 EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address2, 99)); | 176 EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address2, 99)); |
| 177 | 177 |
| 178 IPAddress address3; | 178 IPAddress address3; |
| 179 EXPECT_TRUE(IPAddress::FromIPLiteral("fedc:ba98::", &address3)); | 179 EXPECT_TRUE(address3.AssignFromIPLiteral("fedc:ba98::")); |
| 180 EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address3, 8080)); | 180 EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address3, 8080)); |
| 181 } | 181 } |
| 182 | 182 |
| 183 TEST(IPAddressTest, IPAddressToPackedString) { | 183 TEST(IPAddressTest, IPAddressToPackedString) { |
| 184 IPAddress ipv4_address; | 184 IPAddress ipv4_address; |
| 185 EXPECT_TRUE(IPAddress::FromIPLiteral("4.31.198.44", &ipv4_address)); | 185 EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44")); |
| 186 std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4); | 186 std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4); |
| 187 EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address)); | 187 EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address)); |
| 188 | 188 |
| 189 IPAddress ipv6_address; | 189 IPAddress ipv6_address; |
| 190 EXPECT_TRUE( | 190 EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f")); |
| 191 IPAddress::FromIPLiteral("2001:0700:0300:1800::000f", &ipv6_address)); | |
| 192 std::string expected_ipv6_address( | 191 std::string expected_ipv6_address( |
| 193 "\x20\x01\x07\x00\x03\x00\x18\x00" | 192 "\x20\x01\x07\x00\x03\x00\x18\x00" |
| 194 "\x00\x00\x00\x00\x00\x00\x00\x0f", | 193 "\x00\x00\x00\x00\x00\x00\x00\x0f", |
| 195 16); | 194 16); |
| 196 EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address)); | 195 EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address)); |
| 197 } | 196 } |
| 198 | 197 |
| 199 TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) { | 198 TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) { |
| 200 IPAddress ipv4_number; | 199 IPAddress ipv4_address; |
| 201 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_number)); | 200 EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("192.168.0.1")); |
| 202 | 201 |
| 203 IPAddress ipv6_number = ConvertIPv4ToIPv4MappedIPv6(ipv4_number); | 202 IPAddress ipv6_address = ConvertIPv4ToIPv4MappedIPv6(ipv4_address); |
| 204 | 203 |
| 205 // ::ffff:192.168.0.1 | 204 // ::ffff:192.168.0.1 |
| 206 EXPECT_EQ("::ffff:c0a8:1", ipv6_number.ToString()); | 205 EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString()); |
| 207 } | 206 } |
| 208 | 207 |
| 209 TEST(IPAddressTest, ConvertIPv4MappedIPv6ToIPv4) { | 208 TEST(IPAddressTest, ConvertIPv4MappedIPv6ToIPv4) { |
| 210 IPAddress ipv4mapped_number; | 209 IPAddress ipv4mapped_address; |
| 211 EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:c0a8:1", &ipv4mapped_number)); | 210 EXPECT_TRUE(ipv4mapped_address.AssignFromIPLiteral("::ffff:c0a8:1")); |
| 212 | 211 |
| 213 IPAddress expected; | 212 IPAddress expected; |
| 214 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &expected)); | 213 EXPECT_TRUE(expected.AssignFromIPLiteral("192.168.0.1")); |
| 215 | 214 |
| 216 IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_number); | 215 IPAddress result = ConvertIPv4MappedIPv6ToIPv4(ipv4mapped_address); |
| 217 EXPECT_EQ(expected, result); | 216 EXPECT_EQ(expected, result); |
| 218 } | 217 } |
| 219 | 218 |
| 220 } // anonymous namespace | 219 } // anonymous namespace |
| 221 | 220 |
| 222 } // namespace net | 221 } // namespace net |
| OLD | NEW |