| 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/system/message_pipe_dispatcher.h" | 10 #include "mojo/system/message_pipe_dispatcher.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 // Try adding a readable waiter when already readable (from above). | 75 // Try adding a readable waiter when already readable (from above). |
| 76 w.Init(); | 76 w.Init(); |
| 77 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 77 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 78 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); | 78 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); |
| 79 // Shouldn't need to remove the waiter (it was not added). | 79 // Shouldn't need to remove the waiter (it was not added). |
| 80 | 80 |
| 81 // Make |d0| no longer readable (by reading from it). | 81 // Make |d0| no longer readable (by reading from it). |
| 82 buffer[0] = 0; | 82 buffer[0] = 0; |
| 83 buffer_size = kBufferSize; | 83 buffer_size = kBufferSize; |
| 84 EXPECT_EQ(MOJO_RESULT_OK, | 84 EXPECT_EQ(MOJO_RESULT_OK, |
| 85 d0->ReadMessage(buffer, &buffer_size, | 85 d0->ReadMessage(UserPointer<void>(buffer), |
| 86 0, NULL, | 86 MakeUserPointer(&buffer_size), 0, NULL, |
| 87 MOJO_READ_MESSAGE_FLAG_NONE)); | 87 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 88 EXPECT_EQ(kBufferSize, buffer_size); | 88 EXPECT_EQ(kBufferSize, buffer_size); |
| 89 EXPECT_EQ(123456789, buffer[0]); | 89 EXPECT_EQ(123456789, buffer[0]); |
| 90 | 90 |
| 91 // Wait for zero time for readability on |d0| (will time out). | 91 // Wait for zero time for readability on |d0| (will time out). |
| 92 w.Init(); | 92 w.Init(); |
| 93 ASSERT_EQ(MOJO_RESULT_OK, | 93 ASSERT_EQ(MOJO_RESULT_OK, |
| 94 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); | 94 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); |
| 95 stopwatch.Start(); | 95 stopwatch.Start(); |
| 96 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, NULL)); | 96 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, NULL)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 132 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 133 d0->WriteMessage(NULL, 1, | 133 d0->WriteMessage(NULL, 1, |
| 134 NULL, | 134 NULL, |
| 135 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 135 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 136 // Huge buffer size. | 136 // Huge buffer size. |
| 137 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 137 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 138 d0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), | 138 d0->WriteMessage(buffer, std::numeric_limits<uint32_t>::max(), |
| 139 NULL, | 139 NULL, |
| 140 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 140 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 141 | 141 |
| 142 // |ReadMessage|: | |
| 143 // Null buffer with nonzero buffer size. | |
| 144 uint32_t buffer_size = 1; | |
| 145 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | |
| 146 d0->ReadMessage(NULL, &buffer_size, | |
| 147 0, NULL, | |
| 148 MOJO_READ_MESSAGE_FLAG_NONE)); | |
| 149 | |
| 150 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 142 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 151 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 143 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 152 } | 144 } |
| 153 | 145 |
| 154 // Test what happens when one end is closed (single-threaded test). | 146 // Test what happens when one end is closed (single-threaded test). |
| 155 TEST(MessagePipeDispatcherTest, BasicClosed) { | 147 TEST(MessagePipeDispatcherTest, BasicClosed) { |
| 156 int32_t buffer[1]; | 148 int32_t buffer[1]; |
| 157 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 149 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 158 uint32_t buffer_size; | 150 uint32_t buffer_size; |
| 159 | 151 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 184 | 176 |
| 185 // Try waiting for readable on |d0|; should fail (already satisfied). | 177 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 186 w.Init(); | 178 w.Init(); |
| 187 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 179 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 188 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0)); | 180 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
| 189 | 181 |
| 190 // Try reading from |d1|; should fail (nothing to read). | 182 // Try reading from |d1|; should fail (nothing to read). |
| 191 buffer[0] = 0; | 183 buffer[0] = 0; |
| 192 buffer_size = kBufferSize; | 184 buffer_size = kBufferSize; |
| 193 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 185 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 194 d1->ReadMessage(buffer, &buffer_size, | 186 d1->ReadMessage(UserPointer<void>(buffer), |
| 195 0, NULL, | 187 MakeUserPointer(&buffer_size), 0, NULL, |
| 196 MOJO_READ_MESSAGE_FLAG_NONE)); | 188 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 197 | 189 |
| 198 // Close |d1|. | 190 // Close |d1|. |
| 199 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 191 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 200 | 192 |
| 201 // Try waiting for readable on |d0|; should fail (already satisfied). | 193 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 202 w.Init(); | 194 w.Init(); |
| 203 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 195 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 204 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); | 196 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1)); |
| 205 | 197 |
| 206 // Read from |d0|. | 198 // Read from |d0|. |
| 207 buffer[0] = 0; | 199 buffer[0] = 0; |
| 208 buffer_size = kBufferSize; | 200 buffer_size = kBufferSize; |
| 209 EXPECT_EQ(MOJO_RESULT_OK, | 201 EXPECT_EQ(MOJO_RESULT_OK, |
| 210 d0->ReadMessage(buffer, &buffer_size, | 202 d0->ReadMessage(UserPointer<void>(buffer), |
| 211 0, NULL, | 203 MakeUserPointer(&buffer_size), 0, NULL, |
| 212 MOJO_READ_MESSAGE_FLAG_NONE)); | 204 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 213 EXPECT_EQ(kBufferSize, buffer_size); | 205 EXPECT_EQ(kBufferSize, buffer_size); |
| 214 EXPECT_EQ(123456789, buffer[0]); | 206 EXPECT_EQ(123456789, buffer[0]); |
| 215 | 207 |
| 216 // Try waiting for readable on |d0|; should fail (already satisfied). | 208 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 217 w.Init(); | 209 w.Init(); |
| 218 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 210 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 219 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); | 211 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2)); |
| 220 | 212 |
| 221 // Read again from |d0|. | 213 // Read again from |d0|. |
| 222 buffer[0] = 0; | 214 buffer[0] = 0; |
| 223 buffer_size = kBufferSize; | 215 buffer_size = kBufferSize; |
| 224 EXPECT_EQ(MOJO_RESULT_OK, | 216 EXPECT_EQ(MOJO_RESULT_OK, |
| 225 d0->ReadMessage(buffer, &buffer_size, | 217 d0->ReadMessage(UserPointer<void>(buffer), |
| 226 0, NULL, | 218 MakeUserPointer(&buffer_size), 0, NULL, |
| 227 MOJO_READ_MESSAGE_FLAG_NONE)); | 219 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 228 EXPECT_EQ(kBufferSize, buffer_size); | 220 EXPECT_EQ(kBufferSize, buffer_size); |
| 229 EXPECT_EQ(234567890, buffer[0]); | 221 EXPECT_EQ(234567890, buffer[0]); |
| 230 | 222 |
| 231 // Try waiting for readable on |d0|; should fail (unsatisfiable). | 223 // Try waiting for readable on |d0|; should fail (unsatisfiable). |
| 232 w.Init(); | 224 w.Init(); |
| 233 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 225 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 234 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); | 226 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3)); |
| 235 | 227 |
| 236 // Try waiting for writable on |d0|; should fail (unsatisfiable). | 228 // Try waiting for writable on |d0|; should fail (unsatisfiable). |
| 237 w.Init(); | 229 w.Init(); |
| 238 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 230 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 239 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4)); | 231 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4)); |
| 240 | 232 |
| 241 // Try reading from |d0|; should fail (nothing to read and other end | 233 // Try reading from |d0|; should fail (nothing to read and other end |
| 242 // closed). | 234 // closed). |
| 243 buffer[0] = 0; | 235 buffer[0] = 0; |
| 244 buffer_size = kBufferSize; | 236 buffer_size = kBufferSize; |
| 245 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 237 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 246 d0->ReadMessage(buffer, &buffer_size, | 238 d0->ReadMessage(UserPointer<void>(buffer), |
| 247 0, NULL, | 239 MakeUserPointer(&buffer_size), 0, NULL, |
| 248 MOJO_READ_MESSAGE_FLAG_NONE)); | 240 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 249 | 241 |
| 250 // Try writing to |d0|; should fail (other end closed). | 242 // Try writing to |d0|; should fail (other end closed). |
| 251 buffer[0] = 345678901; | 243 buffer[0] = 345678901; |
| 252 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 244 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 253 d0->WriteMessage(buffer, kBufferSize, | 245 d0->WriteMessage(buffer, kBufferSize, |
| 254 NULL, | 246 NULL, |
| 255 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 247 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 256 | 248 |
| 257 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 249 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 thread.Start(); | 313 thread.Start(); |
| 322 } // Joins the thread. | 314 } // Joins the thread. |
| 323 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 315 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 324 EXPECT_FALSE(did_wait); | 316 EXPECT_FALSE(did_wait); |
| 325 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 317 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
| 326 | 318 |
| 327 // Consume what we wrote to |d0|. | 319 // Consume what we wrote to |d0|. |
| 328 buffer[0] = 0; | 320 buffer[0] = 0; |
| 329 buffer_size = kBufferSize; | 321 buffer_size = kBufferSize; |
| 330 EXPECT_EQ(MOJO_RESULT_OK, | 322 EXPECT_EQ(MOJO_RESULT_OK, |
| 331 d1->ReadMessage(buffer, &buffer_size, | 323 d1->ReadMessage(UserPointer<void>(buffer), |
| 332 0, NULL, | 324 MakeUserPointer(&buffer_size), 0, NULL, |
| 333 MOJO_READ_MESSAGE_FLAG_NONE)); | 325 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 334 EXPECT_EQ(kBufferSize, buffer_size); | 326 EXPECT_EQ(kBufferSize, buffer_size); |
| 335 EXPECT_EQ(123456789, buffer[0]); | 327 EXPECT_EQ(123456789, buffer[0]); |
| 336 | 328 |
| 337 // Wait for readable on |d1| and close |d0| after some time, which should | 329 // Wait for readable on |d1| and close |d0| after some time, which should |
| 338 // cancel that wait. | 330 // cancel that wait. |
| 339 { | 331 { |
| 340 test::WaiterThread thread(d1, | 332 test::WaiterThread thread(d1, |
| 341 MOJO_HANDLE_SIGNAL_READABLE, | 333 MOJO_HANDLE_SIGNAL_READABLE, |
| 342 MOJO_DEADLINE_INDEFINITE, | 334 MOJO_DEADLINE_INDEFINITE, |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 if (result == MOJO_RESULT_OK) { | 474 if (result == MOJO_RESULT_OK) { |
| 483 // Actually need to wait. | 475 // Actually need to wait. |
| 484 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, NULL)); | 476 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, NULL)); |
| 485 read_dispatcher_->RemoveWaiter(&w); | 477 read_dispatcher_->RemoveWaiter(&w); |
| 486 } | 478 } |
| 487 | 479 |
| 488 // Now, try to do the read. | 480 // Now, try to do the read. |
| 489 // Clear the buffer so that we can check the result. | 481 // Clear the buffer so that we can check the result. |
| 490 memset(buffer, 0, sizeof(buffer)); | 482 memset(buffer, 0, sizeof(buffer)); |
| 491 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 483 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
| 492 result = read_dispatcher_->ReadMessage(buffer, &buffer_size, | 484 result = read_dispatcher_->ReadMessage(UserPointer<void>(buffer), |
| 493 0, NULL, | 485 MakeUserPointer(&buffer_size), 0, |
| 494 MOJO_READ_MESSAGE_FLAG_NONE); | 486 NULL, MOJO_READ_MESSAGE_FLAG_NONE); |
| 495 EXPECT_TRUE(result == MOJO_RESULT_OK || | 487 EXPECT_TRUE(result == MOJO_RESULT_OK || |
| 496 result == MOJO_RESULT_SHOULD_WAIT) << "result: " << result; | 488 result == MOJO_RESULT_SHOULD_WAIT) << "result: " << result; |
| 497 // We're racing with others to read, so maybe we failed. | 489 // We're racing with others to read, so maybe we failed. |
| 498 if (result == MOJO_RESULT_SHOULD_WAIT) | 490 if (result == MOJO_RESULT_SHOULD_WAIT) |
| 499 continue; // In which case, try again. | 491 continue; // In which case, try again. |
| 500 // Check for quit. | 492 // Check for quit. |
| 501 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) | 493 if (buffer_size == 4 && memcmp("quit", buffer, 4) == 0) |
| 502 return; | 494 return; |
| 503 EXPECT_GE(buffer_size, 1u); | 495 EXPECT_GE(buffer_size, 1u); |
| 504 EXPECT_LE(buffer_size, kMaxMessageSize); | 496 EXPECT_LE(buffer_size, kMaxMessageSize); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 EXPECT_EQ(total_messages_written, total_messages_read); | 587 EXPECT_EQ(total_messages_written, total_messages_read); |
| 596 EXPECT_EQ(total_bytes_written, total_bytes_read); | 588 EXPECT_EQ(total_bytes_written, total_bytes_read); |
| 597 | 589 |
| 598 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 590 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
| 599 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 591 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
| 600 } | 592 } |
| 601 | 593 |
| 602 } // namespace | 594 } // namespace |
| 603 } // namespace system | 595 } // namespace system |
| 604 } // namespace mojo | 596 } // namespace mojo |
| OLD | NEW |