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

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

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

Powered by Google App Engine
This is Rietveld 408576698