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

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

Issue 9283022: Exposed Listen and Accept methods to plugin. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Added shared declaration of GetPPB_TCPServerSocketPrivate_0_1_Thunk. Created 8 years, 11 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_tcp_server_socket_private.h"
6
7 #include <cstddef>
8 #include <cstring>
9 #include <vector>
10
11 #include "ppapi/cpp/module.h"
12 #include "ppapi/cpp/private/net_address_private.h"
13 #include "ppapi/cpp/private/tcp_socket_private.h"
14 #include "ppapi/tests/test_utils.h"
15 #include "ppapi/tests/testing_instance.h"
16
17 #define ASSERT_SUCCESS(error_message) \
18 if (!(error_message).empty()) \
19 return (error_message);
20
21 using pp::NetAddressPrivate;
22 using pp::TCPSocketPrivate;
23
24 REGISTER_TEST_CASE(TCPServerSocketPrivate);
25
26 TestTCPServerSocketPrivate::TestTCPServerSocketPrivate(
27 TestingInstance* instance)
28 : TestCase(instance),
29 tcp_server_socket_private_interface_(NULL),
30 tcp_socket_private_interface_(NULL),
31 port_(0) {
32 }
33
34 bool TestTCPServerSocketPrivate::Init() {
35 tcp_server_socket_private_interface_ =
36 static_cast<const PPB_TCPServerSocket_Private*>(
37 pp::Module::Get()->GetBrowserInterface(
38 PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE));
39 if (!tcp_server_socket_private_interface_)
40 instance_->AppendError(
41 "PPB_TCPServerSocket_Private interface not available");
42
43 tcp_socket_private_interface_ =
44 static_cast<const PPB_TCPSocket_Private*>(
45 pp::Module::Get()->GetBrowserInterface(
46 PPB_TCPSOCKET_PRIVATE_INTERFACE));
47 if (!tcp_socket_private_interface_)
48 instance_->AppendError("PPB_TCPSocket_Private interface not available");
49
50 bool tcp_socket_private_is_available = TCPSocketPrivate::IsAvailable();
51 if (!tcp_socket_private_is_available)
52 instance_->AppendError("PPB_TCPSocket_Private interface not available");
53
54 bool net_address_private_is_available = NetAddressPrivate::IsAvailable();
55 if (!net_address_private_is_available)
56 instance_->AppendError("PPB_NetAddress_Private interface not available");
57
58 bool init_host_port = GetLocalHostPort(
59 instance_->pp_instance(), &host_, &port_);
60 if (!init_host_port)
61 instance_->AppendError("Can't init host and port");
62
63 return tcp_server_socket_private_interface_ &&
64 tcp_socket_private_is_available &&
65 net_address_private_is_available &&
66 init_host_port &&
67 CheckTestingInterface();
68 }
69
70 void TestTCPServerSocketPrivate::RunTests(const std::string& filter) {
71 RUN_TEST(Create, filter);
72 RUN_TEST_FORCEASYNC_AND_NOT(Listen, filter);
73 RUN_TEST_FORCEASYNC_AND_NOT(Backlog, filter);
74 }
75
76 std::string TestTCPServerSocketPrivate::GetLocalAddress(
77 uint16_t port,
78 PP_NetAddress_Private* address) {
79 TCPSocketPrivate socket(instance_);
80 PP_NetAddress_Private local_address;
81
82 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
83 int32_t rv = socket.Connect(host_.c_str(), port_, callback);
84 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
85 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
86 if (rv == PP_OK_COMPLETIONPENDING)
87 rv = callback.WaitForResult();
88 if (rv != PP_OK)
89 return ReportError("PPB_TCPSocket_Private::Connect", rv);
90
91 if (!socket.GetLocalAddress(&local_address))
92 return ReportError("PPB_TCPSocket_Private::GetLocalAddress", 0);
93 socket.Disconnect();
94
95 if (!NetAddressPrivate::ReplacePort(local_address, port, address))
96 return ReportError("PPB_NetAddress_Private::ReplacePort", 0);
97
98 PASS();
99 }
100
101 std::string TestTCPServerSocketPrivate::SyncRead(PP_Resource socket,
102 char* buffer,
103 int32_t num_bytes) {
104 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
105
106 int32_t rv = tcp_socket_private_interface_->Read(
107 socket, buffer, num_bytes,
108 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
109
110 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
111 return ReportError("PPB_TCPSocket_Private::Read force_async", rv);
112 if (rv == PP_OK_COMPLETIONPENDING)
113 rv = callback.WaitForResult();
114
115 if (num_bytes != rv)
116 return ReportError("PPB_TCPSocket_Private::Read", rv);
117
118 PASS();
119 }
120
121 std::string TestTCPServerSocketPrivate::SyncWrite(PP_Resource socket,
122 const char* buffer,
123 int32_t num_bytes) {
124 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
125 int32_t rv = tcp_socket_private_interface_->Write(
126 socket, buffer, num_bytes,
127 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
128
129 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
130 return ReportError("PPB_TCPSocket_Private::Write force_async", rv);
131 if (rv == PP_OK_COMPLETIONPENDING)
132 rv = callback.WaitForResult();
133 if (num_bytes != rv)
134 return ReportError("PPB_TCPSocket_Private::Write", rv);
135
136 PASS();
137 }
138
139 std::string TestTCPServerSocketPrivate::SyncConnect(PP_Resource socket,
140 const char* host,
141 uint16_t port) {
142 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
143 int32_t rv = tcp_socket_private_interface_->Connect(
144 socket,
145 host_.c_str(),
146 port,
147 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
148 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
149 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
150 if (rv == PP_OK_COMPLETIONPENDING)
151 rv = callback.WaitForResult();
152 if (rv != PP_OK)
153 return ReportError("PPB_TCPSocket_Private::Connect", rv);
154
155 PASS();
156 }
157
158 void TestTCPServerSocketPrivate::ForceConnect(PP_Resource socket,
159 const char* host,
160 uint16_t port) {
161 std::string error_message;
162 do
163 error_message = SyncConnect(socket, host, port);
164 while (!error_message.empty());
165 }
166
167 std::string TestTCPServerSocketPrivate::SyncListen(PP_Resource socket,
168 uint16_t port,
169 int32_t backlog) {
170 PP_NetAddress_Private local_address;
171 std::string error_message = GetLocalAddress(port, &local_address);
172 ASSERT_SUCCESS(error_message);
173
174 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
175 int32_t rv = tcp_server_socket_private_interface_->Listen(
176 socket,
177 &local_address,
178 backlog,
179 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
180 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
181 return ReportError("PPB_TCPServerSocket_Private::Listen force_async", rv);
182 if (rv == PP_OK_COMPLETIONPENDING)
183 rv = callback.WaitForResult();
184 if (rv != PP_OK)
185 return ReportError("PPB_TCPServerSocket_Private::Listen", rv);
186
187 PASS();
188 }
189
190 bool TestTCPServerSocketPrivate::IsSocketsConnected(
191 PP_Resource lhs,
192 PP_Resource rhs) {
193 PP_NetAddress_Private lhs_local_addr, lhs_remote_addr;
194
195 if (!tcp_socket_private_interface_->GetLocalAddress(lhs, &lhs_local_addr))
196 return false;
197 if (!tcp_socket_private_interface_->GetRemoteAddress(lhs, &lhs_remote_addr))
198 return false;
199
200 PP_NetAddress_Private rhs_local_addr, rhs_remote_addr;
201 if (!tcp_socket_private_interface_->GetLocalAddress(rhs, &rhs_local_addr))
202 return false;
203 if (!tcp_socket_private_interface_->GetRemoteAddress(rhs, &rhs_remote_addr))
204 return false;
205
206 return NetAddressPrivate::AreEqual(lhs_local_addr, rhs_remote_addr) &&
207 NetAddressPrivate::AreEqual(lhs_remote_addr, rhs_local_addr);
208 }
209
210 std::string TestTCPServerSocketPrivate::SendMessage(PP_Resource dst,
211 PP_Resource src,
212 const char* message) {
213 const size_t message_size = strlen(message);
214
215 std::string error_message = SyncWrite(src, message, message_size);
216 ASSERT_SUCCESS(error_message);
217
218 std::vector<char> message_buffer(message_size);
219 error_message = SyncRead(dst, &message_buffer[0], message_size);
220 ASSERT_SUCCESS(error_message);
221
222 ASSERT_EQ(0, strncmp(message, &message_buffer[0], message_size));
223
224 PASS();
225 }
226
227 std::string TestTCPServerSocketPrivate::TestConnectedSockets(PP_Resource lhs,
228 PP_Resource rhs) {
229 static const char* const kMessage = "simple message";
230 std::string error_message = SendMessage(lhs, rhs, kMessage);
231 ASSERT_SUCCESS(error_message);
232 error_message = SendMessage(rhs, lhs, kMessage);
233 ASSERT_SUCCESS(error_message);
234 PASS();
235 }
236
237 std::string TestTCPServerSocketPrivate::TestCreate() {
238 PP_Resource tcp_server_socket =
239 tcp_server_socket_private_interface_->Create(0);
240 ASSERT_EQ(0, tcp_server_socket);
241 tcp_server_socket =
242 tcp_server_socket_private_interface_->Create(instance_->pp_instance());
243 ASSERT_TRUE(tcp_server_socket != 0);
244 ASSERT_TRUE(tcp_server_socket_private_interface_->IsTCPServerSocket(
245 tcp_server_socket));
246 PASS();
247 }
248
249 std::string TestTCPServerSocketPrivate::TestListen() {
250 static const int kBacklog = 1;
251
252 PP_Resource server_socket =
253 tcp_server_socket_private_interface_->Create(instance_->pp_instance());
254 ASSERT_TRUE(server_socket != 0);
255
256 uint16_t local_port = force_async_ ? kLocalPortListenAsync :
257 kLocalPortListenSync;
258
259 std::string error_message = SyncListen(server_socket, local_port, kBacklog);
260 ASSERT_SUCCESS(error_message);
261
262 TestCompletionCallback accept_callback(instance_->pp_instance(),
263 force_async_);
264 PP_Resource accepted_socket;
265 int32_t accept_rv = tcp_server_socket_private_interface_->Accept(
266 server_socket,
267 &accepted_socket,
268 static_cast<pp::CompletionCallback>(
269 accept_callback).pp_completion_callback());
270
271 TCPSocketPrivate client_socket(instance_);
272
273 ForceConnect(client_socket.pp_resource(), host_.c_str(), local_port);
274
275 if (force_async_ && accept_rv != PP_OK_COMPLETIONPENDING)
276 return ReportError("PPB_TCPServerSocket_Private::Accept force_async",
277 accept_rv);
278 if (accept_rv == PP_OK_COMPLETIONPENDING)
279 accept_rv = accept_callback.WaitForResult();
280 if (accept_rv != PP_OK)
281 return ReportError("PPB_TCPServerSocket_Private::Accept", accept_rv);
282
283 ASSERT_TRUE(accepted_socket != 0);
284 ASSERT_TRUE(tcp_socket_private_interface_->IsTCPSocket(accepted_socket));
285
286 ASSERT_TRUE(IsSocketsConnected(client_socket.pp_resource(), accepted_socket));
287 error_message = TestConnectedSockets(client_socket.pp_resource(),
288 accepted_socket);
289 ASSERT_SUCCESS(error_message);
290
291 tcp_socket_private_interface_->Disconnect(accepted_socket);
292 client_socket.Disconnect();
293 tcp_server_socket_private_interface_->StopListening(server_socket);
294
295 PASS();
296 }
297
298 std::string TestTCPServerSocketPrivate::TestBacklog() {
299 static const size_t kBacklog = 10;
300
301 PP_Resource server_socket =
302 tcp_server_socket_private_interface_->Create(instance_->pp_instance());
303 ASSERT_TRUE(server_socket != 0);
304
305 uint16_t local_port = force_async_ ? kLocalPortBacklogAsync :
306 kLocalPortBacklogSync;
307
308 std::string error_message = SyncListen(server_socket,
309 local_port,
310 kBacklog);
311 ASSERT_SUCCESS(error_message);
312
313 std::vector<TCPSocketPrivate*> client_sockets(kBacklog);
314 std::vector<TestCompletionCallback*> connect_callbacks(kBacklog);
315 std::vector<int32_t> connect_rv(kBacklog);
316 for (size_t i = 0; i < kBacklog; ++i) {
317 client_sockets[i] = new TCPSocketPrivate(instance_);
318 connect_callbacks[i] = new TestCompletionCallback(instance_->pp_instance(),
319 force_async_);
320 connect_rv[i] = client_sockets[i]->Connect(host_.c_str(),
321 local_port,
322 *connect_callbacks[i]);
323 if (force_async_ && connect_rv[i] != PP_OK_COMPLETIONPENDING)
324 return ReportError("PPB_TCPSocket_Private::Connect force_async",
325 connect_rv[i]);
326 }
327
328 std::vector<PP_Resource> accepted_sockets(kBacklog);
329 for (size_t i = 0; i < kBacklog; ++i) {
330 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
331 int32_t rv = tcp_server_socket_private_interface_->Accept(
332 server_socket,
333 &accepted_sockets[i],
334 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
335 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
336 return ReportError("PPB_TCPServerSocket_Private::Accept force_async", rv);
337 if (rv == PP_OK_COMPLETIONPENDING)
338 rv = callback.WaitForResult();
339 if (rv != PP_OK)
340 return ReportError("PPB_TCPServerSocket_Private::Accept", rv);
341
342 ASSERT_TRUE(accepted_sockets[i] != 0);
343 ASSERT_TRUE(tcp_socket_private_interface_->IsTCPSocket(
344 accepted_sockets[i]));
345 }
346
347 for (size_t i = 0; i < kBacklog; ++i) {
348 if (connect_rv[i] == PP_OK_COMPLETIONPENDING)
349 connect_rv[i] = connect_callbacks[i]->WaitForResult();
350 if (connect_rv[i] != PP_OK)
351 return ReportError("PPB_TCPSocket_Private::Connect", connect_rv[i]);
352 }
353
354 for (size_t i = 0; i < kBacklog; ++i) {
355 bool found = false;
356 for (size_t j = 0; j < kBacklog && !found; ++j)
357 if (IsSocketsConnected(client_sockets[i]->pp_resource(),
358 accepted_sockets[j])) {
359 TestConnectedSockets(client_sockets[i]->pp_resource(),
360 accepted_sockets[j]);
361 found = true;
362 }
363 ASSERT_TRUE(found);
364 }
365
366 for (size_t i = 0; i < kBacklog; ++i)
367 tcp_socket_private_interface_->Disconnect(accepted_sockets[i]);
368
369 for (size_t i = 0; i < kBacklog; ++i) {
370 client_sockets[i]->Disconnect();
371 delete client_sockets[i];
372 delete connect_callbacks[i];
373 }
374
375 tcp_server_socket_private_interface_->StopListening(server_socket);
376
377 PASS();
378 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698