| Index: third_party/WebKit/Source/platform/TimerTest.cpp
|
| diff --git a/third_party/WebKit/Source/platform/TimerTest.cpp b/third_party/WebKit/Source/platform/TimerTest.cpp
|
| index 91c20089b21ffc08dfa7ac90a9ef0927c8c61b1d..51ef4fc941c95acef71738a567014d54213519e1 100644
|
| --- a/third_party/WebKit/Source/platform/TimerTest.cpp
|
| +++ b/third_party/WebKit/Source/platform/TimerTest.cpp
|
| @@ -4,6 +4,9 @@
|
|
|
| #include "platform/Timer.h"
|
|
|
| +#include "platform/scheduler/base/task_queue_impl.h"
|
| +#include "platform/scheduler/child/web_task_runner_impl.h"
|
| +#include "platform/scheduler/renderer/renderer_scheduler_impl.h"
|
| #include "platform/testing/TestingPlatformSupport.h"
|
| #include "public/platform/Platform.h"
|
| #include "public/platform/WebScheduler.h"
|
| @@ -11,6 +14,7 @@
|
| #include "public/platform/WebViewScheduler.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "wtf/CurrentTime.h"
|
| #include "wtf/PtrUtil.h"
|
| #include "wtf/RefCounted.h"
|
| #include <memory>
|
| @@ -20,325 +24,53 @@ using testing::ElementsAre;
|
|
|
| namespace blink {
|
| namespace {
|
| -double gCurrentTimeSecs = 0.0;
|
| -
|
| -class DelayedTask {
|
| -public:
|
| - DelayedTask(WebTaskRunner::Task* task, double delaySeconds)
|
| - : m_task(task)
|
| - , m_runTimeSeconds(gCurrentTimeSecs + delaySeconds)
|
| - , m_delaySeconds(delaySeconds)
|
| - {
|
| - }
|
| -
|
| - bool operator<(const DelayedTask& other) const
|
| - {
|
| - return m_runTimeSeconds > other.m_runTimeSeconds;
|
| - }
|
| -
|
| - void run() const
|
| - {
|
| - m_task->run();
|
| - }
|
| -
|
| - double runTimeSeconds() const
|
| - {
|
| - return m_runTimeSeconds;
|
| - }
|
| -
|
| - double delaySeconds() const
|
| - {
|
| - return m_delaySeconds;
|
| - }
|
| -
|
| -private:
|
| - std::unique_ptr<WebTaskRunner::Task> m_task;
|
| - double m_runTimeSeconds;
|
| - double m_delaySeconds;
|
| -};
|
| -
|
| -class MockWebTaskRunner : public WebTaskRunner {
|
| -public:
|
| - explicit MockWebTaskRunner(std::priority_queue<DelayedTask>* timerTasks) : m_timerTasks(timerTasks) { }
|
| - ~MockWebTaskRunner() override { }
|
| -
|
| - void postTask(const WebTraceLocation&, Task* task) override
|
| - {
|
| - m_timerTasks->push(DelayedTask(task, 0));
|
| - }
|
| -
|
| - void postDelayedTask(const WebTraceLocation&, Task* task, double delayMs) override
|
| - {
|
| - m_timerTasks->push(DelayedTask(task, delayMs * 0.001));
|
| - }
|
| -
|
| - bool runsTasksOnCurrentThread() override
|
| - {
|
| - NOTREACHED();
|
| - return true;
|
| - }
|
| -
|
| - std::unique_ptr<WebTaskRunner> clone() override
|
| - {
|
| - NOTREACHED();
|
| - return nullptr;
|
| - }
|
| -
|
| - double virtualTimeSeconds() const override
|
| - {
|
| - NOTREACHED();
|
| - return 0.0;
|
| - }
|
| -
|
| - double monotonicallyIncreasingVirtualTimeSeconds() const override
|
| - {
|
| - return gCurrentTimeSecs;
|
| - }
|
| -
|
| - base::SingleThreadTaskRunner* taskRunner() override
|
| - {
|
| - ASSERT_NOT_REACHED();
|
| - return nullptr;
|
| - }
|
| -
|
| - std::priority_queue<DelayedTask>* m_timerTasks; // NOT OWNED
|
| -};
|
| -
|
| -class MockWebScheduler : public WebScheduler {
|
| -public:
|
| - MockWebScheduler() : m_timerWebTaskRunner(&m_timerTasks) { }
|
| - ~MockWebScheduler() override { }
|
| -
|
| - bool shouldYieldForHighPriorityWork() override
|
| - {
|
| - return false;
|
| - }
|
| -
|
| - bool canExceedIdleDeadlineIfRequired() override
|
| - {
|
| - return false;
|
| - }
|
| -
|
| - void postIdleTask(const WebTraceLocation&, WebThread::IdleTask*) override
|
| - {
|
| - }
|
| -
|
| - void postNonNestableIdleTask(const WebTraceLocation&, WebThread::IdleTask*) override
|
| - {
|
| - }
|
| -
|
| - void postIdleTaskAfterWakeup(const WebTraceLocation&, WebThread::IdleTask*) override
|
| - {
|
| - }
|
| -
|
| - WebTaskRunner* timerTaskRunner() override
|
| - {
|
| - return &m_timerWebTaskRunner;
|
| - }
|
| -
|
| - WebTaskRunner* loadingTaskRunner() override
|
| - {
|
| - NOTREACHED();
|
| - return nullptr;
|
| - }
|
| -
|
| - void runUntilIdle()
|
| - {
|
| - while (m_timerTasks.size()) {
|
| - gCurrentTimeSecs = m_timerTasks.top().runTimeSeconds();
|
| - m_timerTasks.top().run();
|
| - m_timerTasks.pop();
|
| - }
|
| - }
|
| -
|
| - void runUntilIdleOrDeadlinePassed(double deadline)
|
| - {
|
| - while (m_timerTasks.size()) {
|
| - if (m_timerTasks.top().runTimeSeconds() > deadline) {
|
| - gCurrentTimeSecs = deadline;
|
| - break;
|
| - }
|
| - gCurrentTimeSecs = m_timerTasks.top().runTimeSeconds();
|
| - m_timerTasks.top().run();
|
| - m_timerTasks.pop();
|
| - }
|
| - }
|
| -
|
| - void runPendingTasks()
|
| - {
|
| - while (m_timerTasks.size() && m_timerTasks.top().runTimeSeconds() <= gCurrentTimeSecs) {
|
| - m_timerTasks.top().run();
|
| - m_timerTasks.pop();
|
| - }
|
| - }
|
| -
|
| - bool hasOneTimerTask() const
|
| - {
|
| - return m_timerTasks.size() == 1;
|
| - }
|
| -
|
| - double nextTimerTaskDelaySecs() const
|
| - {
|
| - ASSERT(hasOneTimerTask());
|
| - return m_timerTasks.top().delaySeconds();
|
| - }
|
| -
|
| - void shutdown() override {}
|
| - std::unique_ptr<WebViewScheduler> createWebViewScheduler(InterventionReporter*) override { return nullptr; }
|
| - void suspendTimerQueue() override { }
|
| - void resumeTimerQueue() override { }
|
| - void addPendingNavigation(WebScheduler::NavigatingFrameType) override { }
|
| - void removePendingNavigation(WebScheduler::NavigatingFrameType) override { }
|
| - void onNavigationStarted() override { }
|
| -
|
| -private:
|
| - std::priority_queue<DelayedTask> m_timerTasks;
|
| - MockWebTaskRunner m_timerWebTaskRunner;
|
| -};
|
| -
|
| -class FakeWebThread : public WebThread {
|
| -public:
|
| - FakeWebThread() : m_webScheduler(wrapUnique(new MockWebScheduler())) { }
|
| - ~FakeWebThread() override { }
|
| -
|
| - virtual bool isCurrentThread() const
|
| - {
|
| - NOTREACHED();
|
| - return true;
|
| - }
|
| -
|
| - virtual PlatformThreadId threadId() const
|
| - {
|
| - NOTREACHED();
|
| - return 0;
|
| - }
|
| -
|
| - WebTaskRunner* getWebTaskRunner() override
|
| - {
|
| - NOTREACHED();
|
| - return nullptr;
|
| - }
|
| -
|
| - WebScheduler* scheduler() const override
|
| - {
|
| - return m_webScheduler.get();
|
| - }
|
| -
|
| - virtual void enterRunLoop()
|
| - {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void exitRunLoop()
|
| - {
|
| - NOTREACHED();
|
| - }
|
| -
|
| -private:
|
| - std::unique_ptr<MockWebScheduler> m_webScheduler;
|
| -};
|
| -
|
| -class TimerTestPlatform : public TestingPlatformSupport {
|
| -public:
|
| - TimerTestPlatform()
|
| - : m_webThread(wrapUnique(new FakeWebThread())) { }
|
| - ~TimerTestPlatform() override { }
|
| -
|
| - WebThread* currentThread() override
|
| - {
|
| - return m_webThread.get();
|
| - }
|
| -
|
| - void runUntilIdle()
|
| - {
|
| - mockScheduler()->runUntilIdle();
|
| - }
|
| -
|
| - void runPendingTasks()
|
| - {
|
| - mockScheduler()->runPendingTasks();
|
| - }
|
| -
|
| - void runUntilIdleOrDeadlinePassed(double deadline)
|
| - {
|
| - mockScheduler()->runUntilIdleOrDeadlinePassed(deadline);
|
| - }
|
| -
|
| - bool hasOneTimerTask() const
|
| - {
|
| - return mockScheduler()->hasOneTimerTask();
|
| - }
|
| -
|
| - double nextTimerTaskDelaySecs() const
|
| - {
|
| - return mockScheduler()->nextTimerTaskDelaySecs();
|
| - }
|
| -
|
| -private:
|
| - MockWebScheduler* mockScheduler() const
|
| - {
|
| - return static_cast<MockWebScheduler*>(m_webThread->scheduler());
|
| - }
|
| -
|
| - std::unique_ptr<FakeWebThread> m_webThread;
|
| -};
|
|
|
| class TimerTest : public testing::Test {
|
| public:
|
| void SetUp() override
|
| {
|
| m_runTimes.clear();
|
| - gCurrentTimeSecs = 10.0;
|
| - m_startTime = gCurrentTimeSecs;
|
| + m_platform.advanceClockSeconds(10.0);
|
| + m_startTime = monotonicallyIncreasingTime();
|
| }
|
|
|
| void countingTask(TimerBase*)
|
| {
|
| - m_runTimes.append(gCurrentTimeSecs);
|
| + m_runTimes.append(monotonicallyIncreasingTime());
|
| }
|
|
|
| void recordNextFireTimeTask(TimerBase* timer)
|
| {
|
| - m_nextFireTimes.append(gCurrentTimeSecs + timer->nextFireInterval());
|
| - }
|
| -
|
| - void advanceTimeBy(double timeSecs)
|
| - {
|
| - gCurrentTimeSecs += timeSecs;
|
| - }
|
| -
|
| - void runUntilIdle()
|
| - {
|
| - m_platform.runUntilIdle();
|
| - }
|
| -
|
| - void runPendingTasks()
|
| - {
|
| - m_platform.runPendingTasks();
|
| + m_nextFireTimes.append(monotonicallyIncreasingTime() + timer->nextFireInterval());
|
| }
|
|
|
| - void runUntilIdleOrDeadlinePassed(double deadline)
|
| + void runUntilDeadline(double deadline)
|
| {
|
| - m_platform.runUntilIdleOrDeadlinePassed(deadline);
|
| - }
|
| + double period = deadline - monotonicallyIncreasingTime();
|
| + EXPECT_GE(period, 0.0);
|
| + m_platform.runForPeriodSeconds(period);
|
|
|
| - bool hasOneTimerTask() const
|
| - {
|
| - return m_platform.hasOneTimerTask();
|
| + // We may have stopped before the clock advanced to |deadline|.
|
| + double timeToAdvance = deadline - monotonicallyIncreasingTime();
|
| + m_platform.advanceClockSeconds(timeToAdvance);
|
| }
|
|
|
| - double nextTimerTaskDelaySecs() const
|
| + // Returns false if there are no pending delayed tasks, otherwise sets |time| to
|
| + // the delay in seconds till the next pending delayed task is scheduled to fire.
|
| + bool timeTillNextDelayedTask(double* time) const
|
| {
|
| - return m_platform.nextTimerTaskDelaySecs();
|
| + base::TimeTicks nextRunTime;
|
| + if (!m_platform.rendererScheduler()->TimerTaskRunner()->GetTimeDomain()->NextScheduledRunTime(&nextRunTime))
|
| + return false;
|
| + *time = (nextRunTime - m_platform.rendererScheduler()->TimerTaskRunner()->GetTimeDomain()->Now()).InSecondsF();
|
| + return true;
|
| }
|
|
|
| protected:
|
| double m_startTime;
|
| WTF::Vector<double> m_runTimes;
|
| WTF::Vector<double> m_nextFireTimes;
|
| -
|
| -private:
|
| - TimerTestPlatform m_platform;
|
| + TestingPlatformSupportWithMockScheduler m_platform;
|
| };
|
|
|
| TEST_F(TimerTest, StartOneShot_Zero)
|
| @@ -346,10 +78,10 @@ TEST_F(TimerTest, StartOneShot_Zero)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_FALSE(timeTillNextDelayedTask(&runTime));
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime));
|
| }
|
|
|
| @@ -358,12 +90,12 @@ TEST_F(TimerTest, StartOneShot_ZeroAndCancel)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_FALSE(timeTillNextDelayedTask(&runTime));
|
|
|
| timer.stop();
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_FALSE(m_runTimes.size());
|
| }
|
|
|
| @@ -372,20 +104,19 @@ TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_FALSE(timeTillNextDelayedTask(&runTime));
|
|
|
| timer.stop();
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_FALSE(m_runTimes.size());
|
|
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
|
| + EXPECT_FALSE(timeTillNextDelayedTask(&runTime));
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime));
|
| }
|
|
|
| @@ -394,18 +125,17 @@ TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_FALSE(timeTillNextDelayedTask(&runTime));
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime));
|
|
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
|
| + EXPECT_FALSE(timeTillNextDelayedTask(&runTime));
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime));
|
| }
|
|
|
| @@ -414,10 +144,11 @@ TEST_F(TimerTest, StartOneShot_NonZero)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(10.0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(10.0, runTime);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
|
| }
|
|
|
| @@ -426,12 +157,14 @@ TEST_F(TimerTest, StartOneShot_NonZeroAndCancel)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(10.0, runTime);
|
|
|
| timer.stop();
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_FALSE(m_runTimes.size());
|
| }
|
|
|
| @@ -440,21 +173,23 @@ TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(10.0, runTime);
|
|
|
| timer.stop();
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_FALSE(m_runTimes.size());
|
|
|
| - double secondPostTime = gCurrentTimeSecs;
|
| + double secondPostTime = monotonicallyIncreasingTime();
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(10.0, runTime);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0));
|
| }
|
|
|
| @@ -463,18 +198,19 @@ TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(10.0, runTime);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
|
|
|
| timer.startOneShot(20, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(20.0, nextTimerTaskDelaySecs());
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(20.0, runTime);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0));
|
| }
|
|
|
| @@ -484,10 +220,11 @@ TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing)
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(10.0, runTime);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
|
| }
|
|
|
| @@ -497,7 +234,7 @@ TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask)
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 0.0));
|
| }
|
|
|
| @@ -507,7 +244,7 @@ TEST_F(TimerTest, PostingTimerTwiceWithLaterRunTimeCancelsOriginalTask)
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
|
| }
|
|
|
| @@ -516,10 +253,11 @@ TEST_F(TimerTest, StartRepeatingTask)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startRepeating(1.0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(1.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(1.0, runTime);
|
|
|
| - runUntilIdleOrDeadlinePassed(m_startTime + 5.5);
|
| + runUntilDeadline(m_startTime + 5.5);
|
| EXPECT_THAT(m_runTimes, ElementsAre(
|
| m_startTime + 1.0, m_startTime + 2.0, m_startTime + 3.0, m_startTime + 4.0, m_startTime + 5.0));
|
| }
|
| @@ -529,14 +267,15 @@ TEST_F(TimerTest, StartRepeatingTask_ThenCancel)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startRepeating(1.0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(1.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(1.0, runTime);
|
|
|
| - runUntilIdleOrDeadlinePassed(m_startTime + 2.5);
|
| + runUntilDeadline(m_startTime + 2.5);
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0));
|
|
|
| timer.stop();
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
|
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0));
|
| }
|
| @@ -546,14 +285,15 @@ TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startRepeating(1.0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| - EXPECT_FLOAT_EQ(1.0, nextTimerTaskDelaySecs());
|
| + double runTime;
|
| + EXPECT_TRUE(timeTillNextDelayedTask(&runTime));
|
| + EXPECT_FLOAT_EQ(1.0, runTime);
|
|
|
| - runUntilIdleOrDeadlinePassed(m_startTime + 2.5);
|
| + runUntilDeadline(m_startTime + 2.5);
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0));
|
|
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
|
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, m_startTime + 2.5));
|
| }
|
| @@ -594,7 +334,7 @@ TEST_F(TimerTest, IsActive_AfterRunning_OneShotZero)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_FALSE(timer.isActive());
|
| }
|
|
|
| @@ -603,7 +343,7 @@ TEST_F(TimerTest, IsActive_AfterRunning_OneShotNonZero)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - runUntilIdle();
|
| + m_platform.runUntilIdle();
|
| EXPECT_FALSE(timer.isActive());
|
| }
|
|
|
| @@ -612,7 +352,7 @@ TEST_F(TimerTest, IsActive_AfterRunning_Repeating)
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startRepeating(1.0, BLINK_FROM_HERE);
|
|
|
| - runUntilIdleOrDeadlinePassed(m_startTime + 10);
|
| + runUntilDeadline(m_startTime + 10);
|
| EXPECT_TRUE(timer.isActive()); // It should run until cancelled.
|
| }
|
|
|
| @@ -634,10 +374,12 @@ TEST_F(TimerTest, NextFireInterval_OneShotNonZero)
|
|
|
| TEST_F(TimerTest, NextFireInterval_OneShotNonZero_AfterAFewSeconds)
|
| {
|
| + m_platform.setAutoAdvanceNowToPendingTasks(false);
|
| +
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startOneShot(10, BLINK_FROM_HERE);
|
|
|
| - advanceTimeBy(2.0);
|
| + m_platform.advanceClockSeconds(2.0);
|
| EXPECT_FLOAT_EQ(8.0, timer.nextFireInterval());
|
| }
|
|
|
| @@ -687,24 +429,30 @@ TEST_F(TimerTest, AugmentRepeatInterval)
|
| EXPECT_FLOAT_EQ(10.0, timer.repeatInterval());
|
| EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval());
|
|
|
| - advanceTimeBy(2.0);
|
| + m_platform.advanceClockSeconds(2.0);
|
| timer.augmentRepeatInterval(10);
|
|
|
| EXPECT_FLOAT_EQ(20.0, timer.repeatInterval());
|
| EXPECT_FLOAT_EQ(18.0, timer.nextFireInterval());
|
|
|
| - runUntilIdleOrDeadlinePassed(m_startTime + 50.0);
|
| + // NOTE setAutoAdvanceNowToPendingTasks(true) (which uses cc::OrderedSimpleTaskRunner)
|
| + // results in somewhat strange behavior of the test clock which breaks this test.
|
| + // Specifically the test clock advancing logic ignores newly posted delayed tasks and
|
| + // advances too far.
|
| + runUntilDeadline(m_startTime + 50.0);
|
| EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 20.0, m_startTime + 40.0));
|
| }
|
|
|
| TEST_F(TimerTest, AugmentRepeatInterval_TimerFireDelayed)
|
| {
|
| + m_platform.setAutoAdvanceNowToPendingTasks(false);
|
| +
|
| Timer<TimerTest> timer(this, &TimerTest::countingTask);
|
| timer.startRepeating(10, BLINK_FROM_HERE);
|
| EXPECT_FLOAT_EQ(10.0, timer.repeatInterval());
|
| EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval());
|
|
|
| - advanceTimeBy(123.0); // Make the timer long overdue.
|
| + m_platform.advanceClockSeconds(123.0); // Make the timer long overdue.
|
| timer.augmentRepeatInterval(10);
|
|
|
| EXPECT_FLOAT_EQ(20.0, timer.repeatInterval());
|
| @@ -714,35 +462,24 @@ TEST_F(TimerTest, AugmentRepeatInterval_TimerFireDelayed)
|
|
|
| TEST_F(TimerTest, RepeatingTimerDoesNotDrift)
|
| {
|
| + m_platform.setAutoAdvanceNowToPendingTasks(false);
|
| +
|
| Timer<TimerTest> timer(this, &TimerTest::recordNextFireTimeTask);
|
| timer.startRepeating(2.0, BLINK_FROM_HERE);
|
|
|
| - ASSERT(hasOneTimerTask());
|
| recordNextFireTimeTask(&timer); // Next scheduled task to run at m_startTime + 2.0
|
|
|
| // Simulate timer firing early. Next scheduled task to run at m_startTime + 4.0
|
| - advanceTimeBy(1.9);
|
| - runUntilIdleOrDeadlinePassed(gCurrentTimeSecs + 0.2);
|
| -
|
| - advanceTimeBy(2.0);
|
| - runPendingTasks(); // Next scheduled task to run at m_startTime + 6.0
|
| -
|
| - advanceTimeBy(2.1);
|
| - runPendingTasks(); // Next scheduled task to run at m_startTime + 8.0
|
| -
|
| - advanceTimeBy(2.9);
|
| - runPendingTasks(); // Next scheduled task to run at m_startTime + 10.0
|
| -
|
| - advanceTimeBy(3.1);
|
| - runPendingTasks(); // Next scheduled task to run at m_startTime + 14.0 (skips a beat)
|
| -
|
| - advanceTimeBy(4.0);
|
| - runPendingTasks(); // Next scheduled task to run at m_startTime + 18.0 (skips a beat)
|
| + m_platform.advanceClockSeconds(1.9);
|
| + runUntilDeadline(monotonicallyIncreasingTime() + 0.2);
|
|
|
| - advanceTimeBy(10.0); // Next scheduled task to run at m_startTime + 28.0 (skips 5 beats)
|
| - runPendingTasks();
|
| + m_platform.runForPeriodSeconds(2.0); // Next scheduled task to run at m_startTime + 6.0
|
| + m_platform.runForPeriodSeconds(2.1); // Next scheduled task to run at m_startTime + 8.0
|
| + m_platform.runForPeriodSeconds(2.9); // Next scheduled task to run at m_startTime + 10.0
|
| + m_platform.runForPeriodSeconds(3.1); // Next scheduled task to run at m_startTime + 14.0 (skips a beat)
|
| + m_platform.runForPeriodSeconds(4.0); // Next scheduled task to run at m_startTime + 18.0 (skips a beat)
|
| + m_platform.runForPeriodSeconds(10.0); // Next scheduled task to run at m_startTime + 28.0 (skips 5 beats)
|
|
|
| - runUntilIdleOrDeadlinePassed(m_startTime + 5.5);
|
| EXPECT_THAT(m_nextFireTimes, ElementsAre(
|
| m_startTime + 2.0,
|
| m_startTime + 4.0,
|
| @@ -769,13 +506,13 @@ public:
|
|
|
| TEST_F(TimerTest, UserSuppliedWebTaskRunner)
|
| {
|
| - std::priority_queue<DelayedTask> timerTasks;
|
| - MockWebTaskRunner taskRunner(&timerTasks);
|
| - TimerForTest<TimerTest> timer(&taskRunner, this, &TimerTest::countingTask);
|
| + scoped_refptr<scheduler::TaskQueue> taskRunner(m_platform.rendererScheduler()->NewTimerTaskRunner("test"));
|
| + scheduler::WebTaskRunnerImpl webTaskRunner(taskRunner);
|
| + TimerForTest<TimerTest> timer(&webTaskRunner, this, &TimerTest::countingTask);
|
| timer.startOneShot(0, BLINK_FROM_HERE);
|
|
|
| // Make sure the task was posted on taskRunner.
|
| - EXPECT_FALSE(timerTasks.empty());
|
| + EXPECT_FALSE(taskRunner->IsEmpty());
|
| }
|
|
|
|
|
|
|