Chromium Code Reviews| Index: Source/platform/scheduler/SchedulerTest.cpp |
| diff --git a/Source/platform/scheduler/SchedulerTest.cpp b/Source/platform/scheduler/SchedulerTest.cpp |
| index 40b8a7cc62a6bcea7114b4b316256d28975aca61..2731a83c5af706be03a36a31315f7523389afa05 100644 |
| --- a/Source/platform/scheduler/SchedulerTest.cpp |
| +++ b/Source/platform/scheduler/SchedulerTest.cpp |
| @@ -19,6 +19,18 @@ using blink::Scheduler; |
| namespace { |
| +class SchedulerForTest : public blink::Scheduler { |
| +public: |
| + static void initializeOnMainThread() |
| + { |
| + s_sharedScheduler = new SchedulerForTest(); |
| + } |
| + |
| + using Scheduler::Normal; |
|
Sami
2014/09/11 11:32:18
Neat!
alexclarke
2014/09/11 11:52:05
Acknowledged.
|
| + using Scheduler::CompositorPriority; |
| + using Scheduler::enterSchedulerPolicy; |
| +}; |
| + |
| class TestMainThread : public blink::WebThread { |
| public: |
| // blink::WebThread implementation. |
| @@ -76,6 +88,12 @@ public: |
| , m_sharedTimerRunning(false) |
| , m_sharedTimerFireInterval(0) |
| { |
| + WTF::setMonotonicallyIncreasingTimeFunction(getMonotonicTimeForTest); |
|
Sami
2014/09/11 11:32:19
Drop the "get", it's cleaner :)
Do we actually ne
alexclarke
2014/09/11 11:52:05
Turns out we don't. Nice.
|
| + } |
| + |
| + virtual ~SchedulerTestingPlatformSupport() |
| + { |
| + WTF::setMonotonicallyIncreasingTimeFunction(0); |
| } |
| // blink::Platform implementation. |
| @@ -89,6 +107,11 @@ public: |
| m_sharedTimerFunction = timerFunction; |
| } |
| + virtual double monotonicallyIncreasingTime() OVERRIDE |
| + { |
| + return s_debugTime; |
|
Sami
2014/09/11 11:32:18
nit: also call this s_monotonicallyIncreasingTime.
alexclarke
2014/09/11 11:52:05
Done.
|
| + } |
| + |
| virtual void setSharedTimerFireInterval(double) |
| { |
| m_sharedTimerFireInterval = 0; |
| @@ -125,21 +148,35 @@ public: |
| return m_mainThread.numPendingMainThreadTasks(); |
| } |
| + static void setDebugTime(double time) |
|
Sami
2014/09/11 11:32:18
setMonotonicTimeForTest?
alexclarke
2014/09/11 11:52:05
Done.
|
| + { |
| + s_debugTime = time; |
| + } |
| + |
| private: |
| + static double getMonotonicTimeForTest(void) |
| + { |
| + return s_debugTime; |
| + } |
| + |
| TestMainThread m_mainThread; |
| SharedTimerFunction m_sharedTimerFunction; |
| bool m_sharedTimerRunning; |
| double m_sharedTimerFireInterval; |
| + |
| + static double s_debugTime; |
| }; |
| +double SchedulerTestingPlatformSupport::s_debugTime = 0; |
| + |
| class SchedulerTest : public testing::Test { |
| public: |
| SchedulerTest() |
| : m_reentrantCount(0) |
| , m_maxRecursion(4) |
| { |
| - Scheduler::initializeOnMainThread(); |
| - m_scheduler = Scheduler::shared(); |
| + SchedulerForTest::initializeOnMainThread(); |
| + m_scheduler = static_cast<SchedulerForTest*>(Scheduler::shared()); |
| } |
| ~SchedulerTest() |
| @@ -186,7 +223,7 @@ public: |
| protected: |
| SchedulerTestingPlatformSupport m_platformSupport; |
| - Scheduler* m_scheduler; |
| + SchedulerForTest* m_scheduler; |
| std::vector<std::string> m_order; |
| std::vector<int> m_reentrantOrder; |
| int m_reentrantCount; |
| @@ -266,8 +303,24 @@ TEST_F(SchedulerTest, TestIdleTask) |
| EXPECT_EQ(4, result); |
| } |
| -TEST_F(SchedulerTest, TestTaskPrioritization) |
| +TEST_F(SchedulerTest, TestTaskPrioritization_normalPolicy) |
| { |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::Normal); |
|
Sami
2014/09/11 11:32:18
Instead of doing this in every test, let's add a s
alexclarke
2014/09/11 11:52:05
Done.
|
| + m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("L1"))); |
| + m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("L2"))); |
| + m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("I1"))); |
| + m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("C1"))); |
| + m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("I2"))); |
| + m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("C2"))); |
| + |
| + runPendingTasks(); |
| + EXPECT_THAT(m_order, testing::ElementsAre( |
| + std::string("L1"), std::string("L2"), std::string("I1"), std::string("C1"), std::string("I2"), std::string("C2"))); |
| +} |
| + |
| +TEST_F(SchedulerTest, TestTaskPrioritization_compositorPriorityPolicy) |
| +{ |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); |
| m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("L1"))); |
| m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("L2"))); |
| m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, this, std::string("I1"))); |
| @@ -383,9 +436,27 @@ void postDummyInputTask() |
| Scheduler::shared()->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
| } |
| -TEST_F(SchedulerTest, HighPriorityTasksOnlyRunOncePerSharedTimerFiring) |
| +TEST_F(SchedulerTest, HighPriorityTasksOnlyDontRunBecasueOfSharedTimerFiring_InNormalMode) |
|
Sami
2014/09/11 11:32:18
s/Becasue/Because/
alexclarke
2014/09/11 11:52:05
Done.
|
| { |
| s_dummyTaskCount = 0; |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::Normal); |
| + m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + // Trigger the posting of an input task during execution of the shared timer function. |
| + m_scheduler->setSharedTimerFiredFunction(&postDummyInputTask); |
| + m_scheduler->setSharedTimerFireInterval(0); |
| + m_platformSupport.triggerSharedTimer(); |
| + |
| + EXPECT_EQ(0, s_dummyTaskCount); |
| + |
| + // Clean up. |
| + m_scheduler->stopSharedTimer(); |
| + m_scheduler->setSharedTimerFiredFunction(nullptr); |
| +} |
| + |
| +TEST_F(SchedulerTest, HighPriorityTasksOnlyRunOncePerSharedTimerFiring_InLowSchedulerPolicy) |
| +{ |
| + s_dummyTaskCount = 0; |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); |
| m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
| // Trigger the posting of an input task during execution of the shared timer function. |
| m_scheduler->setSharedTimerFiredFunction(&postDummyInputTask); |
| @@ -399,4 +470,51 @@ TEST_F(SchedulerTest, HighPriorityTasksOnlyRunOncePerSharedTimerFiring) |
| m_scheduler->setSharedTimerFiredFunction(nullptr); |
| } |
| +TEST_F(SchedulerTest, TestInputEventDoesNotTriggerShouldYield_InNormalMode) |
| +{ |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::Normal); |
| + m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + |
| + EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
| +} |
| + |
| +TEST_F(SchedulerTest, TestCompositorEventDoesNotTriggerShouldYield_InNormalMode) |
| +{ |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::Normal); |
| + m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + |
| + EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
| +} |
| + |
| +TEST_F(SchedulerTest, TestInputEventDoesTriggerShouldYield_InLowSchedulerPolicy) |
| +{ |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); |
| + m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + |
| + EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork()); |
| +} |
| + |
| +TEST_F(SchedulerTest, TestCompositorEventDoesTriggerShouldYield_InLowSchedulerPolicy) |
| +{ |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); |
| + m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + |
| + EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork()); |
| +} |
| + |
| +TEST_F(SchedulerTest, TestCompositorEvent_LowSchedulerPolicyDoesntLastLong) |
| +{ |
| + SchedulerTestingPlatformSupport::setDebugTime(1000.0); |
| + |
| + m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); |
| + m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + SchedulerTestingPlatformSupport::setDebugTime(1000.5); |
| + runPendingTasks(); |
| + |
| + ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
| + m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); |
| + |
| + EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
| +} |
| + |
| } // namespace |