3
* Copyright 2004--2011, Google Inc.
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions are met:
8
* 1. Redistributions of source code must retain the above copyright notice,
9
* this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright notice,
11
* this list of conditions and the following disclaimer in the documentation
12
* and/or other materials provided with the distribution.
13
* 3. The name of the author may not be used to endorse or promote products
14
* derived from this software without specific prior written permission.
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#include "talk/base/gunit.h"
29
#include "talk/base/ipaddress.h"
33
static const unsigned int kIPv4AddrSize = 4;
34
static const unsigned int kIPv6AddrSize = 16;
35
static const unsigned int kIPv4RFC1918Addr = 0xC0A80701;
36
static const unsigned int kIPv4PublicAddr = 0x01020304;
37
static const in6_addr kIPv6LinkLocalAddr = {{{0xfe, 0x80, 0x00, 0x00,
38
0x00, 0x00, 0x00, 0x00,
39
0xbe, 0x30, 0x5b, 0xff,
40
0xfe, 0xe5, 0x00, 0xc3}}};
41
static const in6_addr kIPv6PublicAddr = {{{0x24, 0x01, 0xfa, 0x00,
42
0x00, 0x04, 0x10, 0x00,
43
0xbe, 0x30, 0x5b, 0xff,
44
0xfe, 0xe5, 0x00, 0xc3}}};
45
static const in6_addr kIPv6CompatAddr = {{{0x00, 0x00, 0x00, 0x00,
46
0x00, 0x00, 0x00, 0x00,
47
0x00, 0x00, 0x00, 0x00,
48
0xfe, 0xe5, 0x00, 0xc3}}};
49
static const in6_addr kIPv4MappedAnyAddr = {{{0x00, 0x00, 0x00, 0x00,
50
0x00, 0x00, 0x00, 0x00,
51
0x00, 0x00, 0xff, 0xff,
52
0x00, 0x00, 0x00, 0x00}}};
53
static const in6_addr kIPv4MappedLoopbackAddr = {{{0x00, 0x00, 0x00, 0x00,
54
0x00, 0x00, 0x00, 0x00,
55
0x00, 0x00, 0xff, 0xff,
56
0x7f, 0x00, 0x00, 0x01}}};
57
static const in6_addr kIPv4MappedRFC1918Addr = {{{0x00, 0x00, 0x00, 0x00,
58
0x00, 0x00, 0x00, 0x00,
59
0x00, 0x00, 0xff, 0xff,
60
0xc0, 0xa8, 0x07, 0x01}}};
61
static const in6_addr kIPv4MappedPublicAddr = {{{0x00, 0x00, 0x00, 0x00,
62
0x00, 0x00, 0x00, 0x00,
63
0x00, 0x00, 0xff, 0xff,
64
0x01, 0x02, 0x03, 0x04}}};
65
static const in6_addr kIPv6AllNodes = {{{0xff, 0x02, 0x00, 0x00,
66
0x00, 0x00, 0x00, 0x00,
67
0x00, 0x00, 0x00, 0x00,
68
0x00, 0x00, 0x00, 0x01}}};
70
static const std::string kIPv4AnyAddrString = "0.0.0.0";
71
static const std::string kIPv4LoopbackAddrString = "127.0.0.1";
72
static const std::string kIPv4RFC1918AddrString = "192.168.7.1";
73
static const std::string kIPv4PublicAddrString = "1.2.3.4";
74
static const std::string kIPv6AnyAddrString = "::";
75
static const std::string kIPv6LoopbackAddrString = "::1";
76
static const std::string kIPv6LinkLocalAddrString = "fe80::be30:5bff:fee5:c3";
77
static const std::string kIPv6PublicAddrString =
78
"2401:fa00:4:1000:be30:5bff:fee5:c3";
79
static const std::string kIPv4MappedAnyAddrString = "::ffff:0:0";
80
static const std::string kIPv4MappedRFC1918AddrString = "::ffff:c0a8:701";
81
static const std::string kIPv4MappedLoopbackAddrString = "::ffff:7f00:1";
82
static const std::string kIPv4MappedPublicAddrString = "::ffff:102:0304";
83
static const std::string kIPv4MappedV4StyleAddrString = "::ffff:192.168.7.1";
85
static const std::string kIPv4BrokenString1 = "192.168.7.";
86
static const std::string kIPv4BrokenString2 = "192.168.7.1.1";
87
static const std::string kIPv4BrokenString3 = "192.168.7.1:80";
88
static const std::string kIPv4BrokenString4 = "192.168.7.ONE";
89
static const std::string kIPv4BrokenString5 = "-192.168.7.1";
90
static const std::string kIPv4BrokenString6 = "256.168.7.1";
91
static const std::string kIPv6BrokenString1 = "2401:fa00:4:1000:be30";
92
static const std::string kIPv6BrokenString2 =
93
"2401:fa00:4:1000:be30:5bff:fee5:c3:1";
94
static const std::string kIPv6BrokenString3 =
95
"[2401:fa00:4:1000:be30:5bff:fee5:c3]:1";
96
static const std::string kIPv6BrokenString4 =
98
static const std::string kIPv6BrokenString5 =
100
static const std::string kIPv6BrokenString6 =
101
"2401f:fa00:4:1000:be30:5bff:fee5:c3";
102
static const std::string kIPv6BrokenString7 =
103
"2401:ga00:4:1000:be30:5bff:fee5:c3";
104
static const std::string kIPv6BrokenString8 =
105
"2401:fa000:4:1000:be30:5bff:fee5:c3";
106
static const std::string kIPv6BrokenString9 =
107
"2401:fal0:4:1000:be30:5bff:fee5:c3";
108
static const std::string kIPv6BrokenString10 =
110
static const std::string kIPv6BrokenString11 =
111
"::ffff:192.168.7.1.1.1";
112
static const std::string kIPv6BrokenString12 =
113
"::fffe:192.168.7.1";
114
static const std::string kIPv6BrokenString13 =
115
"::ffff:192.168.7.ff";
116
static const std::string kIPv6BrokenString14 =
117
"0x2401:fa00:4:1000:be30:5bff:fee5:c3";
119
bool IPFromHostEntWorks(const std::string& name, int expected_family,
120
IPAddress expected_addr) {
121
struct hostent* ent = gethostbyname(name.c_str());
124
if (!IPFromHostEnt(ent, &addr)) {
127
return addr == expected_addr;
132
bool AreEqual(const IPAddress& addr,
133
const IPAddress& addr2) {
134
if ((IPIsAny(addr) != IPIsAny(addr2)) ||
135
(IPIsLoopback(addr) != IPIsLoopback(addr2)) ||
136
(IPIsPrivate(addr) != IPIsPrivate(addr2)) ||
137
(HashIP(addr) != HashIP(addr2)) ||
138
(addr.Size() != addr2.Size()) ||
139
(addr.family() != addr2.family()) ||
140
(addr.ToString() != addr2.ToString())) {
143
in_addr v4addr, v4addr2;
144
v4addr = addr.ipv4_address();
145
v4addr2 = addr2.ipv4_address();
146
if (0 != memcmp(&v4addr, &v4addr2, sizeof(v4addr))) {
149
in6_addr v6addr, v6addr2;
150
v6addr = addr.ipv6_address();
151
v6addr2 = addr2.ipv6_address();
152
if (0 != memcmp(&v6addr, &v6addr2, sizeof(v6addr))) {
158
bool BrokenIPStringFails(const std::string& broken) {
159
IPAddress addr(0); // Intentionally make it v4.
160
if (IPFromString(kIPv4BrokenString1, &addr)) {
163
return addr.family() == AF_UNSPEC;
166
bool CheckMaskCount(const std::string& mask, int expected_length) {
168
return IPFromString(mask, &addr) &&
169
(expected_length == CountIPMaskBits(addr));
172
bool CheckTruncateIP(const std::string& initial, int truncate_length,
173
const std::string& expected_result) {
174
IPAddress addr, expected;
175
IPFromString(initial, &addr);
176
IPFromString(expected_result, &expected);
177
IPAddress truncated = TruncateIP(addr, truncate_length);
178
return truncated == expected;
181
TEST(IPAddressTest, TestDefaultCtor) {
183
EXPECT_FALSE(IPIsAny(addr));
184
EXPECT_FALSE(IPIsLoopback(addr));
185
EXPECT_FALSE(IPIsPrivate(addr));
187
EXPECT_EQ(0U, addr.Size());
188
EXPECT_EQ(AF_UNSPEC, addr.family());
189
EXPECT_EQ("", addr.ToString());
192
TEST(IPAddressTest, TestInAddrCtor) {
195
// Test V4 Any address.
196
v4addr.s_addr = INADDR_ANY;
197
IPAddress addr(v4addr);
198
EXPECT_TRUE(IPIsAny(addr));
199
EXPECT_FALSE(IPIsLoopback(addr));
200
EXPECT_FALSE(IPIsPrivate(addr));
201
EXPECT_EQ(kIPv4AddrSize, addr.Size());
202
EXPECT_EQ(kIPv4AnyAddrString, addr.ToString());
204
// Test a V4 loopback address.
205
v4addr.s_addr = htonl(INADDR_LOOPBACK);
206
addr = IPAddress(v4addr);
207
EXPECT_FALSE(IPIsAny(addr));
208
EXPECT_TRUE(IPIsLoopback(addr));
209
EXPECT_TRUE(IPIsPrivate(addr));
210
EXPECT_EQ(kIPv4AddrSize, addr.Size());
211
EXPECT_EQ(kIPv4LoopbackAddrString, addr.ToString());
213
// Test an RFC1918 address.
214
v4addr.s_addr = htonl(kIPv4RFC1918Addr);
215
addr = IPAddress(v4addr);
216
EXPECT_FALSE(IPIsAny(addr));
217
EXPECT_FALSE(IPIsLoopback(addr));
218
EXPECT_TRUE(IPIsPrivate(addr));
219
EXPECT_EQ(kIPv4AddrSize, addr.Size());
220
EXPECT_EQ(kIPv4RFC1918AddrString, addr.ToString());
222
// Test a 'normal' v4 address.
223
v4addr.s_addr = htonl(kIPv4PublicAddr);
224
addr = IPAddress(v4addr);
225
EXPECT_FALSE(IPIsAny(addr));
226
EXPECT_FALSE(IPIsLoopback(addr));
227
EXPECT_FALSE(IPIsPrivate(addr));
228
EXPECT_EQ(kIPv4AddrSize, addr.Size());
229
EXPECT_EQ(kIPv4PublicAddrString, addr.ToString());
232
TEST(IPAddressTest, TestInAddr6Ctor) {
234
IPAddress addr(in6addr_any);
235
EXPECT_TRUE(IPIsAny(addr));
236
EXPECT_FALSE(IPIsLoopback(addr));
237
EXPECT_FALSE(IPIsPrivate(addr));
238
EXPECT_EQ(kIPv6AddrSize, addr.Size());
239
EXPECT_EQ(kIPv6AnyAddrString, addr.ToString());
242
addr = IPAddress(in6addr_loopback);
243
EXPECT_FALSE(IPIsAny(addr));
244
EXPECT_TRUE(IPIsLoopback(addr));
245
EXPECT_TRUE(IPIsPrivate(addr));
246
EXPECT_EQ(kIPv6AddrSize, addr.Size());
247
EXPECT_EQ(kIPv6LoopbackAddrString, addr.ToString());
249
// Test v6 link-local.
250
addr = IPAddress(kIPv6LinkLocalAddr);
251
EXPECT_FALSE(IPIsAny(addr));
252
EXPECT_FALSE(IPIsLoopback(addr));
253
EXPECT_TRUE(IPIsPrivate(addr));
254
EXPECT_EQ(kIPv6AddrSize, addr.Size());
255
EXPECT_EQ(kIPv6LinkLocalAddrString, addr.ToString());
257
// Test v6 global address.
258
addr = IPAddress(kIPv6PublicAddr);
259
EXPECT_FALSE(IPIsAny(addr));
260
EXPECT_FALSE(IPIsLoopback(addr));
261
EXPECT_FALSE(IPIsPrivate(addr));
262
EXPECT_EQ(kIPv6AddrSize, addr.Size());
263
EXPECT_EQ(kIPv6PublicAddrString, addr.ToString());
266
TEST(IPAddressTest, TestUint32Ctor) {
267
// Test V4 Any address.
269
EXPECT_TRUE(IPIsAny(addr));
270
EXPECT_FALSE(IPIsLoopback(addr));
271
EXPECT_FALSE(IPIsPrivate(addr));
272
EXPECT_EQ(kIPv4AddrSize, addr.Size());
273
EXPECT_EQ(kIPv4AnyAddrString, addr.ToString());
275
// Test a V4 loopback address.
276
addr = IPAddress(INADDR_LOOPBACK);
277
EXPECT_FALSE(IPIsAny(addr));
278
EXPECT_TRUE(IPIsLoopback(addr));
279
EXPECT_TRUE(IPIsPrivate(addr));
280
EXPECT_EQ(kIPv4AddrSize, addr.Size());
281
EXPECT_EQ(kIPv4LoopbackAddrString, addr.ToString());
283
// Test an RFC1918 address.
284
addr = IPAddress(kIPv4RFC1918Addr);
285
EXPECT_FALSE(IPIsAny(addr));
286
EXPECT_FALSE(IPIsLoopback(addr));
287
EXPECT_TRUE(IPIsPrivate(addr));
288
EXPECT_EQ(kIPv4AddrSize, addr.Size());
289
EXPECT_EQ(kIPv4RFC1918AddrString, addr.ToString());
291
// Test a 'normal' v4 address.
292
addr = IPAddress(kIPv4PublicAddr);
293
EXPECT_FALSE(IPIsAny(addr));
294
EXPECT_FALSE(IPIsLoopback(addr));
295
EXPECT_FALSE(IPIsPrivate(addr));
296
EXPECT_EQ(kIPv4AddrSize, addr.Size());
297
EXPECT_EQ(kIPv4PublicAddrString, addr.ToString());
300
TEST(IPAddressTest, TestHostEntCtor) {
301
IPAddress addr(INADDR_LOOPBACK);
302
EXPECT_PRED3(IPFromHostEntWorks, "localhost", AF_INET, addr);
304
addr = IPAddress(kIPv6AllNodes);
305
EXPECT_PRED3(IPFromHostEntWorks, "ip6-allnodes", AF_INET6, addr);
307
// gethostbyname works for literal addresses too
308
addr = IPAddress(INADDR_ANY);
309
EXPECT_PRED3(IPFromHostEntWorks,
310
kIPv4AnyAddrString, AF_INET, addr);
311
addr = IPAddress(kIPv4RFC1918Addr);
312
EXPECT_PRED3(IPFromHostEntWorks,
313
kIPv4RFC1918AddrString, AF_INET, addr);
314
addr = IPAddress(kIPv4PublicAddr);
315
EXPECT_PRED3(IPFromHostEntWorks,
316
kIPv4PublicAddrString, AF_INET, addr);
318
addr = IPAddress(in6addr_any);
319
EXPECT_PRED3(IPFromHostEntWorks,
320
kIPv6AnyAddrString, AF_INET6, addr);
321
addr = IPAddress(in6addr_loopback);
322
EXPECT_PRED3(IPFromHostEntWorks,
323
kIPv6LoopbackAddrString, AF_INET6, addr);
324
addr = IPAddress(kIPv6LinkLocalAddr);
325
EXPECT_PRED3(IPFromHostEntWorks,
326
kIPv6LinkLocalAddrString, AF_INET6, addr);
327
addr = IPAddress(kIPv6PublicAddr);
328
EXPECT_PRED3(IPFromHostEntWorks,
329
kIPv6PublicAddrString, AF_INET6, addr);
332
TEST(IPAddressTest, TestCopyCtor) {
334
v4addr.s_addr = htonl(kIPv4PublicAddr);
335
IPAddress addr(v4addr);
336
IPAddress addr2(addr);
338
EXPECT_PRED2(AreEqual, addr, addr2);
340
addr = IPAddress(INADDR_ANY);
341
addr2 = IPAddress(addr);
342
EXPECT_PRED2(AreEqual, addr, addr2);
344
addr = IPAddress(INADDR_LOOPBACK);
345
addr2 = IPAddress(addr);
346
EXPECT_PRED2(AreEqual, addr, addr2);
348
addr = IPAddress(kIPv4PublicAddr);
349
addr2 = IPAddress(addr);
350
EXPECT_PRED2(AreEqual, addr, addr2);
352
addr = IPAddress(kIPv4RFC1918Addr);
353
addr2 = IPAddress(addr);
354
EXPECT_PRED2(AreEqual, addr, addr2);
356
addr = IPAddress(in6addr_any);
357
addr2 = IPAddress(addr);
358
EXPECT_PRED2(AreEqual, addr, addr2);
360
addr = IPAddress(in6addr_loopback);
361
addr2 = IPAddress(addr);
362
EXPECT_PRED2(AreEqual, addr, addr2);
364
addr = IPAddress(kIPv6LinkLocalAddr);
365
addr2 = IPAddress(addr);
366
EXPECT_PRED2(AreEqual, addr, addr2);
368
addr = IPAddress(kIPv6PublicAddr);
369
addr2 = IPAddress(addr);
370
EXPECT_PRED2(AreEqual, addr, addr2);
373
TEST(IPAddressTest, TestEquality) {
375
in_addr v4addr, v4addr2;
376
v4addr.s_addr = htonl(kIPv4PublicAddr);
377
v4addr2.s_addr = htonl(kIPv4PublicAddr + 1);
378
IPAddress addr(v4addr);
379
IPAddress addr2(v4addr2);
380
IPAddress addr3(v4addr);
382
EXPECT_TRUE(addr == addr);
383
EXPECT_TRUE(addr2 == addr2);
384
EXPECT_TRUE(addr3 == addr3);
385
EXPECT_TRUE(addr == addr3);
386
EXPECT_TRUE(addr3 == addr);
387
EXPECT_FALSE(addr2 == addr);
388
EXPECT_FALSE(addr2 == addr3);
389
EXPECT_FALSE(addr == addr2);
390
EXPECT_FALSE(addr3 == addr2);
393
IPAddress addr4(kIPv6PublicAddr);
394
IPAddress addr5(kIPv6LinkLocalAddr);
395
IPAddress addr6(kIPv6PublicAddr);
397
EXPECT_TRUE(addr4 == addr4);
398
EXPECT_TRUE(addr5 == addr5);
399
EXPECT_TRUE(addr4 == addr6);
400
EXPECT_TRUE(addr6 == addr4);
401
EXPECT_FALSE(addr4 == addr5);
402
EXPECT_FALSE(addr5 == addr4);
403
EXPECT_FALSE(addr6 == addr5);
404
EXPECT_FALSE(addr5 == addr6);
406
// Check v4/v6 cross-equality
407
EXPECT_FALSE(addr == addr4);
408
EXPECT_FALSE(addr == addr5);
409
EXPECT_FALSE(addr == addr6);
410
EXPECT_FALSE(addr4 == addr);
411
EXPECT_FALSE(addr5 == addr);
412
EXPECT_FALSE(addr6 == addr);
413
EXPECT_FALSE(addr2 == addr4);
414
EXPECT_FALSE(addr2 == addr5);
415
EXPECT_FALSE(addr2 == addr6);
416
EXPECT_FALSE(addr4 == addr2);
417
EXPECT_FALSE(addr5 == addr2);
418
EXPECT_FALSE(addr6 == addr2);
419
EXPECT_FALSE(addr3 == addr4);
420
EXPECT_FALSE(addr3 == addr5);
421
EXPECT_FALSE(addr3 == addr6);
422
EXPECT_FALSE(addr4 == addr3);
423
EXPECT_FALSE(addr5 == addr3);
424
EXPECT_FALSE(addr6 == addr3);
426
// Special cases: loopback and any.
427
// They're special but they're still not equal.
428
IPAddress v4loopback(htonl(INADDR_LOOPBACK));
429
IPAddress v6loopback(in6addr_loopback);
430
EXPECT_FALSE(v4loopback == v6loopback);
433
IPAddress v6any(in6addr_any);
434
EXPECT_FALSE(v4any == v6any);
437
TEST(IPAddressTest, TestComparison) {
438
// Defined in 'ascending' order.
439
// v6 > v4, and intra-family sorting is purely numerical
440
IPAddress addr0; // AF_UNSPEC
441
IPAddress addr1(INADDR_ANY); // 0.0.0.0
442
IPAddress addr2(kIPv4PublicAddr); // 1.2.3.4
443
IPAddress addr3(INADDR_LOOPBACK); // 127.0.0.1
444
IPAddress addr4(kIPv4RFC1918Addr); // 192.168.7.1.
445
IPAddress addr5(in6addr_any); // ::
446
IPAddress addr6(in6addr_loopback); // ::1
447
IPAddress addr7(kIPv6PublicAddr); // 2401....
448
IPAddress addr8(kIPv6LinkLocalAddr); // fe80....
450
EXPECT_TRUE(addr0 < addr1);
451
EXPECT_TRUE(addr1 < addr2);
452
EXPECT_TRUE(addr2 < addr3);
453
EXPECT_TRUE(addr3 < addr4);
454
EXPECT_TRUE(addr4 < addr5);
455
EXPECT_TRUE(addr5 < addr6);
456
EXPECT_TRUE(addr6 < addr7);
457
EXPECT_TRUE(addr7 < addr8);
459
EXPECT_FALSE(addr0 > addr1);
460
EXPECT_FALSE(addr1 > addr2);
461
EXPECT_FALSE(addr2 > addr3);
462
EXPECT_FALSE(addr3 > addr4);
463
EXPECT_FALSE(addr4 > addr5);
464
EXPECT_FALSE(addr5 > addr6);
465
EXPECT_FALSE(addr6 > addr7);
466
EXPECT_FALSE(addr7 > addr8);
468
EXPECT_FALSE(addr0 > addr0);
469
EXPECT_FALSE(addr1 > addr1);
470
EXPECT_FALSE(addr2 > addr2);
471
EXPECT_FALSE(addr3 > addr3);
472
EXPECT_FALSE(addr4 > addr4);
473
EXPECT_FALSE(addr5 > addr5);
474
EXPECT_FALSE(addr6 > addr6);
475
EXPECT_FALSE(addr7 > addr7);
476
EXPECT_FALSE(addr8 > addr8);
478
EXPECT_FALSE(addr0 < addr0);
479
EXPECT_FALSE(addr1 < addr1);
480
EXPECT_FALSE(addr2 < addr2);
481
EXPECT_FALSE(addr3 < addr3);
482
EXPECT_FALSE(addr4 < addr4);
483
EXPECT_FALSE(addr5 < addr5);
484
EXPECT_FALSE(addr6 < addr6);
485
EXPECT_FALSE(addr7 < addr7);
486
EXPECT_FALSE(addr8 < addr8);
489
TEST(IPAddressTest, TestFromString) {
492
addr2 = IPAddress(INADDR_ANY);
494
EXPECT_TRUE(IPFromString(kIPv4AnyAddrString, &addr));
495
EXPECT_EQ(addr.ToString(), kIPv4AnyAddrString);
496
EXPECT_PRED2(AreEqual, addr, addr2);
498
addr2 = IPAddress(INADDR_LOOPBACK);
499
EXPECT_TRUE(IPFromString(kIPv4LoopbackAddrString, &addr));
500
EXPECT_EQ(addr.ToString(), kIPv4LoopbackAddrString);
501
EXPECT_PRED2(AreEqual, addr, addr2);
503
addr2 = IPAddress(kIPv4RFC1918Addr);
504
EXPECT_TRUE(IPFromString(kIPv4RFC1918AddrString, &addr));
505
EXPECT_EQ(addr.ToString(), kIPv4RFC1918AddrString);
506
EXPECT_PRED2(AreEqual, addr, addr2);
508
addr2 = IPAddress(kIPv4PublicAddr);
509
EXPECT_TRUE(IPFromString(kIPv4PublicAddrString, &addr));
510
EXPECT_EQ(addr.ToString(), kIPv4PublicAddrString);
511
EXPECT_PRED2(AreEqual, addr, addr2);
513
addr2 = IPAddress(in6addr_any);
514
EXPECT_TRUE(IPFromString(kIPv6AnyAddrString, &addr));
515
EXPECT_EQ(addr.ToString(), kIPv6AnyAddrString);
516
EXPECT_PRED2(AreEqual, addr, addr2);
518
addr2 = IPAddress(in6addr_loopback);
519
EXPECT_TRUE(IPFromString(kIPv6LoopbackAddrString, &addr));
520
EXPECT_EQ(addr.ToString(), kIPv6LoopbackAddrString);
521
EXPECT_PRED2(AreEqual, addr, addr2);
523
addr2 = IPAddress(kIPv6LinkLocalAddr);
524
EXPECT_TRUE(IPFromString(kIPv6LinkLocalAddrString, &addr));
525
EXPECT_EQ(addr.ToString(), kIPv6LinkLocalAddrString);
526
EXPECT_PRED2(AreEqual, addr, addr2);
528
addr2 = IPAddress(kIPv6PublicAddr);
529
EXPECT_TRUE(IPFromString(kIPv6PublicAddrString, &addr));
530
EXPECT_EQ(addr.ToString(), kIPv6PublicAddrString);
531
EXPECT_PRED2(AreEqual, addr, addr2);
533
addr2 = IPAddress(kIPv4MappedRFC1918Addr);
534
EXPECT_TRUE(IPFromString(kIPv4MappedV4StyleAddrString, &addr));
535
EXPECT_PRED2(AreEqual, addr, addr2);
537
// Broken cases, should set addr to AF_UNSPEC.
538
EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString1);
539
EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString2);
540
EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString3);
541
EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString4);
542
EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString5);
543
EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString6);
544
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString1);
545
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString2);
546
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString3);
547
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString4);
548
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString5);
549
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString6);
550
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString7);
551
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString8);
552
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString9);
553
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString10);
554
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString11);
555
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString12);
556
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString13);
557
EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString14);
560
TEST(IPAddressTest, TestIsPrivate) {
561
EXPECT_FALSE(IPIsPrivate(IPAddress(INADDR_ANY)));
562
EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4PublicAddr)));
563
EXPECT_FALSE(IPIsPrivate(IPAddress(in6addr_any)));
564
EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv6PublicAddr)));
565
EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4MappedAnyAddr)));
566
EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4MappedPublicAddr)));
568
EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv4RFC1918Addr)));
569
EXPECT_TRUE(IPIsPrivate(IPAddress(INADDR_LOOPBACK)));
570
EXPECT_TRUE(IPIsPrivate(IPAddress(in6addr_loopback)));
571
EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv6LinkLocalAddr)));
574
TEST(IPAddressTest, TestIsLoopback) {
575
EXPECT_FALSE(IPIsLoopback(IPAddress(INADDR_ANY)));
576
EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4PublicAddr)));
577
EXPECT_FALSE(IPIsLoopback(IPAddress(in6addr_any)));
578
EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv6PublicAddr)));
579
EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4MappedAnyAddr)));
580
EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4MappedPublicAddr)));
582
EXPECT_TRUE(IPIsLoopback(IPAddress(INADDR_LOOPBACK)));
583
EXPECT_TRUE(IPIsLoopback(IPAddress(in6addr_loopback)));
586
TEST(IPAddressTest, TestNormalized) {
587
// Check normalizing a ::ffff:a.b.c.d address.
589
EXPECT_TRUE(IPFromString(kIPv4MappedV4StyleAddrString, &addr));
590
IPAddress addr2(kIPv4RFC1918Addr);
591
addr = addr.Normalized();
592
EXPECT_EQ(addr2, addr);
594
// Check normalizing a ::ffff:aabb:ccdd address.
595
addr = IPAddress(kIPv4MappedPublicAddr);
596
addr2 = IPAddress(kIPv4PublicAddr);
597
addr = addr.Normalized();
598
EXPECT_EQ(addr, addr2);
600
// Check that a non-mapped v6 addresses isn't altered.
601
addr = IPAddress(kIPv6PublicAddr);
602
addr2 = IPAddress(kIPv6PublicAddr);
603
addr = addr.Normalized();
604
EXPECT_EQ(addr, addr2);
606
// Check that addresses that look a bit like mapped addresses aren't altered
607
EXPECT_TRUE(IPFromString("fe80::ffff:0102:0304", &addr));
609
addr = addr.Normalized();
610
EXPECT_EQ(addr, addr2);
611
EXPECT_TRUE(IPFromString("::0102:0304", &addr));
613
addr = addr.Normalized();
614
EXPECT_EQ(addr, addr2);
615
// This string should 'work' as an IP address but is not a mapped address,
616
// so it shouldn't change on normalization.
617
EXPECT_TRUE(IPFromString("::192.168.7.1", &addr));
619
addr = addr.Normalized();
620
EXPECT_EQ(addr, addr2);
622
// Check that v4 addresses aren't altered.
623
addr = IPAddress(htonl(kIPv4PublicAddr));
624
addr2 = IPAddress(htonl(kIPv4PublicAddr));
625
addr = addr.Normalized();
626
EXPECT_EQ(addr, addr2);
629
TEST(IPAddressTest, TestAsIPv6Address) {
630
IPAddress addr(kIPv4PublicAddr);
631
IPAddress addr2(kIPv4MappedPublicAddr);
632
addr = addr.AsIPv6Address();
633
EXPECT_EQ(addr, addr2);
635
addr = IPAddress(kIPv4MappedPublicAddr);
636
addr2 = IPAddress(kIPv4MappedPublicAddr);
637
addr = addr.AsIPv6Address();
638
EXPECT_EQ(addr, addr2);
640
addr = IPAddress(kIPv6PublicAddr);
641
addr2 = IPAddress(kIPv6PublicAddr);
642
addr = addr.AsIPv6Address();
643
EXPECT_EQ(addr, addr2);
646
TEST(IPAddressTest, TestCountIPMaskBits) {
648
// IPv4 on byte boundaries
649
EXPECT_PRED2(CheckMaskCount, "255.255.255.255", 32);
650
EXPECT_PRED2(CheckMaskCount, "255.255.255.0", 24);
651
EXPECT_PRED2(CheckMaskCount, "255.255.0.0", 16);
652
EXPECT_PRED2(CheckMaskCount, "255.0.0.0", 8);
653
EXPECT_PRED2(CheckMaskCount, "0.0.0.0", 0);
655
// IPv4 not on byte boundaries
656
EXPECT_PRED2(CheckMaskCount, "128.0.0.0", 1);
657
EXPECT_PRED2(CheckMaskCount, "224.0.0.0", 3);
658
EXPECT_PRED2(CheckMaskCount, "255.248.0.0", 13);
659
EXPECT_PRED2(CheckMaskCount, "255.255.224.0", 19);
660
EXPECT_PRED2(CheckMaskCount, "255.255.255.252", 30);
662
// V6 on byte boundaries
663
EXPECT_PRED2(CheckMaskCount, "::", 0);
664
EXPECT_PRED2(CheckMaskCount, "ff00::", 8);
665
EXPECT_PRED2(CheckMaskCount, "ffff::", 16);
666
EXPECT_PRED2(CheckMaskCount, "ffff:ff00::", 24);
667
EXPECT_PRED2(CheckMaskCount, "ffff:ffff::", 32);
668
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ff00::", 40);
669
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff::", 48);
670
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ff00::", 56);
671
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff::", 64);
672
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ff00::", 72);
673
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff::", 80);
674
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ff00::", 88);
675
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff::", 96);
676
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ff00:0000", 104);
677
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000", 112);
678
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00", 120);
679
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 128);
681
// V6 not on byte boundaries.
682
EXPECT_PRED2(CheckMaskCount, "8000::", 1);
683
EXPECT_PRED2(CheckMaskCount, "ff80::", 9);
684
EXPECT_PRED2(CheckMaskCount, "ffff:fe00::", 23);
685
EXPECT_PRED2(CheckMaskCount, "ffff:fffe::", 31);
686
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:e000::", 35);
687
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffe0::", 43);
688
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:f800::", 53);
689
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:fff8::", 61);
690
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:fc00::", 70);
691
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:fffc::", 78);
692
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:8000::", 81);
693
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ff80::", 89);
694
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:fe00::", 103);
695
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:fffe:0000", 111);
696
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fc00", 118);
697
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc", 126);
699
// Non-contiguous ranges. These are kind-of invalid but lets test them
700
// to make sure they don't crash anything or infinite loop or something.
701
EXPECT_PRED2(CheckMaskCount, "217.0.0.0", 2);
702
EXPECT_PRED2(CheckMaskCount, "255.185.0.0", 9);
703
EXPECT_PRED2(CheckMaskCount, "255.255.251.0", 21);
704
EXPECT_PRED2(CheckMaskCount, "255.255.251.255", 21);
705
EXPECT_PRED2(CheckMaskCount, "255.255.254.201", 23);
706
EXPECT_PRED2(CheckMaskCount, "::1", 0);
707
EXPECT_PRED2(CheckMaskCount, "fe80::1", 7);
708
EXPECT_PRED2(CheckMaskCount, "ff80::1", 9);
709
EXPECT_PRED2(CheckMaskCount, "ffff::1", 16);
710
EXPECT_PRED2(CheckMaskCount, "ffff:ff00:1::1", 24);
711
EXPECT_PRED2(CheckMaskCount, "ffff:ffff::ffff:1", 32);
712
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ff00:1::", 40);
713
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff::ff00", 48);
714
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ff00:1234::", 56);
715
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:0012::ffff", 64);
716
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ff01::", 72);
717
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:7f00::", 80);
718
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ff7a::", 88);
719
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:7f00:0000", 96);
720
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ff70:0000", 104);
721
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0211", 112);
722
EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff7f", 120);
725
TEST(IPAddressTest, TestTruncateIP) {
726
EXPECT_PRED3(CheckTruncateIP, "255.255.255.255", 24, "255.255.255.0");
727
EXPECT_PRED3(CheckTruncateIP, "255.255.255.255", 16, "255.255.0.0");
728
EXPECT_PRED3(CheckTruncateIP, "255.255.255.255", 8, "255.0.0.0");
729
EXPECT_PRED3(CheckTruncateIP, "202.67.7.255", 24, "202.67.7.0");
730
EXPECT_PRED3(CheckTruncateIP, "202.129.65.205", 16, "202.129.0.0");
731
EXPECT_PRED3(CheckTruncateIP, "55.25.2.77", 8, "55.0.0.0");
732
EXPECT_PRED3(CheckTruncateIP, "74.128.99.254", 1, "0.0.0.0");
733
EXPECT_PRED3(CheckTruncateIP, "106.55.99.254", 3, "96.0.0.0");
734
EXPECT_PRED3(CheckTruncateIP, "172.167.53.222", 13, "172.160.0.0");
735
EXPECT_PRED3(CheckTruncateIP, "255.255.224.0", 18, "255.255.192.0");
736
EXPECT_PRED3(CheckTruncateIP, "255.255.255.252", 28, "255.255.255.240");
738
EXPECT_PRED3(CheckTruncateIP, "fe80:1111:2222:3333:4444:5555:6666:7777", 1,
740
EXPECT_PRED3(CheckTruncateIP, "fff0:1111:2222:3333:4444:5555:6666:7777", 9,
742
EXPECT_PRED3(CheckTruncateIP, "ffff:ff80:1111:2222:3333:4444:5555:6666", 23,
744
EXPECT_PRED3(CheckTruncateIP, "ffff:ff80:1111:2222:3333:4444:5555:6666", 32,
746
EXPECT_PRED3(CheckTruncateIP, "2400:f9af:e456:1111:2222:3333:4444:5555", 35,
748
EXPECT_PRED3(CheckTruncateIP, "9999:1111:2233:4444:5555:6666:7777:8888", 53,
749
"9999:1111:2233:4000::");
750
EXPECT_PRED3(CheckTruncateIP, "9999:1111:2233:4567:5555:6666:7777:8888", 64,
751
"9999:1111:2233:4567::");
752
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 68,
753
"1111:2222:3333:4444:5000::");
754
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 92,
755
"1111:2222:3333:4444:5555:6660::");
756
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 96,
757
"1111:2222:3333:4444:5555:6666::");
758
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 105,
759
"1111:2222:3333:4444:5555:6666:7700::");
760
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 124,
761
"1111:2222:3333:4444:5555:6666:7777:8880");
763
// Slightly degenerate cases
764
EXPECT_PRED3(CheckTruncateIP, "202.165.33.127", 32, "202.165.33.127");
765
EXPECT_PRED3(CheckTruncateIP, "235.105.77.12", 0, "0.0.0.0");
766
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 128,
767
"1111:2222:3333:4444:5555:6666:7777:8888");
768
EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 0,
771
} // namespace talk_base