| 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 20 matching lines...) Expand all Loading... |
| 31 | 31 |
| 32 using mojo::platform::test::Stopwatch; | 32 using mojo::platform::test::Stopwatch; |
| 33 using mojo::platform::ThreadSleep; | 33 using mojo::platform::ThreadSleep; |
| 34 using mojo::util::MakeUnique; | 34 using mojo::util::MakeUnique; |
| 35 using mojo::util::RefPtr; | 35 using mojo::util::RefPtr; |
| 36 | 36 |
| 37 namespace mojo { | 37 namespace mojo { |
| 38 namespace system { | 38 namespace system { |
| 39 namespace { | 39 namespace { |
| 40 | 40 |
| 41 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | | |
| 42 MOJO_HANDLE_SIGNAL_WRITABLE | | |
| 43 MOJO_HANDLE_SIGNAL_PEER_CLOSED; | |
| 44 | |
| 45 TEST(MessagePipeDispatcherTest, Basic) { | 41 TEST(MessagePipeDispatcherTest, Basic) { |
| 46 Stopwatch stopwatch; | 42 Stopwatch stopwatch; |
| 47 int32_t buffer[1]; | 43 int32_t buffer[1]; |
| 48 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 44 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 49 uint32_t buffer_size; | 45 uint32_t buffer_size; |
| 50 | 46 |
| 51 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. | 47 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. |
| 52 for (unsigned i = 0; i < 2; i++) { | 48 for (unsigned i = 0; i < 2; i++) { |
| 53 auto d0 = MessagePipeDispatcher::Create( | 49 auto d0 = MessagePipeDispatcher::Create( |
| 54 MessagePipeDispatcher::kDefaultCreateOptions); | 50 MessagePipeDispatcher::kDefaultCreateOptions); |
| 55 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, d0->GetType()); | 51 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, d0->GetType()); |
| 56 auto d1 = MessagePipeDispatcher::Create( | 52 auto d1 = MessagePipeDispatcher::Create( |
| 57 MessagePipeDispatcher::kDefaultCreateOptions); | 53 MessagePipeDispatcher::kDefaultCreateOptions); |
| 58 { | 54 { |
| 59 auto mp = MessagePipe::CreateLocalLocal(); | 55 auto mp = MessagePipe::CreateLocalLocal(); |
| 60 d0->Init(mp.Clone(), i); // 0, 1. | 56 d0->Init(mp.Clone(), i); // 0, 1. |
| 61 d1->Init(std::move(mp), i ^ 1); // 1, 0. | 57 d1->Init(std::move(mp), i ^ 1); // 1, 0. |
| 62 } | 58 } |
| 63 Waiter w; | 59 Waiter w; |
| 64 uint32_t context = 0; | 60 uint32_t context = 0; |
| 65 HandleSignalsState hss; | 61 HandleSignalsState hss; |
| 66 | 62 |
| 67 // Try adding a writable waiter when already writable. | 63 // Try adding a writable waiter when already writable. |
| 68 w.Init(); | 64 w.Init(); |
| 69 hss = HandleSignalsState(); | 65 hss = HandleSignalsState(); |
| 70 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 66 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 71 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 67 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
| 72 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 68 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 73 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 69 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 70 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 71 hss.satisfiable_signals); |
| 74 // Shouldn't need to remove the waiter (it was not added). | 72 // Shouldn't need to remove the waiter (it was not added). |
| 75 | 73 |
| 76 // 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 |
| 77 // |d1|), then wait. | 75 // |d1|), then wait. |
| 78 w.Init(); | 76 w.Init(); |
| 79 ASSERT_EQ(MOJO_RESULT_OK, | 77 ASSERT_EQ(MOJO_RESULT_OK, |
| 80 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); | 78 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); |
| 81 buffer[0] = 123456789; | 79 buffer[0] = 123456789; |
| 82 EXPECT_EQ(MOJO_RESULT_OK, | 80 EXPECT_EQ(MOJO_RESULT_OK, |
| 83 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 81 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 84 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 82 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 85 stopwatch.Start(); | 83 stopwatch.Start(); |
| 86 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 84 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 87 EXPECT_EQ(1u, context); | 85 EXPECT_EQ(1u, context); |
| 88 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 86 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 89 hss = HandleSignalsState(); | 87 hss = HandleSignalsState(); |
| 90 d0->RemoveAwakable(&w, &hss); | 88 d0->RemoveAwakable(&w, &hss); |
| 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 89 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 92 hss.satisfied_signals); | 90 hss.satisfied_signals); |
| 93 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 92 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 93 hss.satisfiable_signals); |
| 94 | 94 |
| 95 // Try adding a readable waiter when already readable (from above). | 95 // Try adding a readable waiter when already readable (from above). |
| 96 w.Init(); | 96 w.Init(); |
| 97 hss = HandleSignalsState(); | 97 hss = HandleSignalsState(); |
| 98 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 98 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 99 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); | 99 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); |
| 100 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 100 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 101 hss.satisfied_signals); | 101 hss.satisfied_signals); |
| 102 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 102 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 103 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 104 hss.satisfiable_signals); |
| 103 // Shouldn't need to remove the waiter (it was not added). | 105 // Shouldn't need to remove the waiter (it was not added). |
| 104 | 106 |
| 105 // Make |d0| no longer readable (by reading from it). | 107 // Make |d0| no longer readable (by reading from it). |
| 106 buffer[0] = 0; | 108 buffer[0] = 0; |
| 107 buffer_size = kBufferSize; | 109 buffer_size = kBufferSize; |
| 108 EXPECT_EQ(MOJO_RESULT_OK, | 110 EXPECT_EQ(MOJO_RESULT_OK, |
| 109 d0->ReadMessage(UserPointer<void>(buffer), | 111 d0->ReadMessage(UserPointer<void>(buffer), |
| 110 MakeUserPointer(&buffer_size), 0, nullptr, | 112 MakeUserPointer(&buffer_size), 0, nullptr, |
| 111 MOJO_READ_MESSAGE_FLAG_NONE)); | 113 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 112 EXPECT_EQ(kBufferSize, buffer_size); | 114 EXPECT_EQ(kBufferSize, buffer_size); |
| 113 EXPECT_EQ(123456789, buffer[0]); | 115 EXPECT_EQ(123456789, buffer[0]); |
| 114 | 116 |
| 115 // Wait for zero time for readability on |d0| (will time out). | 117 // Wait for zero time for readability on |d0| (will time out). |
| 116 w.Init(); | 118 w.Init(); |
| 117 ASSERT_EQ(MOJO_RESULT_OK, | 119 ASSERT_EQ(MOJO_RESULT_OK, |
| 118 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 120 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
| 119 stopwatch.Start(); | 121 stopwatch.Start(); |
| 120 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 122 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
| 121 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 123 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 122 hss = HandleSignalsState(); | 124 hss = HandleSignalsState(); |
| 123 d0->RemoveAwakable(&w, &hss); | 125 d0->RemoveAwakable(&w, &hss); |
| 124 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 125 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 128 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 129 hss.satisfiable_signals); |
| 126 | 130 |
| 127 // Wait for non-zero, finite time for readability on |d0| (will time out). | 131 // Wait for non-zero, finite time for readability on |d0| (will time out). |
| 128 w.Init(); | 132 w.Init(); |
| 129 ASSERT_EQ(MOJO_RESULT_OK, | 133 ASSERT_EQ(MOJO_RESULT_OK, |
| 130 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 134 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
| 131 stopwatch.Start(); | 135 stopwatch.Start(); |
| 132 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 136 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 133 w.Wait(2 * test::EpsilonTimeout(), nullptr)); | 137 w.Wait(2 * test::EpsilonTimeout(), nullptr)); |
| 134 MojoDeadline elapsed = stopwatch.Elapsed(); | 138 MojoDeadline elapsed = stopwatch.Elapsed(); |
| 135 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 139 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 136 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 140 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 137 hss = HandleSignalsState(); | 141 hss = HandleSignalsState(); |
| 138 d0->RemoveAwakable(&w, &hss); | 142 d0->RemoveAwakable(&w, &hss); |
| 139 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 143 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 140 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 144 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 145 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 146 hss.satisfiable_signals); |
| 141 | 147 |
| 142 // Check the peer closed signal. | 148 // Check the peer closed signal. |
| 143 w.Init(); | 149 w.Init(); |
| 144 ASSERT_EQ(MOJO_RESULT_OK, | 150 ASSERT_EQ(MOJO_RESULT_OK, |
| 145 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); | 151 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); |
| 146 | 152 |
| 147 // Close the peer. | 153 // Close the peer. |
| 148 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 154 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 149 | 155 |
| 150 // It should be signaled. | 156 // It should be signaled. |
| 151 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context)); | 157 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context)); |
| 152 EXPECT_EQ(12u, context); | 158 EXPECT_EQ(12u, context); |
| 153 hss = HandleSignalsState(); | 159 hss = HandleSignalsState(); |
| 154 d0->RemoveAwakable(&w, &hss); | 160 d0->RemoveAwakable(&w, &hss); |
| 155 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 161 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 156 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 157 | 163 |
| 158 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 164 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 159 } | 165 } |
| 160 } | 166 } |
| 161 | 167 |
| 168 TEST(MessagePipeDispatcherTest, SupportsEntrypointClass) { |
| 169 auto d = MessagePipeDispatcher::Create( |
| 170 MessagePipeDispatcher::kDefaultCreateOptions); |
| 171 ASSERT_TRUE(d); |
| 172 |
| 173 // We need to initialize |d|. |
| 174 { |
| 175 auto d_peer = MessagePipeDispatcher::Create( |
| 176 MessagePipeDispatcher::kDefaultCreateOptions); |
| 177 auto mp = MessagePipe::CreateLocalLocal(); |
| 178 d->Init(mp.Clone(), 0); |
| 179 d_peer->Init(std::move(mp), 1); |
| 180 EXPECT_EQ(MOJO_RESULT_OK, d_peer->Close()); |
| 181 } |
| 182 |
| 183 EXPECT_TRUE( |
| 184 d->SupportsEntrypointClass(Dispatcher::EntrypointClass::MESSAGE_PIPE)); |
| 185 EXPECT_FALSE(d->SupportsEntrypointClass( |
| 186 Dispatcher::EntrypointClass::DATA_PIPE_PRODUCER)); |
| 187 EXPECT_FALSE(d->SupportsEntrypointClass( |
| 188 Dispatcher::EntrypointClass::DATA_PIPE_CONSUMER)); |
| 189 EXPECT_FALSE(d->SupportsEntrypointClass(Dispatcher::EntrypointClass::BUFFER)); |
| 190 |
| 191 // TODO(vtl): Check that it actually returns |MOJO_RESULT_INVALID_ARGUMENT| |
| 192 // for methods in unsupported entrypoint classes. |
| 193 |
| 194 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 195 } |
| 196 |
| 162 TEST(MessagePipeDispatcherTest, InvalidParams) { | 197 TEST(MessagePipeDispatcherTest, InvalidParams) { |
| 163 char buffer[1]; | 198 char buffer[1]; |
| 164 | 199 |
| 165 auto d0 = MessagePipeDispatcher::Create( | 200 auto d0 = MessagePipeDispatcher::Create( |
| 166 MessagePipeDispatcher::kDefaultCreateOptions); | 201 MessagePipeDispatcher::kDefaultCreateOptions); |
| 167 auto d1 = MessagePipeDispatcher::Create( | 202 auto d1 = MessagePipeDispatcher::Create( |
| 168 MessagePipeDispatcher::kDefaultCreateOptions); | 203 MessagePipeDispatcher::kDefaultCreateOptions); |
| 169 { | 204 { |
| 170 auto mp = MessagePipe::CreateLocalLocal(); | 205 auto mp = MessagePipe::CreateLocalLocal(); |
| 171 d0->Init(mp.Clone(), 0); | 206 d0->Init(mp.Clone(), 0); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 289 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 255 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 290 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 256 | 291 |
| 257 // Try waiting for readable on |d0|; should fail (already satisfied). | 292 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 258 w.Init(); | 293 w.Init(); |
| 259 hss = HandleSignalsState(); | 294 hss = HandleSignalsState(); |
| 260 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 295 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 261 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 296 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
| 262 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 297 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 263 hss.satisfied_signals); | 298 hss.satisfied_signals); |
| 264 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 299 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 300 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 301 hss.satisfiable_signals); |
| 265 | 302 |
| 266 // Try reading from |d1|; should fail (nothing to read). | 303 // Try reading from |d1|; should fail (nothing to read). |
| 267 buffer[0] = 0; | 304 buffer[0] = 0; |
| 268 buffer_size = kBufferSize; | 305 buffer_size = kBufferSize; |
| 269 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 306 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 270 d1->ReadMessage(UserPointer<void>(buffer), | 307 d1->ReadMessage(UserPointer<void>(buffer), |
| 271 MakeUserPointer(&buffer_size), 0, nullptr, | 308 MakeUserPointer(&buffer_size), 0, nullptr, |
| 272 MOJO_READ_MESSAGE_FLAG_NONE)); | 309 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 273 | 310 |
| 274 // Close |d1|. | 311 // Close |d1|. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 424 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 388 } // Joins the thread. | 425 } // Joins the thread. |
| 389 elapsed = stopwatch.Elapsed(); | 426 elapsed = stopwatch.Elapsed(); |
| 390 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 427 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 391 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 428 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 392 EXPECT_TRUE(did_wait); | 429 EXPECT_TRUE(did_wait); |
| 393 EXPECT_EQ(MOJO_RESULT_OK, result); | 430 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 394 EXPECT_EQ(1u, context); | 431 EXPECT_EQ(1u, context); |
| 395 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 432 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 396 hss.satisfied_signals); | 433 hss.satisfied_signals); |
| 397 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 434 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 435 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 436 hss.satisfiable_signals); |
| 398 | 437 |
| 399 // Now |d1| is already readable. Try waiting for it again. | 438 // Now |d1| is already readable. Try waiting for it again. |
| 400 { | 439 { |
| 401 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, | 440 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, |
| 402 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result, | 441 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result, |
| 403 &context, &hss); | 442 &context, &hss); |
| 404 stopwatch.Start(); | 443 stopwatch.Start(); |
| 405 thread.Start(); | 444 thread.Start(); |
| 406 } // Joins the thread. | 445 } // Joins the thread. |
| 407 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 446 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 408 EXPECT_FALSE(did_wait); | 447 EXPECT_FALSE(did_wait); |
| 409 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 448 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
| 410 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 449 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 411 hss.satisfied_signals); | 450 hss.satisfied_signals); |
| 412 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 451 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 452 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 453 hss.satisfiable_signals); |
| 413 | 454 |
| 414 // Consume what we wrote to |d0|. | 455 // Consume what we wrote to |d0|. |
| 415 buffer[0] = 0; | 456 buffer[0] = 0; |
| 416 buffer_size = kBufferSize; | 457 buffer_size = kBufferSize; |
| 417 EXPECT_EQ(MOJO_RESULT_OK, | 458 EXPECT_EQ(MOJO_RESULT_OK, |
| 418 d1->ReadMessage(UserPointer<void>(buffer), | 459 d1->ReadMessage(UserPointer<void>(buffer), |
| 419 MakeUserPointer(&buffer_size), 0, nullptr, | 460 MakeUserPointer(&buffer_size), 0, nullptr, |
| 420 MOJO_READ_MESSAGE_FLAG_NONE)); | 461 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 421 EXPECT_EQ(kBufferSize, buffer_size); | 462 EXPECT_EQ(kBufferSize, buffer_size); |
| 422 EXPECT_EQ(123456789, buffer[0]); | 463 EXPECT_EQ(123456789, buffer[0]); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 EXPECT_EQ(total_messages_written, total_messages_read); | 724 EXPECT_EQ(total_messages_written, total_messages_read); |
| 684 EXPECT_EQ(total_bytes_written, total_bytes_read); | 725 EXPECT_EQ(total_bytes_written, total_bytes_read); |
| 685 | 726 |
| 686 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 727 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
| 687 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 728 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
| 688 } | 729 } |
| 689 | 730 |
| 690 } // namespace | 731 } // namespace |
| 691 } // namespace system | 732 } // namespace system |
| 692 } // namespace mojo | 733 } // namespace mojo |
| OLD | NEW |