Chromium Code Reviews| 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> |
| 11 #include <sys/socket.h> | 11 #include <sys/socket.h> |
| 12 #include <sys/stat.h> | 12 #include <sys/stat.h> |
| 13 | 13 |
| 14 #include <map> | 14 #include <map> |
| 15 #include <string> | 15 #include <string> |
| 16 | 16 |
| 17 #include "gmock/gmock.h" | 17 #include "gmock/gmock.h" |
| 18 #include "gtest/gtest.h" | 18 #include "gtest/gtest.h" |
| 19 | 19 |
| 20 #include "nacl_io/kernel_intercept.h" | 20 #include "nacl_io/kernel_intercept.h" |
| 21 #include "nacl_io/kernel_proxy.h" | 21 #include "nacl_io/kernel_proxy.h" |
| 22 #include "nacl_io/ossocket.h" | 22 #include "nacl_io/ossocket.h" |
| 23 #include "nacl_io/ostypes.h" | 23 #include "nacl_io/ostypes.h" |
| 24 | 24 |
| 25 #ifdef PROVIDES_SOCKET_API | 25 #ifdef PROVIDES_SOCKET_API |
| 26 | 26 |
| 27 // When devloping tests for host resolution function is can be usefull | |
|
binji
2014/01/27 19:57:18
When developing tests for host resolution it can b
Sam Clegg
2014/01/27 23:10:15
Hmm, this should not be part of this CL.
Removed.
| |
| 28 // to compare results with the host glibc version. | |
| 29 #if 0 | |
| 30 #define ki_getaddrinfo getaddrinfo | |
| 31 #define ki_gethostbyname gethostbyname | |
| 32 #define ki_freeaddrinfo freeaddrinfo | |
| 33 #endif | |
| 34 | |
| 27 using namespace nacl_io; | 35 using namespace nacl_io; |
| 28 using namespace sdk_util; | 36 using namespace sdk_util; |
| 29 | 37 |
| 30 namespace { | 38 namespace { |
| 31 class SocketTest : public ::testing::Test { | 39 class SocketTest : public ::testing::Test { |
| 32 public: | 40 public: |
| 33 SocketTest() {} | 41 SocketTest() {} |
| 34 | 42 |
| 35 void SetUp() { | 43 void SetUp() { |
| 36 ki_init(&kp_); | 44 ki_init(&kp_); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 | 270 |
| 263 // These utility functions are only used for newlib (glibc provides its own | 271 // These utility functions are only used for newlib (glibc provides its own |
| 264 // implementations of these functions). | 272 // implementations of these functions). |
| 265 #if !defined(__GLIBC__) | 273 #if !defined(__GLIBC__) |
| 266 | 274 |
| 267 TEST(SocketUtilityFunctions, Hstrerror) { | 275 TEST(SocketUtilityFunctions, Hstrerror) { |
| 268 EXPECT_STREQ(hstrerror(2718), | 276 EXPECT_STREQ(hstrerror(2718), |
| 269 "Unknown error in gethostbyname: 2718."); | 277 "Unknown error in gethostbyname: 2718."); |
| 270 } | 278 } |
| 271 | 279 |
| 280 #endif // !defined(__GLIBC__) | |
| 281 | |
| 272 TEST(SocketUtilityFunctions, Htonl) { | 282 TEST(SocketUtilityFunctions, Htonl) { |
| 273 uint32_t host_long = 0x44332211; | 283 uint32_t host_long = 0x44332211; |
| 274 uint32_t network_long = htonl(host_long); | 284 uint32_t network_long = htonl(host_long); |
| 275 uint8_t network_bytes[4]; | 285 uint8_t network_bytes[4]; |
| 276 memcpy(network_bytes, &network_long, 4); | 286 memcpy(network_bytes, &network_long, 4); |
| 277 EXPECT_EQ(network_bytes[0], 0x44); | 287 EXPECT_EQ(network_bytes[0], 0x44); |
| 278 EXPECT_EQ(network_bytes[1], 0x33); | 288 EXPECT_EQ(network_bytes[1], 0x33); |
| 279 EXPECT_EQ(network_bytes[2], 0x22); | 289 EXPECT_EQ(network_bytes[2], 0x22); |
| 280 EXPECT_EQ(network_bytes[3], 0x11); | 290 EXPECT_EQ(network_bytes[3], 0x11); |
| 281 } | 291 } |
| 282 | 292 |
| 283 TEST(SocketUtilityFunctions, Htons) { | 293 TEST(SocketUtilityFunctions, Htons) { |
| 284 uint16_t host_short = 0x2211; | 294 uint16_t host_short = 0x2211; |
| 285 uint16_t network_short = htons(host_short); | 295 uint16_t network_short = htons(host_short); |
| 286 uint8_t network_bytes[2]; | 296 uint8_t network_bytes[2]; |
| 287 memcpy(network_bytes, &network_short, 2); | 297 memcpy(network_bytes, &network_short, 2); |
| 288 EXPECT_EQ(network_bytes[0], 0x22); | 298 EXPECT_EQ(network_bytes[0], 0x22); |
| 289 EXPECT_EQ(network_bytes[1], 0x11); | 299 EXPECT_EQ(network_bytes[1], 0x11); |
| 290 } | 300 } |
| 291 | 301 |
| 292 static struct in_addr generate_ipv4_addr(int tuple1, int tuple2, | 302 static struct in_addr generate_ipv4_addr(uint8_t* tuple) { |
| 293 int tuple3, int tuple4) { | |
| 294 unsigned char addr[4]; | 303 unsigned char addr[4]; |
| 295 addr[0] = static_cast<unsigned char>(tuple1); | 304 addr[0] = static_cast<unsigned char>(tuple[0]); |
| 296 addr[1] = static_cast<unsigned char>(tuple2); | 305 addr[1] = static_cast<unsigned char>(tuple[1]); |
| 297 addr[2] = static_cast<unsigned char>(tuple3); | 306 addr[2] = static_cast<unsigned char>(tuple[2]); |
| 298 addr[3] = static_cast<unsigned char>(tuple4); | 307 addr[3] = static_cast<unsigned char>(tuple[3]); |
| 299 struct in_addr real_addr; | 308 struct in_addr real_addr; |
| 300 memcpy(&real_addr, addr, 4); | 309 memcpy(&real_addr, addr, 4); |
| 301 return real_addr; | 310 return real_addr; |
| 302 } | 311 } |
| 303 | 312 |
| 304 static struct in6_addr generate_ipv6_addr(int* tuples) { | 313 static struct in6_addr generate_ipv6_addr(uint16_t* tuple) { |
| 305 unsigned char addr[16]; | 314 unsigned char addr[16]; |
| 306 for (int i = 0; i < 8; i++) { | 315 for (int i = 0; i < 8; i++) { |
| 307 addr[2*i] = (tuples[i] >> 8) & 0xFF; | 316 addr[2*i] = (tuple[i] >> 8) & 0xFF; |
| 308 addr[2*i+1] = tuples[i] & 0xFF; | 317 addr[2*i+1] = tuple[i] & 0xFF; |
| 309 } | 318 } |
| 310 struct in6_addr real_addr; | 319 struct in6_addr real_addr; |
| 311 memcpy(&real_addr, addr, 16); | 320 memcpy(&real_addr, addr, 16); |
| 312 return real_addr; | 321 return real_addr; |
| 313 } | 322 } |
| 314 | 323 |
| 324 TEST(SocketUtilityFunctions, Inet_addr) { | |
| 325 // Fails for anything other than | |
|
binji
2014/01/27 19:57:18
other than...
Sam Clegg
2014/01/27 23:10:15
Done.
| |
| 326 ASSERT_EQ(INADDR_NONE, inet_addr("foobar")); | |
| 327 | |
| 328 // Fails if there are too many quads | |
| 329 ASSERT_EQ(INADDR_NONE, inet_addr("0.0.0.0.0")); | |
| 330 | |
| 331 // Fails if a single element is > 256 | |
|
binji
2014/01/27 19:57:18
>= 256
| |
| 332 ASSERT_EQ(INADDR_NONE, inet_addr("999.0.0.0")); | |
| 333 | |
| 334 // Fails if a single element is negative. | |
| 335 ASSERT_EQ(INADDR_NONE, inet_addr("-55.0.0.0")); | |
| 336 | |
| 337 // Success cases | |
| 338 uint32_t expected_addr = ntohl(0x07060504); | |
| 339 ASSERT_EQ(expected_addr, inet_addr("7.6.5.4")); | |
| 340 expected_addr = ntohl(0xffffffff); | |
| 341 ASSERT_EQ(expected_addr, inet_addr("255.255.255.255")); | |
| 342 } | |
| 343 | |
| 344 TEST(SocketUtilityFunctions, Inet_aton) { | |
| 345 struct in_addr addr; | |
| 346 | |
| 347 // Failure cases | |
| 348 ASSERT_EQ(0, inet_aton("foobar", &addr)); | |
| 349 ASSERT_EQ(0, inet_aton("0.0.0.0.0", &addr)); | |
| 350 ASSERT_EQ(0, inet_aton("999.0.0.0", &addr)); | |
| 351 | |
| 352 // Success cases | |
| 353 uint32_t expected_addr = htonl(0xff020304); | |
| 354 ASSERT_NE(0, inet_aton("255.2.3.4", &addr)); | |
| 355 ASSERT_EQ(expected_addr, addr.s_addr); | |
| 356 | |
| 357 expected_addr = htonl(0x01000002); | |
| 358 ASSERT_NE(0, inet_aton("1.2", &addr)); | |
| 359 ASSERT_EQ(expected_addr, addr.s_addr); | |
| 360 | |
| 361 expected_addr = htonl(0x01020003); | |
| 362 ASSERT_NE(0, inet_aton("1.2.3", &addr)); | |
| 363 ASSERT_EQ(expected_addr, addr.s_addr); | |
| 364 | |
| 365 expected_addr = htonl(0x0000100); | |
| 366 ASSERT_NE(0, inet_aton("256", &addr)); | |
|
binji
2014/01/27 19:57:18
test larger numbers here and above? The spec says
Sam Clegg
2014/01/27 23:10:15
Done.
| |
| 367 ASSERT_EQ(expected_addr, addr.s_addr); | |
| 368 } | |
| 369 | |
| 315 TEST(SocketUtilityFunctions, Inet_ntoa) { | 370 TEST(SocketUtilityFunctions, Inet_ntoa) { |
| 316 char* stringified_addr = inet_ntoa(generate_ipv4_addr(0,0,0,0)); | 371 struct { |
| 317 ASSERT_TRUE(NULL != stringified_addr); | 372 unsigned char addr_tuple[4]; |
| 318 EXPECT_STREQ("0.0.0.0", stringified_addr); | 373 const char* output; |
| 374 } tests[] = { | |
| 375 { { 0, 0, 0, 0 }, "0.0.0.0" }, | |
| 376 { { 127, 0, 0, 1 }, "127.0.0.1" }, | |
| 377 { { 255, 255, 255, 255 }, "255.255.255.255" }, | |
| 378 }; | |
| 319 | 379 |
| 320 stringified_addr = inet_ntoa(generate_ipv4_addr(127,0,0,1)); | 380 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
| 321 ASSERT_TRUE(NULL != stringified_addr); | 381 char* stringified_addr = inet_ntoa(generate_ipv4_addr(tests[i].addr_tuple)); |
| 322 EXPECT_STREQ("127.0.0.1", stringified_addr); | 382 ASSERT_TRUE(NULL != stringified_addr); |
| 323 | 383 EXPECT_STREQ(tests[i].output, stringified_addr); |
| 324 stringified_addr = inet_ntoa(generate_ipv4_addr(255,255,255,255)); | 384 } |
| 325 ASSERT_TRUE(NULL != stringified_addr); | |
| 326 EXPECT_STREQ("255.255.255.255", stringified_addr); | |
| 327 } | 385 } |
| 328 | 386 |
| 329 TEST(SocketUtilityFunctions, Inet_ntop_ipv4) { | 387 TEST(SocketUtilityFunctions, Inet_ntop_ipv4) { |
| 330 char stringified_addr[INET_ADDRSTRLEN]; | 388 struct { |
| 389 unsigned char addr_tuple[4]; | |
| 390 const char* output; | |
| 391 } tests[] = { | |
| 392 { { 0, 0, 0, 0 }, "0.0.0.0" }, | |
| 393 { { 127, 0, 0, 1 }, "127.0.0.1" }, | |
| 394 { { 255, 255, 255, 255 }, "255.255.255.255" }, | |
| 395 }; | |
| 331 | 396 |
| 332 struct in_addr real_addr = generate_ipv4_addr(0,0,0,0); | 397 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
| 333 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, | 398 char stringified_addr[INET_ADDRSTRLEN]; |
| 334 stringified_addr, INET_ADDRSTRLEN)); | 399 struct in_addr real_addr = generate_ipv4_addr(tests[i].addr_tuple); |
| 335 EXPECT_STREQ("0.0.0.0", stringified_addr); | 400 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, |
| 336 | 401 stringified_addr, INET_ADDRSTRLEN)); |
| 337 real_addr = generate_ipv4_addr(127,0,0,1); | 402 EXPECT_STREQ(tests[i].output, stringified_addr); |
| 338 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, | 403 } |
| 339 stringified_addr, INET_ADDRSTRLEN)); | |
| 340 EXPECT_STREQ("127.0.0.1", stringified_addr); | |
| 341 | |
| 342 real_addr = generate_ipv4_addr(255,255,255,255); | |
| 343 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, | |
| 344 stringified_addr, INET_ADDRSTRLEN)); | |
| 345 EXPECT_STREQ("255.255.255.255", stringified_addr); | |
| 346 } | 404 } |
| 347 | 405 |
| 348 TEST(SocketUtilityFunctions, Inet_ntop_ipv6) { | 406 TEST(SocketUtilityFunctions, Inet_ntop_ipv6) { |
| 349 char stringified_addr[INET6_ADDRSTRLEN]; | 407 struct { |
| 408 unsigned short addr_tuple[8]; | |
| 409 const char* output; | |
| 410 } tests[] = { | |
| 411 { { 0, 0, 0, 0, 0, 0, 0, 0 }, "::" }, | |
| 412 { { 1, 2, 3, 0, 0, 0, 0, 0 }, "1:2:3::" }, | |
| 413 { { 0, 0, 0, 0, 0, 1, 2, 3 }, "::1:2:3" }, | |
| 414 { { 0x1234, 0xa, 0x12, 0x0000, 0x5678, 0x9abc, 0xdef, 0xffff }, | |
| 415 "1234:a:12:0:5678:9abc:def:ffff" }, | |
| 416 { { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }, | |
| 417 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" }, | |
| 418 { { 0, 0, 0, 0, 0, 0xffff, 0x101, 0x101 }, "::ffff:1.1.1.1" }, | |
| 419 { { 0, 0, 0, 0, 0, 0, 0x101, 0x101 }, "::1.1.1.1" }, | |
| 420 }; | |
| 350 | 421 |
| 351 { | 422 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
| 352 int addr_tuples[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; | 423 char stringified_addr[INET6_ADDRSTRLEN]; |
| 353 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); | 424 struct in6_addr real_addr = generate_ipv6_addr(tests[i].addr_tuple); |
| 354 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, | 425 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, |
| 355 stringified_addr, INET6_ADDRSTRLEN)); | 426 stringified_addr, INET6_ADDRSTRLEN)); |
| 356 EXPECT_STREQ("0:0:0:0:0:0:0:0", stringified_addr); | 427 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 } | 428 } |
| 376 } | 429 } |
| 377 | 430 |
| 378 TEST(SocketUtilityFunctions, Inet_ntop_failure) { | 431 TEST(SocketUtilityFunctions, Inet_ntop_failure) { |
| 379 char addr_name[INET6_ADDRSTRLEN]; | 432 char addr_name[INET6_ADDRSTRLEN]; |
| 380 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff, | 433 uint16_t addr6_tuple[8] = { 0xffff, 0xffff, 0xffff, 0xffff, |
| 381 0xffff, 0xffff, 0xffff, 0xffff }; | 434 0xffff, 0xffff, 0xffff, 0xffff }; |
| 382 struct in6_addr ipv6_addr = generate_ipv6_addr(addr_tuples); | 435 uint8_t addr_tuple[4] = { 255, 255, 255, 255 }; |
| 383 struct in_addr ipv4_addr = generate_ipv4_addr(255,255,255,255); | 436 struct in6_addr ipv6_addr = generate_ipv6_addr(addr6_tuple); |
| 437 struct in_addr ipv4_addr = generate_ipv4_addr(addr_tuple); | |
| 384 | 438 |
| 385 EXPECT_TRUE(NULL == inet_ntop(AF_UNIX, &ipv6_addr, | 439 EXPECT_EQ(NULL, inet_ntop(AF_UNIX, &ipv6_addr, |
| 386 addr_name, INET6_ADDRSTRLEN)); | 440 addr_name, INET6_ADDRSTRLEN)); |
| 387 EXPECT_EQ(errno, EAFNOSUPPORT); | 441 EXPECT_EQ(EAFNOSUPPORT, errno); |
| 388 | 442 |
| 389 EXPECT_TRUE(NULL == inet_ntop(AF_INET, &ipv4_addr, | 443 EXPECT_EQ(NULL, inet_ntop(AF_INET, &ipv4_addr, |
| 390 addr_name, INET_ADDRSTRLEN - 1)); | 444 addr_name, INET_ADDRSTRLEN - 1)); |
| 391 EXPECT_EQ(errno, ENOSPC); | 445 EXPECT_EQ(ENOSPC, errno); |
| 392 | 446 |
| 393 EXPECT_TRUE(NULL == inet_ntop(AF_INET6, &ipv6_addr, | 447 EXPECT_EQ(NULL, inet_ntop(AF_INET6, &ipv6_addr, |
| 394 addr_name, INET6_ADDRSTRLEN - 1)); | 448 addr_name, INET6_ADDRSTRLEN / 2)); |
| 395 EXPECT_EQ(errno, ENOSPC); | 449 EXPECT_EQ(ENOSPC, errno); |
| 396 } | 450 } |
| 397 | 451 |
| 398 TEST(SocketUtilityFunctions, Inet_pton) { | 452 TEST(SocketUtilityFunctions, Inet_pton) { |
| 399 struct { | 453 struct { |
| 400 int family; | 454 int family; |
| 401 const char* input; | 455 const char* input; |
| 402 const char* output; | 456 const char* output; // NULL means output should match input |
| 403 } tests[] = { | 457 } tests[] = { |
| 404 { AF_INET, "127.127.12.0", NULL }, | 458 { AF_INET, "127.127.12.0", NULL }, |
| 405 { AF_INET, "0.0.0.0", NULL }, | 459 { AF_INET, "0.0.0.0", NULL }, |
| 406 | 460 |
| 407 { AF_INET6, "0:0:0:0:0:0:0:0", NULL }, | 461 { AF_INET6, "0:0:0:0:0:0:0:0", "::" }, |
| 408 { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL }, | 462 { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL }, |
| 409 { AF_INET6, "1:2:3:4:5:6:7:8", NULL }, | 463 { AF_INET6, "1:2:3:4:5:6:7:8", NULL }, |
| 410 { AF_INET6, "a:b:c:d:e:f:1:2", NULL }, | 464 { 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" }, | 465 { 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" }, | 466 { AF_INET6, "::", "::" }, |
| 413 { AF_INET6, "::12", "0:0:0:0:0:0:0:12" }, | 467 { AF_INET6, "::12", "::12" }, |
| 414 { AF_INET6, "::1:2:3", "0:0:0:0:0:1:2:3" }, | 468 { AF_INET6, "::1:2:3", "::1:2:3" }, |
| 415 { AF_INET6, "12::", "12:0:0:0:0:0:0:0" }, | 469 { AF_INET6, "12::", "12::" }, |
| 416 { AF_INET6, "1:2::", "1:2:0:0:0:0:0:0" }, | 470 { 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" }, | 471 { 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" }, | 472 { 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" }, | 473 { 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" }, | 474 { 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" }, | 475 { 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 }; | 476 }; |
| 424 | 477 |
| 425 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { | 478 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { |
| 426 uint8_t addr[16]; | 479 uint8_t addr[16]; |
| 427 EXPECT_TRUE(inet_pton(tests[i].family, tests[i].input, addr)); | 480 ASSERT_TRUE(inet_pton(tests[i].family, tests[i].input, addr)) |
| 481 << "inet_pton failed for " << tests[i].input; | |
| 428 const char* expected = tests[i].output ? tests[i].output : tests[i].input; | 482 const char* expected = tests[i].output ? tests[i].output : tests[i].input; |
| 429 char out_buffer[256]; | 483 char out_buffer[256]; |
| 430 EXPECT_TRUE( | 484 ASSERT_EQ(out_buffer, |
| 431 inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer))); | 485 inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer))); |
| 432 EXPECT_EQ(std::string(expected), std::string(out_buffer)); | 486 ASSERT_STREQ(expected, out_buffer); |
| 433 } | 487 } |
| 434 } | 488 } |
| 435 | 489 |
| 436 TEST(SocketUtilityFunctions, Inet_pton_failure) { | 490 TEST(SocketUtilityFunctions, Inet_pton_failure) { |
| 491 // All these are examples of strings that do not map | |
| 492 // to IP address. inet_pton returns 0 on failure. | |
| 437 uint8_t addr[16]; | 493 uint8_t addr[16]; |
| 438 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24312", &addr)); | 494 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)); | 495 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)); | 496 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)); | 497 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)); | 498 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)); | 499 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)); | 500 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)); | 501 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0x0", &addr)); |
| 446 | 502 |
| 447 EXPECT_EQ(0, inet_pton(AF_INET6, ":::", &addr)); | 503 EXPECT_EQ(0, inet_pton(AF_INET6, ":::", &addr)); |
| 448 EXPECT_EQ(0, inet_pton(AF_INET6, "0:::0", &addr)); | 504 EXPECT_EQ(0, inet_pton(AF_INET6, "0:::0", &addr)); |
| 449 EXPECT_EQ(0, inet_pton(AF_INET6, "0::0:0::1", &addr)); | 505 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)); | 506 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)); | 507 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)); | 508 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)); | 509 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)); | 510 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)); | 511 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)); | 512 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)); | 513 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0.0", &addr)); |
| 514 EXPECT_EQ(0, inet_pton(AF_INET6, "::1.2.3.4.5.6.7.8", &addr)); | |
| 458 } | 515 } |
| 459 | 516 |
| 460 TEST(SocketUtilityFunctions, Ntohs) { | 517 TEST(SocketUtilityFunctions, Ntohs) { |
| 461 uint8_t network_bytes[2] = { 0x22, 0x11 }; | 518 uint8_t network_bytes[2] = { 0x22, 0x11 }; |
| 462 uint16_t network_short; | 519 uint16_t network_short; |
| 463 memcpy(&network_short, network_bytes, 2); | 520 memcpy(&network_short, network_bytes, 2); |
| 464 uint16_t host_short = ntohs(network_short); | 521 uint16_t host_short = ntohs(network_short); |
| 465 EXPECT_EQ(host_short, 0x2211); | 522 EXPECT_EQ(host_short, 0x2211); |
| 466 } | 523 } |
| 467 | 524 |
| 468 TEST(SocketUtilityFunctions, Ntohl) { | 525 TEST(SocketUtilityFunctions, Ntohl) { |
| 469 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; | 526 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; |
| 470 uint32_t network_long; | 527 uint32_t network_long; |
| 471 memcpy(&network_long, network_bytes, 4); | 528 memcpy(&network_long, network_bytes, 4); |
| 472 uint32_t host_long = ntohl(network_long); | 529 uint32_t host_long = ntohl(network_long); |
| 473 EXPECT_EQ(host_long, 0x44332211); | 530 EXPECT_EQ(host_long, 0x44332211); |
| 474 } | 531 } |
| 475 | 532 |
| 476 #endif // !defined(__GLIBC__) | |
| 477 #endif // PROVIDES_SOCKETPAIR_API | 533 #endif // PROVIDES_SOCKETPAIR_API |
| OLD | NEW |