Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(274)

Side by Side Diff: net/base/ip_address_unittest.cc

Issue 1408803010: Add IPAddress class as a replacement for the IPAddressNumber typedef. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "net/base/ip_address.h"
6
7 #include <vector>
8
9 #include "base/format_macros.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "base/strings/stringprintf.h"
12 #include "net/base/net_util.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace net {
16
17 class IPAddressTest : public testing::Test {
18 public:
19 // Helper to strignize an IP number (used to define expectations).
20 static std::string DumpIPAddress(const IPAddress& v) {
21 std::string out;
22 for (size_t i = 0; i < v.ip_address_.size(); ++i) {
23 if (i != 0)
24 out.append(",");
25 out.append(base::IntToString(static_cast<int>(v.ip_address_[i])));
26 }
27 return out;
28 }
29
30 static IPAddress ArrayToIPAdress(uint8_t address[], size_t length) {
31 std::vector<unsigned char> vec(address, address + length);
32 IPAddress ip_address(vec);
33 return ip_address;
34 }
35 };
36
37 namespace {
38
39 TEST(IPAddressTest, IPAddressToString) {
40 uint8_t addr1[4] = {0, 0, 0, 0};
41 IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1));
42 EXPECT_EQ("0.0.0.0", ip_address1.ToString());
43
44 uint8_t addr2[4] = {192, 168, 0, 1};
45 IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2));
46 EXPECT_EQ("192.168.0.1", ip_address2.ToString());
47
48 uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
49 IPAddress ip_address3 = IPAddressTest::ArrayToIPAdress(addr3, sizeof(addr3));
50 EXPECT_EQ("fedc:ba98::", ip_address3.ToString());
51 }
52
53 TEST(IPAddressTest, IPAddressToStringWithPort) {
54 uint8_t addr1[4] = {0, 0, 0, 0};
55 IPAddress ip_address1 = IPAddressTest::ArrayToIPAdress(addr1, sizeof(addr1));
56 EXPECT_EQ("0.0.0.0:3", ip_address1.ToStringWithPort(3));
57
58 uint8_t addr2[4] = {192, 168, 0, 1};
59 IPAddress ip_address2 = IPAddressTest::ArrayToIPAdress(addr2, sizeof(addr2));
60 EXPECT_EQ("192.168.0.1:99", ip_address2.ToStringWithPort(99));
61
62 uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
63 IPAddress ip_address3 = IPAddressTest::ArrayToIPAdress(addr3, sizeof(addr3));
64 EXPECT_EQ("[fedc:ba98::]:8080", ip_address3.ToStringWithPort(8080));
65 }
66
67 // Test that invalid IP literals fail to parse.
68 TEST(IPAddressTest, FromIPLiteral_FailParse) {
69 IPAddress address;
70
71 EXPECT_FALSE(IPAddress::FromIPLiteral("bad value", &address));
72 EXPECT_FALSE(IPAddress::FromIPLiteral("bad:value", &address));
73 EXPECT_FALSE(IPAddress::FromIPLiteral(std::string(), &address));
74 EXPECT_FALSE(IPAddress::FromIPLiteral("192.168.0.1:30", &address));
75 EXPECT_FALSE(IPAddress::FromIPLiteral(" 192.168.0.1 ", &address));
76 EXPECT_FALSE(IPAddress::FromIPLiteral("[::1]", &address));
77 }
78
79 // Test parsing an IPv4 literal.
80 TEST(IPAddressTest, FromIPLiteral_IPv4) {
81 IPAddress address;
82 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &address));
83 EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(address));
84 EXPECT_EQ("192.168.0.1", address.ToString());
85 }
86
87 // Test parsing an IPv6 literal.
88 TEST(IPAddressTest, FromIPLiteral_IPv6) {
89 IPAddress address;
90 EXPECT_TRUE(IPAddress::FromIPLiteral("1:abcd::3:4:ff", &address));
91 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255",
92 IPAddressTest::DumpIPAddress(address));
93 EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
94 }
95
96 // Test mapping an IPv4 address to an IPv6 address.
97 TEST(IPAddressTest, ConvertIPv4ToIPv6) {
98 IPAddress ipv4_address;
99 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address));
100
101 IPAddress ipv6_address = IPAddress::ConvertIPv4ToIPv6(ipv4_address);
102
103 // ::ffff:192.168.0.1
104 EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
105 IPAddressTest::DumpIPAddress(ipv6_address));
106 EXPECT_EQ("::ffff:c0a8:1", ipv6_address.ToString());
107 }
108
109 TEST(IPAddressTest, FromURLHostname_FailParse) {
110 IPAddress address;
111
112 EXPECT_FALSE(IPAddress::FromURLHostname("bad value", &address));
113 EXPECT_FALSE(IPAddress::FromURLHostname("bad:value", &address));
114 EXPECT_FALSE(IPAddress::FromURLHostname(std::string(), &address));
115 EXPECT_FALSE(IPAddress::FromURLHostname("192.168.0.1:30", &address));
116 EXPECT_FALSE(IPAddress::FromURLHostname(" 192.168.0.1 ", &address));
117 EXPECT_FALSE(IPAddress::FromURLHostname("::1", &address));
118 }
119
120 TEST(IPAddressTest, FromURLHostname_IPv4) {
121 IPAddress address;
122 EXPECT_TRUE(IPAddress::FromURLHostname("192.168.0.1", &address));
123 EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(address));
124 EXPECT_EQ("192.168.0.1", address.ToString());
125 }
126
127 TEST(IPAddressTest, FromURLHostname_IPv6) {
128 IPAddress address;
129 EXPECT_TRUE(IPAddress::FromURLHostname("[1:abcd::3:4:ff]", &address));
130 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255",
131 IPAddressTest::DumpIPAddress(address));
132 EXPECT_EQ("1:abcd::3:4:ff", address.ToString());
133 }
134
135 TEST(IPAddressTest, IsIPv4Mapped) {
136 IPAddress ipv4_address;
137 EXPECT_TRUE(IPAddress::FromIPLiteral("192.168.0.1", &ipv4_address));
138 EXPECT_FALSE(ipv4_address.IsIPv4Mapped());
139
140 IPAddress ipv6_address;
141 EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv4_address));
142 EXPECT_FALSE(ipv6_address.IsIPv4Mapped());
143
144 IPAddress ipv4mapped_address;
145 EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address));
146 EXPECT_TRUE(ipv4mapped_address.IsIPv4Mapped());
147 }
148
149 TEST(IPAddressTest, ConvertIPv4MappedToIPv4) {
150 IPAddress ipv4mapped_address;
151 EXPECT_TRUE(IPAddress::FromIPLiteral("::ffff:0101:1", &ipv4mapped_address));
152 IPAddress expected;
153 EXPECT_TRUE(IPAddress::FromIPLiteral("1.1.0.1", &expected));
154 IPAddress result = IPAddress::ConvertIPv4MappedToIPv4(ipv4mapped_address);
155 EXPECT_EQ(expected.ToString(), result.ToString());
156 }
157
158 // Test parsing invalid CIDR notation literals.
159 TEST(IPAddressTest, FromCIDRBlock_Invalid) {
160 const char* const bad_literals[] = {"foobar",
161 "",
162 "192.168.0.1",
163 "::1",
164 "/",
165 "/1",
166 "1",
167 "192.168.1.1/-1",
168 "192.168.1.1/33",
169 "::1/-3",
170 "a::3/129",
171 "::1/x",
172 "192.168.0.1//11"};
173
174 for (size_t i = 0; i < arraysize(bad_literals); ++i) {
175 IPAddress ip_address;
176 size_t prefix_length_in_bits;
177
178 EXPECT_FALSE(IPAddress::FromCIDRBlock(bad_literals[i], &ip_address,
179 &prefix_length_in_bits));
180 }
181 }
182
183 // Test parsing a valid CIDR notation literal.
184 TEST(IPAddressTest, FromCIDRBlock_Valid) {
185 IPAddress ip_address;
186 size_t prefix_length_in_bits;
187
188 EXPECT_TRUE(IPAddress::FromCIDRBlock("192.168.0.1/11", &ip_address,
189 &prefix_length_in_bits));
190
191 EXPECT_EQ("192,168,0,1", IPAddressTest::DumpIPAddress(ip_address));
192 EXPECT_EQ(11u, prefix_length_in_bits);
193 }
194
195 TEST(IPAddressTest, MatchesPrefix) {
196 struct {
197 const char* const cidr_literal;
198 const char* const ip_literal;
199 bool expected_to_match;
200 } tests[] = {
201 // IPv4 prefix with IPv4 inputs.
202 {"10.10.1.32/27", "10.10.1.44", true},
203 {"10.10.1.32/27", "10.10.1.90", false},
204 {"10.10.1.32/27", "10.10.1.90", false},
205
206 // IPv6 prefix with IPv6 inputs.
207 {"2001:db8::/32", "2001:DB8:3:4::5", true},
208 {"2001:db8::/32", "2001:c8::", false},
209
210 // IPv6 prefix with IPv4 inputs.
211 {"2001:db8::/33", "192.168.0.1", false},
212 {"::ffff:192.168.0.1/112", "192.168.33.77", true},
213
214 // IPv4 prefix with IPv6 inputs.
215 {"10.11.33.44/16", "::ffff:0a0b:89", true},
216 {"10.11.33.44/16", "::ffff:10.12.33.44", false},
217 };
218 for (size_t i = 0; i < arraysize(tests); ++i) {
219 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i,
220 tests[i].cidr_literal,
221 tests[i].ip_literal));
222
223 IPAddress ip_address;
224 EXPECT_TRUE(IPAddress::FromIPLiteral(tests[i].ip_literal, &ip_address));
225
226 IPAddress ip_prefix;
227 size_t prefix_length_in_bits;
228
229 EXPECT_TRUE(IPAddress::FromCIDRBlock(tests[i].cidr_literal, &ip_prefix,
230 &prefix_length_in_bits));
231
232 EXPECT_EQ(tests[i].expected_to_match,
233 ip_address.MatchesPrefix(ip_prefix, prefix_length_in_bits));
234 }
235 }
236
237 TEST(IPAddressTest, AddressFamily) {
238 IPAddress ipv4_address;
239 EXPECT_TRUE(IPAddress::FromIPLiteral("1.1.0.1", &ipv4_address));
240 EXPECT_EQ(ADDRESS_FAMILY_IPV4, ipv4_address.GetAddressFamily());
241
242 IPAddress ipv6_address;
243 EXPECT_TRUE(IPAddress::FromIPLiteral("::1", &ipv6_address));
244 EXPECT_EQ(ADDRESS_FAMILY_IPV6, ipv6_address.GetAddressFamily());
245 }
246
247 TEST(IPAddressTest, IsEqual) {
248 IPAddress ip_address1;
249 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1));
250 IPAddress ip_address2;
251 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2));
252 IPAddress ip_address3;
253 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3));
254
255 EXPECT_FALSE(ip_address1 == ip_address2);
256 EXPECT_TRUE(ip_address1 == ip_address3);
257
258 EXPECT_TRUE(ip_address1 != ip_address2);
259 EXPECT_FALSE(ip_address1 != ip_address3);
260 }
261
262 TEST(IPAddressTest, LessThan) {
263 // IPv4 vs IPv6
264 IPAddress ip_address1;
265 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1));
266 IPAddress ip_address2;
267 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2));
268 EXPECT_TRUE(ip_address1 < ip_address2);
269 EXPECT_FALSE(ip_address2 < ip_address1);
270
271 // Compare equivalent addresses.
272 IPAddress ip_address3;
273 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3));
274 EXPECT_FALSE(ip_address1 < ip_address3);
275 EXPECT_FALSE(ip_address3 < ip_address1);
276 }
277
278 TEST(IPAddressTest, MoreThan) {
279 // IPv4 vs IPv6
280 IPAddress ip_address1;
281 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address1));
282 IPAddress ip_address2;
283 EXPECT_TRUE(IPAddress::FromIPLiteral("2001:db8:0::42", &ip_address2));
284 EXPECT_FALSE(ip_address1 > ip_address2);
285 EXPECT_TRUE(ip_address2 > ip_address1);
286
287 // Compare equivalent addresses.
288 IPAddress ip_address3;
289 EXPECT_TRUE(IPAddress::FromIPLiteral("127.0.0.1", &ip_address3));
290 EXPECT_FALSE(ip_address1 > ip_address3);
291 EXPECT_FALSE(ip_address3 > ip_address1);
292 }
293
294 } // anonymous namespace
295
296 } // namespace net
OLDNEW
« net/base/ip_address.h ('K') | « net/base/ip_address.cc ('k') | net/base/ip_endpoint.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698