| Index: native_client_sdk/src/tests/nacl_io_test/socket_test.cc
|
| diff --git a/native_client_sdk/src/tests/nacl_io_test/socket_test.cc b/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
|
| index fb13de903a3ca5e2f43e6598e8ebe42c1991a188..70a02e0958dc797dd2746a758e0926a9e5236d8c 100644
|
| --- a/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
|
| +++ b/native_client_sdk/src/tests/nacl_io_test/socket_test.cc
|
| @@ -269,6 +269,8 @@ TEST(SocketUtilityFunctions, Hstrerror) {
|
| "Unknown error in gethostbyname: 2718.");
|
| }
|
|
|
| +#endif // !defined(__GLIBC__)
|
| +
|
| TEST(SocketUtilityFunctions, Htonl) {
|
| uint32_t host_long = 0x44332211;
|
| uint32_t network_long = htonl(host_long);
|
| @@ -289,151 +291,220 @@ TEST(SocketUtilityFunctions, Htons) {
|
| EXPECT_EQ(network_bytes[1], 0x11);
|
| }
|
|
|
| -static struct in_addr generate_ipv4_addr(int tuple1, int tuple2,
|
| - int tuple3, int tuple4) {
|
| +static struct in_addr generate_ipv4_addr(uint8_t* tuple) {
|
| unsigned char addr[4];
|
| - addr[0] = static_cast<unsigned char>(tuple1);
|
| - addr[1] = static_cast<unsigned char>(tuple2);
|
| - addr[2] = static_cast<unsigned char>(tuple3);
|
| - addr[3] = static_cast<unsigned char>(tuple4);
|
| + addr[0] = static_cast<unsigned char>(tuple[0]);
|
| + addr[1] = static_cast<unsigned char>(tuple[1]);
|
| + addr[2] = static_cast<unsigned char>(tuple[2]);
|
| + addr[3] = static_cast<unsigned char>(tuple[3]);
|
| struct in_addr real_addr;
|
| memcpy(&real_addr, addr, 4);
|
| return real_addr;
|
| }
|
|
|
| -static struct in6_addr generate_ipv6_addr(int* tuples) {
|
| +static struct in6_addr generate_ipv6_addr(uint16_t* tuple) {
|
| unsigned char addr[16];
|
| for (int i = 0; i < 8; i++) {
|
| - addr[2*i] = (tuples[i] >> 8) & 0xFF;
|
| - addr[2*i+1] = tuples[i] & 0xFF;
|
| + addr[2*i] = (tuple[i] >> 8) & 0xFF;
|
| + addr[2*i+1] = tuple[i] & 0xFF;
|
| }
|
| struct in6_addr real_addr;
|
| memcpy(&real_addr, addr, 16);
|
| return real_addr;
|
| }
|
|
|
| -TEST(SocketUtilityFunctions, Inet_ntoa) {
|
| - char* stringified_addr = inet_ntoa(generate_ipv4_addr(0,0,0,0));
|
| - ASSERT_TRUE(NULL != stringified_addr);
|
| - EXPECT_STREQ("0.0.0.0", stringified_addr);
|
| +TEST(SocketUtilityFunctions, Inet_addr) {
|
| + // Fails for if string contains non-integers.
|
| + ASSERT_EQ(INADDR_NONE, inet_addr("foobar"));
|
| +
|
| + // Fails if there are too many quads
|
| + ASSERT_EQ(INADDR_NONE, inet_addr("0.0.0.0.0"));
|
| +
|
| + // Fails if a single element is > 255
|
| + ASSERT_EQ(INADDR_NONE, inet_addr("999.0.0.0"));
|
| +
|
| + // Fails if a single element is negative.
|
| + ASSERT_EQ(INADDR_NONE, inet_addr("-55.0.0.0"));
|
| +
|
| + // In tripple, notation third integer cannot be larger
|
| + // and 16bit unsigned int.
|
| + ASSERT_EQ(INADDR_NONE, inet_addr("1.2.66000"));
|
| +
|
| + // Success cases.
|
| + // Normal dotted-quad address.
|
| + uint32_t expected_addr = ntohl(0x07060504);
|
| + ASSERT_EQ(expected_addr, inet_addr("7.6.5.4"));
|
| + expected_addr = ntohl(0xffffffff);
|
| + ASSERT_EQ(expected_addr, inet_addr("255.255.255.255"));
|
| +
|
| + // Tripple case
|
| + expected_addr = ntohl(1 << 24 | 2 << 16 | 3);
|
| + ASSERT_EQ(expected_addr, inet_addr("1.2.3"));
|
| + expected_addr = ntohl(1 << 24 | 2 << 16 | 300);
|
| + ASSERT_EQ(expected_addr, inet_addr("1.2.300"));
|
| +
|
| + // Double case
|
| + expected_addr = ntohl(1 << 24 | 20000);
|
| + ASSERT_EQ(expected_addr, inet_addr("1.20000"));
|
| + expected_addr = ntohl(1 << 24 | 2);
|
| + ASSERT_EQ(expected_addr, inet_addr("1.2"));
|
| +
|
| + // Single case
|
| + expected_addr = ntohl(255);
|
| + ASSERT_EQ(expected_addr, inet_addr("255"));
|
| + expected_addr = ntohl(4000000000U);
|
| + ASSERT_EQ(expected_addr, inet_addr("4000000000"));
|
| +}
|
|
|
| - stringified_addr = inet_ntoa(generate_ipv4_addr(127,0,0,1));
|
| - ASSERT_TRUE(NULL != stringified_addr);
|
| - EXPECT_STREQ("127.0.0.1", stringified_addr);
|
| +TEST(SocketUtilityFunctions, Inet_aton) {
|
| + struct in_addr addr;
|
|
|
| - stringified_addr = inet_ntoa(generate_ipv4_addr(255,255,255,255));
|
| - ASSERT_TRUE(NULL != stringified_addr);
|
| - EXPECT_STREQ("255.255.255.255", stringified_addr);
|
| -}
|
| + // Failure cases
|
| + ASSERT_EQ(0, inet_aton("foobar", &addr));
|
| + ASSERT_EQ(0, inet_aton("0.0.0.0.0", &addr));
|
| + ASSERT_EQ(0, inet_aton("999.0.0.0", &addr));
|
|
|
| -TEST(SocketUtilityFunctions, Inet_ntop_ipv4) {
|
| - char stringified_addr[INET_ADDRSTRLEN];
|
| + // Success cases
|
| + uint32_t expected_addr = htonl(0xff020304);
|
| + ASSERT_NE(0, inet_aton("255.2.3.4", &addr));
|
| + ASSERT_EQ(expected_addr, addr.s_addr);
|
|
|
| - struct in_addr real_addr = generate_ipv4_addr(0,0,0,0);
|
| - EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
|
| - stringified_addr, INET_ADDRSTRLEN));
|
| - EXPECT_STREQ("0.0.0.0", stringified_addr);
|
| + expected_addr = htonl(0x01000002);
|
| + ASSERT_NE(0, inet_aton("1.2", &addr));
|
| + ASSERT_EQ(expected_addr, addr.s_addr);
|
|
|
| - real_addr = generate_ipv4_addr(127,0,0,1);
|
| - EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
|
| - stringified_addr, INET_ADDRSTRLEN));
|
| - EXPECT_STREQ("127.0.0.1", stringified_addr);
|
| + expected_addr = htonl(0x01020003);
|
| + ASSERT_NE(0, inet_aton("1.2.3", &addr));
|
| + ASSERT_EQ(expected_addr, addr.s_addr);
|
|
|
| - real_addr = generate_ipv4_addr(255,255,255,255);
|
| - EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
|
| - stringified_addr, INET_ADDRSTRLEN));
|
| - EXPECT_STREQ("255.255.255.255", stringified_addr);
|
| + expected_addr = htonl(0x0000100);
|
| + ASSERT_NE(0, inet_aton("256", &addr));
|
| + ASSERT_EQ(expected_addr, addr.s_addr);
|
| }
|
|
|
| -TEST(SocketUtilityFunctions, Inet_ntop_ipv6) {
|
| - char stringified_addr[INET6_ADDRSTRLEN];
|
| +TEST(SocketUtilityFunctions, Inet_ntoa) {
|
| + struct {
|
| + unsigned char addr_tuple[4];
|
| + const char* output;
|
| + } tests[] = {
|
| + { { 0, 0, 0, 0 }, "0.0.0.0" },
|
| + { { 127, 0, 0, 1 }, "127.0.0.1" },
|
| + { { 255, 255, 255, 255 }, "255.255.255.255" },
|
| + };
|
|
|
| - {
|
| - int addr_tuples[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
| - struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
|
| - EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
|
| - stringified_addr, INET6_ADDRSTRLEN));
|
| - EXPECT_STREQ("0:0:0:0:0:0:0:0", stringified_addr);
|
| + for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) {
|
| + char* stringified_addr = inet_ntoa(generate_ipv4_addr(tests[i].addr_tuple));
|
| + ASSERT_TRUE(NULL != stringified_addr);
|
| + EXPECT_STREQ(tests[i].output, stringified_addr);
|
| }
|
| +}
|
|
|
| - {
|
| - int addr_tuples[8] = { 0x1234, 0xa, 0x12, 0x0000,
|
| - 0x5678, 0x9abc, 0xdef, 0xffff };
|
| - struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
|
| - EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
|
| - stringified_addr, INET6_ADDRSTRLEN));
|
| - EXPECT_STREQ("1234:a:12:0:5678:9abc:def:ffff", stringified_addr);
|
| +TEST(SocketUtilityFunctions, Inet_ntop_ipv4) {
|
| + struct {
|
| + unsigned char addr_tuple[4];
|
| + const char* output;
|
| + } tests[] = {
|
| + { { 0, 0, 0, 0 }, "0.0.0.0" },
|
| + { { 127, 0, 0, 1 }, "127.0.0.1" },
|
| + { { 255, 255, 255, 255 }, "255.255.255.255" },
|
| + };
|
| +
|
| + for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) {
|
| + char stringified_addr[INET_ADDRSTRLEN];
|
| + struct in_addr real_addr = generate_ipv4_addr(tests[i].addr_tuple);
|
| + EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr,
|
| + stringified_addr, INET_ADDRSTRLEN));
|
| + EXPECT_STREQ(tests[i].output, stringified_addr);
|
| }
|
| +}
|
| +
|
| +TEST(SocketUtilityFunctions, Inet_ntop_ipv6) {
|
| + struct {
|
| + unsigned short addr_tuple[8];
|
| + const char* output;
|
| + } tests[] = {
|
| + { { 0, 0, 0, 0, 0, 0, 0, 0 }, "::" },
|
| + { { 1, 2, 3, 0, 0, 0, 0, 0 }, "1:2:3::" },
|
| + { { 0, 0, 0, 0, 0, 1, 2, 3 }, "::1:2:3" },
|
| + { { 0x1234, 0xa, 0x12, 0x0000, 0x5678, 0x9abc, 0xdef, 0xffff },
|
| + "1234:a:12:0:5678:9abc:def:ffff" },
|
| + { { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff },
|
| + "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" },
|
| + { { 0, 0, 0, 0, 0, 0xffff, 0x101, 0x101 }, "::ffff:1.1.1.1" },
|
| + { { 0, 0, 0, 0, 0, 0, 0x101, 0x101 }, "::1.1.1.1" },
|
| + };
|
|
|
| - {
|
| - int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
|
| - 0xffff, 0xffff, 0xffff, 0xffff };
|
| - struct in6_addr real_addr = generate_ipv6_addr(addr_tuples);
|
| + for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) {
|
| + char stringified_addr[INET6_ADDRSTRLEN];
|
| + struct in6_addr real_addr = generate_ipv6_addr(tests[i].addr_tuple);
|
| EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr,
|
| stringified_addr, INET6_ADDRSTRLEN));
|
| - EXPECT_STREQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", stringified_addr);
|
| + EXPECT_STREQ(tests[i].output, stringified_addr);
|
| }
|
| }
|
|
|
| TEST(SocketUtilityFunctions, Inet_ntop_failure) {
|
| char addr_name[INET6_ADDRSTRLEN];
|
| - int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
|
| + uint16_t addr6_tuple[8] = { 0xffff, 0xffff, 0xffff, 0xffff,
|
| 0xffff, 0xffff, 0xffff, 0xffff };
|
| - struct in6_addr ipv6_addr = generate_ipv6_addr(addr_tuples);
|
| - struct in_addr ipv4_addr = generate_ipv4_addr(255,255,255,255);
|
| + uint8_t addr_tuple[4] = { 255, 255, 255, 255 };
|
| + struct in6_addr ipv6_addr = generate_ipv6_addr(addr6_tuple);
|
| + struct in_addr ipv4_addr = generate_ipv4_addr(addr_tuple);
|
|
|
| - EXPECT_TRUE(NULL == inet_ntop(AF_UNIX, &ipv6_addr,
|
| - addr_name, INET6_ADDRSTRLEN));
|
| - EXPECT_EQ(errno, EAFNOSUPPORT);
|
| + EXPECT_EQ(NULL, inet_ntop(AF_UNIX, &ipv6_addr,
|
| + addr_name, INET6_ADDRSTRLEN));
|
| + EXPECT_EQ(EAFNOSUPPORT, errno);
|
|
|
| - EXPECT_TRUE(NULL == inet_ntop(AF_INET, &ipv4_addr,
|
| - addr_name, INET_ADDRSTRLEN - 1));
|
| - EXPECT_EQ(errno, ENOSPC);
|
| + EXPECT_EQ(NULL, inet_ntop(AF_INET, &ipv4_addr,
|
| + addr_name, INET_ADDRSTRLEN - 1));
|
| + EXPECT_EQ(ENOSPC, errno);
|
|
|
| - EXPECT_TRUE(NULL == inet_ntop(AF_INET6, &ipv6_addr,
|
| - addr_name, INET6_ADDRSTRLEN - 1));
|
| - EXPECT_EQ(errno, ENOSPC);
|
| + EXPECT_EQ(NULL, inet_ntop(AF_INET6, &ipv6_addr,
|
| + addr_name, INET6_ADDRSTRLEN / 2));
|
| + EXPECT_EQ(ENOSPC, errno);
|
| }
|
|
|
| TEST(SocketUtilityFunctions, Inet_pton) {
|
| struct {
|
| int family;
|
| const char* input;
|
| - const char* output;
|
| + const char* output; // NULL means output should match input
|
| } tests[] = {
|
| { AF_INET, "127.127.12.0", NULL },
|
| { AF_INET, "0.0.0.0", NULL },
|
|
|
| - { AF_INET6, "0:0:0:0:0:0:0:0", NULL },
|
| + { AF_INET6, "0:0:0:0:0:0:0:0", "::" },
|
| { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL },
|
| { AF_INET6, "1:2:3:4:5:6:7:8", NULL },
|
| { AF_INET6, "a:b:c:d:e:f:1:2", NULL },
|
| { AF_INET6, "A:B:C:D:E:F:1:2", "a:b:c:d:e:f:1:2" },
|
| - { AF_INET6, "::", "0:0:0:0:0:0:0:0" },
|
| - { AF_INET6, "::12", "0:0:0:0:0:0:0:12" },
|
| - { AF_INET6, "::1:2:3", "0:0:0:0:0:1:2:3" },
|
| - { AF_INET6, "12::", "12:0:0:0:0:0:0:0" },
|
| - { AF_INET6, "1:2::", "1:2:0:0:0:0:0:0" },
|
| - { AF_INET6, "::12:0:0:0:0:0:0:0", "12:0:0:0:0:0:0:0" },
|
| - { AF_INET6, "1:2:3::4:5", "1:2:3:0:0:0:4:5" },
|
| - { AF_INET6, "::1.1.1.1", "0:0:0:0:0:0:101:101" },
|
| - { AF_INET6, "::ffff:1.1.1.1", "0:0:0:0:0:ffff:101:101" },
|
| - { AF_INET6, "ffff::1.1.1.1", "ffff:0:0:0:0:0:101:101" },
|
| - { AF_INET6, "::1.1.1.1", "0:0:0:0:0:0:101:101" },
|
| + { AF_INET6, "::", "::" },
|
| + { AF_INET6, "::12", "::12" },
|
| + { AF_INET6, "::1:2:3", "::1:2:3" },
|
| + { AF_INET6, "12::", "12::" },
|
| + { AF_INET6, "1:2::", "1:2::" },
|
| + { AF_INET6, "12:0:0:0:0:0:0:0", "12::" },
|
| + { AF_INET6, "1:2:3::4:5", "1:2:3::4:5" },
|
| + { AF_INET6, "::ffff:1.1.1.1", "::ffff:1.1.1.1" },
|
| + { AF_INET6, "ffff::1.1.1.1", "ffff::101:101" },
|
| + { AF_INET6, "::1.1.1.1", "::1.1.1.1" },
|
| };
|
|
|
| for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) {
|
| uint8_t addr[16];
|
| - EXPECT_TRUE(inet_pton(tests[i].family, tests[i].input, addr));
|
| + ASSERT_TRUE(inet_pton(tests[i].family, tests[i].input, addr))
|
| + << "inet_pton failed for " << tests[i].input;
|
| const char* expected = tests[i].output ? tests[i].output : tests[i].input;
|
| char out_buffer[256];
|
| - EXPECT_TRUE(
|
| - inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer)));
|
| - EXPECT_EQ(std::string(expected), std::string(out_buffer));
|
| + ASSERT_EQ(out_buffer,
|
| + inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer)));
|
| + ASSERT_STREQ(expected, out_buffer);
|
| }
|
| }
|
|
|
| TEST(SocketUtilityFunctions, Inet_pton_failure) {
|
| + // All these are examples of strings that do not map
|
| + // to IP address. inet_pton returns 0 on failure.
|
| uint8_t addr[16];
|
| EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24312", &addr));
|
| EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24 ", &addr));
|
| @@ -455,6 +526,7 @@ TEST(SocketUtilityFunctions, Inet_pton_failure) {
|
| EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:0.0.0.0", &addr));
|
| EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0:1", &addr));
|
| EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0.0", &addr));
|
| + EXPECT_EQ(0, inet_pton(AF_INET6, "::1.2.3.4.5.6.7.8", &addr));
|
| }
|
|
|
| TEST(SocketUtilityFunctions, Ntohs) {
|
| @@ -473,5 +545,4 @@ TEST(SocketUtilityFunctions, Ntohl) {
|
| EXPECT_EQ(host_long, 0x44332211);
|
| }
|
|
|
| -#endif // !defined(__GLIBC__)
|
| #endif // PROVIDES_SOCKETPAIR_API
|
|
|