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

Side by Side Diff: ipc/ipc_sync_channel_unittest.cc

Issue 1871093002: ipc: Add channel names to sync tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Explicit. Created 4 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "ipc/ipc_sync_channel.h" 5 #include "ipc/ipc_sync_channel.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 21 matching lines...) Expand all
32 32
33 using base::WaitableEvent; 33 using base::WaitableEvent;
34 34
35 namespace IPC { 35 namespace IPC {
36 namespace { 36 namespace {
37 37
38 // Base class for a "process" with listener and IPC threads. 38 // Base class for a "process" with listener and IPC threads.
39 class Worker : public Listener, public Sender { 39 class Worker : public Listener, public Sender {
40 public: 40 public:
41 // Will create a channel without a name. 41 // Will create a channel without a name.
42 Worker(Channel::Mode mode, const std::string& thread_name) 42 Worker(Channel::Mode mode,
43 const std::string& thread_name,
44 const std::string& channel_name)
43 : done_(new WaitableEvent(false, false)), 45 : done_(new WaitableEvent(false, false)),
44 channel_created_(new WaitableEvent(false, false)), 46 channel_created_(new WaitableEvent(false, false)),
47 channel_name_(channel_name),
45 mode_(mode), 48 mode_(mode),
46 ipc_thread_((thread_name + "_ipc").c_str()), 49 ipc_thread_((thread_name + "_ipc").c_str()),
47 listener_thread_((thread_name + "_listener").c_str()), 50 listener_thread_((thread_name + "_listener").c_str()),
48 overrided_thread_(NULL), 51 overrided_thread_(NULL),
49 shutdown_event_(true, false), 52 shutdown_event_(true, false),
50 is_shutdown_(false) { 53 is_shutdown_(false) {}
51 }
52 54
53 // Will create a named channel and use this name for the threads' name. 55 // Will create a named channel and use this name for the threads' name.
54 Worker(const std::string& channel_name, Channel::Mode mode) 56 Worker(const std::string& channel_name, Channel::Mode mode)
55 : done_(new WaitableEvent(false, false)), 57 : done_(new WaitableEvent(false, false)),
56 channel_created_(new WaitableEvent(false, false)), 58 channel_created_(new WaitableEvent(false, false)),
57 channel_name_(channel_name), 59 channel_name_(channel_name),
58 mode_(mode), 60 mode_(mode),
59 ipc_thread_((channel_name + "_ipc").c_str()), 61 ipc_thread_((channel_name + "_ipc").c_str()),
60 listener_thread_((channel_name + "_listener").c_str()), 62 listener_thread_((channel_name + "_listener").c_str()),
61 overrided_thread_(NULL), 63 overrided_thread_(NULL),
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 271
270 class IPCSyncChannelTest : public testing::Test { 272 class IPCSyncChannelTest : public testing::Test {
271 private: 273 private:
272 base::MessageLoop message_loop_; 274 base::MessageLoop message_loop_;
273 }; 275 };
274 276
275 //------------------------------------------------------------------------------ 277 //------------------------------------------------------------------------------
276 278
277 class SimpleServer : public Worker { 279 class SimpleServer : public Worker {
278 public: 280 public:
279 explicit SimpleServer(bool pump_during_send) 281 SimpleServer(bool pump_during_send, const std::string& channel_name)
280 : Worker(Channel::MODE_SERVER, "simpler_server"), 282 : Worker(Channel::MODE_SERVER, "simpler_server", channel_name),
281 pump_during_send_(pump_during_send) { } 283 pump_during_send_(pump_during_send) {}
282 void Run() override { 284 void Run() override {
283 SendAnswerToLife(pump_during_send_, true); 285 SendAnswerToLife(pump_during_send_, true);
284 Done(); 286 Done();
285 } 287 }
286 288
287 bool pump_during_send_; 289 bool pump_during_send_;
288 }; 290 };
289 291
290 class SimpleClient : public Worker { 292 class SimpleClient : public Worker {
291 public: 293 public:
292 SimpleClient() : Worker(Channel::MODE_CLIENT, "simple_client") { } 294 explicit SimpleClient(const std::string& channel_name)
295 : Worker(Channel::MODE_CLIENT, "simple_client", channel_name) {}
293 296
294 void OnAnswer(int* answer) override { 297 void OnAnswer(int* answer) override {
295 *answer = 42; 298 *answer = 42;
296 Done(); 299 Done();
297 } 300 }
298 }; 301 };
299 302
300 void Simple(bool pump_during_send) { 303 void Simple(bool pump_during_send) {
301 std::vector<Worker*> workers; 304 std::vector<Worker*> workers;
302 workers.push_back(new SimpleServer(pump_during_send)); 305 workers.push_back(new SimpleServer(pump_during_send, "Simple"));
303 workers.push_back(new SimpleClient()); 306 workers.push_back(new SimpleClient("Simple"));
304 RunTest(workers); 307 RunTest(workers);
305 } 308 }
306 309
307 #if defined(OS_ANDROID) 310 #if defined(OS_ANDROID)
308 #define MAYBE_Simple DISABLED_Simple 311 #define MAYBE_Simple DISABLED_Simple
309 #else 312 #else
310 #define MAYBE_Simple Simple 313 #define MAYBE_Simple Simple
311 #endif 314 #endif
312 // Tests basic synchronous call 315 // Tests basic synchronous call
313 TEST_F(IPCSyncChannelTest, MAYBE_Simple) { 316 TEST_F(IPCSyncChannelTest, MAYBE_Simple) {
314 Simple(false); 317 Simple(false);
315 Simple(true); 318 Simple(true);
316 } 319 }
317 320
318 //------------------------------------------------------------------------------ 321 //------------------------------------------------------------------------------
319 322
320 // Worker classes which override how the sync channel is created to use the 323 // Worker classes which override how the sync channel is created to use the
321 // two-step initialization (calling the lightweight constructor and then 324 // two-step initialization (calling the lightweight constructor and then
322 // ChannelProxy::Init separately) process. 325 // ChannelProxy::Init separately) process.
323 class TwoStepServer : public Worker { 326 class TwoStepServer : public Worker {
324 public: 327 public:
325 explicit TwoStepServer(bool create_pipe_now) 328 TwoStepServer(bool create_pipe_now, const std::string& channel_name)
326 : Worker(Channel::MODE_SERVER, "simpler_server"), 329 : Worker(Channel::MODE_SERVER, "simpler_server", channel_name),
327 create_pipe_now_(create_pipe_now) { } 330 create_pipe_now_(create_pipe_now) {}
328 331
329 void Run() override { 332 void Run() override {
330 SendAnswerToLife(false, true); 333 SendAnswerToLife(false, true);
331 Done(); 334 Done();
332 } 335 }
333 336
334 SyncChannel* CreateChannel() override { 337 SyncChannel* CreateChannel() override {
335 SyncChannel* channel = 338 SyncChannel* channel =
336 SyncChannel::Create(channel_name(), mode(), this, 339 SyncChannel::Create(channel_name(), mode(), this,
337 ipc_thread().task_runner().get(), create_pipe_now_, 340 ipc_thread().task_runner().get(), create_pipe_now_,
338 shutdown_event()) 341 shutdown_event())
339 .release(); 342 .release();
340 return channel; 343 return channel;
341 } 344 }
342 345
343 bool create_pipe_now_; 346 bool create_pipe_now_;
344 }; 347 };
345 348
346 class TwoStepClient : public Worker { 349 class TwoStepClient : public Worker {
347 public: 350 public:
348 TwoStepClient(bool create_pipe_now) 351 TwoStepClient(bool create_pipe_now, const std::string& channel_name)
349 : Worker(Channel::MODE_CLIENT, "simple_client"), 352 : Worker(Channel::MODE_CLIENT, "simple_client", channel_name),
350 create_pipe_now_(create_pipe_now) { } 353 create_pipe_now_(create_pipe_now) {}
351 354
352 void OnAnswer(int* answer) override { 355 void OnAnswer(int* answer) override {
353 *answer = 42; 356 *answer = 42;
354 Done(); 357 Done();
355 } 358 }
356 359
357 SyncChannel* CreateChannel() override { 360 SyncChannel* CreateChannel() override {
358 SyncChannel* channel = 361 SyncChannel* channel =
359 SyncChannel::Create(channel_name(), mode(), this, 362 SyncChannel::Create(channel_name(), mode(), this,
360 ipc_thread().task_runner().get(), create_pipe_now_, 363 ipc_thread().task_runner().get(), create_pipe_now_,
361 shutdown_event()) 364 shutdown_event())
362 .release(); 365 .release();
363 return channel; 366 return channel;
364 } 367 }
365 368
366 bool create_pipe_now_; 369 bool create_pipe_now_;
367 }; 370 };
368 371
369 void TwoStep(bool create_server_pipe_now, bool create_client_pipe_now) { 372 void TwoStep(bool create_server_pipe_now, bool create_client_pipe_now) {
370 std::vector<Worker*> workers; 373 std::vector<Worker*> workers;
371 workers.push_back(new TwoStepServer(create_server_pipe_now)); 374 workers.push_back(new TwoStepServer(create_server_pipe_now, "TwoStep"));
372 workers.push_back(new TwoStepClient(create_client_pipe_now)); 375 workers.push_back(new TwoStepClient(create_client_pipe_now, "TwoStep"));
373 RunTest(workers); 376 RunTest(workers);
374 } 377 }
375 378
376 // Tests basic two-step initialization, where you call the lightweight 379 // Tests basic two-step initialization, where you call the lightweight
377 // constructor then Init. 380 // constructor then Init.
378 TEST_F(IPCSyncChannelTest, TwoStepInitialization) { 381 TEST_F(IPCSyncChannelTest, TwoStepInitialization) {
379 TwoStep(false, false); 382 TwoStep(false, false);
380 TwoStep(false, true); 383 TwoStep(false, true);
381 TwoStep(true, false); 384 TwoStep(true, false);
382 TwoStep(true, true); 385 TwoStep(true, true);
383 } 386 }
384 387
385 //------------------------------------------------------------------------------ 388 //------------------------------------------------------------------------------
386 389
387 class DelayClient : public Worker { 390 class DelayClient : public Worker {
388 public: 391 public:
389 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { } 392 explicit DelayClient(const std::string& channel_name)
393 : Worker(Channel::MODE_CLIENT, "delay_client", channel_name) {}
390 394
391 void OnAnswerDelay(Message* reply_msg) override { 395 void OnAnswerDelay(Message* reply_msg) override {
392 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); 396 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42);
393 Send(reply_msg); 397 Send(reply_msg);
394 Done(); 398 Done();
395 } 399 }
396 }; 400 };
397 401
398 void DelayReply(bool pump_during_send) { 402 void DelayReply(bool pump_during_send) {
399 std::vector<Worker*> workers; 403 std::vector<Worker*> workers;
400 workers.push_back(new SimpleServer(pump_during_send)); 404 workers.push_back(new SimpleServer(pump_during_send, "DelayReply"));
401 workers.push_back(new DelayClient()); 405 workers.push_back(new DelayClient("DelayReply"));
402 RunTest(workers); 406 RunTest(workers);
403 } 407 }
404 408
405 // Tests that asynchronous replies work 409 // Tests that asynchronous replies work
406 TEST_F(IPCSyncChannelTest, DelayReply) { 410 TEST_F(IPCSyncChannelTest, DelayReply) {
407 DelayReply(false); 411 DelayReply(false);
408 DelayReply(true); 412 DelayReply(true);
409 } 413 }
410 414
411 //------------------------------------------------------------------------------ 415 //------------------------------------------------------------------------------
412 416
413 class NoHangServer : public Worker { 417 class NoHangServer : public Worker {
414 public: 418 public:
415 NoHangServer(WaitableEvent* got_first_reply, bool pump_during_send) 419 NoHangServer(WaitableEvent* got_first_reply,
416 : Worker(Channel::MODE_SERVER, "no_hang_server"), 420 bool pump_during_send,
421 const std::string& channel_name)
422 : Worker(Channel::MODE_SERVER, "no_hang_server", channel_name),
417 got_first_reply_(got_first_reply), 423 got_first_reply_(got_first_reply),
418 pump_during_send_(pump_during_send) { } 424 pump_during_send_(pump_during_send) {}
419 void Run() override { 425 void Run() override {
420 SendAnswerToLife(pump_during_send_, true); 426 SendAnswerToLife(pump_during_send_, true);
421 got_first_reply_->Signal(); 427 got_first_reply_->Signal();
422 428
423 SendAnswerToLife(pump_during_send_, false); 429 SendAnswerToLife(pump_during_send_, false);
424 Done(); 430 Done();
425 } 431 }
426 432
427 WaitableEvent* got_first_reply_; 433 WaitableEvent* got_first_reply_;
428 bool pump_during_send_; 434 bool pump_during_send_;
429 }; 435 };
430 436
431 class NoHangClient : public Worker { 437 class NoHangClient : public Worker {
432 public: 438 public:
433 explicit NoHangClient(WaitableEvent* got_first_reply) 439 NoHangClient(WaitableEvent* got_first_reply, const std::string& channel_name)
434 : Worker(Channel::MODE_CLIENT, "no_hang_client"), 440 : Worker(Channel::MODE_CLIENT, "no_hang_client", channel_name),
435 got_first_reply_(got_first_reply) { } 441 got_first_reply_(got_first_reply) {}
436 442
437 void OnAnswerDelay(Message* reply_msg) override { 443 void OnAnswerDelay(Message* reply_msg) override {
438 // Use the DELAY_REPLY macro so that we can force the reply to be sent 444 // Use the DELAY_REPLY macro so that we can force the reply to be sent
439 // before this function returns (when the channel will be reset). 445 // before this function returns (when the channel will be reset).
440 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); 446 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42);
441 Send(reply_msg); 447 Send(reply_msg);
442 got_first_reply_->Wait(); 448 got_first_reply_->Wait();
443 CloseChannel(); 449 CloseChannel();
444 Done(); 450 Done();
445 } 451 }
446 452
447 WaitableEvent* got_first_reply_; 453 WaitableEvent* got_first_reply_;
448 }; 454 };
449 455
450 void NoHang(bool pump_during_send) { 456 void NoHang(bool pump_during_send) {
451 WaitableEvent got_first_reply(false, false); 457 WaitableEvent got_first_reply(false, false);
452 std::vector<Worker*> workers; 458 std::vector<Worker*> workers;
453 workers.push_back(new NoHangServer(&got_first_reply, pump_during_send)); 459 workers.push_back(
454 workers.push_back(new NoHangClient(&got_first_reply)); 460 new NoHangServer(&got_first_reply, pump_during_send, "NoHang"));
461 workers.push_back(new NoHangClient(&got_first_reply, "NoHang"));
455 RunTest(workers); 462 RunTest(workers);
456 } 463 }
457 464
458 // Tests that caller doesn't hang if receiver dies 465 // Tests that caller doesn't hang if receiver dies
459 TEST_F(IPCSyncChannelTest, NoHang) { 466 TEST_F(IPCSyncChannelTest, NoHang) {
460 NoHang(false); 467 NoHang(false);
461 NoHang(true); 468 NoHang(true);
462 } 469 }
463 470
464 //------------------------------------------------------------------------------ 471 //------------------------------------------------------------------------------
465 472
466 class UnblockServer : public Worker { 473 class UnblockServer : public Worker {
467 public: 474 public:
468 UnblockServer(bool pump_during_send, bool delete_during_send) 475 UnblockServer(bool pump_during_send,
469 : Worker(Channel::MODE_SERVER, "unblock_server"), 476 bool delete_during_send,
470 pump_during_send_(pump_during_send), 477 const std::string& channel_name)
471 delete_during_send_(delete_during_send) { } 478 : Worker(Channel::MODE_SERVER, "unblock_server", channel_name),
479 pump_during_send_(pump_during_send),
480 delete_during_send_(delete_during_send) {}
472 void Run() override { 481 void Run() override {
473 if (delete_during_send_) { 482 if (delete_during_send_) {
474 // Use custom code since race conditions mean the answer may or may not be 483 // Use custom code since race conditions mean the answer may or may not be
475 // available. 484 // available.
476 int answer = 0; 485 int answer = 0;
477 SyncMessage* msg = new SyncChannelTestMsg_AnswerToLife(&answer); 486 SyncMessage* msg = new SyncChannelTestMsg_AnswerToLife(&answer);
478 if (pump_during_send_) 487 if (pump_during_send_)
479 msg->EnableMessagePumping(); 488 msg->EnableMessagePumping();
480 Send(msg); 489 Send(msg);
481 } else { 490 } else {
482 SendAnswerToLife(pump_during_send_, true); 491 SendAnswerToLife(pump_during_send_, true);
483 } 492 }
484 Done(); 493 Done();
485 } 494 }
486 495
487 void OnDoubleDelay(int in, Message* reply_msg) override { 496 void OnDoubleDelay(int in, Message* reply_msg) override {
488 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, in * 2); 497 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, in * 2);
489 Send(reply_msg); 498 Send(reply_msg);
490 if (delete_during_send_) 499 if (delete_during_send_)
491 ResetChannel(); 500 ResetChannel();
492 } 501 }
493 502
494 bool pump_during_send_; 503 bool pump_during_send_;
495 bool delete_during_send_; 504 bool delete_during_send_;
496 }; 505 };
497 506
498 class UnblockClient : public Worker { 507 class UnblockClient : public Worker {
499 public: 508 public:
500 explicit UnblockClient(bool pump_during_send) 509 UnblockClient(bool pump_during_send, const std::string& channel_name)
501 : Worker(Channel::MODE_CLIENT, "unblock_client"), 510 : Worker(Channel::MODE_CLIENT, "unblock_client", channel_name),
502 pump_during_send_(pump_during_send) { } 511 pump_during_send_(pump_during_send) {}
503 512
504 void OnAnswer(int* answer) override { 513 void OnAnswer(int* answer) override {
505 SendDouble(pump_during_send_, true); 514 SendDouble(pump_during_send_, true);
506 *answer = 42; 515 *answer = 42;
507 Done(); 516 Done();
508 } 517 }
509 518
510 bool pump_during_send_; 519 bool pump_during_send_;
511 }; 520 };
512 521
513 void Unblock(bool server_pump, bool client_pump, bool delete_during_send) { 522 void Unblock(bool server_pump, bool client_pump, bool delete_during_send) {
514 std::vector<Worker*> workers; 523 std::vector<Worker*> workers;
515 workers.push_back(new UnblockServer(server_pump, delete_during_send)); 524 workers.push_back(
516 workers.push_back(new UnblockClient(client_pump)); 525 new UnblockServer(server_pump, delete_during_send, "Unblock"));
526 workers.push_back(new UnblockClient(client_pump, "Unblock"));
517 RunTest(workers); 527 RunTest(workers);
518 } 528 }
519 529
520 // Tests that the caller unblocks to answer a sync message from the receiver. 530 // Tests that the caller unblocks to answer a sync message from the receiver.
521 TEST_F(IPCSyncChannelTest, Unblock) { 531 TEST_F(IPCSyncChannelTest, Unblock) {
522 Unblock(false, false, false); 532 Unblock(false, false, false);
523 Unblock(false, true, false); 533 Unblock(false, true, false);
524 Unblock(true, false, false); 534 Unblock(true, false, false);
525 Unblock(true, true, false); 535 Unblock(true, true, false);
526 } 536 }
(...skipping 10 matching lines...) Expand all
537 Unblock(false, false, true); 547 Unblock(false, false, true);
538 Unblock(false, true, true); 548 Unblock(false, true, true);
539 Unblock(true, false, true); 549 Unblock(true, false, true);
540 Unblock(true, true, true); 550 Unblock(true, true, true);
541 } 551 }
542 552
543 //------------------------------------------------------------------------------ 553 //------------------------------------------------------------------------------
544 554
545 class RecursiveServer : public Worker { 555 class RecursiveServer : public Worker {
546 public: 556 public:
547 RecursiveServer(bool expected_send_result, bool pump_first, bool pump_second) 557 RecursiveServer(bool expected_send_result,
548 : Worker(Channel::MODE_SERVER, "recursive_server"), 558 bool pump_first,
559 bool pump_second,
560 const std::string& channel_name)
561 : Worker(Channel::MODE_SERVER, "recursive_server", channel_name),
549 expected_send_result_(expected_send_result), 562 expected_send_result_(expected_send_result),
550 pump_first_(pump_first), pump_second_(pump_second) {} 563 pump_first_(pump_first),
564 pump_second_(pump_second) {}
551 void Run() override { 565 void Run() override {
552 SendDouble(pump_first_, expected_send_result_); 566 SendDouble(pump_first_, expected_send_result_);
553 Done(); 567 Done();
554 } 568 }
555 569
556 void OnDouble(int in, int* out) override { 570 void OnDouble(int in, int* out) override {
557 *out = in * 2; 571 *out = in * 2;
558 SendAnswerToLife(pump_second_, expected_send_result_); 572 SendAnswerToLife(pump_second_, expected_send_result_);
559 } 573 }
560 574
561 bool expected_send_result_, pump_first_, pump_second_; 575 bool expected_send_result_, pump_first_, pump_second_;
562 }; 576 };
563 577
564 class RecursiveClient : public Worker { 578 class RecursiveClient : public Worker {
565 public: 579 public:
566 RecursiveClient(bool pump_during_send, bool close_channel) 580 RecursiveClient(bool pump_during_send,
567 : Worker(Channel::MODE_CLIENT, "recursive_client"), 581 bool close_channel,
568 pump_during_send_(pump_during_send), close_channel_(close_channel) {} 582 const std::string& channel_name)
583 : Worker(Channel::MODE_CLIENT, "recursive_client", channel_name),
584 pump_during_send_(pump_during_send),
585 close_channel_(close_channel) {}
569 586
570 void OnDoubleDelay(int in, Message* reply_msg) override { 587 void OnDoubleDelay(int in, Message* reply_msg) override {
571 SendDouble(pump_during_send_, !close_channel_); 588 SendDouble(pump_during_send_, !close_channel_);
572 if (close_channel_) { 589 if (close_channel_) {
573 delete reply_msg; 590 delete reply_msg;
574 } else { 591 } else {
575 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, in * 2); 592 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, in * 2);
576 Send(reply_msg); 593 Send(reply_msg);
577 } 594 }
578 Done(); 595 Done();
579 } 596 }
580 597
581 void OnAnswerDelay(Message* reply_msg) override { 598 void OnAnswerDelay(Message* reply_msg) override {
582 if (close_channel_) { 599 if (close_channel_) {
583 delete reply_msg; 600 delete reply_msg;
584 CloseChannel(); 601 CloseChannel();
585 } else { 602 } else {
586 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); 603 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42);
587 Send(reply_msg); 604 Send(reply_msg);
588 } 605 }
589 } 606 }
590 607
591 bool pump_during_send_, close_channel_; 608 bool pump_during_send_, close_channel_;
592 }; 609 };
593 610
594 void Recursive( 611 void Recursive(
595 bool server_pump_first, bool server_pump_second, bool client_pump) { 612 bool server_pump_first, bool server_pump_second, bool client_pump) {
596 std::vector<Worker*> workers; 613 std::vector<Worker*> workers;
597 workers.push_back( 614 workers.push_back(new RecursiveServer(true, server_pump_first,
598 new RecursiveServer(true, server_pump_first, server_pump_second)); 615 server_pump_second, "Recursive"));
599 workers.push_back(new RecursiveClient(client_pump, false)); 616 workers.push_back(new RecursiveClient(client_pump, false, "Recursive"));
600 RunTest(workers); 617 RunTest(workers);
601 } 618 }
602 619
603 // Tests a server calling Send while another Send is pending. 620 // Tests a server calling Send while another Send is pending.
604 TEST_F(IPCSyncChannelTest, Recursive) { 621 TEST_F(IPCSyncChannelTest, Recursive) {
605 Recursive(false, false, false); 622 Recursive(false, false, false);
606 Recursive(false, false, true); 623 Recursive(false, false, true);
607 Recursive(false, true, false); 624 Recursive(false, true, false);
608 Recursive(false, true, true); 625 Recursive(false, true, true);
609 Recursive(true, false, false); 626 Recursive(true, false, false);
610 Recursive(true, false, true); 627 Recursive(true, false, true);
611 Recursive(true, true, false); 628 Recursive(true, true, false);
612 Recursive(true, true, true); 629 Recursive(true, true, true);
613 } 630 }
614 631
615 //------------------------------------------------------------------------------ 632 //------------------------------------------------------------------------------
616 633
617 void RecursiveNoHang( 634 void RecursiveNoHang(
618 bool server_pump_first, bool server_pump_second, bool client_pump) { 635 bool server_pump_first, bool server_pump_second, bool client_pump) {
619 std::vector<Worker*> workers; 636 std::vector<Worker*> workers;
620 workers.push_back( 637 workers.push_back(new RecursiveServer(false, server_pump_first,
621 new RecursiveServer(false, server_pump_first, server_pump_second)); 638 server_pump_second, "RecursiveNoHang"));
622 workers.push_back(new RecursiveClient(client_pump, true)); 639 workers.push_back(new RecursiveClient(client_pump, true, "RecursiveNoHang"));
623 RunTest(workers); 640 RunTest(workers);
624 } 641 }
625 642
626 // Tests that if a caller makes a sync call during an existing sync call and 643 // Tests that if a caller makes a sync call during an existing sync call and
627 // the receiver dies, neither of the Send() calls hang. 644 // the receiver dies, neither of the Send() calls hang.
628 TEST_F(IPCSyncChannelTest, RecursiveNoHang) { 645 TEST_F(IPCSyncChannelTest, RecursiveNoHang) {
629 RecursiveNoHang(false, false, false); 646 RecursiveNoHang(false, false, false);
630 RecursiveNoHang(false, false, true); 647 RecursiveNoHang(false, false, true);
631 RecursiveNoHang(false, true, false); 648 RecursiveNoHang(false, true, false);
632 RecursiveNoHang(false, true, true); 649 RecursiveNoHang(false, true, true);
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 // pumps messages while waiting for a response. 870 // pumps messages while waiting for a response.
854 TEST_F(IPCSyncChannelTest, QueuedReply) { 871 TEST_F(IPCSyncChannelTest, QueuedReply) {
855 QueuedReply(false); 872 QueuedReply(false);
856 QueuedReply(true); 873 QueuedReply(true);
857 } 874 }
858 875
859 //------------------------------------------------------------------------------ 876 //------------------------------------------------------------------------------
860 877
861 class ChattyClient : public Worker { 878 class ChattyClient : public Worker {
862 public: 879 public:
863 ChattyClient() : 880 explicit ChattyClient(const std::string& channel_name)
864 Worker(Channel::MODE_CLIENT, "chatty_client") { } 881 : Worker(Channel::MODE_CLIENT, "chatty_client", channel_name) {}
865 882
866 void OnAnswer(int* answer) override { 883 void OnAnswer(int* answer) override {
867 // The PostMessage limit is 10k. Send 20% more than that. 884 // The PostMessage limit is 10k. Send 20% more than that.
868 const int kMessageLimit = 10000; 885 const int kMessageLimit = 10000;
869 const int kMessagesToSend = kMessageLimit * 120 / 100; 886 const int kMessagesToSend = kMessageLimit * 120 / 100;
870 for (int i = 0; i < kMessagesToSend; ++i) { 887 for (int i = 0; i < kMessagesToSend; ++i) {
871 if (!SendDouble(false, true)) 888 if (!SendDouble(false, true))
872 break; 889 break;
873 } 890 }
874 *answer = 42; 891 *answer = 42;
875 Done(); 892 Done();
876 } 893 }
877 }; 894 };
878 895
879 void ChattyServer(bool pump_during_send) { 896 void ChattyServer(bool pump_during_send) {
880 std::vector<Worker*> workers; 897 std::vector<Worker*> workers;
881 workers.push_back(new UnblockServer(pump_during_send, false)); 898 workers.push_back(new UnblockServer(pump_during_send, false, "ChattyServer"));
882 workers.push_back(new ChattyClient()); 899 workers.push_back(new ChattyClient("ChattyServer"));
883 RunTest(workers); 900 RunTest(workers);
884 } 901 }
885 902
886 #if defined(OS_ANDROID) 903 #if defined(OS_ANDROID)
887 // Times out. 904 // Times out.
888 #define MAYBE_ChattyServer DISABLED_ChattyServer 905 #define MAYBE_ChattyServer DISABLED_ChattyServer
889 #else 906 #else
890 #define MAYBE_ChattyServer ChattyServer 907 #define MAYBE_ChattyServer ChattyServer
891 #endif 908 #endif
892 // Tests http://b/1093251 - that sending lots of sync messages while 909 // Tests http://b/1093251 - that sending lots of sync messages while
(...skipping 13 matching lines...) Expand all
906 } 923 }
907 924
908 bool timeout_occurred = false; 925 bool timeout_occurred = false;
909 926
910 void TimeoutCallback() { 927 void TimeoutCallback() {
911 timeout_occurred = true; 928 timeout_occurred = true;
912 } 929 }
913 930
914 class DoneEventRaceServer : public Worker { 931 class DoneEventRaceServer : public Worker {
915 public: 932 public:
916 DoneEventRaceServer() 933 explicit DoneEventRaceServer(const std::string& channel_name)
917 : Worker(Channel::MODE_SERVER, "done_event_race_server") { } 934 : Worker(Channel::MODE_SERVER, "done_event_race_server", channel_name) {}
918 935
919 void Run() override { 936 void Run() override {
920 base::ThreadTaskRunnerHandle::Get()->PostTask( 937 base::ThreadTaskRunnerHandle::Get()->PostTask(
921 FROM_HERE, base::Bind(&NestedCallback, this)); 938 FROM_HERE, base::Bind(&NestedCallback, this));
922 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 939 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
923 FROM_HERE, base::Bind(&TimeoutCallback), 940 FROM_HERE, base::Bind(&TimeoutCallback),
924 base::TimeDelta::FromSeconds(9)); 941 base::TimeDelta::FromSeconds(9));
925 // Even though we have a timeout on the Send, it will succeed since for this 942 // Even though we have a timeout on the Send, it will succeed since for this
926 // bug, the reply message comes back and is deserialized, however the done 943 // bug, the reply message comes back and is deserialized, however the done
927 // event wasn't set. So we indirectly use the timeout task to notice if a 944 // event wasn't set. So we indirectly use the timeout task to notice if a
928 // timeout occurred. 945 // timeout occurred.
929 SendAnswerToLife(true, true); 946 SendAnswerToLife(true, true);
930 DCHECK(!timeout_occurred); 947 DCHECK(!timeout_occurred);
931 Done(); 948 Done();
932 } 949 }
933 }; 950 };
934 951
935 #if defined(OS_ANDROID) 952 #if defined(OS_ANDROID)
936 #define MAYBE_DoneEventRace DISABLED_DoneEventRace 953 #define MAYBE_DoneEventRace DISABLED_DoneEventRace
937 #else 954 #else
938 #define MAYBE_DoneEventRace DoneEventRace 955 #define MAYBE_DoneEventRace DoneEventRace
939 #endif 956 #endif
940 // Tests http://b/1474092 - that if after the done_event is set but before 957 // Tests http://b/1474092 - that if after the done_event is set but before
941 // OnObjectSignaled is called another message is sent out, then after its 958 // OnObjectSignaled is called another message is sent out, then after its
942 // reply comes back OnObjectSignaled will be called for the first message. 959 // reply comes back OnObjectSignaled will be called for the first message.
943 TEST_F(IPCSyncChannelTest, MAYBE_DoneEventRace) { 960 TEST_F(IPCSyncChannelTest, MAYBE_DoneEventRace) {
944 std::vector<Worker*> workers; 961 std::vector<Worker*> workers;
945 workers.push_back(new DoneEventRaceServer()); 962 workers.push_back(new DoneEventRaceServer("DoneEventRace"));
946 workers.push_back(new SimpleClient()); 963 workers.push_back(new SimpleClient("DoneEventRace"));
947 RunTest(workers); 964 RunTest(workers);
948 } 965 }
949 966
950 //------------------------------------------------------------------------------ 967 //------------------------------------------------------------------------------
951 968
952 class TestSyncMessageFilter : public SyncMessageFilter { 969 class TestSyncMessageFilter : public SyncMessageFilter {
953 public: 970 public:
954 TestSyncMessageFilter( 971 TestSyncMessageFilter(
955 base::WaitableEvent* shutdown_event, 972 base::WaitableEvent* shutdown_event,
956 Worker* worker, 973 Worker* worker,
(...skipping 20 matching lines...) Expand all
977 994
978 private: 995 private:
979 ~TestSyncMessageFilter() override {} 996 ~TestSyncMessageFilter() override {}
980 997
981 Worker* worker_; 998 Worker* worker_;
982 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 999 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
983 }; 1000 };
984 1001
985 class SyncMessageFilterServer : public Worker { 1002 class SyncMessageFilterServer : public Worker {
986 public: 1003 public:
987 SyncMessageFilterServer() 1004 explicit SyncMessageFilterServer(const std::string& channel_name)
988 : Worker(Channel::MODE_SERVER, "sync_message_filter_server"), 1005 : Worker(Channel::MODE_SERVER,
1006 "sync_message_filter_server",
1007 channel_name),
989 thread_("helper_thread") { 1008 thread_("helper_thread") {
990 base::Thread::Options options; 1009 base::Thread::Options options;
991 options.message_loop_type = base::MessageLoop::TYPE_DEFAULT; 1010 options.message_loop_type = base::MessageLoop::TYPE_DEFAULT;
992 thread_.StartWithOptions(options); 1011 thread_.StartWithOptions(options);
993 filter_ = new TestSyncMessageFilter(shutdown_event(), this, 1012 filter_ = new TestSyncMessageFilter(shutdown_event(), this,
994 thread_.task_runner()); 1013 thread_.task_runner());
995 } 1014 }
996 1015
997 void Run() override { 1016 void Run() override {
998 channel()->AddFilter(filter_.get()); 1017 channel()->AddFilter(filter_.get());
999 } 1018 }
1000 1019
1001 base::Thread thread_; 1020 base::Thread thread_;
1002 scoped_refptr<TestSyncMessageFilter> filter_; 1021 scoped_refptr<TestSyncMessageFilter> filter_;
1003 }; 1022 };
1004 1023
1005 // This class provides functionality to test the case that a Send on the sync 1024 // This class provides functionality to test the case that a Send on the sync
1006 // channel does not crash after the channel has been closed. 1025 // channel does not crash after the channel has been closed.
1007 class ServerSendAfterClose : public Worker { 1026 class ServerSendAfterClose : public Worker {
1008 public: 1027 public:
1009 ServerSendAfterClose() 1028 explicit ServerSendAfterClose(const std::string& channel_name)
1010 : Worker(Channel::MODE_SERVER, "simpler_server"), 1029 : Worker(Channel::MODE_SERVER, "simpler_server", channel_name),
1011 send_result_(true) { 1030 send_result_(true) {}
1012 }
1013 1031
1014 bool SendDummy() { 1032 bool SendDummy() {
1015 ListenerThread()->task_runner()->PostTask( 1033 ListenerThread()->task_runner()->PostTask(
1016 FROM_HERE, base::Bind(base::IgnoreResult(&ServerSendAfterClose::Send), 1034 FROM_HERE, base::Bind(base::IgnoreResult(&ServerSendAfterClose::Send),
1017 this, new SyncChannelTestMsg_NoArgs)); 1035 this, new SyncChannelTestMsg_NoArgs));
1018 return true; 1036 return true;
1019 } 1037 }
1020 1038
1021 bool send_result() const { 1039 bool send_result() const {
1022 return send_result_; 1040 return send_result_;
(...skipping 10 matching lines...) Expand all
1033 Done(); 1051 Done();
1034 return send_result_; 1052 return send_result_;
1035 } 1053 }
1036 1054
1037 bool send_result_; 1055 bool send_result_;
1038 }; 1056 };
1039 1057
1040 // Tests basic synchronous call 1058 // Tests basic synchronous call
1041 TEST_F(IPCSyncChannelTest, SyncMessageFilter) { 1059 TEST_F(IPCSyncChannelTest, SyncMessageFilter) {
1042 std::vector<Worker*> workers; 1060 std::vector<Worker*> workers;
1043 workers.push_back(new SyncMessageFilterServer()); 1061 workers.push_back(new SyncMessageFilterServer("SyncMessageFilter"));
1044 workers.push_back(new SimpleClient()); 1062 workers.push_back(new SimpleClient("SyncMessageFilter"));
1045 RunTest(workers); 1063 RunTest(workers);
1046 } 1064 }
1047 1065
1048 // Test the case when the channel is closed and a Send is attempted after that. 1066 // Test the case when the channel is closed and a Send is attempted after that.
1049 TEST_F(IPCSyncChannelTest, SendAfterClose) { 1067 TEST_F(IPCSyncChannelTest, SendAfterClose) {
1050 ServerSendAfterClose server; 1068 ServerSendAfterClose server("SendAfterClose");
1051 server.Start(); 1069 server.Start();
1052 1070
1053 server.done_event()->Wait(); 1071 server.done_event()->Wait();
1054 server.done_event()->Reset(); 1072 server.done_event()->Reset();
1055 1073
1056 server.SendDummy(); 1074 server.SendDummy();
1057 server.done_event()->Wait(); 1075 server.done_event()->Wait();
1058 1076
1059 EXPECT_FALSE(server.send_result()); 1077 EXPECT_FALSE(server.send_result());
1060 1078
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 } 1823 }
1806 1824
1807 // Windows needs to send an out-of-band secret to verify the client end of the 1825 // Windows needs to send an out-of-band secret to verify the client end of the
1808 // channel. Test that we still connect correctly in that case. 1826 // channel. Test that we still connect correctly in that case.
1809 TEST_F(IPCSyncChannelTest, Verified) { 1827 TEST_F(IPCSyncChannelTest, Verified) {
1810 Verified(); 1828 Verified();
1811 } 1829 }
1812 1830
1813 } // namespace 1831 } // namespace
1814 } // namespace IPC 1832 } // namespace IPC
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698