| 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/simple_dispatcher.h" | 10 #include "mojo/edk/system/simple_dispatcher.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 namespace mojo { | 33 namespace mojo { |
| 34 namespace system { | 34 namespace system { |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 TEST(SimpleDispatcherTest, Basic) { | 37 TEST(SimpleDispatcherTest, Basic) { |
| 38 Stopwatch stopwatch; | 38 Stopwatch stopwatch; |
| 39 | 39 |
| 40 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); | 40 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); |
| 41 Waiter w; | 41 Waiter w; |
| 42 uint32_t context = 0; | 42 uint64_t context = 0; |
| 43 HandleSignalsState hss; | 43 HandleSignalsState hss; |
| 44 | 44 |
| 45 // Try adding a readable waiter when already readable. | 45 // Try adding a readable waiter when already readable. |
| 46 w.Init(); | 46 w.Init(); |
| 47 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 47 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 48 hss = HandleSignalsState(); | 48 hss = HandleSignalsState(); |
| 49 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 49 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 50 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); | 50 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
| 51 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 51 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 52 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 52 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 hss.satisfiable_signals); | 134 hss.satisfiable_signals); |
| 135 | 135 |
| 136 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 136 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 137 } | 137 } |
| 138 | 138 |
| 139 TEST(SimpleDispatcherTest, BasicUnsatisfiable) { | 139 TEST(SimpleDispatcherTest, BasicUnsatisfiable) { |
| 140 Stopwatch stopwatch; | 140 Stopwatch stopwatch; |
| 141 | 141 |
| 142 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); | 142 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); |
| 143 Waiter w; | 143 Waiter w; |
| 144 uint32_t context = 0; | 144 uint64_t context = 0; |
| 145 HandleSignalsState hss; | 145 HandleSignalsState hss; |
| 146 | 146 |
| 147 // Try adding a writable waiter when it can never be writable. | 147 // Try adding a writable waiter when it can never be writable. |
| 148 w.Init(); | 148 w.Init(); |
| 149 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); | 149 d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 150 d->SetSatisfiedSignals(0); | 150 d->SetSatisfiedSignals(0); |
| 151 hss = HandleSignalsState(); | 151 hss = HandleSignalsState(); |
| 152 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 152 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 153 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); | 153 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); |
| 154 EXPECT_EQ(0u, hss.satisfied_signals); | 154 EXPECT_EQ(0u, hss.satisfied_signals); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); | 207 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
| 208 | 208 |
| 209 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 209 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 210 } | 210 } |
| 211 | 211 |
| 212 TEST(SimpleDispatcherTest, BasicClosed) { | 212 TEST(SimpleDispatcherTest, BasicClosed) { |
| 213 Stopwatch stopwatch; | 213 Stopwatch stopwatch; |
| 214 | 214 |
| 215 RefPtr<test::MockSimpleDispatcher> d; | 215 RefPtr<test::MockSimpleDispatcher> d; |
| 216 Waiter w; | 216 Waiter w; |
| 217 uint32_t context = 0; | 217 uint64_t context = 0; |
| 218 HandleSignalsState hss; | 218 HandleSignalsState hss; |
| 219 | 219 |
| 220 // Try adding a writable waiter when the dispatcher has been closed. | 220 // Try adding a writable waiter when the dispatcher has been closed. |
| 221 d = MakeRefCounted<test::MockSimpleDispatcher>(); | 221 d = MakeRefCounted<test::MockSimpleDispatcher>(); |
| 222 w.Init(); | 222 w.Init(); |
| 223 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 223 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
| 224 hss = HandleSignalsState(); | 224 hss = HandleSignalsState(); |
| 225 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 225 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 226 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); | 226 d->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 1, &hss)); |
| 227 EXPECT_EQ(0u, hss.satisfied_signals); | 227 EXPECT_EQ(0u, hss.satisfied_signals); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 w.Wait(2 * test::EpsilonTimeout(), &context)); | 264 w.Wait(2 * test::EpsilonTimeout(), &context)); |
| 265 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); | 265 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); |
| 266 EXPECT_EQ(4u, context); | 266 EXPECT_EQ(4u, context); |
| 267 // Don't need to remove waiters from closed dispatchers. | 267 // Don't need to remove waiters from closed dispatchers. |
| 268 } | 268 } |
| 269 | 269 |
| 270 TEST(SimpleDispatcherTest, BasicThreaded) { | 270 TEST(SimpleDispatcherTest, BasicThreaded) { |
| 271 Stopwatch stopwatch; | 271 Stopwatch stopwatch; |
| 272 bool did_wait; | 272 bool did_wait; |
| 273 MojoResult result; | 273 MojoResult result; |
| 274 uint32_t context; | 274 uint64_t context; |
| 275 HandleSignalsState hss; | 275 HandleSignalsState hss; |
| 276 | 276 |
| 277 // Wait for readable (already readable). | 277 // Wait for readable (already readable). |
| 278 { | 278 { |
| 279 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); | 279 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); |
| 280 { | 280 { |
| 281 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); | 281 d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE); |
| 282 test::WaiterThread thread(d, MOJO_HANDLE_SIGNAL_READABLE, | 282 test::WaiterThread thread(d, MOJO_HANDLE_SIGNAL_READABLE, |
| 283 MOJO_DEADLINE_INDEFINITE, 1, &did_wait, &result, | 283 MOJO_DEADLINE_INDEFINITE, 1, &did_wait, &result, |
| 284 &context, &hss); | 284 &context, &hss); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 386 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 387 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 387 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 388 hss.satisfiable_signals); | 388 hss.satisfiable_signals); |
| 389 } | 389 } |
| 390 | 390 |
| 391 TEST(SimpleDispatcherTest, MultipleWaiters) { | 391 TEST(SimpleDispatcherTest, MultipleWaiters) { |
| 392 static const uint32_t kNumWaiters = 20; | 392 static const uint32_t kNumWaiters = 20; |
| 393 | 393 |
| 394 bool did_wait[kNumWaiters]; | 394 bool did_wait[kNumWaiters]; |
| 395 MojoResult result[kNumWaiters]; | 395 MojoResult result[kNumWaiters]; |
| 396 uint32_t context[kNumWaiters]; | 396 uint64_t context[kNumWaiters]; |
| 397 HandleSignalsState hss[kNumWaiters]; | 397 HandleSignalsState hss[kNumWaiters]; |
| 398 | 398 |
| 399 // All wait for readable and becomes readable after some time. | 399 // All wait for readable and becomes readable after some time. |
| 400 { | 400 { |
| 401 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); | 401 auto d = MakeRefCounted<test::MockSimpleDispatcher>(); |
| 402 std::vector<std::unique_ptr<test::WaiterThread>> threads; | 402 std::vector<std::unique_ptr<test::WaiterThread>> threads; |
| 403 for (uint32_t i = 0; i < kNumWaiters; i++) { | 403 for (uint32_t i = 0; i < kNumWaiters; i++) { |
| 404 threads.push_back(MakeUnique<test::WaiterThread>( | 404 threads.push_back(MakeUnique<test::WaiterThread>( |
| 405 d, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, i, | 405 d, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, i, |
| 406 &did_wait[i], &result[i], &context[i], &hss[i])); | 406 &did_wait[i], &result[i], &context[i], &hss[i])); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 // Since we closed before joining, we can't say much about what each thread | 528 // Since we closed before joining, we can't say much about what each thread |
| 529 // saw as the state. | 529 // saw as the state. |
| 530 } | 530 } |
| 531 } | 531 } |
| 532 | 532 |
| 533 // TODO(vtl): Stress test? | 533 // TODO(vtl): Stress test? |
| 534 | 534 |
| 535 } // namespace | 535 } // namespace |
| 536 } // namespace system | 536 } // namespace system |
| 537 } // namespace mojo | 537 } // namespace mojo |
| OLD | NEW |