OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <arpa/inet.h> | 5 #include <arpa/inet.h> |
6 #include <errno.h> | 6 #include <errno.h> |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <netinet/in.h> | 8 #include <netinet/in.h> |
9 #include <pthread.h> | 9 #include <pthread.h> |
10 #include <sys/types.h> | 10 #include <sys/types.h> |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 | 262 |
263 // These utility functions are only used for newlib (glibc provides its own | 263 // These utility functions are only used for newlib (glibc provides its own |
264 // implementations of these functions). | 264 // implementations of these functions). |
265 #if !defined(__GLIBC__) | 265 #if !defined(__GLIBC__) |
266 | 266 |
267 TEST(SocketUtilityFunctions, Hstrerror) { | 267 TEST(SocketUtilityFunctions, Hstrerror) { |
268 EXPECT_STREQ(hstrerror(2718), | 268 EXPECT_STREQ(hstrerror(2718), |
269 "Unknown error in gethostbyname: 2718."); | 269 "Unknown error in gethostbyname: 2718."); |
270 } | 270 } |
271 | 271 |
| 272 #endif // !defined(__GLIBC__) |
| 273 |
272 TEST(SocketUtilityFunctions, Htonl) { | 274 TEST(SocketUtilityFunctions, Htonl) { |
273 uint32_t host_long = 0x44332211; | 275 uint32_t host_long = 0x44332211; |
274 uint32_t network_long = htonl(host_long); | 276 uint32_t network_long = htonl(host_long); |
275 uint8_t network_bytes[4]; | 277 uint8_t network_bytes[4]; |
276 memcpy(network_bytes, &network_long, 4); | 278 memcpy(network_bytes, &network_long, 4); |
277 EXPECT_EQ(network_bytes[0], 0x44); | 279 EXPECT_EQ(network_bytes[0], 0x44); |
278 EXPECT_EQ(network_bytes[1], 0x33); | 280 EXPECT_EQ(network_bytes[1], 0x33); |
279 EXPECT_EQ(network_bytes[2], 0x22); | 281 EXPECT_EQ(network_bytes[2], 0x22); |
280 EXPECT_EQ(network_bytes[3], 0x11); | 282 EXPECT_EQ(network_bytes[3], 0x11); |
281 } | 283 } |
282 | 284 |
283 TEST(SocketUtilityFunctions, Htons) { | 285 TEST(SocketUtilityFunctions, Htons) { |
284 uint16_t host_short = 0x2211; | 286 uint16_t host_short = 0x2211; |
285 uint16_t network_short = htons(host_short); | 287 uint16_t network_short = htons(host_short); |
286 uint8_t network_bytes[2]; | 288 uint8_t network_bytes[2]; |
287 memcpy(network_bytes, &network_short, 2); | 289 memcpy(network_bytes, &network_short, 2); |
288 EXPECT_EQ(network_bytes[0], 0x22); | 290 EXPECT_EQ(network_bytes[0], 0x22); |
289 EXPECT_EQ(network_bytes[1], 0x11); | 291 EXPECT_EQ(network_bytes[1], 0x11); |
290 } | 292 } |
291 | 293 |
292 static struct in_addr generate_ipv4_addr(int tuple1, int tuple2, | 294 static struct in_addr generate_ipv4_addr(uint8_t* tuple) { |
293 int tuple3, int tuple4) { | |
294 unsigned char addr[4]; | 295 unsigned char addr[4]; |
295 addr[0] = static_cast<unsigned char>(tuple1); | 296 addr[0] = static_cast<unsigned char>(tuple[0]); |
296 addr[1] = static_cast<unsigned char>(tuple2); | 297 addr[1] = static_cast<unsigned char>(tuple[1]); |
297 addr[2] = static_cast<unsigned char>(tuple3); | 298 addr[2] = static_cast<unsigned char>(tuple[2]); |
298 addr[3] = static_cast<unsigned char>(tuple4); | 299 addr[3] = static_cast<unsigned char>(tuple[3]); |
299 struct in_addr real_addr; | 300 struct in_addr real_addr; |
300 memcpy(&real_addr, addr, 4); | 301 memcpy(&real_addr, addr, 4); |
301 return real_addr; | 302 return real_addr; |
302 } | 303 } |
303 | 304 |
304 static struct in6_addr generate_ipv6_addr(int* tuples) { | 305 static struct in6_addr generate_ipv6_addr(uint16_t* tuple) { |
305 unsigned char addr[16]; | 306 unsigned char addr[16]; |
306 for (int i = 0; i < 8; i++) { | 307 for (int i = 0; i < 8; i++) { |
307 addr[2*i] = (tuples[i] >> 8) & 0xFF; | 308 addr[2*i] = (tuple[i] >> 8) & 0xFF; |
308 addr[2*i+1] = tuples[i] & 0xFF; | 309 addr[2*i+1] = tuple[i] & 0xFF; |
309 } | 310 } |
310 struct in6_addr real_addr; | 311 struct in6_addr real_addr; |
311 memcpy(&real_addr, addr, 16); | 312 memcpy(&real_addr, addr, 16); |
312 return real_addr; | 313 return real_addr; |
313 } | 314 } |
314 | 315 |
| 316 TEST(SocketUtilityFunctions, Inet_addr) { |
| 317 // Fails for if string contains non-integers. |
| 318 ASSERT_EQ(INADDR_NONE, inet_addr("foobar")); |
| 319 |
| 320 // Fails if there are too many quads |
| 321 ASSERT_EQ(INADDR_NONE, inet_addr("0.0.0.0.0")); |
| 322 |
| 323 // Fails if a single element is > 255 |
| 324 ASSERT_EQ(INADDR_NONE, inet_addr("999.0.0.0")); |
| 325 |
| 326 // Fails if a single element is negative. |
| 327 ASSERT_EQ(INADDR_NONE, inet_addr("-55.0.0.0")); |
| 328 |
| 329 // In tripple, notation third integer cannot be larger |
| 330 // and 16bit unsigned int. |
| 331 ASSERT_EQ(INADDR_NONE, inet_addr("1.2.66000")); |
| 332 |
| 333 // Success cases. |
| 334 // Normal dotted-quad address. |
| 335 uint32_t expected_addr = ntohl(0x07060504); |
| 336 ASSERT_EQ(expected_addr, inet_addr("7.6.5.4")); |
| 337 expected_addr = ntohl(0xffffffff); |
| 338 ASSERT_EQ(expected_addr, inet_addr("255.255.255.255")); |
| 339 |
| 340 // Tripple case |
| 341 expected_addr = ntohl(1 << 24 | 2 << 16 | 3); |
| 342 ASSERT_EQ(expected_addr, inet_addr("1.2.3")); |
| 343 expected_addr = ntohl(1 << 24 | 2 << 16 | 300); |
| 344 ASSERT_EQ(expected_addr, inet_addr("1.2.300")); |
| 345 |
| 346 // Double case |
| 347 expected_addr = ntohl(1 << 24 | 20000); |
| 348 ASSERT_EQ(expected_addr, inet_addr("1.20000")); |
| 349 expected_addr = ntohl(1 << 24 | 2); |
| 350 ASSERT_EQ(expected_addr, inet_addr("1.2")); |
| 351 |
| 352 // Single case |
| 353 expected_addr = ntohl(255); |
| 354 ASSERT_EQ(expected_addr, inet_addr("255")); |
| 355 expected_addr = ntohl(4000000000U); |
| 356 ASSERT_EQ(expected_addr, inet_addr("4000000000")); |
| 357 } |
| 358 |
| 359 TEST(SocketUtilityFunctions, Inet_aton) { |
| 360 struct in_addr addr; |
| 361 |
| 362 // Failure cases |
| 363 ASSERT_EQ(0, inet_aton("foobar", &addr)); |
| 364 ASSERT_EQ(0, inet_aton("0.0.0.0.0", &addr)); |
| 365 ASSERT_EQ(0, inet_aton("999.0.0.0", &addr)); |
| 366 |
| 367 // Success cases |
| 368 uint32_t expected_addr = htonl(0xff020304); |
| 369 ASSERT_NE(0, inet_aton("255.2.3.4", &addr)); |
| 370 ASSERT_EQ(expected_addr, addr.s_addr); |
| 371 |
| 372 expected_addr = htonl(0x01000002); |
| 373 ASSERT_NE(0, inet_aton("1.2", &addr)); |
| 374 ASSERT_EQ(expected_addr, addr.s_addr); |
| 375 |
| 376 expected_addr = htonl(0x01020003); |
| 377 ASSERT_NE(0, inet_aton("1.2.3", &addr)); |
| 378 ASSERT_EQ(expected_addr, addr.s_addr); |
| 379 |
| 380 expected_addr = htonl(0x0000100); |
| 381 ASSERT_NE(0, inet_aton("256", &addr)); |
| 382 ASSERT_EQ(expected_addr, addr.s_addr); |
| 383 } |
| 384 |
315 TEST(SocketUtilityFunctions, Inet_ntoa) { | 385 TEST(SocketUtilityFunctions, Inet_ntoa) { |
316 char* stringified_addr = inet_ntoa(generate_ipv4_addr(0,0,0,0)); | 386 struct { |
317 ASSERT_TRUE(NULL != stringified_addr); | 387 unsigned char addr_tuple[4]; |
318 EXPECT_STREQ("0.0.0.0", stringified_addr); | 388 const char* output; |
319 | 389 } tests[] = { |
320 stringified_addr = inet_ntoa(generate_ipv4_addr(127,0,0,1)); | 390 { { 0, 0, 0, 0 }, "0.0.0.0" }, |
321 ASSERT_TRUE(NULL != stringified_addr); | 391 { { 127, 0, 0, 1 }, "127.0.0.1" }, |
322 EXPECT_STREQ("127.0.0.1", stringified_addr); | 392 { { 255, 255, 255, 255 }, "255.255.255.255" }, |
323 | 393 }; |
324 stringified_addr = inet_ntoa(generate_ipv4_addr(255,255,255,255)); | 394 |
325 ASSERT_TRUE(NULL != stringified_addr); | 395 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
326 EXPECT_STREQ("255.255.255.255", stringified_addr); | 396 char* stringified_addr = inet_ntoa(generate_ipv4_addr(tests[i].addr_tuple)); |
| 397 ASSERT_TRUE(NULL != stringified_addr); |
| 398 EXPECT_STREQ(tests[i].output, stringified_addr); |
| 399 } |
327 } | 400 } |
328 | 401 |
329 TEST(SocketUtilityFunctions, Inet_ntop_ipv4) { | 402 TEST(SocketUtilityFunctions, Inet_ntop_ipv4) { |
330 char stringified_addr[INET_ADDRSTRLEN]; | 403 struct { |
331 | 404 unsigned char addr_tuple[4]; |
332 struct in_addr real_addr = generate_ipv4_addr(0,0,0,0); | 405 const char* output; |
333 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, | 406 } tests[] = { |
334 stringified_addr, INET_ADDRSTRLEN)); | 407 { { 0, 0, 0, 0 }, "0.0.0.0" }, |
335 EXPECT_STREQ("0.0.0.0", stringified_addr); | 408 { { 127, 0, 0, 1 }, "127.0.0.1" }, |
336 | 409 { { 255, 255, 255, 255 }, "255.255.255.255" }, |
337 real_addr = generate_ipv4_addr(127,0,0,1); | 410 }; |
338 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, | 411 |
339 stringified_addr, INET_ADDRSTRLEN)); | 412 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
340 EXPECT_STREQ("127.0.0.1", stringified_addr); | 413 char stringified_addr[INET_ADDRSTRLEN]; |
341 | 414 struct in_addr real_addr = generate_ipv4_addr(tests[i].addr_tuple); |
342 real_addr = generate_ipv4_addr(255,255,255,255); | 415 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, |
343 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, | 416 stringified_addr, INET_ADDRSTRLEN)); |
344 stringified_addr, INET_ADDRSTRLEN)); | 417 EXPECT_STREQ(tests[i].output, stringified_addr); |
345 EXPECT_STREQ("255.255.255.255", stringified_addr); | 418 } |
346 } | 419 } |
347 | 420 |
348 TEST(SocketUtilityFunctions, Inet_ntop_ipv6) { | 421 TEST(SocketUtilityFunctions, Inet_ntop_ipv6) { |
349 char stringified_addr[INET6_ADDRSTRLEN]; | 422 struct { |
350 | 423 unsigned short addr_tuple[8]; |
351 { | 424 const char* output; |
352 int addr_tuples[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; | 425 } tests[] = { |
353 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); | 426 { { 0, 0, 0, 0, 0, 0, 0, 0 }, "::" }, |
| 427 { { 1, 2, 3, 0, 0, 0, 0, 0 }, "1:2:3::" }, |
| 428 { { 0, 0, 0, 0, 0, 1, 2, 3 }, "::1:2:3" }, |
| 429 { { 0x1234, 0xa, 0x12, 0x0000, 0x5678, 0x9abc, 0xdef, 0xffff }, |
| 430 "1234:a:12:0:5678:9abc:def:ffff" }, |
| 431 { { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, |
| 432 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" }, |
| 433 { { 0, 0, 0, 0, 0, 0xffff, 0x101, 0x101 }, "::ffff:1.1.1.1" }, |
| 434 { { 0, 0, 0, 0, 0, 0, 0x101, 0x101 }, "::1.1.1.1" }, |
| 435 }; |
| 436 |
| 437 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
| 438 char stringified_addr[INET6_ADDRSTRLEN]; |
| 439 struct in6_addr real_addr = generate_ipv6_addr(tests[i].addr_tuple); |
354 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, | 440 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, |
355 stringified_addr, INET6_ADDRSTRLEN)); | 441 stringified_addr, INET6_ADDRSTRLEN)); |
356 EXPECT_STREQ("0:0:0:0:0:0:0:0", stringified_addr); | 442 EXPECT_STREQ(tests[i].output, stringified_addr); |
357 } | |
358 | |
359 { | |
360 int addr_tuples[8] = { 0x1234, 0xa, 0x12, 0x0000, | |
361 0x5678, 0x9abc, 0xdef, 0xffff }; | |
362 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); | |
363 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, | |
364 stringified_addr, INET6_ADDRSTRLEN)); | |
365 EXPECT_STREQ("1234:a:12:0:5678:9abc:def:ffff", stringified_addr); | |
366 } | |
367 | |
368 { | |
369 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff, | |
370 0xffff, 0xffff, 0xffff, 0xffff }; | |
371 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); | |
372 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, | |
373 stringified_addr, INET6_ADDRSTRLEN)); | |
374 EXPECT_STREQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", stringified_addr); | |
375 } | 443 } |
376 } | 444 } |
377 | 445 |
378 TEST(SocketUtilityFunctions, Inet_ntop_failure) { | 446 TEST(SocketUtilityFunctions, Inet_ntop_failure) { |
379 char addr_name[INET6_ADDRSTRLEN]; | 447 char addr_name[INET6_ADDRSTRLEN]; |
380 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff, | 448 uint16_t addr6_tuple[8] = { 0xffff, 0xffff, 0xffff, 0xffff, |
381 0xffff, 0xffff, 0xffff, 0xffff }; | 449 0xffff, 0xffff, 0xffff, 0xffff }; |
382 struct in6_addr ipv6_addr = generate_ipv6_addr(addr_tuples); | 450 uint8_t addr_tuple[4] = { 255, 255, 255, 255 }; |
383 struct in_addr ipv4_addr = generate_ipv4_addr(255,255,255,255); | 451 struct in6_addr ipv6_addr = generate_ipv6_addr(addr6_tuple); |
384 | 452 struct in_addr ipv4_addr = generate_ipv4_addr(addr_tuple); |
385 EXPECT_TRUE(NULL == inet_ntop(AF_UNIX, &ipv6_addr, | 453 |
386 addr_name, INET6_ADDRSTRLEN)); | 454 EXPECT_EQ(NULL, inet_ntop(AF_UNIX, &ipv6_addr, |
387 EXPECT_EQ(errno, EAFNOSUPPORT); | 455 addr_name, INET6_ADDRSTRLEN)); |
388 | 456 EXPECT_EQ(EAFNOSUPPORT, errno); |
389 EXPECT_TRUE(NULL == inet_ntop(AF_INET, &ipv4_addr, | 457 |
390 addr_name, INET_ADDRSTRLEN - 1)); | 458 EXPECT_EQ(NULL, inet_ntop(AF_INET, &ipv4_addr, |
391 EXPECT_EQ(errno, ENOSPC); | 459 addr_name, INET_ADDRSTRLEN - 1)); |
392 | 460 EXPECT_EQ(ENOSPC, errno); |
393 EXPECT_TRUE(NULL == inet_ntop(AF_INET6, &ipv6_addr, | 461 |
394 addr_name, INET6_ADDRSTRLEN - 1)); | 462 EXPECT_EQ(NULL, inet_ntop(AF_INET6, &ipv6_addr, |
395 EXPECT_EQ(errno, ENOSPC); | 463 addr_name, INET6_ADDRSTRLEN / 2)); |
| 464 EXPECT_EQ(ENOSPC, errno); |
396 } | 465 } |
397 | 466 |
398 TEST(SocketUtilityFunctions, Inet_pton) { | 467 TEST(SocketUtilityFunctions, Inet_pton) { |
399 struct { | 468 struct { |
400 int family; | 469 int family; |
401 const char* input; | 470 const char* input; |
402 const char* output; | 471 const char* output; // NULL means output should match input |
403 } tests[] = { | 472 } tests[] = { |
404 { AF_INET, "127.127.12.0", NULL }, | 473 { AF_INET, "127.127.12.0", NULL }, |
405 { AF_INET, "0.0.0.0", NULL }, | 474 { AF_INET, "0.0.0.0", NULL }, |
406 | 475 |
407 { AF_INET6, "0:0:0:0:0:0:0:0", NULL }, | 476 { AF_INET6, "0:0:0:0:0:0:0:0", "::" }, |
408 { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL }, | 477 { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL }, |
409 { AF_INET6, "1:2:3:4:5:6:7:8", NULL }, | 478 { AF_INET6, "1:2:3:4:5:6:7:8", NULL }, |
410 { AF_INET6, "a:b:c:d:e:f:1:2", NULL }, | 479 { AF_INET6, "a:b:c:d:e:f:1:2", NULL }, |
411 { AF_INET6, "A:B:C:D:E:F:1:2", "a:b:c:d:e:f:1:2" }, | 480 { AF_INET6, "A:B:C:D:E:F:1:2", "a:b:c:d:e:f:1:2" }, |
412 { AF_INET6, "::", "0:0:0:0:0:0:0:0" }, | 481 { AF_INET6, "::", "::" }, |
413 { AF_INET6, "::12", "0:0:0:0:0:0:0:12" }, | 482 { AF_INET6, "::12", "::12" }, |
414 { AF_INET6, "::1:2:3", "0:0:0:0:0:1:2:3" }, | 483 { AF_INET6, "::1:2:3", "::1:2:3" }, |
415 { AF_INET6, "12::", "12:0:0:0:0:0:0:0" }, | 484 { AF_INET6, "12::", "12::" }, |
416 { AF_INET6, "1:2::", "1:2:0:0:0:0:0:0" }, | 485 { AF_INET6, "1:2::", "1:2::" }, |
417 { AF_INET6, "::12:0:0:0:0:0:0:0", "12:0:0:0:0:0:0:0" }, | 486 { AF_INET6, "12:0:0:0:0:0:0:0", "12::" }, |
418 { AF_INET6, "1:2:3::4:5", "1:2:3:0:0:0:4:5" }, | 487 { AF_INET6, "1:2:3::4:5", "1:2:3::4:5" }, |
419 { AF_INET6, "::1.1.1.1", "0:0:0:0:0:0:101:101" }, | 488 { AF_INET6, "::ffff:1.1.1.1", "::ffff:1.1.1.1" }, |
420 { AF_INET6, "::ffff:1.1.1.1", "0:0:0:0:0:ffff:101:101" }, | 489 { AF_INET6, "ffff::1.1.1.1", "ffff::101:101" }, |
421 { AF_INET6, "ffff::1.1.1.1", "ffff:0:0:0:0:0:101:101" }, | 490 { AF_INET6, "::1.1.1.1", "::1.1.1.1" }, |
422 { AF_INET6, "::1.1.1.1", "0:0:0:0:0:0:101:101" }, | |
423 }; | 491 }; |
424 | 492 |
425 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { | 493 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
426 uint8_t addr[16]; | 494 uint8_t addr[16]; |
427 EXPECT_TRUE(inet_pton(tests[i].family, tests[i].input, addr)); | 495 ASSERT_TRUE(inet_pton(tests[i].family, tests[i].input, addr)) |
| 496 << "inet_pton failed for " << tests[i].input; |
428 const char* expected = tests[i].output ? tests[i].output : tests[i].input; | 497 const char* expected = tests[i].output ? tests[i].output : tests[i].input; |
429 char out_buffer[256]; | 498 char out_buffer[256]; |
430 EXPECT_TRUE( | 499 ASSERT_EQ(out_buffer, |
431 inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer))); | 500 inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer))); |
432 EXPECT_EQ(std::string(expected), std::string(out_buffer)); | 501 ASSERT_STREQ(expected, out_buffer); |
433 } | 502 } |
434 } | 503 } |
435 | 504 |
436 TEST(SocketUtilityFunctions, Inet_pton_failure) { | 505 TEST(SocketUtilityFunctions, Inet_pton_failure) { |
| 506 // All these are examples of strings that do not map |
| 507 // to IP address. inet_pton returns 0 on failure. |
437 uint8_t addr[16]; | 508 uint8_t addr[16]; |
438 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24312", &addr)); | 509 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24312", &addr)); |
439 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24 ", &addr)); | 510 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24 ", &addr)); |
440 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.1", &addr)); | 511 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.1", &addr)); |
441 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12. 0", &addr)); | 512 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12. 0", &addr)); |
442 EXPECT_EQ(0, inet_pton(AF_INET, " 127.127.12.0", &addr)); | 513 EXPECT_EQ(0, inet_pton(AF_INET, " 127.127.12.0", &addr)); |
443 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.", &addr)); | 514 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.", &addr)); |
444 EXPECT_EQ(0, inet_pton(AF_INET, ".127.127.12.0", &addr)); | 515 EXPECT_EQ(0, inet_pton(AF_INET, ".127.127.12.0", &addr)); |
445 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0x0", &addr)); | 516 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0x0", &addr)); |
446 | 517 |
447 EXPECT_EQ(0, inet_pton(AF_INET6, ":::", &addr)); | 518 EXPECT_EQ(0, inet_pton(AF_INET6, ":::", &addr)); |
448 EXPECT_EQ(0, inet_pton(AF_INET6, "0:::0", &addr)); | 519 EXPECT_EQ(0, inet_pton(AF_INET6, "0:::0", &addr)); |
449 EXPECT_EQ(0, inet_pton(AF_INET6, "0::0:0::1", &addr)); | 520 EXPECT_EQ(0, inet_pton(AF_INET6, "0::0:0::1", &addr)); |
450 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1: 2", &addr)); | 521 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1: 2", &addr)); |
451 EXPECT_EQ(0, inet_pton(AF_INET6, " 0:0:0:0:0:0:1:2", &addr)); | 522 EXPECT_EQ(0, inet_pton(AF_INET6, " 0:0:0:0:0:0:1:2", &addr)); |
452 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2 ", &addr)); | 523 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2 ", &addr)); |
453 EXPECT_EQ(0, inet_pton(AF_INET6, ":0:0:0:0:0:0:1:2", &addr)); | 524 EXPECT_EQ(0, inet_pton(AF_INET6, ":0:0:0:0:0:0:1:2", &addr)); |
454 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2:4", &addr)); | 525 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2:4", &addr)); |
455 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:0.0.0.0", &addr)); | 526 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:0.0.0.0", &addr)); |
456 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0:1", &addr)); | 527 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0:1", &addr)); |
457 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0.0", &addr)); | 528 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0.0", &addr)); |
| 529 EXPECT_EQ(0, inet_pton(AF_INET6, "::1.2.3.4.5.6.7.8", &addr)); |
458 } | 530 } |
459 | 531 |
460 TEST(SocketUtilityFunctions, Ntohs) { | 532 TEST(SocketUtilityFunctions, Ntohs) { |
461 uint8_t network_bytes[2] = { 0x22, 0x11 }; | 533 uint8_t network_bytes[2] = { 0x22, 0x11 }; |
462 uint16_t network_short; | 534 uint16_t network_short; |
463 memcpy(&network_short, network_bytes, 2); | 535 memcpy(&network_short, network_bytes, 2); |
464 uint16_t host_short = ntohs(network_short); | 536 uint16_t host_short = ntohs(network_short); |
465 EXPECT_EQ(host_short, 0x2211); | 537 EXPECT_EQ(host_short, 0x2211); |
466 } | 538 } |
467 | 539 |
468 TEST(SocketUtilityFunctions, Ntohl) { | 540 TEST(SocketUtilityFunctions, Ntohl) { |
469 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; | 541 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; |
470 uint32_t network_long; | 542 uint32_t network_long; |
471 memcpy(&network_long, network_bytes, 4); | 543 memcpy(&network_long, network_bytes, 4); |
472 uint32_t host_long = ntohl(network_long); | 544 uint32_t host_long = ntohl(network_long); |
473 EXPECT_EQ(host_long, 0x44332211); | 545 EXPECT_EQ(host_long, 0x44332211); |
474 } | 546 } |
475 | 547 |
476 #endif // !defined(__GLIBC__) | |
477 #endif // PROVIDES_SOCKETPAIR_API | 548 #endif // PROVIDES_SOCKETPAIR_API |
OLD | NEW |