| Index: mojo/system/core_unittest.cc
|
| diff --git a/mojo/system/core_unittest.cc b/mojo/system/core_unittest.cc
|
| index 2b7b520ec45c2a719717cef9539eb9a1370d04f4..8d1441c6e4cb17d984f34dc5d52349ff3e4cfc54 100644
|
| --- a/mojo/system/core_unittest.cc
|
| +++ b/mojo/system/core_unittest.cc
|
| @@ -16,6 +16,9 @@ namespace mojo {
|
| namespace system {
|
| namespace {
|
|
|
| +const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
|
| +const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
|
| +
|
| typedef test::CoreTestBase CoreTest;
|
|
|
| TEST_F(CoreTest, GetTimeTicksNow) {
|
| @@ -103,23 +106,79 @@ TEST_F(CoreTest, Basic) {
|
| EXPECT_EQ(1u, info.GetEndReadDataCallCount());
|
|
|
| EXPECT_EQ(0u, info.GetAddWaiterCallCount());
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE));
|
| + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->Wait(h,
|
| + ~MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer()));
|
| EXPECT_EQ(1u, info.GetAddWaiterCallCount());
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0));
|
| + core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, NullUserPointer()));
|
| EXPECT_EQ(2u, info.GetAddWaiterCallCount());
|
| + MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000));
|
| + core()->Wait(h,
|
| + ~MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&hss)));
|
| EXPECT_EQ(3u, info.GetAddWaiterCallCount());
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(0u, hss.satisfiable_signals);
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, NullUserPointer()));
|
| + EXPECT_EQ(4u, info.GetAddWaiterCallCount());
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->Wait(
|
| + h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(5u, info.GetAddWaiterCallCount());
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(0u, hss.satisfiable_signals);
|
| +
|
| MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE;
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| core()->WaitMany(MakeUserPointer(&h),
|
| MakeUserPointer(&handle_signals),
|
| 1,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| - EXPECT_EQ(4u, info.GetAddWaiterCallCount());
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| + EXPECT_EQ(6u, info.GetAddWaiterCallCount());
|
| + uint32_t result_index = static_cast<uint32_t>(-1);
|
| + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->WaitMany(MakeUserPointer(&h),
|
| + MakeUserPointer(&handle_signals),
|
| + 1,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + NullUserPointer()));
|
| + EXPECT_EQ(7u, info.GetAddWaiterCallCount());
|
| + EXPECT_EQ(0u, result_index);
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->WaitMany(MakeUserPointer(&h),
|
| + MakeUserPointer(&handle_signals),
|
| + 1,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(8u, info.GetAddWaiterCallCount());
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(0u, hss.satisfiable_signals);
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->WaitMany(MakeUserPointer(&h),
|
| + MakeUserPointer(&handle_signals),
|
| + 1,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(9u, info.GetAddWaiterCallCount());
|
| + EXPECT_EQ(0u, result_index);
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(0u, hss.satisfiable_signals);
|
|
|
| EXPECT_EQ(0u, info.GetDtorCallCount());
|
| EXPECT_EQ(0u, info.GetCloseCallCount());
|
| @@ -154,10 +213,36 @@ TEST_F(CoreTest, InvalidArguments) {
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| core()->Wait(MOJO_HANDLE_INVALID,
|
| ~MOJO_HANDLE_SIGNAL_NONE,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_INVALID_ARGUMENT,
|
| - core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer()));
|
| + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| + core()->Wait(10,
|
| + ~MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer()));
|
| +
|
| + MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| + core()->Wait(MOJO_HANDLE_INVALID,
|
| + ~MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&hss)));
|
| + // On invalid argument, it shouldn't modify the handle signals state.
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
|
| + hss.satisfiable_signals);
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| + core()->Wait(10,
|
| + ~MOJO_HANDLE_SIGNAL_NONE,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&hss)));
|
| + // On invalid argument, it shouldn't modify the handle signals state.
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
|
| + hss.satisfiable_signals);
|
| }
|
|
|
| // |WaitMany()|:
|
| @@ -169,48 +254,115 @@ TEST_F(CoreTest, InvalidArguments) {
|
| core()->WaitMany(MakeUserPointer(handles),
|
| MakeUserPointer(signals),
|
| 0,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| core()->WaitMany(NullUserPointer(),
|
| MakeUserPointer(signals),
|
| 0,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| + // If |num_handles| is invalid, it should leave |result_index| and
|
| + // |signals_states| alone.
|
| + // (We use -1 internally; make sure that doesn't leak.)
|
| + uint32_t result_index = 123;
|
| + MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| + core()->WaitMany(NullUserPointer(),
|
| + MakeUserPointer(signals),
|
| + 0,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(123u, result_index);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
|
| + hss.satisfiable_signals);
|
| +
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| core()->WaitMany(MakeUserPointer(handles),
|
| NullUserPointer(),
|
| 0,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| core()->WaitMany(MakeUserPointer(handles),
|
| MakeUserPointer(signals),
|
| 1,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| + // But if a handle is bad, then it should set |result_index| but still leave
|
| + // |signals_states| alone.
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| + core()->WaitMany(MakeUserPointer(handles),
|
| + MakeUserPointer(signals),
|
| + 1,
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(0u, result_index);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
|
| + hss.satisfiable_signals);
|
|
|
| MockHandleInfo info[2];
|
| handles[0] = CreateMockHandle(&info[0]);
|
|
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss = kFullMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| core()->WaitMany(MakeUserPointer(handles),
|
| MakeUserPointer(signals),
|
| 1,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(0u, result_index);
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(0u, hss.satisfiable_signals);
|
| +
|
| + // On invalid argument, it'll leave |signals_states| alone.
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss = kFullMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| core()->WaitMany(MakeUserPointer(handles),
|
| MakeUserPointer(signals),
|
| 2,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(1u, result_index);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
|
| + hss.satisfied_signals);
|
| + EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
|
| + hss.satisfiable_signals);
|
| handles[1] = handles[0] + 1; // Invalid handle.
|
| EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
|
| core()->WaitMany(MakeUserPointer(handles),
|
| MakeUserPointer(signals),
|
| 2,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| handles[1] = CreateMockHandle(&info[1]);
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| core()->WaitMany(MakeUserPointer(handles),
|
| MakeUserPointer(signals),
|
| 2,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()));
|
| +
|
| + // TODO(vtl): Test one where we get "failed precondition" only for the
|
| + // second handle (and the first one is valid to wait on).
|
|
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
|
| @@ -386,19 +538,24 @@ TEST_F(CoreTest, InvalidArgumentsDeath) {
|
|
|
| // |WaitMany()|:
|
| {
|
| - MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
|
| - MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE,
|
| - ~MOJO_HANDLE_SIGNAL_NONE};
|
| + MojoHandle handle = MOJO_HANDLE_INVALID;
|
| + MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE;
|
| EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(NullUserPointer(),
|
| - MakeUserPointer(signals),
|
| + MakeUserPointer(&signals),
|
| 1,
|
| - MOJO_DEADLINE_INDEFINITE),
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()),
|
| kMemoryCheckFailedRegex);
|
| - EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(MakeUserPointer(handles),
|
| + EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(MakeUserPointer(&handle),
|
| NullUserPointer(),
|
| 1,
|
| - MOJO_DEADLINE_INDEFINITE),
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + NullUserPointer(),
|
| + NullUserPointer()),
|
| kMemoryCheckFailedRegex);
|
| + // TODO(vtl): |result_index| and |signals_states| are optional. Test them
|
| + // with non-null invalid pointers?
|
| }
|
|
|
| // |CreateMessagePipe()|:
|
| @@ -465,6 +622,8 @@ TEST_F(CoreTest, InvalidArgumentsDeath) {
|
|
|
| TEST_F(CoreTest, MessagePipe) {
|
| MojoHandle h[2];
|
| + MojoHandleSignalsState hss[2];
|
| + uint32_t result_index;
|
|
|
| EXPECT_EQ(
|
| MOJO_RESULT_OK,
|
| @@ -478,9 +637,23 @@ TEST_F(CoreTest, MessagePipe) {
|
| // Neither should be readable.
|
| MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
|
| MOJO_HANDLE_SIGNAL_READABLE};
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_DEADLINE_EXCEEDED,
|
| - core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0));
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| + hss[1] = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| + core()->WaitMany(MakeUserPointer(h),
|
| + MakeUserPointer(signals),
|
| + 2,
|
| + 0,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(hss)));
|
| + EXPECT_EQ(static_cast<uint32_t>(-1), result_index);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfiable_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[1].satisfiable_signals);
|
|
|
| // Try to read anyway.
|
| char buffer[1] = {'a'};
|
| @@ -497,19 +670,45 @@ TEST_F(CoreTest, MessagePipe) {
|
| EXPECT_EQ(1u, buffer_size);
|
|
|
| // Both should be writable.
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000));
|
| + core()->Wait(h[0],
|
| + MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss[0])));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfiable_signals);
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000));
|
| + core()->Wait(h[1],
|
| + MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss[0])));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfiable_signals);
|
|
|
| // Also check that |h[1]| is writable using |WaitMany()|.
|
| signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
|
| signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE;
|
| - EXPECT_EQ(1,
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| + hss[1] = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| core()->WaitMany(MakeUserPointer(h),
|
| MakeUserPointer(signals),
|
| 2,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(hss)));
|
| + EXPECT_EQ(1u, result_index);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfiable_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[1].satisfiable_signals);
|
|
|
| // Write to |h[1]|.
|
| buffer[0] = 'b';
|
| @@ -524,11 +723,24 @@ TEST_F(CoreTest, MessagePipe) {
|
| // Check that |h[0]| is now readable.
|
| signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
|
| signals[1] = MOJO_HANDLE_SIGNAL_READABLE;
|
| - EXPECT_EQ(0,
|
| + result_index = static_cast<uint32_t>(-1);
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| + hss[1] = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| core()->WaitMany(MakeUserPointer(h),
|
| MakeUserPointer(signals),
|
| 2,
|
| - MOJO_DEADLINE_INDEFINITE));
|
| + MOJO_DEADLINE_INDEFINITE,
|
| + MakeUserPointer(&result_index),
|
| + MakeUserPointer(hss)));
|
| + EXPECT_EQ(0u, result_index);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfiable_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[1].satisfiable_signals);
|
|
|
| // Read from |h[0]|.
|
| // First, get only the size.
|
| @@ -555,8 +767,14 @@ TEST_F(CoreTest, MessagePipe) {
|
| EXPECT_EQ(1u, buffer_size);
|
|
|
| // |h[0]| should no longer be readable.
|
| - EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| - core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0));
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_DEADLINE_EXCEEDED,
|
| + core()->Wait(
|
| + h[0], MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss[0])));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + hss[0].satisfiable_signals);
|
|
|
| // Write to |h[0]|.
|
| buffer[0] = 'd';
|
| @@ -572,12 +790,24 @@ TEST_F(CoreTest, MessagePipe) {
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
|
|
|
| // Check that |h[1]| is no longer writable (and will never be).
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000));
|
| + core()->Wait(h[1],
|
| + MOJO_HANDLE_SIGNAL_WRITABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss[0])));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfiable_signals);
|
|
|
| // Check that |h[1]| is still readable (for the moment).
|
| + hss[0] = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + core()->Wait(h[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss[0])));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfiable_signals);
|
|
|
| // Discard a message from |h[1]|.
|
| EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
|
| @@ -589,8 +819,14 @@ TEST_F(CoreTest, MessagePipe) {
|
| MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
|
|
|
| // |h[1]| is no longer readable (and will never be).
|
| + hss[0] = kFullMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + core()->Wait(h[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss[0])));
|
| + EXPECT_EQ(0u, hss[0].satisfied_signals);
|
| + EXPECT_EQ(0u, hss[0].satisfiable_signals);
|
|
|
| // Try writing to |h[1]|.
|
| buffer[0] = 'e';
|
| @@ -616,6 +852,7 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
|
| uint32_t num_bytes;
|
| MojoHandle handles[10];
|
| uint32_t num_handles;
|
| + MojoHandleSignalsState hss;
|
| MojoHandle h_received;
|
|
|
| MojoHandle h_passing[2];
|
| @@ -632,9 +869,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
|
| NullUserPointer(),
|
| 0,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_OK,
|
| - core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + core()->Wait(h_passing[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -679,8 +923,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
|
| NullUserPointer(),
|
| 0,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + core()->Wait(h_passed[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -702,9 +954,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
|
| MakeUserPointer(&h_passed[1]),
|
| 1,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_OK,
|
| - core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + core()->Wait(h_passing[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -738,8 +997,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
|
| NullUserPointer(),
|
| 0,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + core()->Wait(h_received,
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -761,6 +1028,7 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
|
|
|
| TEST_F(CoreTest, DataPipe) {
|
| MojoHandle ph, ch; // p is for producer and c is for consumer.
|
| + MojoHandleSignalsState hss;
|
|
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| core()->CreateDataPipe(
|
| @@ -771,15 +1039,32 @@ TEST_F(CoreTest, DataPipe) {
|
| EXPECT_NE(ph, ch);
|
|
|
| // Producer should be never-readable, but already writable.
|
| - EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0));
|
| - EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_OK,
|
| + core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
|
|
|
| // Consumer should be never-writable, and not yet readable.
|
| - EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0));
|
| - EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| - core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0));
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_DEADLINE_EXCEEDED,
|
| + core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
|
|
| // Write.
|
| char elements[2] = {'A', 'B'};
|
| @@ -792,7 +1077,12 @@ TEST_F(CoreTest, DataPipe) {
|
| EXPECT_EQ(2u, num_bytes);
|
|
|
| // Consumer should now be readable.
|
| - EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_OK,
|
| + core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
|
|
| // Read one character.
|
| elements[0] = -1;
|
| @@ -884,8 +1174,12 @@ TEST_F(CoreTest, DataPipe) {
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u));
|
|
|
| // Consumer should now be no longer readable.
|
| - EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| - core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0));
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_DEADLINE_EXCEEDED,
|
| + core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
|
|
| // TODO(vtl): More.
|
|
|
| @@ -893,8 +1187,12 @@ TEST_F(CoreTest, DataPipe) {
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
|
|
|
| // The consumer should now be never-readable.
|
| - EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| - core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0));
|
| + hss = kFullMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_FAILED_PRECONDITION,
|
| + core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(0u, hss.satisfied_signals);
|
| + EXPECT_EQ(0u, hss.satisfiable_signals);
|
|
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
|
| }
|
| @@ -910,6 +1208,7 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| uint32_t num_bytes;
|
| MojoHandle handles[10];
|
| uint32_t num_handles;
|
| + MojoHandleSignalsState hss;
|
|
|
| MojoHandle h_passing[2];
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -930,9 +1229,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| MakeUserPointer(&ch),
|
| 1,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_OK,
|
| - core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + core()->Wait(h_passing[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -965,8 +1271,14 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| UserPointer<const void>(kWorld),
|
| MakeUserPointer(&num_bytes),
|
| MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + core()->Wait(ch_received,
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
| num_bytes = kBufferSize;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| core()->ReadData(ch_received,
|
| @@ -984,9 +1296,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| MakeUserPointer(&ph),
|
| 1,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_OK,
|
| - core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + core()->Wait(h_passing[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -1019,8 +1338,14 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| UserPointer<const void>(kHello),
|
| MakeUserPointer(&num_bytes),
|
| MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + core()->Wait(ch_received,
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&hss)));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
| num_bytes = kBufferSize;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| core()->ReadData(ch_received,
|
| @@ -1061,9 +1386,11 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| 1,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| ch = MOJO_HANDLE_INVALID;
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_OK,
|
| - core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + core()->Wait(h_passing[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + NullUserPointer()));
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -1084,8 +1411,13 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
|
|
|
| // Wait for |ch| to be readable.
|
| - EXPECT_EQ(MOJO_RESULT_OK,
|
| - core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(
|
| + MOJO_RESULT_OK,
|
| + core()->Wait(
|
| + ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, MakeUserPointer(&hss)));
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
|
| + EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
|
|
|
| // Make sure that |ch| can't be sent if it's in a two-phase read.
|
| const void* read_ptr = NULL;
|
| @@ -1112,9 +1444,16 @@ TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
|
| 1,
|
| MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| ph = MOJO_HANDLE_INVALID;
|
| - EXPECT_EQ(
|
| - MOJO_RESULT_OK,
|
| - core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000));
|
| + hss = kEmptyMojoHandleSignalsState;
|
| + EXPECT_EQ(MOJO_RESULT_OK,
|
| + core()->Wait(h_passing[1],
|
| + MOJO_HANDLE_SIGNAL_READABLE,
|
| + 1000000000,
|
| + MakeUserPointer(&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);
|
| num_bytes = kBufferSize;
|
| num_handles = arraysize(handles);
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
|
|