| 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
|
| index 030084b6ee5a3e7d08de1894e641b8ec2246b5b5..c700891ac9ecc991da003e51debd72ea400aca7a 100644
|
| --- a/mojo/edk/system/message_pipe_unittest.cc
|
| +++ b/mojo/edk/system/message_pipe_unittest.cc
|
| @@ -15,6 +15,10 @@ namespace mojo {
|
| namespace system {
|
| namespace {
|
|
|
| +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
|
| @@ -335,8 +339,7 @@ TEST(MessagePipeTest, BasicWaiting) {
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| @@ -344,8 +347,7 @@ TEST(MessagePipeTest, BasicWaiting) {
|
| MOJO_HANDLE_SIGNAL_WRITABLE,
|
| 0, &hss));
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
|
|
| // Not yet readable.
|
| waiter.Init();
|
| @@ -355,8 +357,18 @@ TEST(MessagePipeTest, BasicWaiting) {
|
| hss = HandleSignalsState();
|
| mp->RemoveWaiter(0, &waiter, &hss);
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
| +
|
| + // The peer is not closed.
|
| + waiter.Init();
|
| + ASSERT_EQ(
|
| + MOJO_RESULT_OK,
|
| + mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 2, nullptr));
|
| + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
|
| + hss = HandleSignalsState();
|
| + mp->RemoveWaiter(0, &waiter, &hss);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
|
|
| // Write from port 0 (to port 1), to make port 1 readable.
|
| buffer[0] = 123456789;
|
| @@ -368,11 +380,10 @@ TEST(MessagePipeTest, BasicWaiting) {
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| - mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss));
|
| + mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| @@ -381,36 +392,48 @@ TEST(MessagePipeTest, BasicWaiting) {
|
| 0, &hss));
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
| // ... and still writable.
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| - mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss));
|
| + mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
|
|
| // Close port 0.
|
| mp->Close(0);
|
|
|
| - // Now port 1 should not be writable.
|
| + // Port 1 should be signaled with peer closed.
|
| + waiter.Init();
|
| + hss = HandleSignalsState();
|
| + EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| + mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 5, &hss));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + hss.satisfiable_signals);
|
| +
|
| + // Port 1 should not be writable.
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
| + mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + hss.satisfiable_signals);
|
|
|
| // But it should still be readable.
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
|
| - mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
| + mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, &hss));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + hss.satisfiable_signals);
|
|
|
| // Read from port 1.
|
| buffer[0] = 0;
|
| @@ -425,7 +448,7 @@ TEST(MessagePipeTest, BasicWaiting) {
|
| waiter.Init();
|
| hss = HandleSignalsState();
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 6, nullptr));
|
| + mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, nullptr));
|
| EXPECT_EQ(0u, hss.satisfied_signals);
|
| EXPECT_EQ(0u, hss.satisfiable_signals);
|
|
|
| @@ -460,8 +483,7 @@ TEST(MessagePipeTest, ThreadedWaiting) {
|
| mp->RemoveWaiter(1, thread.waiter(), &hss);
|
| EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| hss.satisfied_signals);
|
| - EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| - hss.satisfiable_signals);
|
| + EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
|
|
|
| mp->Close(0);
|
| mp->Close(1);
|
| @@ -493,6 +515,29 @@ TEST(MessagePipeTest, ThreadedWaiting) {
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| EXPECT_EQ(2u, context);
|
|
|
| + // Close to cancel waiter using peer closed signal.
|
| + {
|
| + scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal());
|
| + test::SimpleWaiterThread thread(&result, &context);
|
| +
|
| + thread.waiter()->Init();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + mp->AddWaiter(1, thread.waiter(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
|
| + 3, nullptr));
|
| + thread.Start();
|
| +
|
| + // Close port 1 first -- this should result in the waiter being cancelled.
|
| + mp->CancelAllWaiters(1);
|
| + mp->Close(1);
|
| +
|
| + // Port 1 is closed, so |Dispatcher::RemoveWaiter()| wouldn't call into the
|
| + // |MessagePipe| to remove any waiter.
|
| +
|
| + mp->Close(0);
|
| + } // Joins |thread|.
|
| + EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| + EXPECT_EQ(3u, context);
|
| +
|
| // Close to make waiter un-wake-up-able.
|
| {
|
| scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal());
|
| @@ -500,7 +545,7 @@ TEST(MessagePipeTest, ThreadedWaiting) {
|
|
|
| thread.waiter()->Init();
|
| ASSERT_EQ(MOJO_RESULT_OK,
|
| - mp->AddWaiter(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3,
|
| + mp->AddWaiter(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 4,
|
| nullptr));
|
| thread.Start();
|
|
|
| @@ -511,14 +556,14 @@ TEST(MessagePipeTest, ThreadedWaiting) {
|
|
|
| HandleSignalsState hss;
|
| mp->RemoveWaiter(1, thread.waiter(), &hss);
|
| - EXPECT_EQ(0u, hss.satisfied_signals);
|
| - EXPECT_EQ(0u, hss.satisfiable_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
|
|
|
| mp->CancelAllWaiters(1);
|
| mp->Close(1);
|
| } // Joins |thread|.
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
|
| - EXPECT_EQ(3u, context);
|
| + EXPECT_EQ(4u, context);
|
| }
|
|
|
| } // namespace
|
|
|