Index: mojo/edk/system/message_pipe_unittest.cc |
diff --git a/mojo/edk/system/message_pipe_unittest.cc b/mojo/edk/system/message_pipe_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0eb3b091e4d408fd431351186f40c66e0bbf6f6d |
--- /dev/null |
+++ b/mojo/edk/system/message_pipe_unittest.cc |
@@ -0,0 +1,465 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/ref_counted.h" |
+#include "base/test/test_io_thread.h" |
+#include "mojo/edk/system/waiter.h" |
+#include "mojo/edk/system/waiter_test_utils.h" |
+#include "mojo/edk/test/scoped_ipc_support.h" |
+#include "mojo/public/c/system/core.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace mojo { |
+namespace system { |
+namespace { |
+ |
+class MessagePipeTest : public testing::Test { |
+ public: |
+ MessagePipeTest() |
+ : test_io_thread_(base::TestIOThread::kAutoStart), |
+ ipc_support_(test_io_thread_.task_runner()) {} |
+ ~MessagePipeTest() override {} |
+ |
+ private: |
+ base::MessageLoop message_loop_; |
+ base::TestIOThread test_io_thread_; |
+ mojo::test::ScopedIPCSupport ipc_support_; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeTest); |
+}; |
+ |
+static const char kHelloWorld[] = "hello world"; |
+TEST_F(MessagePipeTest, WriteData) { |
+ MojoHandle pipe1, pipe2; |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe1, &pipe2)); |
+ ASSERT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, kHelloWorld, sizeof(kHelloWorld), nullptr, |
+ 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ MojoClose(pipe1); |
+ MojoClose(pipe2); |
+} |
+ |
+ |
+const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | |
+ MOJO_HANDLE_SIGNAL_WRITABLE | |
+ MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
+ |
+// Tests: |
+// - only default flags |
+// - reading messages from a port |
+// - when there are no/one/two messages available for that port |
+// - with buffer size 0 (and null buffer) -- should get size |
+// - with too-small buffer -- should get size |
+// - also verify that buffers aren't modified when/where they shouldn't be |
+// - writing messages to a port |
+// - in the obvious scenarios (as above) |
+// - to a port that's been closed |
+// - writing a message to a port, closing the other (would be the source) port, |
+// and reading it |
+TEST_F(MessagePipeTest, Basic) { |
+ MojoHandle pipe0, pipe1; |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
+ |
+ int32_t buffer[2]; |
+ const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
+ uint32_t buffer_size; |
+ |
+ // Nothing to read yet on port 0. |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(kBufferSize, buffer_size); |
+ EXPECT_EQ(123, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ // Ditto for port 1. |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ |
+ // Write from port 1 (to port 0). |
+ buffer[0] = 789012345; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ MojoHandleSignalsState state; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Read from port 0. |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ EXPECT_EQ(789012345, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ // Read again from port 0 -- it should be empty. |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ |
+ // Write two messages from port 0 (to port 1). |
+ buffer[0] = 123456789; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe0, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ buffer[0] = 234567890; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe0, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Read from port 1 with buffer size 0 (should get the size of next message). |
+ // Also test that giving a null buffer is okay when the buffer size is 0. |
+ buffer_size = 0; |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ MojoReadMessage(pipe1, nullptr, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ |
+ // Read from port 1 with buffer size 1 (too small; should get the size of next |
+ // message). |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = 1; |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ EXPECT_EQ(123, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ // Read from port 1. |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ EXPECT_EQ(123456789, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Read again from port 1. |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ EXPECT_EQ(234567890, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ // Read again from port 1 -- it should be empty. |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ |
+ // Write from port 0 (to port 1). |
+ buffer[0] = 345678901; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe0, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ // Close port 0. |
+ MojoClose(pipe0); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Try to write from port 1 (to port 0). |
+ buffer[0] = 456789012; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
+ MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ // Read from port 1; should still get message (even though port 0 was closed). |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ EXPECT_EQ(345678901, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ // Read again from port 1 -- it should be empty (and port 0 is closed). |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ |
+ MojoClose(pipe1); |
+} |
+ |
+TEST_F(MessagePipeTest, CloseWithQueuedIncomingMessages) { |
+ MojoHandle pipe0, pipe1; |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
+ |
+ int32_t buffer[1]; |
+ const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
+ uint32_t buffer_size; |
+ |
+ // Write some messages from port 1 (to port 0). |
+ for (int32_t i = 0; i < 5; i++) { |
+ buffer[0] = i; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, buffer, kBufferSize, nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ } |
+ |
+ MojoHandleSignalsState state; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Port 0 shouldn't be empty. |
+ buffer_size = 0; |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ MojoReadMessage(pipe0, nullptr, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ EXPECT_EQ(kBufferSize, buffer_size); |
+ |
+ // Close port 0 first, which should have outstanding (incoming) messages. |
+ MojoClose(pipe0); |
+ MojoClose(pipe1); |
+} |
+ |
+TEST_F(MessagePipeTest, DiscardMode) { |
+ MojoHandle pipe0, pipe1; |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
+ |
+ int32_t buffer[2]; |
+ const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
+ uint32_t buffer_size; |
+ |
+ // Write from port 1 (to port 0). |
+ buffer[0] = 789012345; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ MojoHandleSignalsState state; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Read/discard from port 0 (no buffer); get size. |
+ buffer_size = 0; |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ MojoReadMessage(pipe0, nullptr, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ |
+ // Read again from port 0 -- it should be empty. |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ |
+ // Write from port 1 (to port 0). |
+ buffer[0] = 890123456; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Read from port 0 (buffer big enough). |
+ buffer[0] = 123; |
+ buffer[1] = 456; |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, 0, nullptr, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ EXPECT_EQ(890123456, buffer[0]); |
+ EXPECT_EQ(456, buffer[1]); |
+ |
+ // Read again from port 0 -- it should be empty. |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ |
+ // Write from port 1 (to port 0). |
+ buffer[0] = 901234567; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Read/discard from port 0 (buffer too small); get size. |
+ buffer_size = 1; |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
+ |
+ // Read again from port 0 -- it should be empty. |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ |
+ // Write from port 1 (to port 0). |
+ buffer[0] = 123456789; |
+ buffer[1] = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &state)); |
+ |
+ // Discard from port 0. |
+ buffer_size = 1; |
+ EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
+ MojoReadMessage(pipe0, nullptr, 0, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ |
+ // Read again from port 0 -- it should be empty. |
+ buffer_size = kBufferSize; |
+ EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
+ MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
+ |
+ MojoClose(pipe0); |
+ MojoClose(pipe1); |
+} |
+ |
+TEST_F(MessagePipeTest, BasicWaiting) { |
+ MojoHandle pipe0, pipe1; |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
+ |
+ HandleSignalsState hss; |
+ |
+ int32_t buffer[1]; |
+ const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
+ uint32_t buffer_size; |
+ |
+ // Always writable (until the other port is closed). |
+ hss = HandleSignalsState(); |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, |
+ &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
+ ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
+ hss = HandleSignalsState(); |
+ |
+ // Not yet readable. |
+ ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
+ MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
+ ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
+ |
+ // The peer is not closed. |
+ hss = HandleSignalsState(); |
+ ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
+ MojoWait(pipe0, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
+ ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
+ |
+ // Write from port 0 (to port 1), to make port 1 readable. |
+ buffer[0] = 123456789; |
+ ASSERT_EQ(MOJO_RESULT_OK, |
+ MojoWriteMessage(pipe0, buffer, kBufferSize, nullptr, 0, |
+ MOJO_WRITE_MESSAGE_FLAG_NONE)); |
+ |
+ // Port 1 should already be readable now. |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
+ hss.satisfied_signals); |
+ ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
+ // ... and still writable. |
+ hss = HandleSignalsState(); |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_WRITABLE, |
+ MOJO_DEADLINE_INDEFINITE, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
+ hss.satisfied_signals); |
+ ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
+ |
+ // Close port 0. |
+ MojoClose(pipe0); |
+ |
+ // Port 1 should be signaled with peer closed. |
+ hss = HandleSignalsState(); |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ MOJO_DEADLINE_INDEFINITE, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ hss.satisfied_signals); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ hss.satisfiable_signals); |
+ |
+ // Port 1 should not be writable. |
+ hss = HandleSignalsState(); |
+ |
+ ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
+ MojoWait(pipe1, MOJO_HANDLE_SIGNAL_WRITABLE, |
+ MOJO_DEADLINE_INDEFINITE, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ hss.satisfied_signals); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ hss.satisfiable_signals); |
+ |
+ // But it should still be readable. |
+ hss = HandleSignalsState(); |
+ ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ hss.satisfied_signals); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
+ hss.satisfiable_signals); |
+ |
+ // Read from port 1. |
+ buffer[0] = 0; |
+ buffer_size = kBufferSize; |
+ ASSERT_EQ(MOJO_RESULT_OK, |
+ MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
+ MOJO_READ_MESSAGE_FLAG_NONE)); |
+ ASSERT_EQ(123456789, buffer[0]); |
+ |
+ // Now port 1 should no longer be readable. |
+ hss = HandleSignalsState(); |
+ ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
+ MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
+ MOJO_DEADLINE_INDEFINITE, &hss)); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
+ ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
+ |
+ MojoClose(pipe1); |
+} |
+ |
+} // namespace |
+} // namespace system |
+} // namespace mojo |