| Index: mojo/system/simple_dispatcher_unittest.cc
|
| diff --git a/mojo/system/simple_dispatcher_unittest.cc b/mojo/system/simple_dispatcher_unittest.cc
|
| index 8c23f6cd14ecb474d578e868268e324c21d1f76e..6f232693ab658e1662d121caf4e2b5e44100f14e 100644
|
| --- a/mojo/system/simple_dispatcher_unittest.cc
|
| +++ b/mojo/system/simple_dispatcher_unittest.cc
|
| @@ -3,8 +3,9 @@
|
| // found in the LICENSE file.
|
|
|
| // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a
|
| -// heavily-loaded system). Sorry. |kEpsilonMicros| may be increased to increase
|
| -// tolerance and reduce observed flakiness.
|
| +// heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to
|
| +// increase tolerance and reduce observed flakiness (though doing so reduces the
|
| +// meaningfulness of the test).
|
|
|
| #include "mojo/system/simple_dispatcher.h"
|
|
|
| @@ -24,9 +25,6 @@ namespace mojo {
|
| namespace system {
|
| namespace {
|
|
|
| -const int64_t kMicrosPerMs = 1000;
|
| -const int64_t kEpsilonMicros = 30 * kMicrosPerMs; // 30 ms.
|
| -
|
| class MockSimpleDispatcher : public SimpleDispatcher {
|
| public:
|
| MockSimpleDispatcher()
|
| @@ -93,7 +91,6 @@ class MockSimpleDispatcher : public SimpleDispatcher {
|
|
|
| TEST(SimpleDispatcherTest, Basic) {
|
| test::Stopwatch stopwatch;
|
| - int64_t elapsed_micros;
|
|
|
| scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher());
|
| Waiter w;
|
| @@ -112,8 +109,7 @@ TEST(SimpleDispatcherTest, Basic) {
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_WRITABLE);
|
| stopwatch.Start();
|
| EXPECT_EQ(1, w.Wait(MOJO_DEADLINE_INDEFINITE));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| // Wait for zero time for writable when already writable.
|
| @@ -123,8 +119,7 @@ TEST(SimpleDispatcherTest, Basic) {
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_WRITABLE);
|
| stopwatch.Start();
|
| EXPECT_EQ(2, w.Wait(0));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| // Wait for non-zero, finite time for writable when already writable.
|
| @@ -133,9 +128,8 @@ TEST(SimpleDispatcherTest, Basic) {
|
| EXPECT_EQ(MOJO_RESULT_OK, d->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 3));
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_WRITABLE);
|
| stopwatch.Start();
|
| - EXPECT_EQ(3, w.Wait(2 * kEpsilonMicros));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_EQ(3, w.Wait(2 * test::EpsilonTimeout().InMicroseconds()));
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| // Wait for zero time for writable when not writable (will time out).
|
| @@ -144,8 +138,7 @@ TEST(SimpleDispatcherTest, Basic) {
|
| EXPECT_EQ(MOJO_RESULT_OK, d->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 4));
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| // Wait for non-zero, finite time for writable when not writable (will time
|
| @@ -154,10 +147,11 @@ TEST(SimpleDispatcherTest, Basic) {
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_READABLE);
|
| EXPECT_EQ(MOJO_RESULT_OK, d->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 4));
|
| stopwatch.Start();
|
| - EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(2 * kEpsilonMicros));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros);
|
| - EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
|
| + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
|
| + w.Wait(2 * test::EpsilonTimeout().InMicroseconds()));
|
| + base::TimeDelta elapsed = stopwatch.Elapsed();
|
| + EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout());
|
| + EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| @@ -165,7 +159,6 @@ TEST(SimpleDispatcherTest, Basic) {
|
|
|
| TEST(SimpleDispatcherTest, BasicUnsatisfiable) {
|
| test::Stopwatch stopwatch;
|
| - int64_t elapsed_micros;
|
|
|
| scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher());
|
| Waiter w;
|
| @@ -185,8 +178,7 @@ TEST(SimpleDispatcherTest, BasicUnsatisfiable) {
|
| d->SetSatisfiableFlags(MOJO_WAIT_FLAG_READABLE);
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(MOJO_DEADLINE_INDEFINITE));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| // Wait for zero time for writable and then it becomes never writable.
|
| @@ -196,8 +188,7 @@ TEST(SimpleDispatcherTest, BasicUnsatisfiable) {
|
| d->SetSatisfiableFlags(MOJO_WAIT_FLAG_READABLE);
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(0));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| // Wait for non-zero, finite time for writable and then it becomes never
|
| @@ -207,9 +198,9 @@ TEST(SimpleDispatcherTest, BasicUnsatisfiable) {
|
| EXPECT_EQ(MOJO_RESULT_OK, d->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 7));
|
| d->SetSatisfiableFlags(MOJO_WAIT_FLAG_READABLE);
|
| stopwatch.Start();
|
| - EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, w.Wait(2 * kEpsilonMicros));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
|
| + w.Wait(2 * test::EpsilonTimeout().InMicroseconds()));
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| d->RemoveWaiter(&w);
|
|
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| @@ -217,7 +208,6 @@ TEST(SimpleDispatcherTest, BasicUnsatisfiable) {
|
|
|
| TEST(SimpleDispatcherTest, BasicClosed) {
|
| test::Stopwatch stopwatch;
|
| - int64_t elapsed_micros;
|
|
|
| scoped_refptr<MockSimpleDispatcher> d;
|
| Waiter w;
|
| @@ -237,8 +227,7 @@ TEST(SimpleDispatcherTest, BasicClosed) {
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(MOJO_DEADLINE_INDEFINITE));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| // Don't need to remove waiters from closed dispatchers.
|
|
|
| // Wait for zero time for writable and then the dispatcher is closed.
|
| @@ -248,8 +237,7 @@ TEST(SimpleDispatcherTest, BasicClosed) {
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| stopwatch.Start();
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(0));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| // Don't need to remove waiters from closed dispatchers.
|
|
|
| // Wait for non-zero, finite time for writable and then the dispatcher is
|
| @@ -259,9 +247,9 @@ TEST(SimpleDispatcherTest, BasicClosed) {
|
| EXPECT_EQ(MOJO_RESULT_OK, d->AddWaiter(&w, MOJO_WAIT_FLAG_WRITABLE, 11));
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| stopwatch.Start();
|
| - EXPECT_EQ(MOJO_RESULT_CANCELLED, w.Wait(2 * kEpsilonMicros));
|
| - elapsed_micros = stopwatch.Elapsed();
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
| + EXPECT_EQ(MOJO_RESULT_CANCELLED,
|
| + w.Wait(2 * test::EpsilonTimeout().InMicroseconds()));
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| // Don't need to remove waiters from closed dispatchers.
|
| }
|
|
|
| @@ -269,7 +257,6 @@ TEST(SimpleDispatcherTest, BasicThreaded) {
|
| test::Stopwatch stopwatch;
|
| bool did_wait;
|
| MojoResult result;
|
| - int64_t elapsed_micros;
|
|
|
| // Wait for readable (already readable).
|
| {
|
| @@ -287,10 +274,9 @@ TEST(SimpleDispatcherTest, BasicThreaded) {
|
| // If we closed earlier, then probably we'd get a |MOJO_RESULT_CANCELLED|.
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| }
|
| - elapsed_micros = stopwatch.Elapsed();
|
| + EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
|
| EXPECT_FALSE(did_wait);
|
| EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, result);
|
| - EXPECT_LT(elapsed_micros, kEpsilonMicros);
|
|
|
| // Wait for readable and becomes readable after some time.
|
| {
|
| @@ -302,16 +288,15 @@ TEST(SimpleDispatcherTest, BasicThreaded) {
|
| &did_wait, &result);
|
| stopwatch.Start();
|
| thread.Start();
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_READABLE);
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| } // Joins the thread.
|
| - elapsed_micros = stopwatch.Elapsed();
|
| + base::TimeDelta elapsed = stopwatch.Elapsed();
|
| + EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout());
|
| + EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout());
|
| EXPECT_TRUE(did_wait);
|
| EXPECT_EQ(1, result);
|
| - EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros);
|
| - EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
|
|
|
| // Wait for readable and becomes never-readable after some time.
|
| {
|
| @@ -323,16 +308,15 @@ TEST(SimpleDispatcherTest, BasicThreaded) {
|
| &did_wait, &result);
|
| stopwatch.Start();
|
| thread.Start();
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
|
| d->SetSatisfiableFlags(MOJO_WAIT_FLAG_NONE);
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| } // Joins the thread.
|
| - elapsed_micros = stopwatch.Elapsed();
|
| + elapsed = stopwatch.Elapsed();
|
| + EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout());
|
| + EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout());
|
| EXPECT_TRUE(did_wait);
|
| EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
|
| - EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros);
|
| - EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
|
|
|
| // Wait for readable and dispatcher gets closed.
|
| {
|
| @@ -344,15 +328,14 @@ TEST(SimpleDispatcherTest, BasicThreaded) {
|
| &did_wait, &result);
|
| stopwatch.Start();
|
| thread.Start();
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| } // Joins the thread.
|
| - elapsed_micros = stopwatch.Elapsed();
|
| + elapsed = stopwatch.Elapsed();
|
| + EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout());
|
| + EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout());
|
| EXPECT_TRUE(did_wait);
|
| EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
|
| - EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros);
|
| - EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
|
|
|
| // Wait for readable and times out.
|
| {
|
| @@ -360,24 +343,23 @@ TEST(SimpleDispatcherTest, BasicThreaded) {
|
| {
|
| test::WaiterThread thread(d,
|
| MOJO_WAIT_FLAG_READABLE,
|
| - 2 * kEpsilonMicros,
|
| + 2 * test::EpsilonTimeout().InMicroseconds(),
|
| 4,
|
| &did_wait, &result);
|
| stopwatch.Start();
|
| thread.Start();
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(1 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(1 * test::EpsilonTimeout());
|
| // Not what we're waiting for.
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_WRITABLE);
|
| } // Joins the thread (after its wait times out).
|
| // If we closed earlier, then probably we'd get a |MOJO_RESULT_CANCELLED|.
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| }
|
| - elapsed_micros = stopwatch.Elapsed();
|
| + elapsed = stopwatch.Elapsed();
|
| + EXPECT_GT(elapsed, (2-1) * test::EpsilonTimeout());
|
| + EXPECT_LT(elapsed, (2+1) * test::EpsilonTimeout());
|
| EXPECT_TRUE(did_wait);
|
| EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, result);
|
| - EXPECT_GT(elapsed_micros, (2-1) * kEpsilonMicros);
|
| - EXPECT_LT(elapsed_micros, (2+1) * kEpsilonMicros);
|
| }
|
|
|
| TEST(SimpleDispatcherTest, MultipleWaiters) {
|
| @@ -398,8 +380,7 @@ TEST(SimpleDispatcherTest, MultipleWaiters) {
|
| &did_wait[i], &result[i]));
|
| threads.back()->Start();
|
| }
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_READABLE);
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| } // Joins the threads.
|
| @@ -429,8 +410,7 @@ TEST(SimpleDispatcherTest, MultipleWaiters) {
|
| &did_wait[i], &result[i]));
|
| threads.back()->Start();
|
| }
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_READABLE);
|
| // This will wake up the ones waiting to write.
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| @@ -465,11 +445,9 @@ TEST(SimpleDispatcherTest, MultipleWaiters) {
|
| &did_wait[i], &result[i]));
|
| threads.back()->Start();
|
| }
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(1 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(1 * test::EpsilonTimeout());
|
| d->SetSatisfiableFlags(MOJO_WAIT_FLAG_READABLE);
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(1 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(1 * test::EpsilonTimeout());
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_READABLE);
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
| } // Joins the threads.
|
| @@ -488,23 +466,24 @@ TEST(SimpleDispatcherTest, MultipleWaiters) {
|
| scoped_refptr<MockSimpleDispatcher> d(new MockSimpleDispatcher());
|
| ScopedVector<test::WaiterThread> threads;
|
| for (size_t i = 0; i < kNumWaiters / 2; i++) {
|
| - threads.push_back(new test::WaiterThread(d,
|
| - MOJO_WAIT_FLAG_READABLE,
|
| - 3 * kEpsilonMicros,
|
| - static_cast<MojoResult>(i),
|
| - &did_wait[i], &result[i]));
|
| + threads.push_back(
|
| + new test::WaiterThread(d,
|
| + MOJO_WAIT_FLAG_READABLE,
|
| + 3 * test::EpsilonTimeout().InMicroseconds(),
|
| + static_cast<MojoResult>(i),
|
| + &did_wait[i], &result[i]));
|
| threads.back()->Start();
|
| }
|
| for (size_t i = kNumWaiters / 2; i < kNumWaiters; i++) {
|
| - threads.push_back(new test::WaiterThread(d,
|
| - MOJO_WAIT_FLAG_WRITABLE,
|
| - 1 * kEpsilonMicros,
|
| - static_cast<MojoResult>(i),
|
| - &did_wait[i], &result[i]));
|
| + threads.push_back(
|
| + new test::WaiterThread(d,
|
| + MOJO_WAIT_FLAG_WRITABLE,
|
| + 1 * test::EpsilonTimeout().InMicroseconds(),
|
| + static_cast<MojoResult>(i),
|
| + &did_wait[i], &result[i]));
|
| threads.back()->Start();
|
| }
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMicroseconds(2 * kEpsilonMicros));
|
| + base::PlatformThread::Sleep(2 * test::EpsilonTimeout());
|
| d->SetSatisfiedFlags(MOJO_WAIT_FLAG_READABLE);
|
| // All those waiting for writable should have timed out.
|
| EXPECT_EQ(MOJO_RESULT_OK, d->Close());
|
|
|