Index: mojo/system/message_pipe_dispatcher_unittest.cc |
diff --git a/mojo/system/message_pipe_dispatcher_unittest.cc b/mojo/system/message_pipe_dispatcher_unittest.cc |
index 675adcb3c6d70933f40af6246d0f81a95785475c..76408e210a9fff70eb52986e6f24915675b1e3e6 100644 |
--- a/mojo/system/message_pipe_dispatcher_unittest.cc |
+++ b/mojo/system/message_pipe_dispatcher_unittest.cc |
@@ -63,9 +63,8 @@ TEST(MessagePipeDispatcherTest, Basic) { |
d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); |
buffer[0] = 123456789; |
EXPECT_EQ(MOJO_RESULT_OK, |
- d1->WriteMessage(buffer, kBufferSize, |
- NULL, |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
+ NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
stopwatch.Start(); |
EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
EXPECT_EQ(1u, context); |
@@ -128,16 +127,53 @@ TEST(MessagePipeDispatcherTest, InvalidParams) { |
} |
// |WriteMessage|: |
- // Null buffer with nonzero buffer size. |
- EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
- d0->WriteMessage(NULL, 1, |
- NULL, |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
// Huge buffer size. |
EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
- d0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), |
- NULL, |
+ d0->WriteMessage(UserPointer<const void>(buffer), |
+ std::numeric_limits<uint32_t>::max(), NULL, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
+} |
+ |
+// These test invalid arguments that should cause death if we're being paranoid |
+// about checking arguments (which we would want to do if, e.g., we were in a |
+// true "kernel" situation, but we might not want to do otherwise for |
+// performance reasons). Probably blatant errors like passing in null pointers |
+// (for required pointer arguments) will still cause death, but perhaps not |
+// predictably. |
+TEST(MessagePipeDispatcherTest, InvalidParamsDeath) { |
+ const char kMemoryCheckFailedRegex[] = "Check failed"; |
+ |
+ scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( |
+ MessagePipeDispatcher::kDefaultCreateOptions)); |
+ scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( |
+ MessagePipeDispatcher::kDefaultCreateOptions)); |
+ { |
+ scoped_refptr<MessagePipe> mp(new MessagePipe()); |
+ d0->Init(mp, 0); |
+ d1->Init(mp, 1); |
+ } |
+ |
+ // |WriteMessage|: |
+ // Null buffer with nonzero buffer size. |
+ EXPECT_DEATH_IF_SUPPORTED( |
+ d0->WriteMessage(NullUserPointer(), 1, NULL, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE), |
+ kMemoryCheckFailedRegex); |
+ |
+ // |ReadMessage|: |
+ // Null buffer with nonzero buffer size. |
+ // First write something so that we actually have something to read. |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ d1->WriteMessage(UserPointer<const void>("x"), 1, NULL, |
MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ uint32_t buffer_size = 1; |
+ EXPECT_DEATH_IF_SUPPORTED( |
+ d0->ReadMessage(NullUserPointer(), MakeUserPointer(&buffer_size), 0, NULL, |
+ MOJO_READ_MESSAGE_FLAG_NONE), |
+ kMemoryCheckFailedRegex); |
EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
@@ -165,14 +201,12 @@ TEST(MessagePipeDispatcherTest, BasicClosed) { |
// Write (twice) to |d1|. |
buffer[0] = 123456789; |
EXPECT_EQ(MOJO_RESULT_OK, |
- d1->WriteMessage(buffer, kBufferSize, |
- NULL, |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
+ NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
buffer[0] = 234567890; |
EXPECT_EQ(MOJO_RESULT_OK, |
- d1->WriteMessage(buffer, kBufferSize, |
- NULL, |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
+ NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
// Try waiting for readable on |d0|; should fail (already satisfied). |
w.Init(); |
@@ -242,9 +276,8 @@ TEST(MessagePipeDispatcherTest, BasicClosed) { |
// Try writing to |d0|; should fail (other end closed). |
buffer[0] = 345678901; |
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
- d0->WriteMessage(buffer, kBufferSize, |
- NULL, |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ d0->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
+ NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
} |
@@ -291,9 +324,8 @@ TEST(MessagePipeDispatcherTest, MAYBE_BasicThreaded) { |
// Wake it up by writing to |d0|. |
buffer[0] = 123456789; |
EXPECT_EQ(MOJO_RESULT_OK, |
- d0->WriteMessage(buffer, kBufferSize, |
- NULL, |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ d0->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
+ NULL, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
} // Joins the thread. |
elapsed = stopwatch.Elapsed(); |
EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout()); |
@@ -421,16 +453,16 @@ class WriterThread : public base::SimpleThread { |
uint32_t bytes_to_write = static_cast<uint32_t>( |
base::RandInt(1, static_cast<int>(kMaxMessageSize))); |
EXPECT_EQ(MOJO_RESULT_OK, |
- write_dispatcher_->WriteMessage(buffer, bytes_to_write, |
- NULL, |
+ write_dispatcher_->WriteMessage(UserPointer<const void>(buffer), |
+ bytes_to_write, NULL, |
MOJO_WRITE_MESSAGE_FLAG_NONE)); |
*bytes_written_ += bytes_to_write; |
} |
// Write one last "quit" message. |
EXPECT_EQ(MOJO_RESULT_OK, |
- write_dispatcher_->WriteMessage("quit", 4, |
- NULL, |
+ write_dispatcher_->WriteMessage(UserPointer<const void>("quit"), |
+ 4, NULL, |
MOJO_WRITE_MESSAGE_FLAG_NONE)); |
} |