OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_host_resolver_private.h" | 5 #include "ppapi/tests/test_host_resolver_private.h" |
6 | 6 |
7 #include "ppapi/c/private/ppb_net_address_private.h" | 7 #include "ppapi/c/private/ppb_net_address_private.h" |
8 #include "ppapi/cpp/module.h" | 8 #include "ppapi/cpp/module_impl.h" |
9 #include "ppapi/cpp/pass_ref.h" | 9 #include "ppapi/cpp/private/host_resolver_private.h" |
10 #include "ppapi/cpp/private/tcp_socket_private.h" | 10 #include "ppapi/cpp/private/tcp_socket_private.h" |
11 #include "ppapi/cpp/var.h" | 11 #include "ppapi/cpp/var.h" |
12 #include "ppapi/tests/test_utils.h" | 12 #include "ppapi/tests/test_utils.h" |
13 #include "ppapi/tests/testing_instance.h" | 13 #include "ppapi/tests/testing_instance.h" |
14 | 14 |
15 REGISTER_TEST_CASE(HostResolverPrivate); | 15 REGISTER_TEST_CASE(HostResolverPrivate); |
16 | 16 |
17 TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance) | 17 TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance) |
18 : TestCase(instance) { | 18 : TestCase(instance) { |
19 } | 19 } |
20 | 20 |
21 bool TestHostResolverPrivate::Init() { | 21 bool TestHostResolverPrivate::Init() { |
22 core_interface_ = static_cast<const PPB_Core*>( | 22 bool host_resolver_private_is_available = |
23 pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE)); | 23 pp::HostResolverPrivate::IsAvailable(); |
24 if (!core_interface_) | 24 if (!host_resolver_private_is_available) |
25 instance_->AppendError("PPB_Core interface not available"); | 25 instance_->AppendError("PPB_HostResolver_Private interface not available"); |
26 host_resolver_private_interface_ = | 26 |
27 static_cast<const PPB_HostResolver_Private*>( | |
28 pp::Module::Get()->GetBrowserInterface( | |
29 PPB_HOSTRESOLVER_PRIVATE_INTERFACE)); | |
30 bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable(); | 27 bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable(); |
31 if (!tcp_socket_private_is_available) | 28 if (!tcp_socket_private_is_available) |
32 instance_->AppendError("PPB_TCPSocket_Private interface not available"); | 29 instance_->AppendError("PPB_TCPSocket_Private interface not available"); |
33 if (!host_resolver_private_interface_) | |
34 instance_->AppendError("PPB_HostResolver_Private interface not available"); | |
35 | 30 |
36 bool init_host_port = GetLocalHostPort( | 31 bool init_host_port = |
37 instance_->pp_instance(), &host_, &port_); | 32 GetLocalHostPort(instance_->pp_instance(), &host_, &port_); |
38 if (!init_host_port) | 33 if (!init_host_port) |
39 instance_->AppendError("Can't init host and port"); | 34 instance_->AppendError("Can't init host and port"); |
40 | 35 |
41 return core_interface_ && | 36 return host_resolver_private_is_available && |
42 host_resolver_private_interface_ && | |
43 tcp_socket_private_is_available && | 37 tcp_socket_private_is_available && |
44 init_host_port && | 38 init_host_port && |
45 CheckTestingInterface() && | 39 CheckTestingInterface() && |
46 EnsureRunningOverHTTP(); | 40 EnsureRunningOverHTTP(); |
47 } | 41 } |
48 | 42 |
49 void TestHostResolverPrivate::RunTests(const std::string& filter) { | 43 void TestHostResolverPrivate::RunTests(const std::string& filter) { |
50 RUN_TEST(Create, filter); | 44 RUN_TEST(Empty, filter); |
51 RUN_TEST_FORCEASYNC_AND_NOT(Resolve, filter); | 45 RUN_TEST_FORCEASYNC_AND_NOT(Resolve, filter); |
52 RUN_TEST_FORCEASYNC_AND_NOT(ResolveIPv4, filter); | 46 RUN_TEST_FORCEASYNC_AND_NOT(ResolveIPv4, filter); |
53 } | 47 } |
54 | 48 |
55 std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket, | 49 std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket, |
56 const std::string& host, | 50 const std::string& host, |
57 uint16_t port) { | 51 uint16_t port) { |
58 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 52 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
59 int32_t rv = socket->Connect(host.c_str(), port, callback); | 53 int32_t rv = socket->Connect(host.c_str(), port, callback); |
60 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 54 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 return ReportError("PPB_TCPSocket_Private::Write", rv); | 102 return ReportError("PPB_TCPSocket_Private::Write", rv); |
109 *bytes_written = rv; | 103 *bytes_written = rv; |
110 PASS(); | 104 PASS(); |
111 } | 105 } |
112 | 106 |
113 std::string TestHostResolverPrivate::CheckHTTPResponse( | 107 std::string TestHostResolverPrivate::CheckHTTPResponse( |
114 pp::TCPSocketPrivate* socket, | 108 pp::TCPSocketPrivate* socket, |
115 const std::string& request, | 109 const std::string& request, |
116 const std::string& response) { | 110 const std::string& response) { |
117 int32_t rv = 0; | 111 int32_t rv = 0; |
118 std::string error_message; | 112 ASSERT_SUBTEST_SUCCESS( |
119 | 113 SyncWrite(socket, request.c_str(), request.size(), &rv)); |
120 error_message = SyncWrite(socket, request.c_str(), request.size(), &rv); | |
121 if (!error_message.empty()) | |
122 return error_message; | |
123 | |
124 std::vector<char> response_buffer(response.size()); | 114 std::vector<char> response_buffer(response.size()); |
125 error_message = SyncRead(socket, &response_buffer[0], response.size(), &rv); | 115 ASSERT_SUBTEST_SUCCESS( |
126 if (!error_message.empty()) | 116 SyncRead(socket, &response_buffer[0], response.size(), &rv)); |
127 return error_message; | |
128 std::string actual_response(&response_buffer[0], rv); | 117 std::string actual_response(&response_buffer[0], rv); |
129 if (response != actual_response) { | 118 if (response != actual_response) { |
130 return "CheckHTTPResponse failed, expected: " + response + | 119 return "CheckHTTPResponse failed, expected: " + response + |
131 ", actual: " + actual_response; | 120 ", actual: " + actual_response; |
132 } | 121 } |
133 PASS(); | 122 PASS(); |
134 } | 123 } |
135 | 124 |
136 std::string TestHostResolverPrivate::SyncResolve( | 125 std::string TestHostResolverPrivate::SyncResolve( |
137 PP_Resource host_resolver, | 126 pp::HostResolverPrivate* host_resolver, |
138 const std::string& host, | 127 const std::string& host, |
139 uint16_t port, | 128 uint16_t port, |
140 const PP_HostResolver_Private_Hint& hint) { | 129 const PP_HostResolver_Private_Hint& hint) { |
141 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 130 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
142 int32_t rv = host_resolver_private_interface_->Resolve( | 131 int32_t rv = host_resolver->Resolve(host, port, hint, callback); |
143 host_resolver, | |
144 host.c_str(), | |
145 port, | |
146 &hint, | |
147 static_cast<pp::CompletionCallback>(callback).pp_completion_callback()); | |
148 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 132 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
149 return ReportError("PPB_HostResolver_Private::Resolve force_async", rv); | 133 return ReportError("PPB_HostResolver_Private::Resolve force_async", rv); |
150 if (rv == PP_OK_COMPLETIONPENDING) | 134 if (rv == PP_OK_COMPLETIONPENDING) |
151 rv = callback.WaitForResult(); | 135 rv = callback.WaitForResult(); |
152 if (rv != PP_OK) | 136 if (rv != PP_OK) |
153 return ReportError("PPB_HostResolver_Private::Resolve", rv); | 137 return ReportError("PPB_HostResolver_Private::Resolve", rv); |
154 PASS(); | 138 PASS(); |
155 } | 139 } |
156 | 140 |
157 std::string TestHostResolverPrivate::TestCreate() { | 141 std::string TestHostResolverPrivate::TestEmpty() { |
158 PP_Resource host_resolver = host_resolver_private_interface_->Create(0); | 142 pp::HostResolverPrivate host_resolver(instance_); |
159 ASSERT_EQ(0, host_resolver); | 143 ASSERT_EQ(0, host_resolver.GetSize()); |
| 144 PP_NetAddress_Private address; |
| 145 ASSERT_FALSE(host_resolver.GetNetAddress(0, &address)); |
160 | 146 |
161 host_resolver = | |
162 host_resolver_private_interface_->Create(instance_->pp_instance()); | |
163 ASSERT_NE(0, host_resolver); | |
164 ASSERT_TRUE(host_resolver_private_interface_->IsHostResolver(host_resolver)); | |
165 ASSERT_EQ(0, host_resolver_private_interface_->GetSize(host_resolver)); | |
166 | |
167 PP_NetAddress_Private address; | |
168 ASSERT_FALSE(host_resolver_private_interface_->GetNetAddress(host_resolver, | |
169 0, | |
170 &address)); | |
171 core_interface_->ReleaseResource(host_resolver); | |
172 PASS(); | 147 PASS(); |
173 } | 148 } |
174 | 149 |
175 std::string TestHostResolverPrivate::ParametrizedTestResolve( | 150 std::string TestHostResolverPrivate::ParametrizedTestResolve( |
176 const PP_HostResolver_Private_Hint &hint) { | 151 const PP_HostResolver_Private_Hint &hint) { |
177 PP_Resource host_resolver = | 152 pp::HostResolverPrivate host_resolver(instance_); |
178 host_resolver_private_interface_->Create(instance_->pp_instance()); | |
179 ASSERT_NE(0, host_resolver); | |
180 ASSERT_TRUE(host_resolver_private_interface_->IsHostResolver(host_resolver)); | |
181 | 153 |
182 std::string error_message = SyncResolve(host_resolver, host_, port_, hint); | 154 ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint)); |
183 if (!error_message.empty()) | |
184 return error_message; | |
185 | 155 |
186 const size_t size = host_resolver_private_interface_->GetSize(host_resolver); | 156 const size_t size = host_resolver.GetSize(); |
187 ASSERT_TRUE(size >= 1); | 157 ASSERT_TRUE(size >= 1); |
188 | 158 |
189 PP_NetAddress_Private address; | 159 PP_NetAddress_Private address; |
190 for (size_t i = 0; i < size; ++i) { | 160 for (size_t i = 0; i < size; ++i) { |
191 ASSERT_TRUE(host_resolver_private_interface_->GetNetAddress(host_resolver, | 161 ASSERT_TRUE(host_resolver.GetNetAddress(i, &address)); |
192 i, | 162 |
193 &address)); | |
194 pp::TCPSocketPrivate socket(instance_); | 163 pp::TCPSocketPrivate socket(instance_); |
195 error_message = SyncConnect(&socket, address); | 164 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, address)); |
196 error_message = | 165 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket, |
197 CheckHTTPResponse(&socket, "GET / HTTP/1.0\r\n\r\n", "HTTP/1.0"); | 166 "GET / HTTP/1.0\r\n\r\n", |
198 if (!error_message.empty()) | 167 "HTTP")); |
199 return error_message; | |
200 socket.Disconnect(); | 168 socket.Disconnect(); |
201 } | 169 } |
202 | 170 |
203 ASSERT_FALSE(host_resolver_private_interface_->GetNetAddress(host_resolver, | 171 ASSERT_FALSE(host_resolver.GetNetAddress(size, &address)); |
204 size, | 172 pp::Var canonical_name = host_resolver.GetCanonicalName(); |
205 &address)); | |
206 PP_Var pp_var = | |
207 host_resolver_private_interface_->GetCanonicalName(host_resolver); | |
208 pp::Var canonical_name(pp::PassRef(), pp_var); | |
209 ASSERT_TRUE(canonical_name.is_string()); | 173 ASSERT_TRUE(canonical_name.is_string()); |
210 pp::TCPSocketPrivate socket(instance_); | 174 pp::TCPSocketPrivate socket(instance_); |
211 error_message = SyncConnect(&socket, | 175 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, |
212 canonical_name.AsString().c_str(), | 176 canonical_name.AsString(), |
213 port_); | 177 port_)); |
214 if (!error_message.empty()) | 178 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket, |
215 return error_message; | 179 "GET / HTTP/1.0\r\n\r\n", |
216 error_message = CheckHTTPResponse(&socket, | 180 "HTTP")); |
217 "GET / HTTP/1.0\r\n\r\n", "HTTP"); | |
218 if (!error_message.empty()) | |
219 return error_message; | |
220 socket.Disconnect(); | 181 socket.Disconnect(); |
221 | 182 |
222 core_interface_->ReleaseResource(host_resolver); | |
223 PASS(); | 183 PASS(); |
224 } | 184 } |
225 | 185 |
226 std::string TestHostResolverPrivate::TestResolve() { | 186 std::string TestHostResolverPrivate::TestResolve() { |
227 PP_HostResolver_Private_Hint hint; | 187 PP_HostResolver_Private_Hint hint; |
228 hint.family = PP_NETADDRESSFAMILY_UNSPECIFIED; | 188 hint.family = PP_NETADDRESSFAMILY_UNSPECIFIED; |
229 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME; | 189 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME; |
230 return ParametrizedTestResolve(hint); | 190 return ParametrizedTestResolve(hint); |
231 } | 191 } |
232 | 192 |
233 std::string TestHostResolverPrivate::TestResolveIPv4() { | 193 std::string TestHostResolverPrivate::TestResolveIPv4() { |
234 PP_HostResolver_Private_Hint hint; | 194 PP_HostResolver_Private_Hint hint; |
235 hint.family = PP_NETADDRESSFAMILY_IPV4; | 195 hint.family = PP_NETADDRESSFAMILY_IPV4; |
236 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME; | 196 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME; |
237 return ParametrizedTestResolve(hint); | 197 return ParametrizedTestResolve(hint); |
238 } | 198 } |
OLD | NEW |