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

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 documentation for PPB_TCPServerSocket_Private methods, Create method became async. Created 8 years, 10 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::SyncCreate(
102 PP_Instance instance,
103 PP_Resource* tcp_server_socket) {
104 TestCompletionCallback callback(instance, force_async_);
105 int32_t rv = tcp_server_socket_private_interface_->Create(
106 instance, tcp_server_socket,
107 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
108
109 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
110 return ReportError("PPB_TCPServerSocket_Private::Create force_async", rv);
111 if (rv == PP_OK_COMPLETIONPENDING)
112 rv = callback.WaitForResult();
113 ASSERT_EQ(PP_OK, rv);
114
115 PASS();
116 }
117
118 std::string TestTCPServerSocketPrivate::SyncRead(PP_Resource socket,
119 char* buffer,
120 int32_t num_bytes) {
121 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
122
123 int32_t rv = tcp_socket_private_interface_->Read(
124 socket, buffer, num_bytes,
125 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
126
127 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
128 return ReportError("PPB_TCPSocket_Private::Read force_async", rv);
129 if (rv == PP_OK_COMPLETIONPENDING)
130 rv = callback.WaitForResult();
131
132 if (num_bytes != rv)
133 return ReportError("PPB_TCPSocket_Private::Read", rv);
134
135 PASS();
136 }
137
138 std::string TestTCPServerSocketPrivate::SyncWrite(PP_Resource socket,
139 const char* buffer,
140 int32_t num_bytes) {
141 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
142 int32_t rv = tcp_socket_private_interface_->Write(
143 socket, buffer, num_bytes,
144 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
145
146 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
147 return ReportError("PPB_TCPSocket_Private::Write force_async", rv);
148 if (rv == PP_OK_COMPLETIONPENDING)
149 rv = callback.WaitForResult();
150 if (num_bytes != rv)
151 return ReportError("PPB_TCPSocket_Private::Write", rv);
152
153 PASS();
154 }
155
156 std::string TestTCPServerSocketPrivate::SyncConnect(PP_Resource socket,
157 const char* host,
158 uint16_t port) {
159 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
160 int32_t rv = tcp_socket_private_interface_->Connect(
161 socket,
162 host_.c_str(),
163 port,
164 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
165 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
166 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
167 if (rv == PP_OK_COMPLETIONPENDING)
168 rv = callback.WaitForResult();
169 if (rv != PP_OK)
170 return ReportError("PPB_TCPSocket_Private::Connect", rv);
171
172 PASS();
173 }
174
175 void TestTCPServerSocketPrivate::ForceConnect(PP_Resource socket,
176 const char* host,
177 uint16_t port) {
178 std::string error_message;
179 do {
180 error_message = SyncConnect(socket, host, port);
181 } while (!error_message.empty());
182 }
183
184 std::string TestTCPServerSocketPrivate::SyncListen(PP_Resource socket,
185 uint16_t port,
186 int32_t backlog) {
187 PP_NetAddress_Private local_address;
188 std::string error_message = GetLocalAddress(port, &local_address);
189 ASSERT_SUCCESS(error_message);
190
191 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
192 int32_t rv = tcp_server_socket_private_interface_->Listen(
193 socket,
194 &local_address,
195 backlog,
196 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
197 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
198 return ReportError("PPB_TCPServerSocket_Private::Listen force_async", rv);
199 if (rv == PP_OK_COMPLETIONPENDING)
200 rv = callback.WaitForResult();
201 if (rv != PP_OK)
202 return ReportError("PPB_TCPServerSocket_Private::Listen", rv);
203
204 PASS();
205 }
206
207 bool TestTCPServerSocketPrivate::IsSocketsConnected(
208 PP_Resource lhs,
209 PP_Resource rhs) {
210 PP_NetAddress_Private lhs_local_addr, lhs_remote_addr;
211
212 if (!tcp_socket_private_interface_->GetLocalAddress(lhs, &lhs_local_addr))
213 return false;
214 if (!tcp_socket_private_interface_->GetRemoteAddress(lhs, &lhs_remote_addr))
215 return false;
216
217 PP_NetAddress_Private rhs_local_addr, rhs_remote_addr;
218 if (!tcp_socket_private_interface_->GetLocalAddress(rhs, &rhs_local_addr))
219 return false;
220 if (!tcp_socket_private_interface_->GetRemoteAddress(rhs, &rhs_remote_addr))
221 return false;
222
223 return NetAddressPrivate::AreEqual(lhs_local_addr, rhs_remote_addr) &&
224 NetAddressPrivate::AreEqual(lhs_remote_addr, rhs_local_addr);
225 }
226
227 std::string TestTCPServerSocketPrivate::SendMessage(PP_Resource dst,
228 PP_Resource src,
229 const char* message) {
230 const size_t message_size = strlen(message);
231
232 std::string error_message = SyncWrite(src, message, message_size);
233 ASSERT_SUCCESS(error_message);
234
235 std::vector<char> message_buffer(message_size);
236 error_message = SyncRead(dst, &message_buffer[0], message_size);
237 ASSERT_SUCCESS(error_message);
238 ASSERT_EQ(0, strncmp(message, &message_buffer[0], message_size));
239 PASS();
240 }
241
242 std::string TestTCPServerSocketPrivate::TestConnectedSockets(PP_Resource lhs,
243 PP_Resource rhs) {
244 static const char* const kMessage = "simple message";
245 std::string error_message = SendMessage(lhs, rhs, kMessage);
246 ASSERT_SUCCESS(error_message);
247 error_message = SendMessage(rhs, lhs, kMessage);
248 ASSERT_SUCCESS(error_message);
249 PASS();
250 }
251
252 std::string TestTCPServerSocketPrivate::TestCreate() {
253 PP_Resource server_socket;
254 std::string error_message;
255
256 error_message = SyncCreate(0, &server_socket);
257 if (error_message.empty())
258 return "Error: successful call of PPB_TCPServerSocket_Private::Create " \
259 " with 0 as instance";
260
261 error_message = SyncCreate(instance_->pp_instance(), &server_socket);
262 ASSERT_SUCCESS(error_message);
263 ASSERT_TRUE(server_socket != 0);
264 ASSERT_TRUE(tcp_server_socket_private_interface_->IsTCPServerSocket(
265 server_socket));
266 PASS();
267 }
268
269 std::string TestTCPServerSocketPrivate::TestListen() {
270 static const int kBacklog = 2;
271
272 PP_Resource server_socket;
273 std::string error_message = SyncCreate(instance_->pp_instance(),
274 &server_socket);
275 ASSERT_SUCCESS(error_message);
276 ASSERT_TRUE(server_socket != 0);
277
278 uint16_t local_port = force_async_ ? kLocalPortListenAsync :
279 kLocalPortListenSync;
280
281 error_message = SyncListen(server_socket, local_port, kBacklog);
282 ASSERT_SUCCESS(error_message);
283
284 TestCompletionCallback accept_callback(instance_->pp_instance(),
285 force_async_);
286 PP_Resource accepted_socket;
287 int32_t accept_rv = tcp_server_socket_private_interface_->Accept(
288 server_socket,
289 &accepted_socket,
290 static_cast<pp::CompletionCallback>(
291 accept_callback).pp_completion_callback());
292
293 TCPSocketPrivate client_socket(instance_);
294
295 ForceConnect(client_socket.pp_resource(), host_.c_str(), local_port);
296
297 if (force_async_ && accept_rv != PP_OK_COMPLETIONPENDING)
298 return ReportError("PPB_TCPServerSocket_Private::Accept force_async",
299 accept_rv);
300 if (accept_rv == PP_OK_COMPLETIONPENDING)
301 accept_rv = accept_callback.WaitForResult();
302 if (accept_rv != PP_OK)
303 return ReportError("PPB_TCPServerSocket_Private::Accept", accept_rv);
304
305 ASSERT_TRUE(accepted_socket != 0);
306 ASSERT_TRUE(tcp_socket_private_interface_->IsTCPSocket(accepted_socket));
307
308 ASSERT_TRUE(IsSocketsConnected(client_socket.pp_resource(), accepted_socket));
309 error_message = TestConnectedSockets(client_socket.pp_resource(),
310 accepted_socket);
311 ASSERT_SUCCESS(error_message);
312
313 tcp_socket_private_interface_->Disconnect(accepted_socket);
314 client_socket.Disconnect();
315 tcp_server_socket_private_interface_->StopListening(server_socket);
316
317 PASS();
318 }
319
320 std::string TestTCPServerSocketPrivate::TestBacklog() {
321 static const size_t kBacklog = 5;
322
323 PP_Resource server_socket;
324 std::string error_message = SyncCreate(instance_->pp_instance(),
325 &server_socket);
326 ASSERT_SUCCESS(error_message);
327 ASSERT_TRUE(server_socket != 0);
328
329 uint16_t local_port = force_async_ ? kLocalPortBacklogAsync :
330 kLocalPortBacklogSync;
331
332 error_message = SyncListen(server_socket, local_port, 2 * kBacklog);
333 ASSERT_SUCCESS(error_message);
334
335 std::vector<TCPSocketPrivate*> client_sockets(kBacklog);
336 std::vector<TestCompletionCallback*> connect_callbacks(kBacklog);
337 std::vector<int32_t> connect_rv(kBacklog);
338 for (size_t i = 0; i < kBacklog; ++i) {
339 client_sockets[i] = new TCPSocketPrivate(instance_);
340 connect_callbacks[i] = new TestCompletionCallback(instance_->pp_instance(),
341 force_async_);
342 connect_rv[i] = client_sockets[i]->Connect(host_.c_str(),
343 local_port,
344 *connect_callbacks[i]);
345 if (force_async_ && connect_rv[i] != PP_OK_COMPLETIONPENDING)
346 return ReportError("PPB_TCPSocket_Private::Connect force_async",
347 connect_rv[i]);
348 }
349
350 std::vector<PP_Resource> accepted_sockets(kBacklog);
351 for (size_t i = 0; i < kBacklog; ++i) {
352 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
353 int32_t rv = tcp_server_socket_private_interface_->Accept(
354 server_socket,
355 &accepted_sockets[i],
356 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
357 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
358 return ReportError("PPB_TCPServerSocket_Private::Accept force_async", rv);
359 if (rv == PP_OK_COMPLETIONPENDING)
360 rv = callback.WaitForResult();
361 if (rv != PP_OK)
362 return ReportError("PPB_TCPServerSocket_Private::Accept", rv);
363
364 ASSERT_TRUE(accepted_sockets[i] != 0);
365 ASSERT_TRUE(tcp_socket_private_interface_->IsTCPSocket(
366 accepted_sockets[i]));
367 }
368
369 for (size_t i = 0; i < kBacklog; ++i) {
370 if (connect_rv[i] == PP_OK_COMPLETIONPENDING)
371 connect_rv[i] = connect_callbacks[i]->WaitForResult();
372 if (connect_rv[i] != PP_OK)
373 return ReportError("PPB_TCPSocket_Private::Connect", connect_rv[i]);
374 }
375
376 for (size_t i = 0; i < kBacklog; ++i) {
377 bool found = false;
378 for (size_t j = 0; j < kBacklog && !found; ++j)
379 if (IsSocketsConnected(client_sockets[i]->pp_resource(),
380 accepted_sockets[j])) {
381 TestConnectedSockets(client_sockets[i]->pp_resource(),
382 accepted_sockets[j]);
383 found = true;
384 }
385 ASSERT_TRUE(found);
386 }
387
388 for (size_t i = 0; i < kBacklog; ++i)
389 tcp_socket_private_interface_->Disconnect(accepted_sockets[i]);
390
391 for (size_t i = 0; i < kBacklog; ++i) {
392 client_sockets[i]->Disconnect();
393 delete client_sockets[i];
394 delete connect_callbacks[i];
395 }
396
397 tcp_server_socket_private_interface_->StopListening(server_socket);
398
399 PASS();
400 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698