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

Side by Side Diff: mojo/services/network/udp_socket_apptest.cc

Issue 863253002: Update from https://crrev.com/312600 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/macros.h" 5 #include "base/macros.h"
6 #include "base/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "mojo/public/cpp/application/application_connection.h" 8 #include "mojo/public/cpp/application/application_connection.h"
9 #include "mojo/public/cpp/application/application_impl.h" 9 #include "mojo/public/cpp/application/application_impl.h"
10 #include "mojo/public/cpp/application/application_test_base.h" 10 #include "mojo/public/cpp/application/application_test_base.h"
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 215 }
216 NotifyRun(); 216 NotifyRun();
217 } 217 }
218 }; 218 };
219 219
220 NetworkErrorPtr result_; 220 NetworkErrorPtr result_;
221 NetAddressPtr src_addr_; 221 NetAddressPtr src_addr_;
222 Array<uint8_t> data_; 222 Array<uint8_t> data_;
223 }; 223 };
224 224
225 struct ReceiveResult {
226 NetworkErrorPtr result;
227 NetAddressPtr addr;
228 Array<uint8_t> data;
229 };
230
231 class UDPSocketClientImpl : public UDPSocketClient {
232 public:
233 UDPSocketClientImpl() : run_loop_(nullptr), expected_receive_count_(0) {}
234
235 ~UDPSocketClientImpl() override {
236 while (!results_.empty()) {
237 delete results_.front();
238 results_.pop();
239 }
240 }
241
242 std::queue<ReceiveResult*>* results() {
243 return &results_;
244 }
245
246 void WaitForReceiveResults(size_t count) {
247 if (results_.size() == count)
248 return;
249
250 expected_receive_count_ = count;
251 base::RunLoop run_loop;
252 run_loop_ = &run_loop;
253 run_loop.Run();
254 run_loop_ = nullptr;
255 }
256
257 private:
258 void OnReceived(NetworkErrorPtr result,
259 NetAddressPtr src_addr,
260 Array<uint8_t> data) override {
261 ReceiveResult* entry = new ReceiveResult();
262 entry->result = result.Pass();
263 entry->addr = src_addr.Pass();
264 entry->data = data.Pass();
265
266 results_.push(entry);
267
268 if (results_.size() == expected_receive_count_ && run_loop_) {
269 expected_receive_count_ = 0;
270 run_loop_->Quit();
271 }
272 }
273
274 base::RunLoop* run_loop_;
275 std::queue<ReceiveResult*> results_;
276 size_t expected_receive_count_;
277
278 DISALLOW_COPY_AND_ASSIGN(UDPSocketClientImpl);
279 };
280
225 class UDPSocketAppTest : public test::ApplicationTestBase { 281 class UDPSocketAppTest : public test::ApplicationTestBase {
226 public: 282 public:
227 UDPSocketAppTest() {} 283 UDPSocketAppTest() {}
228 ~UDPSocketAppTest() override {} 284 ~UDPSocketAppTest() override {}
229 285
230 void SetUp() override { 286 void SetUp() override {
231 ApplicationTestBase::SetUp(); 287 ApplicationTestBase::SetUp();
232 288
233 ApplicationConnection* connection = 289 ApplicationConnection* connection =
234 application_impl()->ConnectToApplication("mojo:network_service"); 290 application_impl()->ConnectToApplication("mojo:network_service");
235 connection->ConnectToService(&network_service_); 291 connection->ConnectToService(&network_service_);
236 292
237 network_service_->CreateUDPSocket(GetProxy(&udp_socket_)); 293 network_service_->CreateUDPSocket(GetProxy(&socket_));
238 udp_socket_.set_client(&udp_socket_client_); 294 socket_.set_client(&receiver_);
239 } 295 }
240 296
241 protected: 297 protected:
242 struct ReceiveResult {
243 NetworkErrorPtr result;
244 NetAddressPtr addr;
245 Array<uint8_t> data;
246 };
247
248 class UDPSocketClientImpl : public UDPSocketClient {
249 public:
250
251 UDPSocketClientImpl() : run_loop_(nullptr), expected_receive_count_(0) {}
252
253 ~UDPSocketClientImpl() override {
254 while (!results_.empty()) {
255 delete results_.front();
256 results_.pop();
257 }
258 }
259
260 void OnReceived(NetworkErrorPtr result,
261 NetAddressPtr src_addr,
262 Array<uint8_t> data) override {
263 ReceiveResult* entry = new ReceiveResult();
264 entry->result = result.Pass();
265 entry->addr = src_addr.Pass();
266 entry->data = data.Pass();
267
268 results_.push(entry);
269
270 if (results_.size() == expected_receive_count_ && run_loop_) {
271 expected_receive_count_ = 0;
272 run_loop_->Quit();
273 }
274 }
275
276 base::RunLoop* run_loop_;
277 std::queue<ReceiveResult*> results_;
278 size_t expected_receive_count_;
279
280 DISALLOW_COPY_AND_ASSIGN(UDPSocketClientImpl);
281 };
282
283 std::queue<ReceiveResult*>* GetReceiveResults() {
284 return &udp_socket_client_.results_;
285 }
286
287 void WaitForReceiveResults(size_t count) {
288 if (GetReceiveResults()->size() == count)
289 return;
290
291 udp_socket_client_.expected_receive_count_ = count;
292 base::RunLoop run_loop;
293 udp_socket_client_.run_loop_ = &run_loop;
294 run_loop.Run();
295 udp_socket_client_.run_loop_ = nullptr;
296 }
297
298 NetworkServicePtr network_service_; 298 NetworkServicePtr network_service_;
299 UDPSocketPtr udp_socket_; 299 UDPSocketPtr socket_;
300 UDPSocketClientImpl udp_socket_client_; 300 UDPSocketClientImpl receiver_;
301 301
302 DISALLOW_COPY_AND_ASSIGN(UDPSocketAppTest); 302 DISALLOW_COPY_AND_ASSIGN(UDPSocketAppTest);
303 }; 303 };
304 304
305 } // namespace 305 } // namespace
306 306
307 TEST_F(UDPSocketAppTest, Settings) { 307 TEST_F(UDPSocketAppTest, Settings) {
308 TestCallback callback1; 308 TestCallback callback1;
309 udp_socket_->AllowAddressReuse(callback1.callback()); 309 socket_->AllowAddressReuse(callback1.callback());
310 callback1.WaitForResult(); 310 callback1.WaitForResult();
311 EXPECT_EQ(net::OK, callback1.result()->code); 311 EXPECT_EQ(net::OK, callback1.result()->code);
312 312
313 // Should fail because the socket hasn't been bound. 313 // Should fail because the socket hasn't been bound.
314 TestCallback callback2; 314 TestCallback callback2;
315 udp_socket_->SetSendBufferSize(1024, callback2.callback()); 315 socket_->SetSendBufferSize(1024, callback2.callback());
316 callback2.WaitForResult(); 316 callback2.WaitForResult();
317 EXPECT_NE(net::OK, callback2.result()->code); 317 EXPECT_NE(net::OK, callback2.result()->code);
318 318
319 // Should fail because the socket hasn't been bound. 319 // Should fail because the socket hasn't been bound.
320 TestCallback callback3; 320 TestCallback callback3;
321 udp_socket_->SetReceiveBufferSize(2048, callback3.callback()); 321 socket_->SetReceiveBufferSize(2048, callback3.callback());
322 callback3.WaitForResult(); 322 callback3.WaitForResult();
323 EXPECT_NE(net::OK, callback3.result()->code); 323 EXPECT_NE(net::OK, callback3.result()->code);
324 324
325 TestCallbackWithAddress callback4; 325 TestCallbackWithAddress callback4;
326 udp_socket_->Bind(GetLocalHostWithAnyPort(), callback4.callback()); 326 socket_->Bind(GetLocalHostWithAnyPort(), callback4.callback());
327 callback4.WaitForResult(); 327 callback4.WaitForResult();
328 EXPECT_EQ(net::OK, callback4.result()->code); 328 EXPECT_EQ(net::OK, callback4.result()->code);
329 EXPECT_NE(0u, callback4.net_address()->ipv4->port); 329 EXPECT_NE(0u, callback4.net_address()->ipv4->port);
330 330
331 // Should fail because the socket has been bound. 331 // Should fail because the socket has been bound.
332 TestCallback callback5; 332 TestCallback callback5;
333 udp_socket_->AllowAddressReuse(callback5.callback()); 333 socket_->AllowAddressReuse(callback5.callback());
334 callback5.WaitForResult(); 334 callback5.WaitForResult();
335 EXPECT_NE(net::OK, callback5.result()->code); 335 EXPECT_NE(net::OK, callback5.result()->code);
336 336
337 TestCallback callback6; 337 TestCallback callback6;
338 udp_socket_->SetSendBufferSize(1024, callback6.callback()); 338 socket_->SetSendBufferSize(1024, callback6.callback());
339 callback6.WaitForResult(); 339 callback6.WaitForResult();
340 EXPECT_EQ(net::OK, callback6.result()->code); 340 EXPECT_EQ(net::OK, callback6.result()->code);
341 341
342 TestCallback callback7; 342 TestCallback callback7;
343 udp_socket_->SetReceiveBufferSize(2048, callback7.callback()); 343 socket_->SetReceiveBufferSize(2048, callback7.callback());
344 callback7.WaitForResult(); 344 callback7.WaitForResult();
345 EXPECT_EQ(net::OK, callback7.result()->code); 345 EXPECT_EQ(net::OK, callback7.result()->code);
346 346
347 TestCallbackWithUint32 callback8; 347 TestCallbackWithUint32 callback8;
348 udp_socket_->NegotiateMaxPendingSendRequests(0, callback8.callback()); 348 socket_->NegotiateMaxPendingSendRequests(0, callback8.callback());
349 callback8.WaitForResult(); 349 callback8.WaitForResult();
350 EXPECT_GT(callback8.result(), 0u); 350 EXPECT_GT(callback8.result(), 0u);
351 351
352 TestCallbackWithUint32 callback9; 352 TestCallbackWithUint32 callback9;
353 udp_socket_->NegotiateMaxPendingSendRequests(16, callback9.callback()); 353 socket_->NegotiateMaxPendingSendRequests(16, callback9.callback());
354 callback9.WaitForResult(); 354 callback9.WaitForResult();
355 EXPECT_GT(callback9.result(), 0u); 355 EXPECT_GT(callback9.result(), 0u);
356 } 356 }
357 357
358 TEST_F(UDPSocketAppTest, TestReadWrite) { 358 TEST_F(UDPSocketAppTest, TestReadWrite) {
359 TestCallbackWithAddress callback1; 359 TestCallbackWithAddress callback1;
360 udp_socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback()); 360 socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback());
361 callback1.WaitForResult(); 361 callback1.WaitForResult();
362 ASSERT_EQ(net::OK, callback1.result()->code); 362 ASSERT_EQ(net::OK, callback1.result()->code);
363 ASSERT_NE(0u, callback1.net_address()->ipv4->port); 363 ASSERT_NE(0u, callback1.net_address()->ipv4->port);
364 364
365 NetAddressPtr server_addr = callback1.net_address().Clone(); 365 NetAddressPtr server_addr = callback1.net_address().Clone();
366 366
367 UDPSocketPtr client_socket; 367 UDPSocketPtr client_socket;
368 network_service_->CreateUDPSocket(GetProxy(&client_socket)); 368 network_service_->CreateUDPSocket(GetProxy(&client_socket));
369 369
370 TestCallbackWithAddress callback2; 370 TestCallbackWithAddress callback2;
371 client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback()); 371 client_socket->Bind(GetLocalHostWithAnyPort(), callback2.callback());
372 callback2.WaitForResult(); 372 callback2.WaitForResult();
373 ASSERT_EQ(net::OK, callback2.result()->code); 373 ASSERT_EQ(net::OK, callback2.result()->code);
374 ASSERT_NE(0u, callback2.net_address()->ipv4->port); 374 ASSERT_NE(0u, callback2.net_address()->ipv4->port);
375 375
376 NetAddressPtr client_addr = callback2.net_address().Clone(); 376 NetAddressPtr client_addr = callback2.net_address().Clone();
377 377
378 const size_t kDatagramCount = 6; 378 const size_t kDatagramCount = 6;
379 const size_t kDatagramSize = 255; 379 const size_t kDatagramSize = 255;
380 udp_socket_->ReceiveMore(kDatagramCount); 380 socket_->ReceiveMore(kDatagramCount);
381 381
382 for (size_t i = 0; i < kDatagramCount; ++i) { 382 for (size_t i = 0; i < kDatagramCount; ++i) {
383 TestCallback callback; 383 TestCallback callback;
384 client_socket->SendTo( 384 client_socket->SendTo(
385 server_addr.Clone(), 385 server_addr.Clone(),
386 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize), 386 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize),
387 callback.callback()); 387 callback.callback());
388 callback.WaitForResult(); 388 callback.WaitForResult();
389 EXPECT_EQ(255, callback.result()->code); 389 EXPECT_EQ(255, callback.result()->code);
390 } 390 }
391 391
392 WaitForReceiveResults(kDatagramCount); 392 receiver_.WaitForReceiveResults(kDatagramCount);
393 for (size_t i = 0; i < kDatagramCount; ++i) { 393 for (size_t i = 0; i < kDatagramCount; ++i) {
394 scoped_ptr<ReceiveResult> result(GetReceiveResults()->front()); 394 scoped_ptr<ReceiveResult> result(receiver_.results()->front());
395 GetReceiveResults()->pop(); 395 receiver_.results()->pop();
396 396
397 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code); 397 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code);
398 EXPECT_TRUE(result->addr.Equals(client_addr)); 398 EXPECT_TRUE(result->addr.Equals(client_addr));
399 EXPECT_TRUE(result->data.Equals( 399 EXPECT_TRUE(result->data.Equals(
400 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize))); 400 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize)));
401 } 401 }
402 } 402 }
403 403
404 TEST_F(UDPSocketAppTest, TestUDPSocketWrapper) { 404 TEST_F(UDPSocketAppTest, TestConnectedReadWrite) {
405 UDPSocketWrapper udp_socket(udp_socket_.Pass(), 4, 4);
406
407 TestCallbackWithAddress callback1; 405 TestCallbackWithAddress callback1;
408 udp_socket.Bind(GetLocalHostWithAnyPort(), callback1.callback()); 406 socket_->Bind(GetLocalHostWithAnyPort(), callback1.callback());
409 callback1.WaitForResult(); 407 callback1.WaitForResult();
410 ASSERT_EQ(net::OK, callback1.result()->code); 408 ASSERT_EQ(net::OK, callback1.result()->code);
411 ASSERT_NE(0u, callback1.net_address()->ipv4->port); 409 ASSERT_NE(0u, callback1.net_address()->ipv4->port);
410
411 NetAddressPtr server_addr = callback1.net_address().Clone();
412
413 UDPSocketPtr client_socket;
414 network_service_->CreateUDPSocket(GetProxy(&client_socket));
415 UDPSocketClientImpl client_socket_receiver;
416 client_socket.set_client(&client_socket_receiver);
417
418 TestCallbackWithAddress callback2;
419 client_socket->Connect(server_addr.Clone(), callback2.callback());
420 callback2.WaitForResult();
421 ASSERT_EQ(net::OK, callback2.result()->code);
422 ASSERT_NE(0u, callback2.net_address()->ipv4->port);
423
424 NetAddressPtr client_addr = callback2.net_address().Clone();
425
426 const size_t kDatagramCount = 6;
427 const size_t kDatagramSize = 255;
428
429 // Test send using a connected socket.
430 socket_->ReceiveMore(kDatagramCount);
431
432 for (size_t i = 0; i < kDatagramCount; ++i) {
433 TestCallback callback;
434 client_socket->SendTo(
435 nullptr,
436 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize),
437 callback.callback());
438 callback.WaitForResult();
439 EXPECT_EQ(255, callback.result()->code);
440 }
441
442 receiver_.WaitForReceiveResults(kDatagramCount);
443 for (size_t i = 0; i < kDatagramCount; ++i) {
444 scoped_ptr<ReceiveResult> result(receiver_.results()->front());
445 receiver_.results()->pop();
446
447 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code);
448 EXPECT_TRUE(result->addr.Equals(client_addr));
449 EXPECT_TRUE(result->data.Equals(
450 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize)));
451 }
452
453 // Test receive using a connected socket.
454 client_socket->ReceiveMore(kDatagramCount);
455
456 for (size_t i = 0; i < kDatagramCount; ++i) {
457 TestCallback callback;
458 socket_->SendTo(
459 client_addr.Clone(),
460 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize),
461 callback.callback());
462 callback.WaitForResult();
463 EXPECT_EQ(255, callback.result()->code);
464 }
465
466 client_socket_receiver.WaitForReceiveResults(kDatagramCount);
467 for (size_t i = 0; i < kDatagramCount; ++i) {
468 scoped_ptr<ReceiveResult> result(client_socket_receiver.results()->front());
469 client_socket_receiver.results()->pop();
470
471 EXPECT_EQ(static_cast<int>(kDatagramSize), result->result->code);
472 EXPECT_FALSE(result->addr);
473 EXPECT_TRUE(result->data.Equals(
474 CreateTestMessage(static_cast<uint8_t>(i), kDatagramSize)));
475 }
476 }
477
478 TEST_F(UDPSocketAppTest, TestWrapperReadWrite) {
479 UDPSocketWrapper socket(socket_.Pass(), 4, 4);
480
481 TestCallbackWithAddress callback1;
482 socket.Bind(GetLocalHostWithAnyPort(), callback1.callback());
483 callback1.WaitForResult();
484 ASSERT_EQ(net::OK, callback1.result()->code);
485 ASSERT_NE(0u, callback1.net_address()->ipv4->port);
412 486
413 NetAddressPtr server_addr = callback1.net_address().Clone(); 487 NetAddressPtr server_addr = callback1.net_address().Clone();
414 488
415 UDPSocketPtr raw_client_socket; 489 UDPSocketPtr raw_client_socket;
416 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket)); 490 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket));
417 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4); 491 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4);
418 492
419 TestCallbackWithAddress callback2; 493 TestCallbackWithAddress callback2;
420 client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback()); 494 client_socket.Bind(GetLocalHostWithAnyPort(), callback2.callback());
421 callback2.WaitForResult(); 495 callback2.WaitForResult();
422 ASSERT_EQ(net::OK, callback2.result()->code); 496 ASSERT_EQ(net::OK, callback2.result()->code);
423 ASSERT_NE(0u, callback2.net_address()->ipv4->port); 497 ASSERT_NE(0u, callback2.net_address()->ipv4->port);
424 498
425 NetAddressPtr client_addr = callback2.net_address().Clone(); 499 NetAddressPtr client_addr = callback2.net_address().Clone();
426 500
427 const size_t kDatagramCount = 16; 501 const size_t kDatagramCount = 16;
428 const size_t kDatagramSize = 255; 502 const size_t kDatagramSize = 255;
429 503
430 for (size_t i = 1; i < kDatagramCount; ++i) { 504 for (size_t i = 1; i < kDatagramCount; ++i) {
431 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]); 505 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]);
432 scoped_ptr<TestReceiveCallback[]> receive_callbacks( 506 scoped_ptr<TestReceiveCallback[]> receive_callbacks(
433 new TestReceiveCallback[i]); 507 new TestReceiveCallback[i]);
434 508
435 for (size_t j = 0; j < i; ++j) { 509 for (size_t j = 0; j < i; ++j) {
436 client_socket.SendTo( 510 client_socket.SendTo(
437 server_addr.Clone(), 511 server_addr.Clone(),
438 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize), 512 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize),
439 send_callbacks[j].callback()); 513 send_callbacks[j].callback());
440 514
441 udp_socket.ReceiveFrom(receive_callbacks[j].callback()); 515 socket.ReceiveFrom(receive_callbacks[j].callback());
442 } 516 }
443 517
444 receive_callbacks[i - 1].WaitForResult(); 518 receive_callbacks[i - 1].WaitForResult();
445 519
446 for (size_t j = 0; j < i; ++j) { 520 for (size_t j = 0; j < i; ++j) {
447 EXPECT_EQ(static_cast<int>(kDatagramSize), 521 EXPECT_EQ(static_cast<int>(kDatagramSize),
448 receive_callbacks[j].result()->code); 522 receive_callbacks[j].result()->code);
449 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr)); 523 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr));
450 EXPECT_TRUE(receive_callbacks[j].data().Equals( 524 EXPECT_TRUE(receive_callbacks[j].data().Equals(
451 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize))); 525 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize)));
452 } 526 }
453 } 527 }
454 } 528 }
455 529
530 TEST_F(UDPSocketAppTest, TestWrapperConnectedReadWrite) {
531 UDPSocketWrapper socket(socket_.Pass(), 4, 4);
532
533 TestCallbackWithAddress callback1;
534 socket.Bind(GetLocalHostWithAnyPort(), callback1.callback());
535 callback1.WaitForResult();
536 ASSERT_EQ(net::OK, callback1.result()->code);
537 ASSERT_NE(0u, callback1.net_address()->ipv4->port);
538
539 NetAddressPtr server_addr = callback1.net_address().Clone();
540
541 UDPSocketPtr raw_client_socket;
542 network_service_->CreateUDPSocket(GetProxy(&raw_client_socket));
543 UDPSocketWrapper client_socket(raw_client_socket.Pass(), 4, 4);
544
545 TestCallbackWithAddress callback2;
546 client_socket.Connect(server_addr.Pass(), callback2.callback());
547 callback2.WaitForResult();
548 ASSERT_EQ(net::OK, callback2.result()->code);
549 ASSERT_NE(0u, callback2.net_address()->ipv4->port);
550
551 NetAddressPtr client_addr = callback2.net_address().Clone();
552
553 const size_t kDatagramCount = 16;
554 const size_t kDatagramSize = 255;
555
556 // Test send using a connected socket.
557 for (size_t i = 1; i < kDatagramCount; ++i) {
558 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]);
559 scoped_ptr<TestReceiveCallback[]> receive_callbacks(
560 new TestReceiveCallback[i]);
561
562 for (size_t j = 0; j < i; ++j) {
563 client_socket.SendTo(
564 nullptr,
565 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize),
566 send_callbacks[j].callback());
567
568 socket.ReceiveFrom(receive_callbacks[j].callback());
569 }
570
571 receive_callbacks[i - 1].WaitForResult();
572
573 for (size_t j = 0; j < i; ++j) {
574 EXPECT_EQ(static_cast<int>(kDatagramSize),
575 receive_callbacks[j].result()->code);
576 EXPECT_TRUE(receive_callbacks[j].src_addr().Equals(client_addr));
577 EXPECT_TRUE(receive_callbacks[j].data().Equals(
578 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize)));
579 }
580 }
581
582 // Test receive using a connected socket.
583 for (size_t i = 1; i < kDatagramCount; ++i) {
584 scoped_ptr<TestCallback[]> send_callbacks(new TestCallback[i]);
585 scoped_ptr<TestReceiveCallback[]> receive_callbacks(
586 new TestReceiveCallback[i]);
587
588 for (size_t j = 0; j < i; ++j) {
589 socket.SendTo(
590 client_addr.Clone(),
591 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize),
592 send_callbacks[j].callback());
593
594 client_socket.ReceiveFrom(receive_callbacks[j].callback());
595 }
596
597 receive_callbacks[i - 1].WaitForResult();
598
599 for (size_t j = 0; j < i; ++j) {
600 EXPECT_EQ(static_cast<int>(kDatagramSize),
601 receive_callbacks[j].result()->code);
602 EXPECT_FALSE(receive_callbacks[j].src_addr());
603 EXPECT_TRUE(receive_callbacks[j].data().Equals(
604 CreateTestMessage(static_cast<uint8_t>(j), kDatagramSize)));
605 }
606 }
607 }
608
456 } // namespace service 609 } // namespace service
457 } // namespace mojo 610 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698