Index: mojo/system/raw_channel_unittest.cc |
diff --git a/mojo/system/raw_channel_unittest.cc b/mojo/system/raw_channel_unittest.cc |
index 70aba1c6305a5cdd449544bfa54628257b4d9109..6c2b72212d43992b7c4b9994be6544f22f5a3146 100644 |
--- a/mojo/system/raw_channel_unittest.cc |
+++ b/mojo/system/raw_channel_unittest.cc |
@@ -253,7 +253,7 @@ class ReadCheckerRawChannelDelegate : public RawChannel::Delegate { |
CHECK_EQ(fatal_error, FATAL_ERROR_FAILED_READ); |
} |
- // Wait for all the messages (of sizes |expected_sizes_|) to be seen. |
+ // Waits for all the messages (of sizes |expected_sizes_|) to be seen. |
void Wait() { |
done_event_.Wait(); |
} |
@@ -362,7 +362,7 @@ class ReadCountdownRawChannelDelegate : public RawChannel::Delegate { |
CHECK_EQ(fatal_error, FATAL_ERROR_FAILED_READ); |
} |
- // Wait for all the messages to have been seen. |
+ // Waits for all the messages to have been seen. |
void Wait() { |
done_event_.Wait(); |
} |
@@ -497,12 +497,11 @@ TEST_F(RawChannelTest, OnFatalError) { |
TEST_F(RawChannelTest, ReadUnaffectedByWriteFatalError) { |
const size_t kMessageCount = 5; |
- // Write into the other end a few messages. |
+ // Write a few messages into the other end. |
uint32_t message_size = 1; |
- for (size_t count = 0; count < kMessageCount; |
- ++count, message_size += message_size / 2 + 1) { |
+ for (size_t i = 0; i < kMessageCount; |
+ i++, message_size += message_size / 2 + 1) |
EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), message_size)); |
- } |
// Close the other end, which should make writing fail. |
handles[1].reset(); |
@@ -548,6 +547,150 @@ TEST_F(RawChannelTest, WriteMessageAfterShutdown) { |
EXPECT_FALSE(rc->WriteMessage(MakeTestMessage(1))); |
} |
+// RawChannelTest.ShutdownOnReadMessage ---------------------------------------- |
+ |
+class ShutdownOnReadMessageRawChannelDelegate : public RawChannel::Delegate { |
+ public: |
+ explicit ShutdownOnReadMessageRawChannelDelegate(RawChannel* raw_channel) |
+ : raw_channel_(raw_channel), |
+ done_event_(false, false), |
+ did_shutdown_(false) {} |
+ virtual ~ShutdownOnReadMessageRawChannelDelegate() {} |
+ |
+ // |RawChannel::Delegate| implementation (called on the I/O thread): |
+ virtual void OnReadMessage( |
+ const MessageInTransit::View& message_view) OVERRIDE { |
+ EXPECT_FALSE(did_shutdown_); |
+ EXPECT_TRUE(CheckMessageData(message_view.bytes(), |
+ message_view.num_bytes())); |
+ raw_channel_->Shutdown(); |
+ did_shutdown_ = true; |
+ done_event_.Signal(); |
+ } |
+ virtual void OnFatalError(FatalError /*fatal_error*/) OVERRIDE { |
+ CHECK(false); // Should not get called. |
+ } |
+ |
+ // Waits for shutdown. |
+ void Wait() { |
+ done_event_.Wait(); |
+ EXPECT_TRUE(did_shutdown_); |
+ } |
+ |
+ private: |
+ RawChannel* const raw_channel_; |
+ base::WaitableEvent done_event_; |
+ bool did_shutdown_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ShutdownOnReadMessageRawChannelDelegate); |
+}; |
+ |
+// TODO(vtl): crbug.com/366768 |
+#if defined(OS_WIN) |
+#define MAYBE_ShutdownOnReadMessage DISABLED_ShutdownOnReadMessage |
+#else |
+#define MAYBE_ShutdownOnReadMessage ShutdownOnReadMessage |
+#endif |
+TEST_F(RawChannelTest, MAYBE_ShutdownOnReadMessage) { |
+ // Write a few messages into the other end. |
+ for (size_t count = 0; count < 5; count++) |
+ EXPECT_TRUE(WriteTestMessageToHandle(handles[1].get(), 10)); |
+ |
+ scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
+ ShutdownOnReadMessageRawChannelDelegate delegate(rc.get()); |
+ io_thread()->PostTaskAndWait(FROM_HERE, |
+ base::Bind(&InitOnIOThread, rc.get(), |
+ base::Unretained(&delegate))); |
+ |
+ // Wait for the delegate, which will shut the |RawChannel| down. |
+ delegate.Wait(); |
+} |
+ |
+// RawChannelTest.ShutdownOnFatalError{Read, Write} ---------------------------- |
+ |
+class ShutdownOnFatalErrorRawChannelDelegate : public RawChannel::Delegate { |
+ public: |
+ ShutdownOnFatalErrorRawChannelDelegate(RawChannel* raw_channel, |
+ FatalError shutdown_on_error_type) |
+ : raw_channel_(raw_channel), |
+ shutdown_on_error_type_(shutdown_on_error_type), |
+ done_event_(false, false), |
+ did_shutdown_(false) {} |
+ virtual ~ShutdownOnFatalErrorRawChannelDelegate() {} |
+ |
+ // |RawChannel::Delegate| implementation (called on the I/O thread): |
+ virtual void OnReadMessage( |
+ const MessageInTransit::View& /*message_view*/) OVERRIDE { |
+ CHECK(false); // Should not get called. |
+ } |
+ virtual void OnFatalError(FatalError fatal_error) OVERRIDE { |
+ EXPECT_FALSE(did_shutdown_); |
+ if (fatal_error != shutdown_on_error_type_) |
+ return; |
+ raw_channel_->Shutdown(); |
+ did_shutdown_ = true; |
+ done_event_.Signal(); |
+ } |
+ |
+ // Waits for shutdown. |
+ void Wait() { |
+ done_event_.Wait(); |
+ EXPECT_TRUE(did_shutdown_); |
+ } |
+ |
+ private: |
+ RawChannel* const raw_channel_; |
+ const FatalError shutdown_on_error_type_; |
+ base::WaitableEvent done_event_; |
+ bool did_shutdown_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ShutdownOnFatalErrorRawChannelDelegate); |
+}; |
+ |
+// TODO(vtl): crbug.com/366768 |
+#if defined(OS_WIN) |
+#define MAYBE_ShutdownOnFatalErrorRead DISABLED_ShutdownOnFatalErrorRead |
+#else |
+#define MAYBE_ShutdownOnFatalErrorRead ShutdownOnFatalErrorRead |
+#endif |
+TEST_F(RawChannelTest, MAYBE_ShutdownOnFatalErrorRead) { |
+ scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
+ ShutdownOnFatalErrorRawChannelDelegate delegate( |
+ rc.get(), RawChannel::Delegate::FATAL_ERROR_FAILED_READ); |
+ io_thread()->PostTaskAndWait(FROM_HERE, |
+ base::Bind(&InitOnIOThread, rc.get(), |
+ 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(); |
+} |
+ |
+// TODO(vtl): crbug.com/366768 |
+#if defined(OS_WIN) |
+#define MAYBE_ShutdownOnFatalErrorWrite DISABLED_ShutdownOnFatalErrorWrite |
+#else |
+#define MAYBE_ShutdownOnFatalErrorWrite ShutdownOnFatalErrorWrite |
+#endif |
+TEST_F(RawChannelTest, MAYBE_ShutdownOnFatalErrorWrite) { |
+ scoped_ptr<RawChannel> rc(RawChannel::Create(handles[0].Pass())); |
+ ShutdownOnFatalErrorRawChannelDelegate delegate( |
+ rc.get(), RawChannel::Delegate::FATAL_ERROR_FAILED_WRITE); |
+ io_thread()->PostTaskAndWait(FROM_HERE, |
+ base::Bind(&InitOnIOThread, rc.get(), |
+ 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(); |
+} |
+ |
} // namespace |
} // namespace system |
} // namespace mojo |