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

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

Powered by Google App Engine
This is Rietveld 408576698