| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a | 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a |
| 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to | 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to |
| 7 // increase tolerance and reduce observed flakiness (though doing so reduces the | 7 // increase tolerance and reduce observed flakiness (though doing so reduces the |
| 8 // meaningfulness of the test). | 8 // meaningfulness of the test). |
| 9 | 9 |
| 10 #include "mojo/edk/system/message_pipe_dispatcher.h" | 10 #include "mojo/edk/system/message_pipe_dispatcher.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 // Add a readable waiter to |d0|, then make it readable (by writing to | 74 // Add a readable waiter to |d0|, then make it readable (by writing to |
| 75 // |d1|), then wait. | 75 // |d1|), then wait. |
| 76 w.Init(); | 76 w.Init(); |
| 77 ASSERT_EQ(MOJO_RESULT_OK, | 77 ASSERT_EQ(MOJO_RESULT_OK, |
| 78 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); | 78 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); |
| 79 buffer[0] = 123456789; | 79 buffer[0] = 123456789; |
| 80 EXPECT_EQ(MOJO_RESULT_OK, | 80 EXPECT_EQ(MOJO_RESULT_OK, |
| 81 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 81 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 82 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 82 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 83 stopwatch.Start(); | 83 stopwatch.Start(); |
| 84 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 84 EXPECT_EQ(MOJO_RESULT_OK, |
| 85 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 85 EXPECT_EQ(1u, context); | 86 EXPECT_EQ(1u, context); |
| 86 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 87 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 87 hss = HandleSignalsState(); | 88 hss = HandleSignalsState(); |
| 88 d0->RemoveAwakable(&w, &hss); | 89 d0->RemoveAwakable(&w, &hss); |
| 89 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 90 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 90 hss.satisfied_signals); | 91 hss.satisfied_signals); |
| 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 92 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 92 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 93 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 93 hss.satisfiable_signals); | 94 hss.satisfiable_signals); |
| 94 | 95 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 112 MakeUserPointer(&buffer_size), 0, nullptr, | 113 MakeUserPointer(&buffer_size), 0, nullptr, |
| 113 MOJO_READ_MESSAGE_FLAG_NONE)); | 114 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 114 EXPECT_EQ(kBufferSize, buffer_size); | 115 EXPECT_EQ(kBufferSize, buffer_size); |
| 115 EXPECT_EQ(123456789, buffer[0]); | 116 EXPECT_EQ(123456789, buffer[0]); |
| 116 | 117 |
| 117 // Wait for zero time for readability on |d0| (will time out). | 118 // Wait for zero time for readability on |d0| (will time out). |
| 118 w.Init(); | 119 w.Init(); |
| 119 ASSERT_EQ(MOJO_RESULT_OK, | 120 ASSERT_EQ(MOJO_RESULT_OK, |
| 120 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 121 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
| 121 stopwatch.Start(); | 122 stopwatch.Start(); |
| 122 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr, nullptr)); |
| 123 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 124 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 124 hss = HandleSignalsState(); | 125 hss = HandleSignalsState(); |
| 125 d0->RemoveAwakable(&w, &hss); | 126 d0->RemoveAwakable(&w, &hss); |
| 126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 128 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 129 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 129 hss.satisfiable_signals); | 130 hss.satisfiable_signals); |
| 130 | 131 |
| 131 // Wait for non-zero, finite time for readability on |d0| (will time out). | 132 // Wait for non-zero, finite time for readability on |d0| (will time out). |
| 132 w.Init(); | 133 w.Init(); |
| 133 ASSERT_EQ(MOJO_RESULT_OK, | 134 ASSERT_EQ(MOJO_RESULT_OK, |
| 134 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 135 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
| 135 stopwatch.Start(); | 136 stopwatch.Start(); |
| 136 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 137 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 137 w.Wait(2 * test::EpsilonTimeout(), nullptr)); | 138 w.Wait(2 * test::EpsilonTimeout(), nullptr, nullptr)); |
| 138 MojoDeadline elapsed = stopwatch.Elapsed(); | 139 MojoDeadline elapsed = stopwatch.Elapsed(); |
| 139 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 140 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 140 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 141 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 141 hss = HandleSignalsState(); | 142 hss = HandleSignalsState(); |
| 142 d0->RemoveAwakable(&w, &hss); | 143 d0->RemoveAwakable(&w, &hss); |
| 143 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 144 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 144 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 145 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 145 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 146 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 146 hss.satisfiable_signals); | 147 hss.satisfiable_signals); |
| 147 | 148 |
| 148 // Check the peer closed signal. | 149 // Check the peer closed signal. |
| 149 w.Init(); | 150 w.Init(); |
| 150 ASSERT_EQ(MOJO_RESULT_OK, | 151 ASSERT_EQ(MOJO_RESULT_OK, |
| 151 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); | 152 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); |
| 152 | 153 |
| 153 // Close the peer. | 154 // Close the peer. |
| 154 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 155 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 155 | 156 |
| 156 // It should be signaled. | 157 // It should be signaled. |
| 157 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context)); | 158 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context, nullptr)); |
| 158 EXPECT_EQ(12u, context); | 159 EXPECT_EQ(12u, context); |
| 159 hss = HandleSignalsState(); | 160 hss = HandleSignalsState(); |
| 160 d0->RemoveAwakable(&w, &hss); | 161 d0->RemoveAwakable(&w, &hss); |
| 161 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 163 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 163 | 164 |
| 164 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 165 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 165 } | 166 } |
| 166 } | 167 } |
| 167 | 168 |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 // Wait for it to be readable. | 600 // Wait for it to be readable. |
| 600 w.Init(); | 601 w.Init(); |
| 601 hss = HandleSignalsState(); | 602 hss = HandleSignalsState(); |
| 602 result = read_dispatcher_->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, | 603 result = read_dispatcher_->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, |
| 603 &hss); | 604 &hss); |
| 604 EXPECT_TRUE(result == MOJO_RESULT_OK || | 605 EXPECT_TRUE(result == MOJO_RESULT_OK || |
| 605 result == MOJO_RESULT_ALREADY_EXISTS) | 606 result == MOJO_RESULT_ALREADY_EXISTS) |
| 606 << "result: " << result; | 607 << "result: " << result; |
| 607 if (result == MOJO_RESULT_OK) { | 608 if (result == MOJO_RESULT_OK) { |
| 608 // Actually need to wait. | 609 // Actually need to wait. |
| 609 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); | 610 EXPECT_EQ(MOJO_RESULT_OK, |
| 611 w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr, nullptr)); |
| 610 read_dispatcher_->RemoveAwakable(&w, &hss); | 612 read_dispatcher_->RemoveAwakable(&w, &hss); |
| 611 } | 613 } |
| 612 // We may not actually be readable, since we're racing with other threads. | 614 // We may not actually be readable, since we're racing with other threads. |
| 613 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 615 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 614 | 616 |
| 615 // Now, try to do the read. | 617 // Now, try to do the read. |
| 616 // Clear the buffer so that we can check the result. | 618 // Clear the buffer so that we can check the result. |
| 617 memset(buffer, 0, sizeof(buffer)); | 619 memset(buffer, 0, sizeof(buffer)); |
| 618 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 620 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 619 result = read_dispatcher_->ReadMessage( | 621 result = read_dispatcher_->ReadMessage( |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 EXPECT_EQ(total_messages_written, total_messages_read); | 724 EXPECT_EQ(total_messages_written, total_messages_read); |
| 723 EXPECT_EQ(total_bytes_written, total_bytes_read); | 725 EXPECT_EQ(total_bytes_written, total_bytes_read); |
| 724 | 726 |
| 725 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 727 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
| 726 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 728 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
| 727 } | 729 } |
| 728 | 730 |
| 729 } // namespace | 731 } // namespace |
| 730 } // namespace system | 732 } // namespace system |
| 731 } // namespace mojo | 733 } // namespace mojo |
| OLD | NEW |