OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "ppapi/tests/test_net_address_private.h" | 5 #include "ppapi/tests/test_net_address_private.h" |
6 | 6 |
| 7 #include "base/basictypes.h" |
| 8 #include "build/build_config.h" |
7 #include "ppapi/cpp/private/net_address_private.h" | 9 #include "ppapi/cpp/private/net_address_private.h" |
8 #include "ppapi/c/private/ppb_net_address_private.h" | 10 #include "ppapi/c/private/ppb_net_address_private.h" |
9 #include "ppapi/tests/testing_instance.h" | 11 #include "ppapi/tests/testing_instance.h" |
10 | 12 |
11 // Other than |GetAnyAddress()|, there's no way to actually get | 13 // Other than |GetAnyAddress()|, there's no way to actually get |
12 // |PP_NetAddress_Private| structs from just this interface. We'll cheat and | 14 // |PP_NetAddress_Private| structs from just this interface. We'll cheat and |
13 // synthesize some. | 15 // synthesize some. |
14 // TODO(viettrungluu): This is very fragile and implementation-dependent. :( | |
15 #if defined(_WIN32) | |
16 #define OS_WIN | |
17 #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ | |
18 defined(__OpenBSD__) || defined(__sun) || defined(__native_client__) | |
19 #define OS_POSIX | |
20 #else | |
21 #error "Unsupported platform." | |
22 #endif | |
23 | 16 |
24 #if defined(OS_WIN) | 17 #if defined(OS_POSIX) |
25 #include <ws2tcpip.h> | |
26 #elif defined(OS_POSIX) | |
27 #include <arpa/inet.h> | 18 #include <arpa/inet.h> |
28 #include <netdb.h> | 19 #include <netdb.h> |
29 #include <netinet/in.h> | 20 #include <netinet/in.h> |
30 #include <sys/socket.h> | 21 #include <sys/socket.h> |
31 #endif | 22 #endif |
32 | 23 |
| 24 #if defined(OS_MACOSX) |
| 25 // This is a bit evil, but it's standard operating procedure for |s6_addr|.... |
| 26 #define s6_addr16 __u6_addr.__u6_addr16 |
| 27 #endif |
| 28 |
| 29 #if defined(OS_WIN) |
| 30 #include <ws2tcpip.h> |
| 31 |
| 32 #define s6_addr16 u.Word |
| 33 #endif |
| 34 |
33 using pp::NetAddressPrivate; | 35 using pp::NetAddressPrivate; |
34 | 36 |
35 namespace { | 37 namespace { |
36 | 38 |
| 39 // |host| should be an IP address represented as text, e.g., "192.168.0.1". |
37 PP_NetAddress_Private MakeIPv4NetAddress(const char* host, int port) { | 40 PP_NetAddress_Private MakeIPv4NetAddress(const char* host, int port) { |
38 PP_NetAddress_Private addr = PP_NetAddress_Private(); | 41 PP_NetAddress_Private addr = PP_NetAddress_Private(); |
39 addr.size = sizeof(sockaddr_in); | 42 addr.size = sizeof(sockaddr_in); |
40 sockaddr_in* a = reinterpret_cast<sockaddr_in*>(addr.data); | 43 sockaddr_in* a = reinterpret_cast<sockaddr_in*>(addr.data); |
41 a->sin_family = AF_INET; | 44 a->sin_family = AF_INET; |
42 a->sin_port = htons(port); | 45 a->sin_port = htons(port); |
43 a->sin_addr.s_addr = inet_addr(host); | 46 a->sin_addr.s_addr = inet_addr(host); |
44 return addr; | 47 return addr; |
45 } | 48 } |
46 | 49 |
47 // TODO(viettrungluu): Also add IPv6 tests. | 50 // |host| should be an array of eight 16-bit numbers. |
| 51 PP_NetAddress_Private MakeIPv6NetAddress(const uint16_t host[], uint16_t port, |
| 52 uint32_t scope_id) { |
| 53 PP_NetAddress_Private addr = PP_NetAddress_Private(); |
| 54 addr.size = sizeof(sockaddr_in6); |
| 55 sockaddr_in6* a = reinterpret_cast<sockaddr_in6*>(addr.data); |
| 56 a->sin6_family = AF_INET6; |
| 57 a->sin6_port = htons(port); |
| 58 a->sin6_flowinfo = 0; |
| 59 for (int i = 0; i < 8; i++) |
| 60 a->sin6_addr.s6_addr16[i] = htons(host[i]); |
| 61 a->sin6_scope_id = scope_id; |
| 62 return addr; |
| 63 } |
48 | 64 |
49 } // namespace | 65 } // namespace |
50 | 66 |
51 REGISTER_TEST_CASE(NetAddressPrivate); | 67 REGISTER_TEST_CASE(NetAddressPrivate); |
52 | 68 |
53 TestNetAddressPrivate::TestNetAddressPrivate(TestingInstance* instance) | 69 TestNetAddressPrivate::TestNetAddressPrivate(TestingInstance* instance) |
54 : TestCase(instance) { | 70 : TestCase(instance) { |
55 } | 71 } |
56 | 72 |
57 bool TestNetAddressPrivate::Init() { | 73 bool TestNetAddressPrivate::Init() { |
58 return NetAddressPrivate::IsAvailable(); | 74 return NetAddressPrivate::IsAvailable(); |
59 } | 75 } |
60 | 76 |
61 void TestNetAddressPrivate::RunTests(const std::string& filter) { | 77 void TestNetAddressPrivate::RunTests(const std::string& filter) { |
62 RUN_TEST(AreEqual, filter); | 78 RUN_TEST(AreEqual, filter); |
63 RUN_TEST(AreHostsEqual, filter); | 79 RUN_TEST(AreHostsEqual, filter); |
64 RUN_TEST(Describe, filter); | 80 RUN_TEST(Describe, filter); |
65 RUN_TEST(ReplacePort, filter); | 81 RUN_TEST(ReplacePort, filter); |
66 RUN_TEST(GetAnyAddress, filter); | 82 RUN_TEST(GetAnyAddress, filter); |
| 83 RUN_TEST(DescribeIPv6, filter); |
67 } | 84 } |
68 | 85 |
69 std::string TestNetAddressPrivate::TestAreEqual() { | 86 std::string TestNetAddressPrivate::TestAreEqual() { |
70 // No comparisons should ever be done with invalid addresses. | 87 // No comparisons should ever be done with invalid addresses. |
71 PP_NetAddress_Private invalid = PP_NetAddress_Private(); | 88 PP_NetAddress_Private invalid = PP_NetAddress_Private(); |
72 ASSERT_FALSE(NetAddressPrivate::AreEqual(invalid, invalid)); | 89 ASSERT_FALSE(NetAddressPrivate::AreEqual(invalid, invalid)); |
73 | 90 |
74 PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress("127.0.0.1", 80); | 91 PP_NetAddress_Private localhost_80 = MakeIPv4NetAddress("127.0.0.1", 80); |
75 ASSERT_TRUE(NetAddressPrivate::AreEqual(localhost_80, localhost_80)); | 92 ASSERT_TRUE(NetAddressPrivate::AreEqual(localhost_80, localhost_80)); |
76 ASSERT_FALSE(NetAddressPrivate::AreEqual(localhost_80, invalid)); | 93 ASSERT_FALSE(NetAddressPrivate::AreEqual(localhost_80, invalid)); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 PP_NetAddress_Private result = PP_NetAddress_Private(); | 165 PP_NetAddress_Private result = PP_NetAddress_Private(); |
149 | 166 |
150 NetAddressPrivate::GetAnyAddress(false, &result); | 167 NetAddressPrivate::GetAnyAddress(false, &result); |
151 ASSERT_TRUE(NetAddressPrivate::AreEqual(result, result)); | 168 ASSERT_TRUE(NetAddressPrivate::AreEqual(result, result)); |
152 | 169 |
153 NetAddressPrivate::GetAnyAddress(true, &result); | 170 NetAddressPrivate::GetAnyAddress(true, &result); |
154 ASSERT_TRUE(NetAddressPrivate::AreEqual(result, result)); | 171 ASSERT_TRUE(NetAddressPrivate::AreEqual(result, result)); |
155 | 172 |
156 PASS(); | 173 PASS(); |
157 } | 174 } |
| 175 |
| 176 // TODO(viettrungluu): More IPv6 tests needed. |
| 177 |
| 178 std::string TestNetAddressPrivate::TestDescribeIPv6() { |
| 179 static const struct { |
| 180 uint16_t address[8]; |
| 181 uint16_t port; |
| 182 uint32_t scope; |
| 183 const char* expected_without_port; |
| 184 const char* expected_with_port; |
| 185 } test_cases[] = { |
| 186 { // Generic test case (unique longest run of zeros to collapse). |
| 187 { 0x12, 0xabcd, 0, 0x0001, 0, 0, 0, 0xcdef }, 12, 0, |
| 188 "12:abcd:0:1::cdef", "[12:abcd:0:1::cdef]:12" |
| 189 }, |
| 190 { // Non-zero scope. |
| 191 { 0x1234, 0xabcd, 0, 0x0001, 0, 0, 0, 0xcdef }, 1234, 789, |
| 192 "1234:abcd:0:1::cdef%789", "[1234:abcd:0:1::cdef%789]:1234" |
| 193 }, |
| 194 { // Ignore the first (non-longest) run of zeros. |
| 195 { 0, 0, 0, 0x0123, 0, 0, 0, 0 }, 123, 0, |
| 196 "0:0:0:123::", "[0:0:0:123::]:123" |
| 197 }, |
| 198 { // Collapse the first (equally-longest) run of zeros. |
| 199 { 0x1234, 0xabcd, 0, 0, 0xff, 0, 0, 0xcdef }, 123, 0, |
| 200 "1234:abcd::ff:0:0:cdef", "[1234:abcd::ff:0:0:cdef]:123" |
| 201 }, |
| 202 { // Don't collapse "runs" of zeros of length 1. |
| 203 { 0, 0xa, 1, 2, 3, 0, 5, 0 }, 123, 0, |
| 204 "0:a:1:2:3:0:5:0", "[0:a:1:2:3:0:5:0]:123" |
| 205 }, |
| 206 { // Collapse a run of zeros at the beginning. |
| 207 { 0, 0, 0, 2, 3, 0, 0, 0 }, 123, 0, |
| 208 "::2:3:0:0:0", "[::2:3:0:0:0]:123" |
| 209 }, |
| 210 { // Collapse a run of zeros at the end. |
| 211 { 0, 0xa, 1, 2, 3, 0, 0, 0 }, 123, 0, |
| 212 "0:a:1:2:3::", "[0:a:1:2:3::]:123" |
| 213 }, |
| 214 { // IPv4 192.168.1.2 embedded in IPv6 in the deprecated way. |
| 215 { 0, 0, 0, 0, 0, 0, 0xc0a8, 0x102 }, 123, 0, |
| 216 "::192.168.1.2", "[::192.168.1.2]:123" |
| 217 }, |
| 218 { // ... with non-zero scope. |
| 219 { 0, 0, 0, 0, 0, 0, 0xc0a8, 0x102 }, 123, 789, |
| 220 "::192.168.1.2%789", "[::192.168.1.2%789]:123" |
| 221 }, |
| 222 { // IPv4 192.168.1.2 embedded in IPv6. |
| 223 { 0, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x102 }, 123, 0, |
| 224 "::ffff:192.168.1.2", "[::ffff:192.168.1.2]:123" |
| 225 }, |
| 226 { // ... with non-zero scope. |
| 227 { 0, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x102 }, 123, 789, |
| 228 "::ffff:192.168.1.2%789", "[::ffff:192.168.1.2%789]:123" |
| 229 }, |
| 230 { // *Not* IPv4 embedded in IPv6. |
| 231 { 0, 0, 0, 0, 0, 0x1234, 0xc0a8, 0x102 }, 123, 0, |
| 232 "::1234:c0a8:102", "[::1234:c0a8:102]:123" |
| 233 } |
| 234 }; |
| 235 |
| 236 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); i++) { |
| 237 PP_NetAddress_Private addr = MakeIPv6NetAddress(test_cases[i].address, |
| 238 test_cases[i].port, |
| 239 test_cases[i].scope); |
| 240 ASSERT_EQ(test_cases[i].expected_without_port, |
| 241 NetAddressPrivate::Describe(addr, false)); |
| 242 ASSERT_EQ(test_cases[i].expected_with_port, |
| 243 NetAddressPrivate::Describe(addr, true)); |
| 244 } |
| 245 |
| 246 PASS(); |
| 247 } |
OLD | NEW |