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

Side by Side Diff: ipc/ipc_sync_channel_unittest.cc

Issue 6973055: Removing 'using namespace' style violations in src/ipc/ (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Replacing all IPC:: cases, wrapping in the IPC namespace Created 9 years, 7 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 | Annotate | Revision Log
« 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // Unit test for SyncChannel. 5 // Unit test for SyncChannel.
6 6
7 #include "ipc/ipc_sync_channel.h" 7 #include "ipc/ipc_sync_channel.h"
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
15 #include "base/message_loop.h" 15 #include "base/message_loop.h"
16 #include "base/stl_util-inl.h" 16 #include "base/stl_util-inl.h"
17 #include "base/string_util.h" 17 #include "base/string_util.h"
18 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" 18 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
19 #include "base/threading/platform_thread.h" 19 #include "base/threading/platform_thread.h"
20 #include "base/threading/thread.h" 20 #include "base/threading/thread.h"
21 #include "base/synchronization/waitable_event.h" 21 #include "base/synchronization/waitable_event.h"
22 #include "ipc/ipc_message.h" 22 #include "ipc/ipc_message.h"
23 #include "ipc/ipc_sync_message_filter.h" 23 #include "ipc/ipc_sync_message_filter.h"
24 #include "ipc/ipc_sync_message_unittest.h" 24 #include "ipc/ipc_sync_message_unittest.h"
25 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
26 26
27 using namespace IPC;
28 using base::WaitableEvent; 27 using base::WaitableEvent;
29 28
30 namespace { 29 namespace IPC {
brettw 2011/05/13 19:13:40 I think we still want to keep the anonymous namesp
KushalP 2011/05/13 19:19:17 Done.
31 30
32 // Base class for a "process" with listener and IPC threads. 31 // Base class for a "process" with listener and IPC threads.
33 class Worker : public Channel::Listener, public Message::Sender { 32 class Worker : public Channel::Listener, public Message::Sender {
34 public: 33 public:
35 // Will create a channel without a name. 34 // Will create a channel without a name.
36 Worker(Channel::Mode mode, const std::string& thread_name) 35 Worker(Channel::Mode mode, const std::string& thread_name)
37 : done_(new WaitableEvent(false, false)), 36 : done_(new WaitableEvent(false, false)),
38 channel_created_(new WaitableEvent(false, false)), 37 channel_created_(new WaitableEvent(false, false)),
39 mode_(mode), 38 mode_(mode),
40 ipc_thread_((thread_name + "_ipc").c_str()), 39 ipc_thread_((thread_name + "_ipc").c_str()),
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 workers[i]->Start(); 246 workers[i]->Start();
248 } 247 }
249 248
250 // wait for all the workers to finish 249 // wait for all the workers to finish
251 for (size_t i = 0; i < workers.size(); ++i) 250 for (size_t i = 0; i < workers.size(); ++i)
252 workers[i]->done_event()->Wait(); 251 workers[i]->done_event()->Wait();
253 252
254 STLDeleteContainerPointers(workers.begin(), workers.end()); 253 STLDeleteContainerPointers(workers.begin(), workers.end());
255 } 254 }
256 255
257 } // namespace
258
259 class IPCSyncChannelTest : public testing::Test { 256 class IPCSyncChannelTest : public testing::Test {
260 private: 257 private:
261 MessageLoop message_loop_; 258 MessageLoop message_loop_;
262 }; 259 };
263 260
264 //----------------------------------------------------------------------------- 261 //-----------------------------------------------------------------------------
265 262
266 namespace {
267
268 class SimpleServer : public Worker { 263 class SimpleServer : public Worker {
269 public: 264 public:
270 explicit SimpleServer(bool pump_during_send) 265 explicit SimpleServer(bool pump_during_send)
271 : Worker(Channel::MODE_SERVER, "simpler_server"), 266 : Worker(Channel::MODE_SERVER, "simpler_server"),
272 pump_during_send_(pump_during_send) { } 267 pump_during_send_(pump_during_send) { }
273 void Run() { 268 void Run() {
274 SendAnswerToLife(pump_during_send_, base::kNoTimeout, true); 269 SendAnswerToLife(pump_during_send_, base::kNoTimeout, true);
275 Done(); 270 Done();
276 } 271 }
277 272
(...skipping 10 matching lines...) Expand all
288 } 283 }
289 }; 284 };
290 285
291 void Simple(bool pump_during_send) { 286 void Simple(bool pump_during_send) {
292 std::vector<Worker*> workers; 287 std::vector<Worker*> workers;
293 workers.push_back(new SimpleServer(pump_during_send)); 288 workers.push_back(new SimpleServer(pump_during_send));
294 workers.push_back(new SimpleClient()); 289 workers.push_back(new SimpleClient());
295 RunTest(workers); 290 RunTest(workers);
296 } 291 }
297 292
298 } // namespace
299
300 // Tests basic synchronous call 293 // Tests basic synchronous call
301 TEST_F(IPCSyncChannelTest, Simple) { 294 TEST_F(IPCSyncChannelTest, Simple) {
302 Simple(false); 295 Simple(false);
303 Simple(true); 296 Simple(true);
304 } 297 }
305 298
306 //----------------------------------------------------------------------------- 299 //-----------------------------------------------------------------------------
307 300
308 namespace {
309
310 class DelayClient : public Worker { 301 class DelayClient : public Worker {
311 public: 302 public:
312 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { } 303 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { }
313 304
314 void OnAnswerDelay(Message* reply_msg) { 305 void OnAnswerDelay(Message* reply_msg) {
315 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); 306 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42);
316 Send(reply_msg); 307 Send(reply_msg);
317 Done(); 308 Done();
318 } 309 }
319 }; 310 };
320 311
321 void DelayReply(bool pump_during_send) { 312 void DelayReply(bool pump_during_send) {
322 std::vector<Worker*> workers; 313 std::vector<Worker*> workers;
323 workers.push_back(new SimpleServer(pump_during_send)); 314 workers.push_back(new SimpleServer(pump_during_send));
324 workers.push_back(new DelayClient()); 315 workers.push_back(new DelayClient());
325 RunTest(workers); 316 RunTest(workers);
326 } 317 }
327 318
328 } // namespace
329
330 // Tests that asynchronous replies work 319 // Tests that asynchronous replies work
331 TEST_F(IPCSyncChannelTest, DelayReply) { 320 TEST_F(IPCSyncChannelTest, DelayReply) {
332 DelayReply(false); 321 DelayReply(false);
333 DelayReply(true); 322 DelayReply(true);
334 } 323 }
335 324
336 //----------------------------------------------------------------------------- 325 //-----------------------------------------------------------------------------
337 326
338 namespace {
339
340 class NoHangServer : public Worker { 327 class NoHangServer : public Worker {
341 public: 328 public:
342 explicit NoHangServer(WaitableEvent* got_first_reply, bool pump_during_send) 329 explicit NoHangServer(WaitableEvent* got_first_reply, bool pump_during_send)
343 : Worker(Channel::MODE_SERVER, "no_hang_server"), 330 : Worker(Channel::MODE_SERVER, "no_hang_server"),
344 got_first_reply_(got_first_reply), 331 got_first_reply_(got_first_reply),
345 pump_during_send_(pump_during_send) { } 332 pump_during_send_(pump_during_send) { }
346 void Run() { 333 void Run() {
347 SendAnswerToLife(pump_during_send_, base::kNoTimeout, true); 334 SendAnswerToLife(pump_during_send_, base::kNoTimeout, true);
348 got_first_reply_->Signal(); 335 got_first_reply_->Signal();
349 336
(...skipping 25 matching lines...) Expand all
375 }; 362 };
376 363
377 void NoHang(bool pump_during_send) { 364 void NoHang(bool pump_during_send) {
378 WaitableEvent got_first_reply(false, false); 365 WaitableEvent got_first_reply(false, false);
379 std::vector<Worker*> workers; 366 std::vector<Worker*> workers;
380 workers.push_back(new NoHangServer(&got_first_reply, pump_during_send)); 367 workers.push_back(new NoHangServer(&got_first_reply, pump_during_send));
381 workers.push_back(new NoHangClient(&got_first_reply)); 368 workers.push_back(new NoHangClient(&got_first_reply));
382 RunTest(workers); 369 RunTest(workers);
383 } 370 }
384 371
385 } // namespace
386
387 // Tests that caller doesn't hang if receiver dies 372 // Tests that caller doesn't hang if receiver dies
388 TEST_F(IPCSyncChannelTest, NoHang) { 373 TEST_F(IPCSyncChannelTest, NoHang) {
389 NoHang(false); 374 NoHang(false);
390 NoHang(true); 375 NoHang(true);
391 } 376 }
392 377
393 //----------------------------------------------------------------------------- 378 //-----------------------------------------------------------------------------
394 379
395 namespace {
396
397 class UnblockServer : public Worker { 380 class UnblockServer : public Worker {
398 public: 381 public:
399 UnblockServer(bool pump_during_send, bool delete_during_send) 382 UnblockServer(bool pump_during_send, bool delete_during_send)
400 : Worker(Channel::MODE_SERVER, "unblock_server"), 383 : Worker(Channel::MODE_SERVER, "unblock_server"),
401 pump_during_send_(pump_during_send), 384 pump_during_send_(pump_during_send),
402 delete_during_send_(delete_during_send) { } 385 delete_during_send_(delete_during_send) { }
403 void Run() { 386 void Run() {
404 if (delete_during_send_) { 387 if (delete_during_send_) {
405 // Use custom code since race conditions mean the answer may or may not be 388 // Use custom code since race conditions mean the answer may or may not be
406 // available. 389 // available.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 bool pump_during_send_; 424 bool pump_during_send_;
442 }; 425 };
443 426
444 void Unblock(bool server_pump, bool client_pump, bool delete_during_send) { 427 void Unblock(bool server_pump, bool client_pump, bool delete_during_send) {
445 std::vector<Worker*> workers; 428 std::vector<Worker*> workers;
446 workers.push_back(new UnblockServer(server_pump, delete_during_send)); 429 workers.push_back(new UnblockServer(server_pump, delete_during_send));
447 workers.push_back(new UnblockClient(client_pump)); 430 workers.push_back(new UnblockClient(client_pump));
448 RunTest(workers); 431 RunTest(workers);
449 } 432 }
450 433
451 } // namespace
452
453 // Tests that the caller unblocks to answer a sync message from the receiver. 434 // Tests that the caller unblocks to answer a sync message from the receiver.
454 TEST_F(IPCSyncChannelTest, Unblock) { 435 TEST_F(IPCSyncChannelTest, Unblock) {
455 Unblock(false, false, false); 436 Unblock(false, false, false);
456 Unblock(false, true, false); 437 Unblock(false, true, false);
457 Unblock(true, false, false); 438 Unblock(true, false, false);
458 Unblock(true, true, false); 439 Unblock(true, true, false);
459 } 440 }
460 441
461 //----------------------------------------------------------------------------- 442 //-----------------------------------------------------------------------------
462 443
463 // Tests that the the IPC::SyncChannel object can be deleted during a Send. 444 // Tests that the the SyncChannel object can be deleted during a Send.
464 TEST_F(IPCSyncChannelTest, ChannelDeleteDuringSend) { 445 TEST_F(IPCSyncChannelTest, ChannelDeleteDuringSend) {
465 Unblock(false, false, true); 446 Unblock(false, false, true);
466 Unblock(false, true, true); 447 Unblock(false, true, true);
467 Unblock(true, false, true); 448 Unblock(true, false, true);
468 Unblock(true, true, true); 449 Unblock(true, true, true);
469 } 450 }
470 451
471 //----------------------------------------------------------------------------- 452 //-----------------------------------------------------------------------------
472 453
473 namespace {
474
475 class RecursiveServer : public Worker { 454 class RecursiveServer : public Worker {
476 public: 455 public:
477 explicit RecursiveServer( 456 explicit RecursiveServer(
478 bool expected_send_result, bool pump_first, bool pump_second) 457 bool expected_send_result, bool pump_first, bool pump_second)
479 : Worker(Channel::MODE_SERVER, "recursive_server"), 458 : Worker(Channel::MODE_SERVER, "recursive_server"),
480 expected_send_result_(expected_send_result), 459 expected_send_result_(expected_send_result),
481 pump_first_(pump_first), pump_second_(pump_second) { } 460 pump_first_(pump_first), pump_second_(pump_second) { }
482 void Run() { 461 void Run() {
483 SendDouble(pump_first_, expected_send_result_); 462 SendDouble(pump_first_, expected_send_result_);
484 Done(); 463 Done();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 503
525 void Recursive( 504 void Recursive(
526 bool server_pump_first, bool server_pump_second, bool client_pump) { 505 bool server_pump_first, bool server_pump_second, bool client_pump) {
527 std::vector<Worker*> workers; 506 std::vector<Worker*> workers;
528 workers.push_back( 507 workers.push_back(
529 new RecursiveServer(true, server_pump_first, server_pump_second)); 508 new RecursiveServer(true, server_pump_first, server_pump_second));
530 workers.push_back(new RecursiveClient(client_pump, false)); 509 workers.push_back(new RecursiveClient(client_pump, false));
531 RunTest(workers); 510 RunTest(workers);
532 } 511 }
533 512
534 } // namespace
535
536 // Tests a server calling Send while another Send is pending. 513 // Tests a server calling Send while another Send is pending.
537 TEST_F(IPCSyncChannelTest, Recursive) { 514 TEST_F(IPCSyncChannelTest, Recursive) {
538 Recursive(false, false, false); 515 Recursive(false, false, false);
539 Recursive(false, false, true); 516 Recursive(false, false, true);
540 Recursive(false, true, false); 517 Recursive(false, true, false);
541 Recursive(false, true, true); 518 Recursive(false, true, true);
542 Recursive(true, false, false); 519 Recursive(true, false, false);
543 Recursive(true, false, true); 520 Recursive(true, false, true);
544 Recursive(true, true, false); 521 Recursive(true, true, false);
545 Recursive(true, true, true); 522 Recursive(true, true, true);
546 } 523 }
547 524
548 //----------------------------------------------------------------------------- 525 //-----------------------------------------------------------------------------
549 526
550 namespace {
551
552 void RecursiveNoHang( 527 void RecursiveNoHang(
553 bool server_pump_first, bool server_pump_second, bool client_pump) { 528 bool server_pump_first, bool server_pump_second, bool client_pump) {
554 std::vector<Worker*> workers; 529 std::vector<Worker*> workers;
555 workers.push_back( 530 workers.push_back(
556 new RecursiveServer(false, server_pump_first, server_pump_second)); 531 new RecursiveServer(false, server_pump_first, server_pump_second));
557 workers.push_back(new RecursiveClient(client_pump, true)); 532 workers.push_back(new RecursiveClient(client_pump, true));
558 RunTest(workers); 533 RunTest(workers);
559 } 534 }
560 535
561 } // namespace
562
563 // Tests that if a caller makes a sync call during an existing sync call and 536 // Tests that if a caller makes a sync call during an existing sync call and
564 // the receiver dies, neither of the Send() calls hang. 537 // the receiver dies, neither of the Send() calls hang.
565 TEST_F(IPCSyncChannelTest, RecursiveNoHang) { 538 TEST_F(IPCSyncChannelTest, RecursiveNoHang) {
566 RecursiveNoHang(false, false, false); 539 RecursiveNoHang(false, false, false);
567 RecursiveNoHang(false, false, true); 540 RecursiveNoHang(false, false, true);
568 RecursiveNoHang(false, true, false); 541 RecursiveNoHang(false, true, false);
569 RecursiveNoHang(false, true, true); 542 RecursiveNoHang(false, true, true);
570 RecursiveNoHang(true, false, false); 543 RecursiveNoHang(true, false, false);
571 RecursiveNoHang(true, false, true); 544 RecursiveNoHang(true, false, true);
572 RecursiveNoHang(true, true, false); 545 RecursiveNoHang(true, true, false);
573 RecursiveNoHang(true, true, true); 546 RecursiveNoHang(true, true, true);
574 } 547 }
575 548
576 //----------------------------------------------------------------------------- 549 //-----------------------------------------------------------------------------
577 550
578 namespace {
579
580 class MultipleServer1 : public Worker { 551 class MultipleServer1 : public Worker {
581 public: 552 public:
582 explicit MultipleServer1(bool pump_during_send) 553 explicit MultipleServer1(bool pump_during_send)
583 : Worker("test_channel1", Channel::MODE_SERVER), 554 : Worker("test_channel1", Channel::MODE_SERVER),
584 pump_during_send_(pump_during_send) { } 555 pump_during_send_(pump_during_send) { }
585 556
586 void Run() { 557 void Run() {
587 SendDouble(pump_during_send_, true); 558 SendDouble(pump_during_send_, true);
588 Done(); 559 Done();
589 } 560 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 worker->OverrideThread(&worker_thread); 640 worker->OverrideThread(&worker_thread);
670 workers.push_back(worker); 641 workers.push_back(worker);
671 642
672 worker = new MultipleClient1( 643 worker = new MultipleClient1(
673 &client1_msg_received, &client1_can_reply); 644 &client1_msg_received, &client1_can_reply);
674 workers.push_back(worker); 645 workers.push_back(worker);
675 646
676 RunTest(workers); 647 RunTest(workers);
677 } 648 }
678 649
679 } // namespace
680
681 // Tests that multiple SyncObjects on the same listener thread can unblock each 650 // Tests that multiple SyncObjects on the same listener thread can unblock each
682 // other. 651 // other.
683 TEST_F(IPCSyncChannelTest, Multiple) { 652 TEST_F(IPCSyncChannelTest, Multiple) {
684 Multiple(false, false); 653 Multiple(false, false);
685 Multiple(false, true); 654 Multiple(false, true);
686 Multiple(true, false); 655 Multiple(true, false);
687 Multiple(true, true); 656 Multiple(true, true);
688 } 657 }
689 658
690 //----------------------------------------------------------------------------- 659 //-----------------------------------------------------------------------------
691 660
692 namespace {
693
694 // This class provides server side functionality to test the case where 661 // This class provides server side functionality to test the case where
695 // multiple sync channels are in use on the same thread on the client and 662 // multiple sync channels are in use on the same thread on the client and
696 // nested calls are issued. 663 // nested calls are issued.
697 class QueuedReplyServer : public Worker { 664 class QueuedReplyServer : public Worker {
698 public: 665 public:
699 QueuedReplyServer(base::Thread* listener_thread, 666 QueuedReplyServer(base::Thread* listener_thread,
700 const std::string& channel_name, 667 const std::string& channel_name,
701 const std::string& reply_text) 668 const std::string& reply_text)
702 : Worker(channel_name, Channel::MODE_SERVER), 669 : Worker(channel_name, Channel::MODE_SERVER),
703 reply_text_(reply_text) { 670 reply_text_(reply_text) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 748
782 worker = new QueuedReplyClient(&client_worker_thread, 749 worker = new QueuedReplyClient(&client_worker_thread,
783 "QueuedReply_Server2", 750 "QueuedReply_Server2",
784 "Got second message", 751 "Got second message",
785 client_pump); 752 client_pump);
786 workers.push_back(worker); 753 workers.push_back(worker);
787 754
788 RunTest(workers); 755 RunTest(workers);
789 } 756 }
790 757
791 } // namespace
792
793 // While a blocking send is in progress, the listener thread might answer other 758 // While a blocking send is in progress, the listener thread might answer other
794 // synchronous messages. This tests that if during the response to another 759 // synchronous messages. This tests that if during the response to another
795 // message the reply to the original messages comes, it is queued up correctly 760 // message the reply to the original messages comes, it is queued up correctly
796 // and the original Send is unblocked later. 761 // and the original Send is unblocked later.
797 // We also test that the send call stacks unwind correctly when the channel 762 // We also test that the send call stacks unwind correctly when the channel
798 // pumps messages while waiting for a response. 763 // pumps messages while waiting for a response.
799 TEST_F(IPCSyncChannelTest, QueuedReply) { 764 TEST_F(IPCSyncChannelTest, QueuedReply) {
800 QueuedReply(false); 765 QueuedReply(false);
801 QueuedReply(true); 766 QueuedReply(true);
802 } 767 }
803 768
804 //----------------------------------------------------------------------------- 769 //-----------------------------------------------------------------------------
805 770
806 namespace {
807
808 void DropAssert(const std::string&) {} 771 void DropAssert(const std::string&) {}
809 772
810 class BadServer : public Worker { 773 class BadServer : public Worker {
811 public: 774 public:
812 explicit BadServer(bool pump_during_send) 775 explicit BadServer(bool pump_during_send)
813 : Worker(Channel::MODE_SERVER, "simpler_server"), 776 : Worker(Channel::MODE_SERVER, "simpler_server"),
814 pump_during_send_(pump_during_send) { } 777 pump_during_send_(pump_during_send) { }
815 void Run() { 778 void Run() {
816 int answer = 0; 779 int answer = 0;
817 780
(...skipping 21 matching lines...) Expand all
839 bool pump_during_send_; 802 bool pump_during_send_;
840 }; 803 };
841 804
842 void BadMessage(bool pump_during_send) { 805 void BadMessage(bool pump_during_send) {
843 std::vector<Worker*> workers; 806 std::vector<Worker*> workers;
844 workers.push_back(new BadServer(pump_during_send)); 807 workers.push_back(new BadServer(pump_during_send));
845 workers.push_back(new SimpleClient()); 808 workers.push_back(new SimpleClient());
846 RunTest(workers); 809 RunTest(workers);
847 } 810 }
848 811
849 } // namespace
850
851 // Tests that if a message is not serialized correctly, the Send() will fail. 812 // Tests that if a message is not serialized correctly, the Send() will fail.
852 TEST_F(IPCSyncChannelTest, BadMessage) { 813 TEST_F(IPCSyncChannelTest, BadMessage) {
853 BadMessage(false); 814 BadMessage(false);
854 BadMessage(true); 815 BadMessage(true);
855 } 816 }
856 817
857 //----------------------------------------------------------------------------- 818 //-----------------------------------------------------------------------------
858 819
859 namespace {
860
861 class ChattyClient : public Worker { 820 class ChattyClient : public Worker {
862 public: 821 public:
863 ChattyClient() : 822 ChattyClient() :
864 Worker(Channel::MODE_CLIENT, "chatty_client") { } 823 Worker(Channel::MODE_CLIENT, "chatty_client") { }
865 824
866 void OnAnswer(int* answer) { 825 void OnAnswer(int* answer) {
867 // The PostMessage limit is 10k. Send 20% more than that. 826 // The PostMessage limit is 10k. Send 20% more than that.
868 const int kMessageLimit = 10000; 827 const int kMessageLimit = 10000;
869 const int kMessagesToSend = kMessageLimit * 120 / 100; 828 const int kMessagesToSend = kMessageLimit * 120 / 100;
870 for (int i = 0; i < kMessagesToSend; ++i) { 829 for (int i = 0; i < kMessagesToSend; ++i) {
871 if (!SendDouble(false, true)) 830 if (!SendDouble(false, true))
872 break; 831 break;
873 } 832 }
874 *answer = 42; 833 *answer = 42;
875 Done(); 834 Done();
876 } 835 }
877 }; 836 };
878 837
879 void ChattyServer(bool pump_during_send) { 838 void ChattyServer(bool pump_during_send) {
880 std::vector<Worker*> workers; 839 std::vector<Worker*> workers;
881 workers.push_back(new UnblockServer(pump_during_send, false)); 840 workers.push_back(new UnblockServer(pump_during_send, false));
882 workers.push_back(new ChattyClient()); 841 workers.push_back(new ChattyClient());
883 RunTest(workers); 842 RunTest(workers);
884 } 843 }
885 844
886 } // namespace
887
888 // Tests http://b/1093251 - that sending lots of sync messages while 845 // Tests http://b/1093251 - that sending lots of sync messages while
889 // the receiver is waiting for a sync reply does not overflow the PostMessage 846 // the receiver is waiting for a sync reply does not overflow the PostMessage
890 // queue. 847 // queue.
891 TEST_F(IPCSyncChannelTest, ChattyServer) { 848 TEST_F(IPCSyncChannelTest, ChattyServer) {
892 ChattyServer(false); 849 ChattyServer(false);
893 ChattyServer(true); 850 ChattyServer(true);
894 } 851 }
895 852
896 //------------------------------------------------------------------------------ 853 //------------------------------------------------------------------------------
897 854
898 namespace {
899
900 class TimeoutServer : public Worker { 855 class TimeoutServer : public Worker {
901 public: 856 public:
902 TimeoutServer(int timeout_ms, 857 TimeoutServer(int timeout_ms,
903 std::vector<bool> timeout_seq, 858 std::vector<bool> timeout_seq,
904 bool pump_during_send) 859 bool pump_during_send)
905 : Worker(Channel::MODE_SERVER, "timeout_server"), 860 : Worker(Channel::MODE_SERVER, "timeout_server"),
906 timeout_ms_(timeout_ms), 861 timeout_ms_(timeout_ms),
907 timeout_seq_(timeout_seq), 862 timeout_seq_(timeout_seq),
908 pump_during_send_(pump_during_send) { 863 pump_during_send_(pump_during_send) {
909 } 864 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 timeout_seq.push_back(true); 931 timeout_seq.push_back(true);
977 timeout_seq.push_back(false); 932 timeout_seq.push_back(false);
978 timeout_seq.push_back(false); 933 timeout_seq.push_back(false);
979 timeout_seq.push_back(true); 934 timeout_seq.push_back(true);
980 timeout_seq.push_back(false); 935 timeout_seq.push_back(false);
981 workers.push_back(new TimeoutServer(100, timeout_seq, pump_during_send)); 936 workers.push_back(new TimeoutServer(100, timeout_seq, pump_during_send));
982 workers.push_back(new UnresponsiveClient(timeout_seq)); 937 workers.push_back(new UnresponsiveClient(timeout_seq));
983 RunTest(workers); 938 RunTest(workers);
984 } 939 }
985 940
986 } // namespace
987
988 // Tests that SendWithTimeout does not time-out if the response comes back fast 941 // Tests that SendWithTimeout does not time-out if the response comes back fast
989 // enough. 942 // enough.
990 TEST_F(IPCSyncChannelTest, SendWithTimeoutOK) { 943 TEST_F(IPCSyncChannelTest, SendWithTimeoutOK) {
991 SendWithTimeoutOK(false); 944 SendWithTimeoutOK(false);
992 SendWithTimeoutOK(true); 945 SendWithTimeoutOK(true);
993 } 946 }
994 947
995 // Tests that SendWithTimeout does time-out. 948 // Tests that SendWithTimeout does time-out.
996 TEST_F(IPCSyncChannelTest, SendWithTimeoutTimeout) { 949 TEST_F(IPCSyncChannelTest, SendWithTimeoutTimeout) {
997 SendWithTimeoutTimeout(false); 950 SendWithTimeoutTimeout(false);
998 SendWithTimeoutTimeout(true); 951 SendWithTimeoutTimeout(true);
999 } 952 }
1000 953
1001 // Sends some message that time-out and some that succeed. 954 // Sends some message that time-out and some that succeed.
1002 // Crashes flakily, http://crbug.com/70075. 955 // Crashes flakily, http://crbug.com/70075.
1003 TEST_F(IPCSyncChannelTest, DISABLED_SendWithTimeoutMixedOKAndTimeout) { 956 TEST_F(IPCSyncChannelTest, DISABLED_SendWithTimeoutMixedOKAndTimeout) {
1004 SendWithTimeoutMixedOKAndTimeout(false); 957 SendWithTimeoutMixedOKAndTimeout(false);
1005 SendWithTimeoutMixedOKAndTimeout(true); 958 SendWithTimeoutMixedOKAndTimeout(true);
1006 } 959 }
1007 960
1008 //------------------------------------------------------------------------------ 961 //------------------------------------------------------------------------------
1009 962
1010 namespace {
1011
1012 class NestedTask : public Task { 963 class NestedTask : public Task {
1013 public: 964 public:
1014 explicit NestedTask(Worker* server) : server_(server) { } 965 explicit NestedTask(Worker* server) : server_(server) { }
1015 void Run() { 966 void Run() {
1016 // Sleep a bit so that we wake up after the reply has been received. 967 // Sleep a bit so that we wake up after the reply has been received.
1017 base::PlatformThread::Sleep(250); 968 base::PlatformThread::Sleep(250);
1018 server_->SendAnswerToLife(true, base::kNoTimeout, true); 969 server_->SendAnswerToLife(true, base::kNoTimeout, true);
1019 } 970 }
1020 971
1021 Worker* server_; 972 Worker* server_;
(...skipping 19 matching lines...) Expand all
1041 // Even though we have a timeout on the Send, it will succeed since for this 992 // Even though we have a timeout on the Send, it will succeed since for this
1042 // bug, the reply message comes back and is deserialized, however the done 993 // bug, the reply message comes back and is deserialized, however the done
1043 // event wasn't set. So we indirectly use the timeout task to notice if a 994 // event wasn't set. So we indirectly use the timeout task to notice if a
1044 // timeout occurred. 995 // timeout occurred.
1045 SendAnswerToLife(true, 10000, true); 996 SendAnswerToLife(true, 10000, true);
1046 DCHECK(!timeout_occured); 997 DCHECK(!timeout_occured);
1047 Done(); 998 Done();
1048 } 999 }
1049 }; 1000 };
1050 1001
1051 } // namespace
1052
1053 // Tests http://b/1474092 - that if after the done_event is set but before 1002 // Tests http://b/1474092 - that if after the done_event is set but before
1054 // OnObjectSignaled is called another message is sent out, then after its 1003 // OnObjectSignaled is called another message is sent out, then after its
1055 // reply comes back OnObjectSignaled will be called for the first message. 1004 // reply comes back OnObjectSignaled will be called for the first message.
1056 TEST_F(IPCSyncChannelTest, DoneEventRace) { 1005 TEST_F(IPCSyncChannelTest, DoneEventRace) {
1057 std::vector<Worker*> workers; 1006 std::vector<Worker*> workers;
1058 workers.push_back(new DoneEventRaceServer()); 1007 workers.push_back(new DoneEventRaceServer());
1059 workers.push_back(new SimpleClient()); 1008 workers.push_back(new SimpleClient());
1060 RunTest(workers); 1009 RunTest(workers);
1061 } 1010 }
1062 1011
1063 //----------------------------------------------------------------------------- 1012 //-----------------------------------------------------------------------------
1064 1013
1065 namespace { 1014 class TestSyncMessageFilter : public SyncMessageFilter {
1066
1067 class TestSyncMessageFilter : public IPC::SyncMessageFilter {
1068 public: 1015 public:
1069 TestSyncMessageFilter(base::WaitableEvent* shutdown_event, Worker* worker) 1016 TestSyncMessageFilter(base::WaitableEvent* shutdown_event, Worker* worker)
1070 : SyncMessageFilter(shutdown_event), 1017 : SyncMessageFilter(shutdown_event),
1071 worker_(worker), 1018 worker_(worker),
1072 thread_("helper_thread") { 1019 thread_("helper_thread") {
1073 base::Thread::Options options; 1020 base::Thread::Options options;
1074 options.message_loop_type = MessageLoop::TYPE_DEFAULT; 1021 options.message_loop_type = MessageLoop::TYPE_DEFAULT;
1075 thread_.StartWithOptions(options); 1022 thread_.StartWithOptions(options);
1076 } 1023 }
1077 1024
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1135 1082
1136 bool Send(Message* msg) { 1083 bool Send(Message* msg) {
1137 send_result_ = Worker::Send(msg); 1084 send_result_ = Worker::Send(msg);
1138 Done(); 1085 Done();
1139 return send_result_; 1086 return send_result_;
1140 } 1087 }
1141 1088
1142 bool send_result_; 1089 bool send_result_;
1143 }; 1090 };
1144 1091
1145 } // namespace
1146
1147 // Tests basic synchronous call 1092 // Tests basic synchronous call
1148 TEST_F(IPCSyncChannelTest, SyncMessageFilter) { 1093 TEST_F(IPCSyncChannelTest, SyncMessageFilter) {
1149 std::vector<Worker*> workers; 1094 std::vector<Worker*> workers;
1150 workers.push_back(new SyncMessageFilterServer()); 1095 workers.push_back(new SyncMessageFilterServer());
1151 workers.push_back(new SimpleClient()); 1096 workers.push_back(new SimpleClient());
1152 RunTest(workers); 1097 RunTest(workers);
1153 } 1098 }
1154 1099
1155 // Test the case when the channel is closed and a Send is attempted after that. 1100 // Test the case when the channel is closed and a Send is attempted after that.
1156 TEST_F(IPCSyncChannelTest, SendAfterClose) { 1101 TEST_F(IPCSyncChannelTest, SendAfterClose) {
1157 ServerSendAfterClose server; 1102 ServerSendAfterClose server;
1158 server.Start(); 1103 server.Start();
1159 1104
1160 server.done_event()->Wait(); 1105 server.done_event()->Wait();
1161 server.done_event()->Reset(); 1106 server.done_event()->Reset();
1162 1107
1163 server.SendDummy(); 1108 server.SendDummy();
1164 server.done_event()->Wait(); 1109 server.done_event()->Wait();
1165 1110
1166 EXPECT_FALSE(server.send_result()); 1111 EXPECT_FALSE(server.send_result());
1167 } 1112 }
1168 1113
1169 //----------------------------------------------------------------------------- 1114 //-----------------------------------------------------------------------------
1170 1115
1171 namespace {
1172
1173 class RestrictedDispatchServer : public Worker { 1116 class RestrictedDispatchServer : public Worker {
1174 public: 1117 public:
1175 RestrictedDispatchServer(WaitableEvent* sent_ping_event) 1118 RestrictedDispatchServer(WaitableEvent* sent_ping_event)
1176 : Worker("restricted_channel", Channel::MODE_SERVER), 1119 : Worker("restricted_channel", Channel::MODE_SERVER),
1177 sent_ping_event_(sent_ping_event) { } 1120 sent_ping_event_(sent_ping_event) { }
1178 1121
1179 void OnDoPing(int ping) { 1122 void OnDoPing(int ping) {
1180 // Send an asynchronous message that unblocks the caller. 1123 // Send an asynchronous message that unblocks the caller.
1181 IPC::Message* msg = new SyncChannelTestMsg_Ping(ping); 1124 Message* msg = new SyncChannelTestMsg_Ping(ping);
1182 msg->set_unblock(true); 1125 msg->set_unblock(true);
1183 Send(msg); 1126 Send(msg);
1184 // Signal the event after the message has been sent on the channel, on the 1127 // Signal the event after the message has been sent on the channel, on the
1185 // IPC thread. 1128 // IPC thread.
1186 ipc_thread().message_loop()->PostTask(FROM_HERE, 1129 ipc_thread().message_loop()->PostTask(FROM_HERE,
1187 NewRunnableMethod(this, &RestrictedDispatchServer::OnPingSent)); 1130 NewRunnableMethod(this, &RestrictedDispatchServer::OnPingSent));
1188 } 1131 }
1189 1132
1190 base::Thread* ListenerThread() { return Worker::ListenerThread(); } 1133 base::Thread* ListenerThread() { return Worker::ListenerThread(); }
1191 1134
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 void OnPing(int ping) { 1235 void OnPing(int ping) {
1293 ping_ = ping; 1236 ping_ = ping;
1294 } 1237 }
1295 1238
1296 int ping_; 1239 int ping_;
1297 RestrictedDispatchServer* server_; 1240 RestrictedDispatchServer* server_;
1298 int* success_; 1241 int* success_;
1299 WaitableEvent* sent_ping_event_; 1242 WaitableEvent* sent_ping_event_;
1300 }; 1243 };
1301 1244
1302 } // namespace
1303
1304 TEST_F(IPCSyncChannelTest, RestrictedDispatch) { 1245 TEST_F(IPCSyncChannelTest, RestrictedDispatch) {
1305 WaitableEvent sent_ping_event(false, false); 1246 WaitableEvent sent_ping_event(false, false);
1306 1247
1307 RestrictedDispatchServer* server = 1248 RestrictedDispatchServer* server =
1308 new RestrictedDispatchServer(&sent_ping_event); 1249 new RestrictedDispatchServer(&sent_ping_event);
1309 int success = 0; 1250 int success = 0;
1310 std::vector<Worker*> workers; 1251 std::vector<Worker*> workers;
1311 workers.push_back(new NonRestrictedDispatchServer); 1252 workers.push_back(new NonRestrictedDispatchServer);
1312 workers.push_back(server); 1253 workers.push_back(server);
1313 workers.push_back( 1254 workers.push_back(
1314 new RestrictedDispatchClient(&sent_ping_event, server, &success)); 1255 new RestrictedDispatchClient(&sent_ping_event, server, &success));
1315 RunTest(workers); 1256 RunTest(workers);
1316 EXPECT_EQ(3, success); 1257 EXPECT_EQ(3, success);
1317 } 1258 }
1259
1260 } // 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