| 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 d1->Init(std::move(mp), i ^ 1); // 1, 0. | 57 d1->Init(std::move(mp), i ^ 1); // 1, 0. |
| 58 } | 58 } |
| 59 Waiter w; | 59 Waiter w; |
| 60 uint64_t context = 0; | 60 uint64_t context = 0; |
| 61 HandleSignalsState hss; | 61 HandleSignalsState hss; |
| 62 | 62 |
| 63 // Try adding a writable waiter when already writable. | 63 // Try adding a writable waiter when already writable. |
| 64 w.Init(); | 64 w.Init(); |
| 65 hss = HandleSignalsState(); | 65 hss = HandleSignalsState(); |
| 66 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 66 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 67 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 67 d0->AddAwakable(&w, 0, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss)); |
| 68 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 68 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 69 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 69 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 70 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 70 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 71 hss.satisfiable_signals); | 71 hss.satisfiable_signals); |
| 72 // Shouldn't need to remove the waiter (it was not added). | 72 // Shouldn't need to remove the waiter (it was not added). |
| 73 | 73 |
| 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( |
| 78 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); | 78 MOJO_RESULT_OK, |
| 79 d0->AddAwakable(&w, 1, false, MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 79 buffer[0] = 123456789; | 80 buffer[0] = 123456789; |
| 80 EXPECT_EQ(MOJO_RESULT_OK, | 81 EXPECT_EQ(MOJO_RESULT_OK, |
| 81 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 82 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 82 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 83 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 83 stopwatch.Start(); | 84 stopwatch.Start(); |
| 84 EXPECT_EQ(MOJO_RESULT_OK, | 85 EXPECT_EQ(MOJO_RESULT_OK, |
| 85 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); | 86 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr)); |
| 86 EXPECT_EQ(1u, context); | 87 EXPECT_EQ(1u, context); |
| 87 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 88 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 88 hss = HandleSignalsState(); | 89 hss = HandleSignalsState(); |
| 89 d0->RemoveAwakable(&w, &hss); | 90 d0->RemoveAwakable(false, &w, 0, &hss); |
| 90 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 91 hss.satisfied_signals); | 92 hss.satisfied_signals); |
| 92 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 93 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 93 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 94 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 94 hss.satisfiable_signals); | 95 hss.satisfiable_signals); |
| 95 | 96 |
| 96 // Try adding a readable waiter when already readable (from above). | 97 // Try adding a readable waiter when already readable (from above). |
| 97 w.Init(); | 98 w.Init(); |
| 98 hss = HandleSignalsState(); | 99 hss = HandleSignalsState(); |
| 99 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 100 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 100 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); | 101 d0->AddAwakable(&w, 2, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 101 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 102 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 102 hss.satisfied_signals); | 103 hss.satisfied_signals); |
| 103 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 104 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 104 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 105 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 105 hss.satisfiable_signals); | 106 hss.satisfiable_signals); |
| 106 // Shouldn't need to remove the waiter (it was not added). | 107 // Shouldn't need to remove the waiter (it was not added). |
| 107 | 108 |
| 108 // Make |d0| no longer readable (by reading from it). | 109 // Make |d0| no longer readable (by reading from it). |
| 109 buffer[0] = 0; | 110 buffer[0] = 0; |
| 110 buffer_size = kBufferSize; | 111 buffer_size = kBufferSize; |
| 111 EXPECT_EQ(MOJO_RESULT_OK, | 112 EXPECT_EQ(MOJO_RESULT_OK, |
| 112 d0->ReadMessage(UserPointer<void>(buffer), | 113 d0->ReadMessage(UserPointer<void>(buffer), |
| 113 MakeUserPointer(&buffer_size), 0, nullptr, | 114 MakeUserPointer(&buffer_size), 0, nullptr, |
| 114 MOJO_READ_MESSAGE_FLAG_NONE)); | 115 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 115 EXPECT_EQ(kBufferSize, buffer_size); | 116 EXPECT_EQ(kBufferSize, buffer_size); |
| 116 EXPECT_EQ(123456789, buffer[0]); | 117 EXPECT_EQ(123456789, buffer[0]); |
| 117 | 118 |
| 118 // Wait for zero time for readability on |d0| (will time out). | 119 // Wait for zero time for readability on |d0| (will time out). |
| 119 w.Init(); | 120 w.Init(); |
| 120 ASSERT_EQ(MOJO_RESULT_OK, | 121 ASSERT_EQ( |
| 121 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 122 MOJO_RESULT_OK, |
| 123 d0->AddAwakable(&w, 3, false, MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 122 stopwatch.Start(); | 124 stopwatch.Start(); |
| 123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr, nullptr)); | 125 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr, nullptr)); |
| 124 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 126 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 125 hss = HandleSignalsState(); | 127 hss = HandleSignalsState(); |
| 126 d0->RemoveAwakable(&w, &hss); | 128 d0->RemoveAwakable(false, &w, 0, &hss); |
| 127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 129 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 130 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 129 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 131 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 130 hss.satisfiable_signals); | 132 hss.satisfiable_signals); |
| 131 | 133 |
| 132 // Wait for non-zero, finite time for readability on |d0| (will time out). | 134 // Wait for non-zero, finite time for readability on |d0| (will time out). |
| 133 w.Init(); | 135 w.Init(); |
| 134 ASSERT_EQ(MOJO_RESULT_OK, | 136 ASSERT_EQ( |
| 135 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 137 MOJO_RESULT_OK, |
| 138 d0->AddAwakable(&w, 3, false, MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 136 stopwatch.Start(); | 139 stopwatch.Start(); |
| 137 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 140 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 138 w.Wait(2 * test::EpsilonTimeout(), nullptr, nullptr)); | 141 w.Wait(2 * test::EpsilonTimeout(), nullptr, nullptr)); |
| 139 MojoDeadline elapsed = stopwatch.Elapsed(); | 142 MojoDeadline elapsed = stopwatch.Elapsed(); |
| 140 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 143 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 141 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 144 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 142 hss = HandleSignalsState(); | 145 hss = HandleSignalsState(); |
| 143 d0->RemoveAwakable(&w, &hss); | 146 d0->RemoveAwakable(false, &w, 0, &hss); |
| 144 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 147 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 145 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 148 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 146 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 149 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 147 hss.satisfiable_signals); | 150 hss.satisfiable_signals); |
| 148 | 151 |
| 149 // Check the peer closed signal. | 152 // Check the peer closed signal. |
| 150 w.Init(); | 153 w.Init(); |
| 151 ASSERT_EQ(MOJO_RESULT_OK, | 154 ASSERT_EQ(MOJO_RESULT_OK, |
| 152 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); | 155 d0->AddAwakable(&w, 12, false, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 156 nullptr)); |
| 153 | 157 |
| 154 // Close the peer. | 158 // Close the peer. |
| 155 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 159 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 156 | 160 |
| 157 // It should be signaled. | 161 // It should be signaled. |
| 158 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context, nullptr)); | 162 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context, nullptr)); |
| 159 EXPECT_EQ(12u, context); | 163 EXPECT_EQ(12u, context); |
| 160 hss = HandleSignalsState(); | 164 hss = HandleSignalsState(); |
| 161 d0->RemoveAwakable(&w, &hss); | 165 d0->RemoveAwakable(false, &w, 0, &hss); |
| 162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 166 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 163 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 167 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 164 | 168 |
| 165 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 169 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 166 } | 170 } |
| 167 } | 171 } |
| 168 | 172 |
| 169 TEST(MessagePipeDispatcherTest, SupportsEntrypointClass) { | 173 TEST(MessagePipeDispatcherTest, SupportsEntrypointClass) { |
| 170 auto d = MessagePipeDispatcher::Create( | 174 auto d = MessagePipeDispatcher::Create( |
| 171 MessagePipeDispatcher::kDefaultCreateOptions); | 175 MessagePipeDispatcher::kDefaultCreateOptions); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 289 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 286 buffer[0] = 234567890; | 290 buffer[0] = 234567890; |
| 287 EXPECT_EQ(MOJO_RESULT_OK, | 291 EXPECT_EQ(MOJO_RESULT_OK, |
| 288 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 292 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 289 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 293 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 290 | 294 |
| 291 // Try waiting for readable on |d0|; should fail (already satisfied). | 295 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 292 w.Init(); | 296 w.Init(); |
| 293 hss = HandleSignalsState(); | 297 hss = HandleSignalsState(); |
| 294 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 298 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 295 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 299 d0->AddAwakable(&w, 0, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 296 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 300 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 297 hss.satisfied_signals); | 301 hss.satisfied_signals); |
| 298 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 302 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 299 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 303 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 300 hss.satisfiable_signals); | 304 hss.satisfiable_signals); |
| 301 | 305 |
| 302 // Try reading from |d1|; should fail (nothing to read). | 306 // Try reading from |d1|; should fail (nothing to read). |
| 303 buffer[0] = 0; | 307 buffer[0] = 0; |
| 304 buffer_size = kBufferSize; | 308 buffer_size = kBufferSize; |
| 305 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 309 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 306 d1->ReadMessage(UserPointer<void>(buffer), | 310 d1->ReadMessage(UserPointer<void>(buffer), |
| 307 MakeUserPointer(&buffer_size), 0, nullptr, | 311 MakeUserPointer(&buffer_size), 0, nullptr, |
| 308 MOJO_READ_MESSAGE_FLAG_NONE)); | 312 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 309 | 313 |
| 310 // Close |d1|. | 314 // Close |d1|. |
| 311 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 315 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 312 | 316 |
| 313 // Try waiting for readable on |d0|; should fail (already satisfied). | 317 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 314 w.Init(); | 318 w.Init(); |
| 315 hss = HandleSignalsState(); | 319 hss = HandleSignalsState(); |
| 316 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 320 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 317 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); | 321 d0->AddAwakable(&w, 1, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 318 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 322 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 319 hss.satisfied_signals); | 323 hss.satisfied_signals); |
| 320 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 324 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 321 hss.satisfiable_signals); | 325 hss.satisfiable_signals); |
| 322 | 326 |
| 323 // Read from |d0|. | 327 // Read from |d0|. |
| 324 buffer[0] = 0; | 328 buffer[0] = 0; |
| 325 buffer_size = kBufferSize; | 329 buffer_size = kBufferSize; |
| 326 EXPECT_EQ(MOJO_RESULT_OK, | 330 EXPECT_EQ(MOJO_RESULT_OK, |
| 327 d0->ReadMessage(UserPointer<void>(buffer), | 331 d0->ReadMessage(UserPointer<void>(buffer), |
| 328 MakeUserPointer(&buffer_size), 0, nullptr, | 332 MakeUserPointer(&buffer_size), 0, nullptr, |
| 329 MOJO_READ_MESSAGE_FLAG_NONE)); | 333 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 330 EXPECT_EQ(kBufferSize, buffer_size); | 334 EXPECT_EQ(kBufferSize, buffer_size); |
| 331 EXPECT_EQ(123456789, buffer[0]); | 335 EXPECT_EQ(123456789, buffer[0]); |
| 332 | 336 |
| 333 // Try waiting for readable on |d0|; should fail (already satisfied). | 337 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 334 w.Init(); | 338 w.Init(); |
| 335 hss = HandleSignalsState(); | 339 hss = HandleSignalsState(); |
| 336 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 340 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 337 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); | 341 d0->AddAwakable(&w, 2, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 338 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 342 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 339 hss.satisfied_signals); | 343 hss.satisfied_signals); |
| 340 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 344 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 341 hss.satisfiable_signals); | 345 hss.satisfiable_signals); |
| 342 | 346 |
| 343 // Read again from |d0|. | 347 // Read again from |d0|. |
| 344 buffer[0] = 0; | 348 buffer[0] = 0; |
| 345 buffer_size = kBufferSize; | 349 buffer_size = kBufferSize; |
| 346 EXPECT_EQ(MOJO_RESULT_OK, | 350 EXPECT_EQ(MOJO_RESULT_OK, |
| 347 d0->ReadMessage(UserPointer<void>(buffer), | 351 d0->ReadMessage(UserPointer<void>(buffer), |
| 348 MakeUserPointer(&buffer_size), 0, nullptr, | 352 MakeUserPointer(&buffer_size), 0, nullptr, |
| 349 MOJO_READ_MESSAGE_FLAG_NONE)); | 353 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 350 EXPECT_EQ(kBufferSize, buffer_size); | 354 EXPECT_EQ(kBufferSize, buffer_size); |
| 351 EXPECT_EQ(234567890, buffer[0]); | 355 EXPECT_EQ(234567890, buffer[0]); |
| 352 | 356 |
| 353 // Try waiting for readable on |d0|; should fail (unsatisfiable). | 357 // Try waiting for readable on |d0|; should fail (unsatisfiable). |
| 354 w.Init(); | 358 w.Init(); |
| 355 hss = HandleSignalsState(); | 359 hss = HandleSignalsState(); |
| 356 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 360 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 357 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); | 361 d0->AddAwakable(&w, 3, false, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 358 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 362 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 363 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 360 | 364 |
| 361 // Try waiting for writable on |d0|; should fail (unsatisfiable). | 365 // Try waiting for writable on |d0|; should fail (unsatisfiable). |
| 362 w.Init(); | 366 w.Init(); |
| 363 hss = HandleSignalsState(); | 367 hss = HandleSignalsState(); |
| 364 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 368 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 365 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); | 369 d0->AddAwakable(&w, 4, false, MOJO_HANDLE_SIGNAL_WRITABLE, &hss)); |
| 366 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 370 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 367 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 371 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 368 | 372 |
| 369 // Try reading from |d0|; should fail (nothing to read and other end | 373 // Try reading from |d0|; should fail (nothing to read and other end |
| 370 // closed). | 374 // closed). |
| 371 buffer[0] = 0; | 375 buffer[0] = 0; |
| 372 buffer_size = kBufferSize; | 376 buffer_size = kBufferSize; |
| 373 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 377 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 374 d0->ReadMessage(UserPointer<void>(buffer), | 378 d0->ReadMessage(UserPointer<void>(buffer), |
| 375 MakeUserPointer(&buffer_size), 0, nullptr, | 379 MakeUserPointer(&buffer_size), 0, nullptr, |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 unsigned char buffer[kMaxMessageSize]; | 597 unsigned char buffer[kMaxMessageSize]; |
| 594 Waiter w; | 598 Waiter w; |
| 595 HandleSignalsState hss; | 599 HandleSignalsState hss; |
| 596 MojoResult result; | 600 MojoResult result; |
| 597 | 601 |
| 598 // Read messages. | 602 // Read messages. |
| 599 for (;;) { | 603 for (;;) { |
| 600 // Wait for it to be readable. | 604 // Wait for it to be readable. |
| 601 w.Init(); | 605 w.Init(); |
| 602 hss = HandleSignalsState(); | 606 hss = HandleSignalsState(); |
| 603 result = read_dispatcher_->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, | 607 result = read_dispatcher_->AddAwakable(&w, 0, false, |
| 604 &hss); | 608 MOJO_HANDLE_SIGNAL_READABLE, &hss); |
| 605 EXPECT_TRUE(result == MOJO_RESULT_OK || | 609 EXPECT_TRUE(result == MOJO_RESULT_OK || |
| 606 result == MOJO_RESULT_ALREADY_EXISTS) | 610 result == MOJO_RESULT_ALREADY_EXISTS) |
| 607 << "result: " << result; | 611 << "result: " << result; |
| 608 if (result == MOJO_RESULT_OK) { | 612 if (result == MOJO_RESULT_OK) { |
| 609 // Actually need to wait. | 613 // Actually need to wait. |
| 610 EXPECT_EQ(MOJO_RESULT_OK, | 614 EXPECT_EQ(MOJO_RESULT_OK, |
| 611 w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr, nullptr)); | 615 w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr, nullptr)); |
| 612 read_dispatcher_->RemoveAwakable(&w, &hss); | 616 read_dispatcher_->RemoveAwakable(false, &w, 0, &hss); |
| 613 } | 617 } |
| 614 // We may not actually be readable, since we're racing with other threads. | 618 // We may not actually be readable, since we're racing with other threads. |
| 615 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 619 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 616 | 620 |
| 617 // Now, try to do the read. | 621 // Now, try to do the read. |
| 618 // Clear the buffer so that we can check the result. | 622 // Clear the buffer so that we can check the result. |
| 619 memset(buffer, 0, sizeof(buffer)); | 623 memset(buffer, 0, sizeof(buffer)); |
| 620 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 624 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 621 result = read_dispatcher_->ReadMessage( | 625 result = read_dispatcher_->ReadMessage( |
| 622 UserPointer<void>(buffer), MakeUserPointer(&buffer_size), 0, nullptr, | 626 UserPointer<void>(buffer), MakeUserPointer(&buffer_size), 0, nullptr, |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 EXPECT_EQ(total_messages_written, total_messages_read); | 728 EXPECT_EQ(total_messages_written, total_messages_read); |
| 725 EXPECT_EQ(total_bytes_written, total_bytes_read); | 729 EXPECT_EQ(total_bytes_written, total_bytes_read); |
| 726 | 730 |
| 727 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 731 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
| 728 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 732 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
| 729 } | 733 } |
| 730 | 734 |
| 731 } // namespace | 735 } // namespace |
| 732 } // namespace system | 736 } // namespace system |
| 733 } // namespace mojo | 737 } // namespace mojo |
| OLD | NEW |