Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1310)

Side by Side Diff: ppapi/tests/test_host_resolver_private.cc

Issue 9455092: HostResolver is exposed to plugin. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: CreateNetworkListFromAddrInfo marked as shared. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "ppapi/tests/test_host_resolver_private.h"
6
7 #include <cstddef>
8
9 #include "ppapi/c/private/ppb_net_address_private.h"
10 #include "ppapi/cpp/module.h"
11 #include "ppapi/cpp/pass_ref.h"
12 #include "ppapi/cpp/private/tcp_socket_private.h"
13 #include "ppapi/cpp/var.h"
14 #include "ppapi/tests/test_utils.h"
15 #include "ppapi/tests/testing_instance.h"
16
17 namespace {
18
19 const char* const kHost = "www.google.com";
20 const uint16_t kPort = 80;
21
22 } // namespace
23
24 REGISTER_TEST_CASE(HostResolverPrivate);
25
26 TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance)
27 : TestCase(instance) {
28 }
29
30 bool TestHostResolverPrivate::Init() {
31 core_interface_ = static_cast<const PPB_Core*>(
32 pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE));
33 if (!core_interface_)
34 instance_->AppendError("PPB_Core interface not available");
35 host_resolver_private_interface_ =
36 static_cast<const PPB_HostResolver_Private*>(
37 pp::Module::Get()->GetBrowserInterface(
38 PPB_HOSTRESOLVER_PRIVATE_INTERFACE));
39 bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable();
40 if (!tcp_socket_private_is_available)
41 instance_->AppendError("PPB_TCPSocket_Private interface not available");
42 if (!host_resolver_private_interface_)
43 instance_->AppendError("PPB_HostResolver_Private interface not available");
44 return core_interface_ &&
45 host_resolver_private_interface_ &&
46 tcp_socket_private_is_available;
47 }
48
49 void TestHostResolverPrivate::RunTests(const std::string& filter) {
50 RUN_TEST(Create, filter);
51 RUN_TEST_FORCEASYNC_AND_NOT(Resolve, filter);
52 RUN_TEST_FORCEASYNC_AND_NOT(ResolveIPv4, filter);
53 RUN_TEST_FORCEASYNC_AND_NOT(ResolveIPv6, filter);
54 }
55
56 std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket,
57 const std::string& host,
58 uint16_t port) {
59 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
60 int32_t rv = socket->Connect(host.c_str(), port, callback);
61 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
62 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
63 if (rv == PP_OK_COMPLETIONPENDING)
64 rv = callback.WaitForResult();
65 ASSERT_EQ(PP_OK, rv);
66 PASS();
67 }
68
69 std::string TestHostResolverPrivate::SyncConnect(
70 pp::TCPSocketPrivate* socket,
71 const PP_NetAddress_Private& address) {
72 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
73 int32_t rv = socket->ConnectWithNetAddress(&address, callback);
74 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
75 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
76 if (rv == PP_OK_COMPLETIONPENDING)
77 rv = callback.WaitForResult();
78 ASSERT_EQ(PP_OK, rv);
79 PASS();
80 }
81
82 std::string TestHostResolverPrivate::SyncRead(pp::TCPSocketPrivate* socket,
83 char* buffer,
84 int32_t num_bytes,
85 int32_t* bytes_read) {
86 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
87 int32_t rv = socket->Read(buffer, num_bytes, callback);
88 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
89 return ReportError("PPB_TCPSocket_Private::Read force_async", rv);
90 if (rv == PP_OK_COMPLETIONPENDING)
91 rv = callback.WaitForResult();
92 if (num_bytes != rv)
93 return ReportError("PPB_TCPSocket_Private::Read", rv);
94 *bytes_read = rv;
95 PASS();
96 }
97
98 std::string TestHostResolverPrivate::SyncWrite(pp::TCPSocketPrivate* socket,
99 const char* buffer,
100 int32_t num_bytes,
101 int32_t* bytes_written) {
102 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
103 int32_t rv = socket->Write(buffer, num_bytes, callback);
104 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
105 return ReportError("PPB_TCPSocket_Private::Write force_async", rv);
106 if (rv == PP_OK_COMPLETIONPENDING)
107 rv = callback.WaitForResult();
108 if (num_bytes != rv)
109 return ReportError("PPB_TCPSocket_Private::Write", rv);
110 *bytes_written = rv;
111 PASS();
112 }
113
114 std::string TestHostResolverPrivate::CheckHTTPResponse(
115 pp::TCPSocketPrivate* socket,
116 const std::string& request,
117 const std::string& response) {
118 int32_t rv = 0;
119 std::string error_message;
120
121 error_message = SyncWrite(socket, request.c_str(), request.size(), &rv);
122 if (!error_message.empty())
123 return error_message;
124
125 std::vector<char> response_buffer(response.size());
126 error_message = SyncRead(socket, &response_buffer[0], response.size(), &rv);
127 if (!error_message.empty())
128 return error_message;
129 std::string actual_response(&response_buffer[0], rv);
130 if (response != actual_response) {
131 return "CheckHTTPResponse failed, expected: " + response +
132 ", actual: " + actual_response;
133 }
134 PASS();
135 }
136
137 std::string TestHostResolverPrivate::SyncResolve(
138 PP_Resource host_resolver,
139 const std::string& host,
140 uint16_t port,
141 const PP_HostResolver_Private_Hint& hint) {
142 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
143 int32_t rv = host_resolver_private_interface_->Resolve(
144 host_resolver,
145 host.c_str(),
146 port,
147 &hint,
148 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
149 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
150 return ReportError("PPB_HostResolver_Private::Resolve force_async", rv);
151 if (rv == PP_OK_COMPLETIONPENDING)
152 rv = callback.WaitForResult();
153 if (rv != PP_OK)
154 return ReportError("PPB_HostResolver_Private::Resolve", rv);
155 PASS();
156 }
157
158 std::string TestHostResolverPrivate::TestCreate() {
159 PP_Resource host_resolver = host_resolver_private_interface_->Create(0);
160 ASSERT_EQ(0, host_resolver);
161
162 host_resolver =
163 host_resolver_private_interface_->Create(instance_->pp_instance());
164 ASSERT_NE(0, host_resolver);
165 ASSERT_TRUE(host_resolver_private_interface_->IsHostResolver(host_resolver));
166 ASSERT_EQ(0, host_resolver_private_interface_->GetSize(host_resolver));
167 ASSERT_FALSE(host_resolver_private_interface_->GetItem(host_resolver,
168 0,
169 NULL,
170 NULL));
171 core_interface_->ReleaseResource(host_resolver);
172 PASS();
173 }
174
175 std::string TestHostResolverPrivate::ParametrizedTestResolve(
176 const PP_HostResolver_Private_Hint &hint) {
177 PP_Resource host_resolver =
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
182 std::string error_message = SyncResolve(host_resolver, kHost, kPort, hint);
183 if (!error_message.empty())
184 return error_message;
185
186 const size_t size = host_resolver_private_interface_->GetSize(host_resolver);
187 ASSERT_TRUE(size >= 1);
188
189 PP_NetAddress_Private address;
190 for (size_t i = 0; i < size; ++i) {
191 ASSERT_TRUE(host_resolver_private_interface_->GetItem(host_resolver,
192 i,
193 NULL,
194 &address));
195 pp::TCPSocketPrivate socket(instance_);
196 error_message = SyncConnect(&socket, address);
197 error_message =
198 CheckHTTPResponse(&socket, "GET / HTTP/1.0\r\n\r\n", "HTTP/1.0");
199 if (!error_message.empty())
200 return error_message;
201 socket.Disconnect();
202 }
203
204 ASSERT_FALSE(host_resolver_private_interface_->GetItem(host_resolver,
205 size,
206 NULL,
207 &address));
208 PP_Var pp_var;
209 ASSERT_TRUE(host_resolver_private_interface_->GetItem(host_resolver,
210 0,
211 &pp_var,
212 &address));
213 pp::Var canonical_name(pp::PassRef(), pp_var);
214 ASSERT_TRUE(canonical_name.is_string());
215 pp::TCPSocketPrivate socket(instance_);
216 error_message = SyncConnect(&socket,
217 canonical_name.AsString().c_str(),
218 kPort);
219 if (!error_message.empty())
220 return error_message;
221 error_message = CheckHTTPResponse(&socket,
222 "GET / HTTP/1.0\r\n\r\n", "HTTP/1.0");
223 if (!error_message.empty())
224 return error_message;
225 socket.Disconnect();
226
227 core_interface_->ReleaseResource(host_resolver);
228 PASS();
229 }
230
231 std::string TestHostResolverPrivate::TestResolve() {
232 PP_HostResolver_Private_Hint hint;
233 hint.family = PP_NETADDRESSFAMILY_UNSPECIFIED;
234 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME;
235 return ParametrizedTestResolve(hint);
236 }
237
238 std::string TestHostResolverPrivate::TestResolveIPv4() {
239 PP_HostResolver_Private_Hint hint;
240 hint.family = PP_NETADDRESSFAMILY_IPV4;
241 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME;
242 return ParametrizedTestResolve(hint);
243 }
244
245 std::string TestHostResolverPrivate::TestResolveIPv6() {
246 PP_HostResolver_Private_Hint hint;
247 hint.family = PP_NETADDRESSFAMILY_IPV6;
248 hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME;
249 return ParametrizedTestResolve(hint);
250 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698