| 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 11 matching lines...) Expand all Loading... |
| 22 #include "mojo/edk/system/message_pipe.h" | 22 #include "mojo/edk/system/message_pipe.h" |
| 23 #include "mojo/edk/system/test_utils.h" | 23 #include "mojo/edk/system/test_utils.h" |
| 24 #include "mojo/edk/system/waiter.h" | 24 #include "mojo/edk/system/waiter.h" |
| 25 #include "mojo/edk/system/waiter_test_utils.h" | 25 #include "mojo/edk/system/waiter_test_utils.h" |
| 26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 27 | 27 |
| 28 namespace mojo { | 28 namespace mojo { |
| 29 namespace system { | 29 namespace system { |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | |
| 33 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 34 MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
| 35 |
| 32 TEST(MessagePipeDispatcherTest, Basic) { | 36 TEST(MessagePipeDispatcherTest, Basic) { |
| 33 test::Stopwatch stopwatch; | 37 test::Stopwatch stopwatch; |
| 34 int32_t buffer[1]; | 38 int32_t buffer[1]; |
| 35 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 39 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 36 uint32_t buffer_size; | 40 uint32_t buffer_size; |
| 37 | 41 |
| 38 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. | 42 // Run this test both with |d0| as port 0, |d1| as port 1 and vice versa. |
| 39 for (unsigned i = 0; i < 2; i++) { | 43 for (unsigned i = 0; i < 2; i++) { |
| 40 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( | 44 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( |
| 41 MessagePipeDispatcher::kDefaultCreateOptions)); | 45 MessagePipeDispatcher::kDefaultCreateOptions)); |
| 42 EXPECT_EQ(Dispatcher::kTypeMessagePipe, d0->GetType()); | 46 EXPECT_EQ(Dispatcher::kTypeMessagePipe, d0->GetType()); |
| 43 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( | 47 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( |
| 44 MessagePipeDispatcher::kDefaultCreateOptions)); | 48 MessagePipeDispatcher::kDefaultCreateOptions)); |
| 45 { | 49 { |
| 46 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); | 50 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); |
| 47 d0->Init(mp, i); // 0, 1. | 51 d0->Init(mp, i); // 0, 1. |
| 48 d1->Init(mp, i ^ 1); // 1, 0. | 52 d1->Init(mp, i ^ 1); // 1, 0. |
| 49 } | 53 } |
| 50 Waiter w; | 54 Waiter w; |
| 51 uint32_t context = 0; | 55 uint32_t context = 0; |
| 52 HandleSignalsState hss; | 56 HandleSignalsState hss; |
| 53 | 57 |
| 54 // Try adding a writable waiter when already writable. | 58 // Try adding a writable waiter when already writable. |
| 55 w.Init(); | 59 w.Init(); |
| 56 hss = HandleSignalsState(); | 60 hss = HandleSignalsState(); |
| 57 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 61 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 58 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); | 62 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
| 59 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 63 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 60 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 64 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 61 hss.satisfiable_signals); | |
| 62 // Shouldn't need to remove the waiter (it was not added). | 65 // Shouldn't need to remove the waiter (it was not added). |
| 63 | 66 |
| 64 // Add a readable waiter to |d0|, then make it readable (by writing to | 67 // Add a readable waiter to |d0|, then make it readable (by writing to |
| 65 // |d1|), then wait. | 68 // |d1|), then wait. |
| 66 w.Init(); | 69 w.Init(); |
| 67 ASSERT_EQ(MOJO_RESULT_OK, | 70 ASSERT_EQ(MOJO_RESULT_OK, |
| 68 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); | 71 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); |
| 69 buffer[0] = 123456789; | 72 buffer[0] = 123456789; |
| 70 EXPECT_EQ(MOJO_RESULT_OK, | 73 EXPECT_EQ(MOJO_RESULT_OK, |
| 71 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 74 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 72 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 75 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 73 stopwatch.Start(); | 76 stopwatch.Start(); |
| 74 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 77 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 75 EXPECT_EQ(1u, context); | 78 EXPECT_EQ(1u, context); |
| 76 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 79 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 77 hss = HandleSignalsState(); | 80 hss = HandleSignalsState(); |
| 78 d0->RemoveWaiter(&w, &hss); | 81 d0->RemoveWaiter(&w, &hss); |
| 79 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 82 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 80 hss.satisfied_signals); | 83 hss.satisfied_signals); |
| 81 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 84 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 82 hss.satisfiable_signals); | |
| 83 | 85 |
| 84 // Try adding a readable waiter when already readable (from above). | 86 // Try adding a readable waiter when already readable (from above). |
| 85 w.Init(); | 87 w.Init(); |
| 86 hss = HandleSignalsState(); | 88 hss = HandleSignalsState(); |
| 87 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 89 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 88 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); | 90 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); |
| 89 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 90 hss.satisfied_signals); | 92 hss.satisfied_signals); |
| 91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 93 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 92 hss.satisfiable_signals); | |
| 93 // Shouldn't need to remove the waiter (it was not added). | 94 // Shouldn't need to remove the waiter (it was not added). |
| 94 | 95 |
| 95 // Make |d0| no longer readable (by reading from it). | 96 // Make |d0| no longer readable (by reading from it). |
| 96 buffer[0] = 0; | 97 buffer[0] = 0; |
| 97 buffer_size = kBufferSize; | 98 buffer_size = kBufferSize; |
| 98 EXPECT_EQ(MOJO_RESULT_OK, | 99 EXPECT_EQ(MOJO_RESULT_OK, |
| 99 d0->ReadMessage(UserPointer<void>(buffer), | 100 d0->ReadMessage(UserPointer<void>(buffer), |
| 100 MakeUserPointer(&buffer_size), 0, nullptr, | 101 MakeUserPointer(&buffer_size), 0, nullptr, |
| 101 MOJO_READ_MESSAGE_FLAG_NONE)); | 102 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 102 EXPECT_EQ(kBufferSize, buffer_size); | 103 EXPECT_EQ(kBufferSize, buffer_size); |
| 103 EXPECT_EQ(123456789, buffer[0]); | 104 EXPECT_EQ(123456789, buffer[0]); |
| 104 | 105 |
| 105 // Wait for zero time for readability on |d0| (will time out). | 106 // Wait for zero time for readability on |d0| (will time out). |
| 106 w.Init(); | 107 w.Init(); |
| 107 ASSERT_EQ(MOJO_RESULT_OK, | 108 ASSERT_EQ(MOJO_RESULT_OK, |
| 108 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 109 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
| 109 stopwatch.Start(); | 110 stopwatch.Start(); |
| 110 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); | 111 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
| 111 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 112 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 112 hss = HandleSignalsState(); | 113 hss = HandleSignalsState(); |
| 113 d0->RemoveWaiter(&w, &hss); | 114 d0->RemoveWaiter(&w, &hss); |
| 114 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 115 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 115 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 116 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 116 hss.satisfiable_signals); | |
| 117 | 117 |
| 118 // Wait for non-zero, finite time for readability on |d0| (will time out). | 118 // Wait for non-zero, finite time for readability on |d0| (will time out). |
| 119 w.Init(); | 119 w.Init(); |
| 120 ASSERT_EQ(MOJO_RESULT_OK, | 120 ASSERT_EQ(MOJO_RESULT_OK, |
| 121 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); | 121 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); |
| 122 stopwatch.Start(); | 122 stopwatch.Start(); |
| 123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 124 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr)); | 124 w.Wait(2 * test::EpsilonTimeout().InMicroseconds(), nullptr)); |
| 125 base::TimeDelta elapsed = stopwatch.Elapsed(); | 125 base::TimeDelta elapsed = stopwatch.Elapsed(); |
| 126 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 126 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 127 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 127 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 128 hss = HandleSignalsState(); | 128 hss = HandleSignalsState(); |
| 129 d0->RemoveWaiter(&w, &hss); | 129 d0->RemoveWaiter(&w, &hss); |
| 130 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 130 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 131 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 131 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 132 hss.satisfiable_signals); | 132 |
| 133 // Check the peer closed signal. |
| 134 w.Init(); |
| 135 ASSERT_EQ(MOJO_RESULT_OK, |
| 136 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); |
| 137 |
| 138 // Close the peer. |
| 139 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 140 |
| 141 // It should be signaled. |
| 142 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(1000, &context)); |
| 143 EXPECT_EQ(12u, context); |
| 144 hss = HandleSignalsState(); |
| 145 d0->RemoveWaiter(&w, &hss); |
| 146 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 147 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 133 | 148 |
| 134 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 149 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 135 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | |
| 136 } | 150 } |
| 137 } | 151 } |
| 138 | 152 |
| 139 TEST(MessagePipeDispatcherTest, InvalidParams) { | 153 TEST(MessagePipeDispatcherTest, InvalidParams) { |
| 140 char buffer[1]; | 154 char buffer[1]; |
| 141 | 155 |
| 142 scoped_refptr<MessagePipeDispatcher> d0( | 156 scoped_refptr<MessagePipeDispatcher> d0( |
| 143 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); | 157 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); |
| 144 scoped_refptr<MessagePipeDispatcher> d1( | 158 scoped_refptr<MessagePipeDispatcher> d1( |
| 145 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); | 159 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, | 245 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, |
| 232 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 246 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 233 | 247 |
| 234 // Try waiting for readable on |d0|; should fail (already satisfied). | 248 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 235 w.Init(); | 249 w.Init(); |
| 236 hss = HandleSignalsState(); | 250 hss = HandleSignalsState(); |
| 237 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 251 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 238 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 252 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
| 239 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 253 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 240 hss.satisfied_signals); | 254 hss.satisfied_signals); |
| 241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 255 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 242 hss.satisfiable_signals); | |
| 243 | 256 |
| 244 // Try reading from |d1|; should fail (nothing to read). | 257 // Try reading from |d1|; should fail (nothing to read). |
| 245 buffer[0] = 0; | 258 buffer[0] = 0; |
| 246 buffer_size = kBufferSize; | 259 buffer_size = kBufferSize; |
| 247 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 260 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 248 d1->ReadMessage(UserPointer<void>(buffer), | 261 d1->ReadMessage(UserPointer<void>(buffer), |
| 249 MakeUserPointer(&buffer_size), 0, nullptr, | 262 MakeUserPointer(&buffer_size), 0, nullptr, |
| 250 MOJO_READ_MESSAGE_FLAG_NONE)); | 263 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 251 | 264 |
| 252 // Close |d1|. | 265 // Close |d1|. |
| 253 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 266 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 254 | 267 |
| 255 // Try waiting for readable on |d0|; should fail (already satisfied). | 268 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 256 w.Init(); | 269 w.Init(); |
| 257 hss = HandleSignalsState(); | 270 hss = HandleSignalsState(); |
| 258 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 271 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 259 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); | 272 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, &hss)); |
| 260 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 273 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 261 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 274 hss.satisfied_signals); |
| 275 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 276 hss.satisfiable_signals); |
| 262 | 277 |
| 263 // Read from |d0|. | 278 // Read from |d0|. |
| 264 buffer[0] = 0; | 279 buffer[0] = 0; |
| 265 buffer_size = kBufferSize; | 280 buffer_size = kBufferSize; |
| 266 EXPECT_EQ(MOJO_RESULT_OK, | 281 EXPECT_EQ(MOJO_RESULT_OK, |
| 267 d0->ReadMessage(UserPointer<void>(buffer), | 282 d0->ReadMessage(UserPointer<void>(buffer), |
| 268 MakeUserPointer(&buffer_size), 0, nullptr, | 283 MakeUserPointer(&buffer_size), 0, nullptr, |
| 269 MOJO_READ_MESSAGE_FLAG_NONE)); | 284 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 270 EXPECT_EQ(kBufferSize, buffer_size); | 285 EXPECT_EQ(kBufferSize, buffer_size); |
| 271 EXPECT_EQ(123456789, buffer[0]); | 286 EXPECT_EQ(123456789, buffer[0]); |
| 272 | 287 |
| 273 // Try waiting for readable on |d0|; should fail (already satisfied). | 288 // Try waiting for readable on |d0|; should fail (already satisfied). |
| 274 w.Init(); | 289 w.Init(); |
| 275 hss = HandleSignalsState(); | 290 hss = HandleSignalsState(); |
| 276 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 291 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 277 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); | 292 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); |
| 278 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 293 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 279 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 294 hss.satisfied_signals); |
| 295 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 296 hss.satisfiable_signals); |
| 280 | 297 |
| 281 // Read again from |d0|. | 298 // Read again from |d0|. |
| 282 buffer[0] = 0; | 299 buffer[0] = 0; |
| 283 buffer_size = kBufferSize; | 300 buffer_size = kBufferSize; |
| 284 EXPECT_EQ(MOJO_RESULT_OK, | 301 EXPECT_EQ(MOJO_RESULT_OK, |
| 285 d0->ReadMessage(UserPointer<void>(buffer), | 302 d0->ReadMessage(UserPointer<void>(buffer), |
| 286 MakeUserPointer(&buffer_size), 0, nullptr, | 303 MakeUserPointer(&buffer_size), 0, nullptr, |
| 287 MOJO_READ_MESSAGE_FLAG_NONE)); | 304 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 288 EXPECT_EQ(kBufferSize, buffer_size); | 305 EXPECT_EQ(kBufferSize, buffer_size); |
| 289 EXPECT_EQ(234567890, buffer[0]); | 306 EXPECT_EQ(234567890, buffer[0]); |
| 290 | 307 |
| 291 // Try waiting for readable on |d0|; should fail (unsatisfiable). | 308 // Try waiting for readable on |d0|; should fail (unsatisfiable). |
| 292 w.Init(); | 309 w.Init(); |
| 293 hss = HandleSignalsState(); | 310 hss = HandleSignalsState(); |
| 294 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 295 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); | 312 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); |
| 296 EXPECT_EQ(0u, hss.satisfied_signals); | 313 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 297 EXPECT_EQ(0u, hss.satisfiable_signals); | 314 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 298 | 315 |
| 299 // Try waiting for writable on |d0|; should fail (unsatisfiable). | 316 // Try waiting for writable on |d0|; should fail (unsatisfiable). |
| 300 w.Init(); | 317 w.Init(); |
| 301 hss = HandleSignalsState(); | 318 hss = HandleSignalsState(); |
| 302 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 319 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 303 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); | 320 d0->AddWaiter(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); |
| 304 EXPECT_EQ(0u, hss.satisfied_signals); | 321 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 305 EXPECT_EQ(0u, hss.satisfiable_signals); | 322 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 306 | 323 |
| 307 // Try reading from |d0|; should fail (nothing to read and other end | 324 // Try reading from |d0|; should fail (nothing to read and other end |
| 308 // closed). | 325 // closed). |
| 309 buffer[0] = 0; | 326 buffer[0] = 0; |
| 310 buffer_size = kBufferSize; | 327 buffer_size = kBufferSize; |
| 311 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 328 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 312 d0->ReadMessage(UserPointer<void>(buffer), | 329 d0->ReadMessage(UserPointer<void>(buffer), |
| 313 MakeUserPointer(&buffer_size), 0, nullptr, | 330 MakeUserPointer(&buffer_size), 0, nullptr, |
| 314 MOJO_READ_MESSAGE_FLAG_NONE)); | 331 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 315 | 332 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 384 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 368 } // Joins the thread. | 385 } // Joins the thread. |
| 369 elapsed = stopwatch.Elapsed(); | 386 elapsed = stopwatch.Elapsed(); |
| 370 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 387 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 371 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 388 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 372 EXPECT_TRUE(did_wait); | 389 EXPECT_TRUE(did_wait); |
| 373 EXPECT_EQ(MOJO_RESULT_OK, result); | 390 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 374 EXPECT_EQ(1u, context); | 391 EXPECT_EQ(1u, context); |
| 375 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 392 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 376 hss.satisfied_signals); | 393 hss.satisfied_signals); |
| 377 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 394 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 378 hss.satisfiable_signals); | |
| 379 | 395 |
| 380 // Now |d1| is already readable. Try waiting for it again. | 396 // Now |d1| is already readable. Try waiting for it again. |
| 381 { | 397 { |
| 382 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, | 398 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, |
| 383 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result, | 399 MOJO_DEADLINE_INDEFINITE, 2, &did_wait, &result, |
| 384 &context, &hss); | 400 &context, &hss); |
| 385 stopwatch.Start(); | 401 stopwatch.Start(); |
| 386 thread.Start(); | 402 thread.Start(); |
| 387 } // Joins the thread. | 403 } // Joins the thread. |
| 388 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 404 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 389 EXPECT_FALSE(did_wait); | 405 EXPECT_FALSE(did_wait); |
| 390 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 406 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
| 391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 392 hss.satisfied_signals); | 408 hss.satisfied_signals); |
| 393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 409 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 394 hss.satisfiable_signals); | |
| 395 | 410 |
| 396 // Consume what we wrote to |d0|. | 411 // Consume what we wrote to |d0|. |
| 397 buffer[0] = 0; | 412 buffer[0] = 0; |
| 398 buffer_size = kBufferSize; | 413 buffer_size = kBufferSize; |
| 399 EXPECT_EQ(MOJO_RESULT_OK, | 414 EXPECT_EQ(MOJO_RESULT_OK, |
| 400 d1->ReadMessage(UserPointer<void>(buffer), | 415 d1->ReadMessage(UserPointer<void>(buffer), |
| 401 MakeUserPointer(&buffer_size), 0, nullptr, | 416 MakeUserPointer(&buffer_size), 0, nullptr, |
| 402 MOJO_READ_MESSAGE_FLAG_NONE)); | 417 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 403 EXPECT_EQ(kBufferSize, buffer_size); | 418 EXPECT_EQ(kBufferSize, buffer_size); |
| 404 EXPECT_EQ(123456789, buffer[0]); | 419 EXPECT_EQ(123456789, buffer[0]); |
| 405 | 420 |
| 406 // Wait for readable on |d1| and close |d0| after some time, which should | 421 // Wait for readable on |d1| and close |d0| after some time, which should |
| 407 // cancel that wait. | 422 // cancel that wait. |
| 408 { | 423 { |
| 409 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, | 424 test::WaiterThread thread(d1, MOJO_HANDLE_SIGNAL_READABLE, |
| 410 MOJO_DEADLINE_INDEFINITE, 3, &did_wait, &result, | 425 MOJO_DEADLINE_INDEFINITE, 3, &did_wait, &result, |
| 411 &context, &hss); | 426 &context, &hss); |
| 412 stopwatch.Start(); | 427 stopwatch.Start(); |
| 413 thread.Start(); | 428 thread.Start(); |
| 414 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); | 429 base::PlatformThread::Sleep(2 * test::EpsilonTimeout()); |
| 415 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); | 430 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); |
| 416 } // Joins the thread. | 431 } // Joins the thread. |
| 417 elapsed = stopwatch.Elapsed(); | 432 elapsed = stopwatch.Elapsed(); |
| 418 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); | 433 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); |
| 419 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); | 434 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); |
| 420 EXPECT_TRUE(did_wait); | 435 EXPECT_TRUE(did_wait); |
| 421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 436 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 422 EXPECT_EQ(3u, context); | 437 EXPECT_EQ(3u, context); |
| 423 EXPECT_EQ(0u, hss.satisfied_signals); | 438 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 424 EXPECT_EQ(0u, hss.satisfiable_signals); | 439 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 425 | 440 |
| 426 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 441 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
| 427 } | 442 } |
| 428 | 443 |
| 429 for (unsigned i = 0; i < 2; i++) { | 444 for (unsigned i = 0; i < 2; i++) { |
| 430 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( | 445 scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher( |
| 431 MessagePipeDispatcher::kDefaultCreateOptions)); | 446 MessagePipeDispatcher::kDefaultCreateOptions)); |
| 432 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( | 447 scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher( |
| 433 MessagePipeDispatcher::kDefaultCreateOptions)); | 448 MessagePipeDispatcher::kDefaultCreateOptions)); |
| 434 { | 449 { |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 EXPECT_EQ(total_messages_written, total_messages_read); | 682 EXPECT_EQ(total_messages_written, total_messages_read); |
| 668 EXPECT_EQ(total_bytes_written, total_bytes_read); | 683 EXPECT_EQ(total_bytes_written, total_bytes_read); |
| 669 | 684 |
| 670 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); | 685 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); |
| 671 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); | 686 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); |
| 672 } | 687 } |
| 673 | 688 |
| 674 } // namespace | 689 } // namespace |
| 675 } // namespace system | 690 } // namespace system |
| 676 } // namespace mojo | 691 } // namespace mojo |
| OLD | NEW |