Index: mojo/system/core_impl_unittest.cc |
diff --git a/mojo/system/core_impl_unittest.cc b/mojo/system/core_impl_unittest.cc |
index 1ace04d52549d803043f75c978c2a3d9ad0221f1..bfa2bfa4820e448177ac910f8cf485109ec6d4f2 100644 |
--- a/mojo/system/core_impl_unittest.cc |
+++ b/mojo/system/core_impl_unittest.cc |
@@ -4,6 +4,8 @@ |
#include "mojo/system/core_impl.h" |
+#include <limits> |
+ |
#include "mojo/system/core_test_base.h" |
namespace mojo { |
@@ -42,6 +44,10 @@ TEST_F(CoreImplTest, Basic) { |
core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL, |
MOJO_READ_MESSAGE_FLAG_NONE)); |
EXPECT_EQ(2u, info.GetReadMessageCallCount()); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->ReadMessage(h, NULL, NULL, NULL, NULL, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(3u, info.GetReadMessageCallCount()); |
EXPECT_EQ(0u, info.GetAddWaiterCallCount()); |
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
@@ -133,6 +139,140 @@ TEST_F(CoreImplTest, InvalidArguments) { |
EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); |
EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); |
} |
+ |
+ // |CreateMessagePipe()|: |
+ { |
+ MojoHandle h; |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->CreateMessagePipe(NULL, NULL)); |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->CreateMessagePipe(&h, NULL)); |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->CreateMessagePipe(NULL, &h)); |
+ } |
+ |
+ // |WriteMessage()|: |
+ // Only check arguments checked by |CoreImpl|, namely |handle|, |handles|, and |
+ // |num_handles|. |
+ { |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->WriteMessage(MOJO_HANDLE_INVALID, NULL, 0, NULL, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ MockHandleInfo info; |
+ MojoHandle h = CreateMockHandle(&info); |
+ MojoHandle handles[2] = { MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID }; |
+ |
+ // Null |handles| with nonzero |num_handles|. |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->WriteMessage(h, NULL, 0, NULL, 1, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ // Checked by |CoreImpl|, shouldn't go through to the dispatcher. |
+ EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
+ |
+ // Huge handle count (implausibly big on some systems -- more than can be |
+ // stored in a 32-bit address space). |
+ // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or |
+ // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or |
+ // not. |
+ EXPECT_NE(MOJO_RESULT_OK, |
+ core()->WriteMessage(h, NULL, 0, handles, |
+ std::numeric_limits<uint32_t>::max(), |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
+ |
+ // Huge handle count (plausibly big). |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ core()->WriteMessage(h, NULL, 0, handles, |
+ std::numeric_limits<uint32_t>::max() / |
+ sizeof(handles[0]), |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
+ |
+ // Invalid handle in |handles|. |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->WriteMessage(h, NULL, 0, handles, 1, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
+ |
+ // Two invalid handles in |handles|. |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->WriteMessage(h, NULL, 0, handles, 2, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
+ |
+ // Can't send a handle over itself. |
+ handles[0] = h; |
+ EXPECT_EQ(MOJO_RESULT_BUSY, |
+ core()->WriteMessage(h, NULL, 0, handles, 1, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
+ |
+ MockHandleInfo info_2; |
+ MojoHandle h_2 = CreateMockHandle(&info_2); |
+ |
+ // This is "okay", but |MockDispatcher| doesn't implement it. |
+ handles[0] = h_2; |
+ EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
+ core()->WriteMessage(h, NULL, 0, handles, 1, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
+ |
+ // One of the |handles| is still invalid. |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->WriteMessage(h, NULL, 0, handles, 2, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
+ |
+ // One of the |handles| is the same as |handle|. |
+ handles[1] = h; |
+ EXPECT_EQ(MOJO_RESULT_BUSY, |
+ core()->WriteMessage(h, NULL, 0, handles, 2, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
+ |
+ // Can't send a handle twice in the same message. |
+ handles[1] = h_2; |
+ EXPECT_EQ(MOJO_RESULT_BUSY, |
+ core()->WriteMessage(h, NULL, 0, handles, 2, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
+ |
+ // Note: Since we never successfully sent anything with it, |h_2| should |
+ // still be valid. |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_2)); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
+ } |
+ |
+ // |ReadMessage()|: |
+ // Only check arguments checked by |CoreImpl|, namely |handle|, |handles|, and |
+ // |num_handles|. |
+ { |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->ReadMessage(MOJO_HANDLE_INVALID, NULL, NULL, NULL, NULL, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ |
+ MockHandleInfo info; |
+ MojoHandle h = CreateMockHandle(&info); |
+ |
+ uint32_t handle_count = 1; |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ // Checked by |CoreImpl|, shouldn't go through to the dispatcher. |
+ EXPECT_EQ(0u, info.GetReadMessageCallCount()); |
+ |
+ // Okay. |
+ handle_count = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ // Checked by |CoreImpl|, shouldn't go through to the dispatcher. |
+ EXPECT_EQ(1u, info.GetReadMessageCallCount()); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
+ } |
} |
// TODO(vtl): test |Wait()| and |WaitMany()| properly |