| OLD | NEW |
| 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 "mojo/edk/system/raw_channel.h" | 5 #include "mojo/edk/system/raw_channel.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <stdio.h> | 8 #include <stdio.h> |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); | 548 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| 549 io_thread()->PostTaskAndWait( | 549 io_thread()->PostTaskAndWait( |
| 550 FROM_HERE, | 550 FROM_HERE, |
| 551 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); | 551 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); |
| 552 io_thread()->PostTaskAndWait( | 552 io_thread()->PostTaskAndWait( |
| 553 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc.get()))); | 553 FROM_HERE, base::Bind(&RawChannel::Shutdown, base::Unretained(rc.get()))); |
| 554 | 554 |
| 555 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); | 555 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| 556 } | 556 } |
| 557 | 557 |
| 558 // RawChannelTest.ShutdownOnReadMessage ---------------------------------------- | 558 // RawChannelTest.{Shutdown, ShutdownAndDestroy}OnReadMessage ------------------ |
| 559 | 559 |
| 560 class ShutdownOnReadMessageRawChannelDelegate : public RawChannel::Delegate { | 560 class ShutdownOnReadMessageRawChannelDelegate : public RawChannel::Delegate { |
| 561 public: | 561 public: |
| 562 explicit ShutdownOnReadMessageRawChannelDelegate(RawChannel* raw_channel) | 562 explicit ShutdownOnReadMessageRawChannelDelegate(RawChannel* raw_channel, |
| 563 bool should_destroy) |
| 563 : raw_channel_(raw_channel), | 564 : raw_channel_(raw_channel), |
| 565 should_destroy_(should_destroy), |
| 564 done_event_(false, false), | 566 done_event_(false, false), |
| 565 did_shutdown_(false) {} | 567 did_shutdown_(false) {} |
| 566 ~ShutdownOnReadMessageRawChannelDelegate() override {} | 568 ~ShutdownOnReadMessageRawChannelDelegate() override {} |
| 567 | 569 |
| 568 // |RawChannel::Delegate| implementation (called on the I/O thread): | 570 // |RawChannel::Delegate| implementation (called on the I/O thread): |
| 569 void OnReadMessage( | 571 void OnReadMessage( |
| 570 const MessageInTransit::View& message_view, | 572 const MessageInTransit::View& message_view, |
| 571 embedder::ScopedPlatformHandleVectorPtr platform_handles) override { | 573 embedder::ScopedPlatformHandleVectorPtr platform_handles) override { |
| 572 EXPECT_FALSE(platform_handles); | 574 EXPECT_FALSE(platform_handles); |
| 573 EXPECT_FALSE(did_shutdown_); | 575 EXPECT_FALSE(did_shutdown_); |
| 574 EXPECT_TRUE( | 576 EXPECT_TRUE( |
| 575 CheckMessageData(message_view.bytes(), message_view.num_bytes())); | 577 CheckMessageData(message_view.bytes(), message_view.num_bytes())); |
| 576 raw_channel_->Shutdown(); | 578 raw_channel_->Shutdown(); |
| 579 if (should_destroy_) |
| 580 delete raw_channel_; |
| 577 did_shutdown_ = true; | 581 did_shutdown_ = true; |
| 578 done_event_.Signal(); | 582 done_event_.Signal(); |
| 579 } | 583 } |
| 580 void OnError(Error /*error*/) override { | 584 void OnError(Error /*error*/) override { |
| 581 CHECK(false); // Should not get called. | 585 CHECK(false); // Should not get called. |
| 582 } | 586 } |
| 583 | 587 |
| 584 // Waits for shutdown. | 588 // Waits for shutdown. |
| 585 void Wait() { | 589 void Wait() { |
| 586 done_event_.Wait(); | 590 done_event_.Wait(); |
| 587 EXPECT_TRUE(did_shutdown_); | 591 EXPECT_TRUE(did_shutdown_); |
| 588 } | 592 } |
| 589 | 593 |
| 590 private: | 594 private: |
| 591 RawChannel* const raw_channel_; | 595 RawChannel* const raw_channel_; |
| 596 const bool should_destroy_; |
| 592 base::WaitableEvent done_event_; | 597 base::WaitableEvent done_event_; |
| 593 bool did_shutdown_; | 598 bool did_shutdown_; |
| 594 | 599 |
| 595 DISALLOW_COPY_AND_ASSIGN(ShutdownOnReadMessageRawChannelDelegate); | 600 DISALLOW_COPY_AND_ASSIGN(ShutdownOnReadMessageRawChannelDelegate); |
| 596 }; | 601 }; |
| 597 | 602 |
| 598 TEST_F(RawChannelTest, ShutdownOnReadMessage) { | 603 TEST_F(RawChannelTest, ShutdownOnReadMessage) { |
| 599 // Write a few messages into the other end. | 604 // Write a few messages into the other end. |
| 600 for (size_t count = 0; count < 5; count++) | 605 for (size_t count = 0; count < 5; count++) |
| 601 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), 10)); | 606 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), 10)); |
| 602 | 607 |
| 603 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); | 608 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| 604 ShutdownOnReadMessageRawChannelDelegate delegate(rc.get()); | 609 ShutdownOnReadMessageRawChannelDelegate delegate(rc.get(), false); |
| 605 io_thread()->PostTaskAndWait( | 610 io_thread()->PostTaskAndWait( |
| 606 FROM_HERE, | 611 FROM_HERE, |
| 607 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); | 612 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); |
| 608 | 613 |
| 609 // Wait for the delegate, which will shut the |RawChannel| down. | 614 // Wait for the delegate, which will shut the |RawChannel| down. |
| 610 delegate.Wait(); | 615 delegate.Wait(); |
| 611 } | 616 } |
| 612 | 617 |
| 613 // RawChannelTest.ShutdownOnError{Read, Write} --------------------------------- | 618 TEST_F(RawChannelTest, ShutdownAndDestroyOnReadMessage) { |
| 619 // Write a message into the other end. |
| 620 EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), 10)); |
| 621 |
| 622 // The delegate will destroy |rc|. |
| 623 RawChannel* rc = RawChannel::Create(handles[0].Pass()).release(); |
| 624 ShutdownOnReadMessageRawChannelDelegate delegate(rc, true); |
| 625 io_thread()->PostTaskAndWait( |
| 626 FROM_HERE, base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 627 |
| 628 // Wait for the delegate, which will shut the |RawChannel| down. |
| 629 delegate.Wait(); |
| 630 } |
| 631 |
| 632 // RawChannelTest.{Shutdown, ShutdownAndDestroy}OnError{Read, Write} ----------- |
| 614 | 633 |
| 615 class ShutdownOnErrorRawChannelDelegate : public RawChannel::Delegate { | 634 class ShutdownOnErrorRawChannelDelegate : public RawChannel::Delegate { |
| 616 public: | 635 public: |
| 617 ShutdownOnErrorRawChannelDelegate(RawChannel* raw_channel, | 636 ShutdownOnErrorRawChannelDelegate(RawChannel* raw_channel, |
| 637 bool should_destroy, |
| 618 Error shutdown_on_error_type) | 638 Error shutdown_on_error_type) |
| 619 : raw_channel_(raw_channel), | 639 : raw_channel_(raw_channel), |
| 640 should_destroy_(should_destroy), |
| 620 shutdown_on_error_type_(shutdown_on_error_type), | 641 shutdown_on_error_type_(shutdown_on_error_type), |
| 621 done_event_(false, false), | 642 done_event_(false, false), |
| 622 did_shutdown_(false) {} | 643 did_shutdown_(false) {} |
| 623 ~ShutdownOnErrorRawChannelDelegate() override {} | 644 ~ShutdownOnErrorRawChannelDelegate() override {} |
| 624 | 645 |
| 625 // |RawChannel::Delegate| implementation (called on the I/O thread): | 646 // |RawChannel::Delegate| implementation (called on the I/O thread): |
| 626 void OnReadMessage( | 647 void OnReadMessage( |
| 627 const MessageInTransit::View& /*message_view*/, | 648 const MessageInTransit::View& /*message_view*/, |
| 628 embedder::ScopedPlatformHandleVectorPtr /*platform_handles*/) override { | 649 embedder::ScopedPlatformHandleVectorPtr /*platform_handles*/) override { |
| 629 CHECK(false); // Should not get called. | 650 CHECK(false); // Should not get called. |
| 630 } | 651 } |
| 631 void OnError(Error error) override { | 652 void OnError(Error error) override { |
| 632 EXPECT_FALSE(did_shutdown_); | 653 EXPECT_FALSE(did_shutdown_); |
| 633 if (error != shutdown_on_error_type_) | 654 if (error != shutdown_on_error_type_) |
| 634 return; | 655 return; |
| 635 raw_channel_->Shutdown(); | 656 raw_channel_->Shutdown(); |
| 657 if (should_destroy_) |
| 658 delete raw_channel_; |
| 636 did_shutdown_ = true; | 659 did_shutdown_ = true; |
| 637 done_event_.Signal(); | 660 done_event_.Signal(); |
| 638 } | 661 } |
| 639 | 662 |
| 640 // Waits for shutdown. | 663 // Waits for shutdown. |
| 641 void Wait() { | 664 void Wait() { |
| 642 done_event_.Wait(); | 665 done_event_.Wait(); |
| 643 EXPECT_TRUE(did_shutdown_); | 666 EXPECT_TRUE(did_shutdown_); |
| 644 } | 667 } |
| 645 | 668 |
| 646 private: | 669 private: |
| 647 RawChannel* const raw_channel_; | 670 RawChannel* const raw_channel_; |
| 671 const bool should_destroy_; |
| 648 const Error shutdown_on_error_type_; | 672 const Error shutdown_on_error_type_; |
| 649 base::WaitableEvent done_event_; | 673 base::WaitableEvent done_event_; |
| 650 bool did_shutdown_; | 674 bool did_shutdown_; |
| 651 | 675 |
| 652 DISALLOW_COPY_AND_ASSIGN(ShutdownOnErrorRawChannelDelegate); | 676 DISALLOW_COPY_AND_ASSIGN(ShutdownOnErrorRawChannelDelegate); |
| 653 }; | 677 }; |
| 654 | 678 |
| 655 TEST_F(RawChannelTest, ShutdownOnErrorRead) { | 679 TEST_F(RawChannelTest, ShutdownOnErrorRead) { |
| 656 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); | 680 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| 657 ShutdownOnErrorRawChannelDelegate delegate( | 681 ShutdownOnErrorRawChannelDelegate delegate( |
| 658 rc.get(), RawChannel::Delegate::ERROR_READ_SHUTDOWN); | 682 rc.get(), false, RawChannel::Delegate::ERROR_READ_SHUTDOWN); |
| 659 io_thread()->PostTaskAndWait( | 683 io_thread()->PostTaskAndWait( |
| 660 FROM_HERE, | 684 FROM_HERE, |
| 661 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); | 685 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); |
| 662 | 686 |
| 663 // Close the handle of the other end, which should stuff fail. | 687 // Close the handle of the other end, which should stuff fail. |
| 664 handles[1].reset(); | 688 handles[1].reset(); |
| 665 | 689 |
| 666 // Wait for the delegate, which will shut the |RawChannel| down. | 690 // Wait for the delegate, which will shut the |RawChannel| down. |
| 667 delegate.Wait(); | 691 delegate.Wait(); |
| 668 } | 692 } |
| 669 | 693 |
| 694 TEST_F(RawChannelTest, ShutdownAndDestroyOnErrorRead) { |
| 695 RawChannel* rc = RawChannel::Create(handles[0].Pass()).release(); |
| 696 ShutdownOnErrorRawChannelDelegate delegate( |
| 697 rc, true, RawChannel::Delegate::ERROR_READ_SHUTDOWN); |
| 698 io_thread()->PostTaskAndWait( |
| 699 FROM_HERE, base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 700 |
| 701 // Close the handle of the other end, which should stuff fail. |
| 702 handles[1].reset(); |
| 703 |
| 704 // Wait for the delegate, which will shut the |RawChannel| down. |
| 705 delegate.Wait(); |
| 706 } |
| 707 |
| 670 TEST_F(RawChannelTest, ShutdownOnErrorWrite) { | 708 TEST_F(RawChannelTest, ShutdownOnErrorWrite) { |
| 671 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); | 709 scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| 672 ShutdownOnErrorRawChannelDelegate delegate(rc.get(), | 710 ShutdownOnErrorRawChannelDelegate delegate(rc.get(), false, |
| 673 RawChannel::Delegate::ERROR_WRITE); | 711 RawChannel::Delegate::ERROR_WRITE); |
| 674 io_thread()->PostTaskAndWait( | 712 io_thread()->PostTaskAndWait( |
| 675 FROM_HERE, | 713 FROM_HERE, |
| 676 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); | 714 base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); |
| 677 | 715 |
| 678 // Close the handle of the other end, which should stuff fail. | 716 // Close the handle of the other end, which should stuff fail. |
| 679 handles[1].reset(); | 717 handles[1].reset(); |
| 680 | 718 |
| 681 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); | 719 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| 682 | 720 |
| 683 // Wait for the delegate, which will shut the |RawChannel| down. | 721 // Wait for the delegate, which will shut the |RawChannel| down. |
| 684 delegate.Wait(); | 722 delegate.Wait(); |
| 685 } | 723 } |
| 686 | 724 |
| 725 TEST_F(RawChannelTest, ShutdownAndDestroyOnErrorWrite) { |
| 726 RawChannel* rc = RawChannel::Create(handles[0].Pass()).release(); |
| 727 ShutdownOnErrorRawChannelDelegate delegate(rc, true, |
| 728 RawChannel::Delegate::ERROR_WRITE); |
| 729 io_thread()->PostTaskAndWait( |
| 730 FROM_HERE, base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| 731 |
| 732 // Close the handle of the other end, which should stuff fail. |
| 733 handles[1].reset(); |
| 734 |
| 735 EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| 736 |
| 737 // Wait for the delegate, which will shut the |RawChannel| down. |
| 738 delegate.Wait(); |
| 739 } |
| 740 |
| 687 // RawChannelTest.ReadWritePlatformHandles ------------------------------------- | 741 // RawChannelTest.ReadWritePlatformHandles ------------------------------------- |
| 688 | 742 |
| 689 class ReadPlatformHandlesCheckerRawChannelDelegate | 743 class ReadPlatformHandlesCheckerRawChannelDelegate |
| 690 : public RawChannel::Delegate { | 744 : public RawChannel::Delegate { |
| 691 public: | 745 public: |
| 692 ReadPlatformHandlesCheckerRawChannelDelegate() : done_event_(false, false) {} | 746 ReadPlatformHandlesCheckerRawChannelDelegate() : done_event_(false, false) {} |
| 693 ~ReadPlatformHandlesCheckerRawChannelDelegate() override {} | 747 ~ReadPlatformHandlesCheckerRawChannelDelegate() override {} |
| 694 | 748 |
| 695 // |RawChannel::Delegate| implementation (called on the I/O thread): | 749 // |RawChannel::Delegate| implementation (called on the I/O thread): |
| 696 void OnReadMessage( | 750 void OnReadMessage( |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 796 FROM_HERE, | 850 FROM_HERE, |
| 797 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_read.get()))); | 851 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_read.get()))); |
| 798 io_thread()->PostTaskAndWait( | 852 io_thread()->PostTaskAndWait( |
| 799 FROM_HERE, | 853 FROM_HERE, |
| 800 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_write.get()))); | 854 base::Bind(&RawChannel::Shutdown, base::Unretained(rc_write.get()))); |
| 801 } | 855 } |
| 802 | 856 |
| 803 } // namespace | 857 } // namespace |
| 804 } // namespace system | 858 } // namespace system |
| 805 } // namespace mojo | 859 } // namespace mojo |
| OLD | NEW |