OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_udp_socket.h" | 5 #include "ppapi/tests/test_udp_socket.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "ppapi/cpp/pass_ref.h" | 9 #include "ppapi/cpp/pass_ref.h" |
10 #include "ppapi/cpp/tcp_socket.h" | 10 #include "ppapi/cpp/tcp_socket.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 net_address_is_available && | 76 net_address_is_available && |
77 init_address && | 77 init_address && |
78 CheckTestingInterface() && | 78 CheckTestingInterface() && |
79 EnsureRunningOverHTTP(); | 79 EnsureRunningOverHTTP(); |
80 } | 80 } |
81 | 81 |
82 void TestUDPSocket::RunTests(const std::string& filter) { | 82 void TestUDPSocket::RunTests(const std::string& filter) { |
83 RUN_CALLBACK_TEST(TestUDPSocket, ReadWrite, filter); | 83 RUN_CALLBACK_TEST(TestUDPSocket, ReadWrite, filter); |
84 RUN_CALLBACK_TEST(TestUDPSocket, Broadcast, filter); | 84 RUN_CALLBACK_TEST(TestUDPSocket, Broadcast, filter); |
85 RUN_CALLBACK_TEST(TestUDPSocket, SetOption, filter); | 85 RUN_CALLBACK_TEST(TestUDPSocket, SetOption, filter); |
86 RUN_CALLBACK_TEST(TestUDPSocket, ParallelSend, filter); | |
86 } | 87 } |
87 | 88 |
88 std::string TestUDPSocket::GetLocalAddress(pp::NetAddress* address) { | 89 std::string TestUDPSocket::GetLocalAddress(pp::NetAddress* address) { |
89 pp::TCPSocket socket(instance_); | 90 pp::TCPSocket socket(instance_); |
90 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); | 91 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
91 callback.WaitForResult(socket.Connect(address_, callback.GetCallback())); | 92 callback.WaitForResult(socket.Connect(address_, callback.GetCallback())); |
92 CHECK_CALLBACK_BEHAVIOR(callback); | 93 CHECK_CALLBACK_BEHAVIOR(callback); |
93 ASSERT_EQ(PP_OK, callback.result()); | 94 ASSERT_EQ(PP_OK, callback.result()); |
94 *address = socket.GetLocalAddress(); | 95 *address = socket.GetLocalAddress(); |
95 ASSERT_NE(0, address->pp_resource()); | 96 ASSERT_NE(0, address->pp_resource()); |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 ASSERT_EQ(PP_OK, callback.result()); | 310 ASSERT_EQ(PP_OK, callback.result()); |
310 | 311 |
311 callback.WaitForResult(socket.SetOption( | 312 callback.WaitForResult(socket.SetOption( |
312 PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE, pp::Var(1024), | 313 PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE, pp::Var(1024), |
313 callback.GetCallback())); | 314 callback.GetCallback())); |
314 CHECK_CALLBACK_BEHAVIOR(callback); | 315 CHECK_CALLBACK_BEHAVIOR(callback); |
315 ASSERT_EQ(PP_OK, callback.result()); | 316 ASSERT_EQ(PP_OK, callback.result()); |
316 | 317 |
317 PASS(); | 318 PASS(); |
318 } | 319 } |
320 | |
321 std::string TestUDPSocket::TestParallelSend() { | |
322 // This test only makes sense when callbacks are optional. | |
323 if (callback_type() == PP_OPTIONAL) { | |
dmichael (off chromium)
2014/10/08 17:20:46
Maybe it would be cleaner to do:
if (callback_type
bbudge
2014/10/08 21:44:35
Done.
| |
324 pp::UDPSocket server_socket(instance_), client_socket(instance_); | |
325 pp::NetAddress server_address, client_address; | |
326 | |
327 ASSERT_SUBTEST_SUCCESS( | |
328 LookupPortAndBindUDPSocket(&server_socket, &server_address)); | |
329 ASSERT_SUBTEST_SUCCESS( | |
330 LookupPortAndBindUDPSocket(&client_socket, &client_address)); | |
331 const std::string message = "Simple message that will be sent via UDP"; | |
332 pp::NetAddress recvfrom_address; | |
333 | |
334 const size_t kParallelSends = 10; | |
335 std::vector<TestCompletionCallback*> sendto_callbacks(kParallelSends); | |
336 std::vector<int32_t> sendto_results(kParallelSends); | |
337 size_t pending = 0; | |
338 for (size_t i = 0; i < kParallelSends; i++) { | |
339 sendto_callbacks[i] = | |
340 new TestCompletionCallback(instance_->pp_instance(), callback_type()); | |
341 sendto_results[i] = | |
342 client_socket.SendTo(message.c_str(), | |
343 message.size(), | |
344 server_address, | |
345 sendto_callbacks[i]->GetCallback()); | |
346 | |
347 while (sendto_results[i] == PP_ERROR_INPROGRESS) { | |
348 // Run pending sends to completion until we can send successfully. | |
349 ASSERT_GT(i, pending); | |
350 sendto_callbacks[pending]->WaitForResult(sendto_results[pending]); | |
351 CHECK_CALLBACK_BEHAVIOR(*sendto_callbacks[pending]); | |
352 ASSERT_EQ(message.size(), | |
353 static_cast<size_t>(sendto_callbacks[pending]->result())); | |
354 pending++; | |
355 // Try to send the message again. | |
356 sendto_results[i] = | |
357 client_socket.SendTo(message.c_str(), | |
358 message.size(), | |
359 server_address, | |
360 sendto_callbacks[i]->GetCallback()); | |
dmichael (off chromium)
2014/10/08 17:20:46
At this point, I don't think sendto_results[i] sho
bbudge
2014/10/08 21:44:35
OK, I think it's probably good to constrain this b
| |
361 } | |
362 } | |
363 | |
364 // Finish all pending sends. | |
365 for (size_t i = pending; i < kParallelSends; i++) { | |
366 sendto_callbacks[i]->WaitForResult(sendto_results[i]); | |
367 CHECK_CALLBACK_BEHAVIOR(*sendto_callbacks[i]); | |
368 ASSERT_EQ(message.size(), | |
369 static_cast<size_t>(sendto_callbacks[i]->result())); | |
370 } | |
371 | |
372 for (size_t i = 0; i < kParallelSends; ++i) | |
373 delete sendto_callbacks[i]; | |
374 | |
375 for (size_t i = 0; i < kParallelSends; i++) { | |
376 std::string str; | |
377 ASSERT_SUBTEST_SUCCESS( | |
378 ReadSocket(&server_socket, &recvfrom_address, message.size(), &str)); | |
379 ASSERT_EQ(message, str); | |
380 } | |
381 | |
382 server_socket.Close(); | |
383 client_socket.Close(); | |
384 } | |
385 | |
386 PASS(); | |
387 } | |
OLD | NEW |