Chromium Code Reviews| Index: mojo/edk/system/raw_channel_unittest.cc |
| diff --git a/mojo/edk/system/raw_channel_unittest.cc b/mojo/edk/system/raw_channel_unittest.cc |
| index a8cbcba7d7b5d3d4cb93c110bd716d55c272d321..a95ce3022d02c66ac8562947ae877e4215216102 100644 |
| --- a/mojo/edk/system/raw_channel_unittest.cc |
| +++ b/mojo/edk/system/raw_channel_unittest.cc |
| @@ -555,12 +555,14 @@ TEST_F(RawChannelTest, WriteMessageAfterShutdown) { |
| EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| } |
| -// RawChannelTest.ShutdownOnReadMessage ---------------------------------------- |
| +// RawChannelTest.{Shutdown, ShutdownAndDestroy}OnReadMessage ------------------ |
| class ShutdownOnReadMessageRawChannelDelegate : public RawChannel::Delegate { |
| public: |
| - explicit ShutdownOnReadMessageRawChannelDelegate(RawChannel* raw_channel) |
| + explicit ShutdownOnReadMessageRawChannelDelegate(RawChannel* raw_channel, |
| + bool should_destroy) |
| : raw_channel_(raw_channel), |
| + should_destroy_(should_destroy), |
| done_event_(false, false), |
| did_shutdown_(false) {} |
| ~ShutdownOnReadMessageRawChannelDelegate() override {} |
| @@ -574,6 +576,8 @@ class ShutdownOnReadMessageRawChannelDelegate : public RawChannel::Delegate { |
| EXPECT_TRUE( |
| CheckMessageData(message_view.bytes(), message_view.num_bytes())); |
| raw_channel_->Shutdown(); |
| + if (should_destroy_) |
| + delete raw_channel_; |
| did_shutdown_ = true; |
| done_event_.Signal(); |
| } |
| @@ -589,6 +593,7 @@ class ShutdownOnReadMessageRawChannelDelegate : public RawChannel::Delegate { |
| private: |
| RawChannel* const raw_channel_; |
| + const bool should_destroy_; |
| base::WaitableEvent done_event_; |
| bool did_shutdown_; |
| @@ -601,7 +606,7 @@ TEST_F(RawChannelTest, ShutdownOnReadMessage) { |
| EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), 10)); |
| scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| - ShutdownOnReadMessageRawChannelDelegate delegate(rc.get()); |
| + ShutdownOnReadMessageRawChannelDelegate delegate(rc.get(), false); |
| io_thread()->PostTaskAndWait( |
| FROM_HERE, |
| base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); |
| @@ -610,13 +615,29 @@ TEST_F(RawChannelTest, ShutdownOnReadMessage) { |
| delegate.Wait(); |
| } |
| -// RawChannelTest.ShutdownOnError{Read, Write} --------------------------------- |
| +TEST_F(RawChannelTest, ShutdownAndDestroyOnReadMessage) { |
|
yzshen1
2015/01/21 23:03:42
An alternative is to use value parameterized tests
viettrungluu
2015/01/21 23:34:32
I don't think it's worth the extra complication (t
|
| + // Write a message into the other end. |
| + EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), 10)); |
| + |
| + // The delegate will destroy |rc|. |
| + RawChannel* rc = RawChannel::Create(handles[0].Pass()).release(); |
| + ShutdownOnReadMessageRawChannelDelegate delegate(rc, true); |
| + io_thread()->PostTaskAndWait( |
| + FROM_HERE, base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| + |
| + // Wait for the delegate, which will shut the |RawChannel| down. |
| + delegate.Wait(); |
| +} |
| + |
| +// RawChannelTest.{Shutdown, ShutdownAndDestroy}OnError{Read, Write} ----------- |
| class ShutdownOnErrorRawChannelDelegate : public RawChannel::Delegate { |
| public: |
| ShutdownOnErrorRawChannelDelegate(RawChannel* raw_channel, |
| + bool should_destroy, |
| Error shutdown_on_error_type) |
| : raw_channel_(raw_channel), |
| + should_destroy_(should_destroy), |
| shutdown_on_error_type_(shutdown_on_error_type), |
| done_event_(false, false), |
| did_shutdown_(false) {} |
| @@ -633,6 +654,8 @@ class ShutdownOnErrorRawChannelDelegate : public RawChannel::Delegate { |
| if (error != shutdown_on_error_type_) |
| return; |
| raw_channel_->Shutdown(); |
| + if (should_destroy_) |
| + delete raw_channel_; |
| did_shutdown_ = true; |
| done_event_.Signal(); |
| } |
| @@ -645,6 +668,7 @@ class ShutdownOnErrorRawChannelDelegate : public RawChannel::Delegate { |
| private: |
| RawChannel* const raw_channel_; |
| + const bool should_destroy_; |
| const Error shutdown_on_error_type_; |
| base::WaitableEvent done_event_; |
| bool did_shutdown_; |
| @@ -655,7 +679,7 @@ class ShutdownOnErrorRawChannelDelegate : public RawChannel::Delegate { |
| TEST_F(RawChannelTest, ShutdownOnErrorRead) { |
| scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| ShutdownOnErrorRawChannelDelegate delegate( |
| - rc.get(), RawChannel::Delegate::ERROR_READ_SHUTDOWN); |
| + rc.get(), false, RawChannel::Delegate::ERROR_READ_SHUTDOWN); |
| io_thread()->PostTaskAndWait( |
| FROM_HERE, |
| base::Bind(&InitOnIOThread, rc.get(), base::Unretained(&delegate))); |
| @@ -667,9 +691,23 @@ TEST_F(RawChannelTest, ShutdownOnErrorRead) { |
| delegate.Wait(); |
| } |
| +TEST_F(RawChannelTest, ShutdownAndDestroyOnErrorRead) { |
| + RawChannel* rc = RawChannel::Create(handles[0].Pass()).release(); |
| + ShutdownOnErrorRawChannelDelegate delegate( |
| + rc, true, RawChannel::Delegate::ERROR_READ_SHUTDOWN); |
| + io_thread()->PostTaskAndWait( |
| + FROM_HERE, base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| + |
| + // Close the handle of the other end, which should stuff fail. |
| + handles[1].reset(); |
| + |
| + // Wait for the delegate, which will shut the |RawChannel| down. |
| + delegate.Wait(); |
| +} |
| + |
| TEST_F(RawChannelTest, ShutdownOnErrorWrite) { |
| scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
| - ShutdownOnErrorRawChannelDelegate delegate(rc.get(), |
| + ShutdownOnErrorRawChannelDelegate delegate(rc.get(), false, |
| RawChannel::Delegate::ERROR_WRITE); |
| io_thread()->PostTaskAndWait( |
| FROM_HERE, |
| @@ -684,6 +722,22 @@ TEST_F(RawChannelTest, ShutdownOnErrorWrite) { |
| delegate.Wait(); |
| } |
| +TEST_F(RawChannelTest, ShutdownAndDestroyOnErrorWrite) { |
| + RawChannel* rc = RawChannel::Create(handles[0].Pass()).release(); |
| + ShutdownOnErrorRawChannelDelegate delegate(rc, true, |
| + RawChannel::Delegate::ERROR_WRITE); |
| + io_thread()->PostTaskAndWait( |
| + FROM_HERE, base::Bind(&InitOnIOThread, rc, base::Unretained(&delegate))); |
| + |
| + // Close the handle of the other end, which should stuff fail. |
| + handles[1].reset(); |
| + |
| + EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
| + |
| + // Wait for the delegate, which will shut the |RawChannel| down. |
| + delegate.Wait(); |
| +} |
| + |
| // RawChannelTest.ReadWritePlatformHandles ------------------------------------- |
| class ReadPlatformHandlesCheckerRawChannelDelegate |