Index: mojo/system/core_impl_unittest.cc |
diff --git a/mojo/system/core_impl_unittest.cc b/mojo/system/core_impl_unittest.cc |
index bfa2bfa4820e448177ac910f8cf485109ec6d4f2..6b4241675d8456edf3878b1e806f935916db0a16 100644 |
--- a/mojo/system/core_impl_unittest.cc |
+++ b/mojo/system/core_impl_unittest.cc |
@@ -6,6 +6,7 @@ |
#include <limits> |
+#include "base/basictypes.h" |
#include "mojo/system/core_test_base.h" |
namespace mojo { |
@@ -380,6 +381,120 @@ TEST_F(CoreImplTest, MessagePipe) { |
EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); |
} |
+TEST_F(CoreImplTest, MessagePipeBasicLocalHandlePassing) { |
+ const char kHello[] = "hello"; |
+ const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
+ const char kWorld[] = "world!!!"; |
+ const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
+ char buffer[100]; |
+ const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
+ uint32_t num_bytes; |
+ MojoHandle handles[10]; |
+ uint32_t num_handles; |
+ MojoHandle h_received; |
+ |
+ MojoHandle h_passing[2]; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->CreateMessagePipe(&h_passing[0], &h_passing[1])); |
+ |
+ MojoHandle h_passed[2]; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->CreateMessagePipe(&h_passed[0], &h_passed[1])); |
+ |
+ // Make sure that |h_passing[]| work properly. |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->WriteMessage(h_passing[0], |
+ kHello, kHelloSize, |
+ NULL, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->Wait(h_passing[1], MOJO_WAIT_FLAG_READABLE, 1000000000)); |
+ num_bytes = kBufferSize; |
+ num_handles = arraysize(handles); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->ReadMessage(h_passing[1], |
+ buffer, &num_bytes, |
+ handles, &num_handles, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(kHelloSize, num_bytes); |
+ EXPECT_STREQ(kHello, buffer); |
+ EXPECT_EQ(0u, num_handles); |
+ |
+ // Make sure that |h_passed[]| work properly. |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->WriteMessage(h_passed[0], |
+ kHello, kHelloSize, |
+ NULL, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->Wait(h_passed[1], MOJO_WAIT_FLAG_READABLE, 1000000000)); |
+ num_bytes = kBufferSize; |
+ num_handles = arraysize(handles); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->ReadMessage(h_passed[1], |
+ buffer, &num_bytes, |
+ handles, &num_handles, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(kHelloSize, num_bytes); |
+ EXPECT_STREQ(kHello, buffer); |
+ EXPECT_EQ(0u, num_handles); |
+ |
+ // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->WriteMessage(h_passing[0], |
+ kWorld, kWorldSize, |
+ &h_passed[1], 1, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->Wait(h_passing[1], MOJO_WAIT_FLAG_READABLE, 1000000000)); |
+ num_bytes = kBufferSize; |
+ num_handles = arraysize(handles); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->ReadMessage(h_passing[1], |
+ buffer, &num_bytes, |
+ handles, &num_handles, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(kWorldSize, num_bytes); |
+ EXPECT_STREQ(kWorld, buffer); |
+ EXPECT_EQ(1u, num_handles); |
+ h_received = handles[0]; |
+ EXPECT_NE(h_received, MOJO_HANDLE_INVALID); |
+ EXPECT_NE(h_received, h_passing[0]); |
+ EXPECT_NE(h_received, h_passing[1]); |
+ EXPECT_NE(h_received, h_passed[0]); |
+ |
+ // Note: We rely on the Mojo system not re-using handle values very often. |
+ EXPECT_NE(h_received, h_passed[1]); |
+ |
+ // |h_passed[1]| should no longer be valid; check that trying to close it |
+ // fails. See above note. |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); |
+ |
+ // Write to |h_passed[0]|. Should receive on |h_received|. |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->WriteMessage(h_passed[0], |
+ kHello, kHelloSize, |
+ NULL, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->Wait(h_received, MOJO_WAIT_FLAG_READABLE, 1000000000)); |
+ num_bytes = kBufferSize; |
+ num_handles = arraysize(handles); |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->ReadMessage(h_received, |
+ buffer, &num_bytes, |
+ handles, &num_handles, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(kHelloSize, num_bytes); |
+ EXPECT_STREQ(kHello, buffer); |
+ EXPECT_EQ(0u, num_handles); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); |
+} |
+ |
} // namespace |
} // namespace system |
} // namespace mojo |