| Index: cc/CCDelayBasedTimeSourceTest.cpp
|
| diff --git a/cc/CCDelayBasedTimeSourceTest.cpp b/cc/CCDelayBasedTimeSourceTest.cpp
|
| deleted file mode 100644
|
| index 1819123fae16681f28fdeaa12f1018be4426118b..0000000000000000000000000000000000000000
|
| --- a/cc/CCDelayBasedTimeSourceTest.cpp
|
| +++ /dev/null
|
| @@ -1,379 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "CCDelayBasedTimeSource.h"
|
| -
|
| -#include "CCSchedulerTestCommon.h"
|
| -#include "CCThread.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include <wtf/RefPtr.h>
|
| -
|
| -using namespace cc;
|
| -using namespace WTF;
|
| -using namespace WebKitTests;
|
| -
|
| -namespace {
|
| -
|
| -base::TimeDelta interval()
|
| -{
|
| - return base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / 60);
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSourceTest, TaskPostedAndTickCalled)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| -
|
| - timer->setActive(true);
|
| - EXPECT_TRUE(timer->active());
|
| - EXPECT_TRUE(thread.hasPendingTask());
|
| -
|
| - timer->setNow(timer->now() + base::TimeDelta::FromMilliseconds(16));
|
| - thread.runPendingTask();
|
| - EXPECT_TRUE(timer->active());
|
| - EXPECT_TRUE(client.tickCalled());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, TickNotCalledWithTaskPosted)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - EXPECT_TRUE(thread.hasPendingTask());
|
| - timer->setActive(false);
|
| - thread.runPendingTask();
|
| - EXPECT_FALSE(client.tickCalled());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, StartTwiceEnqueuesOneTask)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - EXPECT_TRUE(thread.hasPendingTask());
|
| - thread.reset();
|
| - timer->setActive(true);
|
| - EXPECT_FALSE(thread.hasPendingTask());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, StartWhenRunningDoesntTick)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - thread.runPendingTask();
|
| - thread.reset();
|
| - timer->setActive(true);
|
| - EXPECT_FALSE(thread.hasPendingTask());
|
| -}
|
| -
|
| -// At 60Hz, when the tick returns at exactly the requested next time, make sure
|
| -// a 16ms next delay is posted.
|
| -TEST(CCDelayBasedTimeSource, NextDelaySaneWhenExactlyOnRequestedTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - timer->setNow(timer->now() + interval());
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -}
|
| -
|
| -// At 60Hz, when the tick returns at slightly after the requested next time, make sure
|
| -// a 16ms next delay is posted.
|
| -TEST(CCDelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - timer->setNow(timer->now() + interval() + base::TimeDelta::FromMicroseconds(1));
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -}
|
| -
|
| -// At 60Hz, when the tick returns at exactly 2*interval after the requested next time, make sure
|
| -// a 16ms next delay is posted.
|
| -TEST(CCDelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - timer->setNow(timer->now() + 2 * interval());
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -}
|
| -
|
| -// At 60Hz, when the tick returns at 2*interval and a bit after the requested next time, make sure
|
| -// a 16ms next delay is posted.
|
| -TEST(CCDelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterTwiceRequestedTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - timer->setNow(timer->now() + 2 * interval() + base::TimeDelta::FromMicroseconds(1));
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -}
|
| -
|
| -// At 60Hz, when the tick returns halfway to the next frame time, make sure
|
| -// a correct next delay value is posted.
|
| -TEST(CCDelayBasedTimeSource, NextDelaySaneWhenHalfAfterRequestedTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - timer->setNow(timer->now() + interval() + base::TimeDelta::FromMilliseconds(8));
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(8, thread.pendingDelayMs());
|
| -}
|
| -
|
| -// If the timebase and interval are updated with a jittery source, we want to
|
| -// make sure we do not double tick.
|
| -TEST(CCDelayBasedTimeSource, SaneHandlingOfJitteryTimebase)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - // Jitter timebase ~1ms late
|
| - timer->setNow(timer->now() + interval());
|
| - timer->setTimebaseAndInterval(timer->now() + base::TimeDelta::FromMilliseconds(1), interval());
|
| - thread.runPendingTask();
|
| -
|
| - // Without double tick prevention, pendingDelayMs would be 1.
|
| - EXPECT_EQ(17, thread.pendingDelayMs());
|
| -
|
| - // Jitter timebase ~1ms early
|
| - timer->setNow(timer->now() + interval());
|
| - timer->setTimebaseAndInterval(timer->now() - base::TimeDelta::FromMilliseconds(1), interval());
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(15, thread.pendingDelayMs());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, HandlesSignificantTimebaseChangesImmediately)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - // Tick, then shift timebase by +7ms.
|
| - timer->setNow(timer->now() + interval());
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - client.reset();
|
| - thread.runPendingTaskOnOverwrite(true);
|
| - base::TimeDelta jitter = base::TimeDelta::FromMilliseconds(7) + base::TimeDelta::FromMicroseconds(1);
|
| - timer->setTimebaseAndInterval(timer->now() + jitter, interval());
|
| - thread.runPendingTaskOnOverwrite(false);
|
| -
|
| - EXPECT_FALSE(client.tickCalled()); // Make sure pending tasks were canceled.
|
| - EXPECT_EQ(7, thread.pendingDelayMs());
|
| -
|
| - // Tick, then shift timebase by -7ms.
|
| - timer->setNow(timer->now() + jitter);
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - client.reset();
|
| - thread.runPendingTaskOnOverwrite(true);
|
| - timer->setTimebaseAndInterval(base::TimeTicks() + interval(), interval());
|
| - thread.runPendingTaskOnOverwrite(false);
|
| -
|
| - EXPECT_FALSE(client.tickCalled()); // Make sure pending tasks were canceled.
|
| - EXPECT_EQ(16-7, thread.pendingDelayMs());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, HanldlesSignificantIntervalChangesImmediately)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| - // Run the first task, as that activates the timer and picks up a timebase.
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - // Tick, then double the interval.
|
| - timer->setNow(timer->now() + interval());
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -
|
| - client.reset();
|
| - thread.runPendingTaskOnOverwrite(true);
|
| - timer->setTimebaseAndInterval(base::TimeTicks() + interval(), interval() * 2);
|
| - thread.runPendingTaskOnOverwrite(false);
|
| -
|
| - EXPECT_FALSE(client.tickCalled()); // Make sure pending tasks were canceled.
|
| - EXPECT_EQ(33, thread.pendingDelayMs());
|
| -
|
| - // Tick, then halve the interval.
|
| - timer->setNow(timer->now() + interval() * 2);
|
| - thread.runPendingTask();
|
| -
|
| - EXPECT_EQ(33, thread.pendingDelayMs());
|
| -
|
| - client.reset();
|
| - thread.runPendingTaskOnOverwrite(true);
|
| - timer->setTimebaseAndInterval(base::TimeTicks() + interval() * 3, interval());
|
| - thread.runPendingTaskOnOverwrite(false);
|
| -
|
| - EXPECT_FALSE(client.tickCalled()); // Make sure pending tasks were canceled.
|
| - EXPECT_EQ(16, thread.pendingDelayMs());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise)
|
| -{
|
| - int numIterations = 10;
|
| -
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true);
|
| -
|
| - double totalFrameTime = 0;
|
| - for (int i = 0; i < numIterations; ++i) {
|
| - long long delayMs = thread.pendingDelayMs();
|
| -
|
| - // accumulate the "delay"
|
| - totalFrameTime += delayMs / 1000.0;
|
| -
|
| - // Run the callback exactly when asked
|
| - timer->setNow(timer->now() + base::TimeDelta::FromMilliseconds(delayMs));
|
| - thread.runPendingTask();
|
| - }
|
| - double averageInterval = totalFrameTime / static_cast<double>(numIterations);
|
| - EXPECT_NEAR(1.0 / 60.0, averageInterval, 0.1);
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, TestDeactivateWhilePending)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| - timer->setActive(true); // Should post a task.
|
| - timer->setActive(false);
|
| - timer.clear();
|
| - thread.runPendingTask(); // Should run the posted task without crashing.
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, TestDeactivateAndReactivateBeforeNextTickTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| -
|
| - // Should run the activate task, and pick up a new timebase.
|
| - timer->setActive(true);
|
| - thread.runPendingTask();
|
| -
|
| - // Stop the timer
|
| - timer->setActive(false);
|
| -
|
| - // Task will be pending anyway, run it
|
| - thread.runPendingTask();
|
| -
|
| - // Start the timer again, but before the next tick time the timer previously
|
| - // planned on using. That same tick time should still be targeted.
|
| - timer->setNow(timer->now() + base::TimeDelta::FromMilliseconds(4));
|
| - timer->setActive(true);
|
| - EXPECT_EQ(12, thread.pendingDelayMs());
|
| -}
|
| -
|
| -TEST(CCDelayBasedTimeSource, TestDeactivateAndReactivateAfterNextTickTime)
|
| -{
|
| - FakeCCThread thread;
|
| - FakeCCTimeSourceClient client;
|
| - RefPtr<FakeCCDelayBasedTimeSource> timer = FakeCCDelayBasedTimeSource::create(interval(), &thread);
|
| - timer->setClient(&client);
|
| -
|
| - // Should run the activate task, and pick up a new timebase.
|
| - timer->setActive(true);
|
| - thread.runPendingTask();
|
| -
|
| - // Stop the timer
|
| - timer->setActive(false);
|
| -
|
| - // Task will be pending anyway, run it
|
| - thread.runPendingTask();
|
| -
|
| - // Start the timer again, but before the next tick time the timer previously
|
| - // planned on using. That same tick time should still be targeted.
|
| - timer->setNow(timer->now() + base::TimeDelta::FromMilliseconds(20));
|
| - timer->setActive(true);
|
| - EXPECT_EQ(13, thread.pendingDelayMs());
|
| -}
|
| -
|
| -}
|
|
|