Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: Source/platform/scheduler/SchedulerTest.cpp

Issue 656463004: Use the scheduling mechanism provided by the platform (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Mike's comments. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/scheduler/Scheduler.cpp ('k') | Source/platform/scheduler/TracedTask.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "config.h" 5 #include "config.h"
6 #include "platform/scheduler/Scheduler.h" 6 #include "platform/scheduler/Scheduler.h"
7 7
8 #include "platform/RuntimeEnabledFeatures.h" 8 #include "platform/RuntimeEnabledFeatures.h"
9 #include "platform/TestingPlatformSupport.h" 9 #include "platform/TestingPlatformSupport.h"
10 #include "platform/TraceLocation.h" 10 #include "platform/TraceLocation.h"
11 #include "public/platform/Platform.h" 11 #include "public/platform/Platform.h"
12 #include "public/platform/WebThread.h" 12 #include "public/platform/WebScheduler.h"
13 13
14 #include <gmock/gmock.h> 14 #include <gmock/gmock.h>
15 #include <gtest/gtest.h> 15 #include <gtest/gtest.h>
16 #include <string> 16 #include <string>
17 #include <vector> 17 #include <vector>
18 18
19 using blink::Scheduler; 19 using blink::Scheduler;
20 using blink::WebScheduler;
21 using blink::WebTraceLocation;
20 22
21 namespace { 23 namespace {
22 24
23 class SchedulerForTest : public blink::Scheduler { 25 class SchedulerForTest : public Scheduler {
24 public: 26 public:
25 static void initializeOnMainThread() 27 SchedulerForTest(WebScheduler* webScheduler):
28 Scheduler(webScheduler)
26 { 29 {
27 s_sharedScheduler = new SchedulerForTest();
28 } 30 }
29
30 using Scheduler::Normal;
31 using Scheduler::CompositorPriority;
32 using Scheduler::enterSchedulerPolicy;
33 }; 31 };
34 32
35 class TestMainThread : public blink::WebThread { 33 class WebSchedulerForTest : public WebScheduler {
36 public: 34 public:
37 // blink::WebThread implementation. 35 WebSchedulerForTest()
38 virtual void postTask(Task* task) override 36 : m_shouldYieldForHighPriorityWork(false)
39 { 37 , m_didShutdown(false)
40 m_pendingTasks.append(adoptPtr(task));
41 }
42
43 virtual void postDelayedTask(Task* task, long long delayMs) override
44 {
45 ASSERT_NOT_REACHED();
46 }
47
48 virtual bool isCurrentThread() const override
49 {
50 return true;
51 }
52
53 virtual blink::PlatformThreadId threadId() const override
54 {
55 ASSERT_NOT_REACHED();
56 return 0;
57 }
58
59 virtual void enterRunLoop() override
60 {
61 ASSERT_NOT_REACHED();
62 }
63
64 virtual void exitRunLoop() override
65 {
66 ASSERT_NOT_REACHED();
67 }
68
69 void runPendingTasks()
70 {
71 while (!m_pendingTasks.isEmpty())
72 m_pendingTasks.takeFirst()->run();
73 }
74
75 size_t numPendingMainThreadTasks() const
76 {
77 return m_pendingTasks.size();
78 }
79
80 private:
81 WTF::Deque<OwnPtr<Task> > m_pendingTasks;
82 };
83
84 class SchedulerTestingPlatformSupport : blink::TestingPlatformSupport {
85 public:
86 SchedulerTestingPlatformSupport()
87 : TestingPlatformSupport(TestingPlatformSupport::Config())
88 , m_sharedTimerFunction(nullptr)
89 , m_sharedTimerRunning(false)
90 , m_sharedTimerFireInterval(0)
91 , m_monotonicallyIncreasingTime(0)
92 { 38 {
93 } 39 }
94 40
95 // blink::Platform implementation. 41 // WebScheduler implementation:
96 virtual blink::WebThread* currentThread() override 42 void shutdown() override
97 { 43 {
98 return &m_mainThread; 44 m_didShutdown = true;
99 } 45 }
100 46
101 virtual void setSharedTimerFiredFunction(SharedTimerFunction timerFunction) override 47 bool shouldYieldForHighPriorityWork() override
102 { 48 {
103 m_sharedTimerFunction = timerFunction; 49 return m_shouldYieldForHighPriorityWork;
104 } 50 }
105 51
106 virtual double monotonicallyIncreasingTime() override 52 void postIdleTask(const WebTraceLocation&, IdleTask* task) override
107 { 53 {
108 return m_monotonicallyIncreasingTime; 54 m_latestIdleTask = adoptPtr(task);
109 } 55 }
110 56
111 virtual void setSharedTimerFireInterval(double) 57 bool didShutdown() const
112 { 58 {
113 m_sharedTimerFireInterval = 0; 59 return m_didShutdown;
114 m_sharedTimerRunning = true;
115 } 60 }
116 61
117 virtual void stopSharedTimer() 62 void setShouldYieldForHighPriorityWork(bool shouldYieldForHighPriorityWork)
118 { 63 {
119 m_sharedTimerRunning = false; 64 m_shouldYieldForHighPriorityWork = shouldYieldForHighPriorityWork;
120 } 65 }
121 66
122 void runPendingTasks() 67 void runLatestIdleTask(double deadlineSeconds)
123 { 68 {
124 m_mainThread.runPendingTasks(); 69 m_latestIdleTask->run(deadlineSeconds);
70 m_latestIdleTask.clear();
125 } 71 }
126 72
127 bool sharedTimerRunning() const 73 protected:
128 { 74 bool m_shouldYieldForHighPriorityWork;
129 return m_sharedTimerRunning; 75 bool m_didShutdown;
130 }
131 76
132 double sharedTimerFireInterval() const 77 OwnPtr<WebScheduler::IdleTask> m_latestIdleTask;
133 {
134 return m_sharedTimerFireInterval;
135 }
136
137 void triggerSharedTimer()
138 {
139 m_sharedTimerFunction();
140 }
141
142 size_t numPendingMainThreadTasks() const
143 {
144 return m_mainThread.numPendingMainThreadTasks();
145 }
146
147 void setMonotonicTimeForTest(double time)
148 {
149 m_monotonicallyIncreasingTime = time;
150 }
151
152 private:
153 TestMainThread m_mainThread;
154 SharedTimerFunction m_sharedTimerFunction;
155 bool m_sharedTimerRunning;
156 double m_sharedTimerFireInterval;
157 double m_monotonicallyIncreasingTime;
158 }; 78 };
159 79
160 class SchedulerTest : public testing::Test { 80 class SchedulerTest : public testing::Test {
161 public: 81 public:
162 SchedulerTest() 82 SchedulerTest()
163 : m_reentrantCount(0)
164 , m_maxRecursion(4)
165 { 83 {
166 blink::RuntimeEnabledFeatures::setBlinkSchedulerEnabled(true); 84 blink::RuntimeEnabledFeatures::setBlinkSchedulerEnabled(true);
167 SchedulerForTest::initializeOnMainThread(); 85 m_webScheduler = adoptPtr(new WebSchedulerForTest());
168 m_scheduler = static_cast<SchedulerForTest*>(Scheduler::shared()); 86 m_scheduler = adoptPtr(new SchedulerForTest(m_webScheduler.get()));
169 } 87 }
170 88
171 ~SchedulerTest()
172 {
173 Scheduler::shutdown();
174 }
175
176 virtual void SetUp() override
177 {
178 m_scheduler->enterSchedulerPolicy(SchedulerForTest::Normal);
179 }
180
181 virtual void TearDown() override
182 {
183 // If the Scheduler hasn't been shut down then explicitly flush the task s.
184 if (Scheduler::shared())
185 runPendingTasks();
186 }
187
188 void runPendingTasks()
189 {
190 m_platformSupport.runPendingTasks();
191 }
192
193 void enableIdleTasks()
194 {
195 m_platformSupport.setMonotonicTimeForTest(0);
196 m_scheduler->willBeginFrame(1);
197 m_scheduler->didCommitFrameToCompositor();
198 }
199
200 void appendToVector(std::string value)
201 {
202 m_order.push_back(value);
203 }
204
205 void appendToVectorIdleTask(std::string value, double deadline)
206 {
207 appendToVector(value);
208 }
209
210 void appendToVectorReentrantTask()
211 {
212 m_reentrantOrder.push_back(m_reentrantCount++);
213
214 if (m_reentrantCount > m_maxRecursion)
215 return;
216 Scheduler::shared()->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appen dToVectorReentrantTask, this));
217 }
218
219 void appendToVectorReentrantInputTask()
220 {
221 m_reentrantOrder.push_back(m_reentrantCount++);
222
223 if (m_reentrantCount > m_maxRecursion)
224 return;
225 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendTo VectorReentrantInputTask, this));
226 }
227
228 void appendToVectorReentrantCompositorTask()
229 {
230 m_reentrantOrder.push_back(m_reentrantCount++);
231
232 if (m_reentrantCount > m_maxRecursion)
233 return;
234 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::app endToVectorReentrantCompositorTask, this));
235 }
236 protected: 89 protected:
237 SchedulerTestingPlatformSupport m_platformSupport; 90 OwnPtr<WebSchedulerForTest> m_webScheduler;
238 SchedulerForTest* m_scheduler; 91 OwnPtr<SchedulerForTest> m_scheduler;
239 std::vector<std::string> m_order;
240 std::vector<int> m_reentrantOrder;
241 int m_reentrantCount;
242 int m_maxRecursion;
243 }; 92 };
244 93
245 void orderedTestTask(int value, int* result) 94 TEST_F(SchedulerTest, TestShutdown)
246 { 95 {
247 *result = (*result << 4) | value; 96 EXPECT_FALSE(m_webScheduler->didShutdown());
97 m_scheduler.clear();
98 EXPECT_TRUE(m_webScheduler->didShutdown());
248 } 99 }
249 100
250 void unorderedTestTask(int value, int* result) 101 TEST_F(SchedulerTest, TestShouldYield)
251 { 102 {
252 *result += value;
253 }
254
255 void idleTestTask(bool* taskRun, double expectedDeadline, double deadlineSeconds )
256 {
257 EXPECT_FALSE(*taskRun);
258 EXPECT_EQ(expectedDeadline, deadlineSeconds);
259 *taskRun = true;
260 }
261
262 void repostingIdleTestTask(Scheduler* scheduler, int* runCount, double deadlineS econds)
263 {
264 if (*runCount == 0)
265 scheduler->postIdleTask(FROM_HERE, WTF::bind<double>(&repostingIdleTestT ask, scheduler, runCount));
266 (*runCount)++;
267 }
268
269 TEST_F(SchedulerTest, TestPostTask)
270 {
271 int result = 0;
272 m_scheduler->postTask(FROM_HERE, WTF::bind(&orderedTestTask, 1, &result));
273 m_scheduler->postTask(FROM_HERE, WTF::bind(&orderedTestTask, 2, &result));
274 m_scheduler->postTask(FROM_HERE, WTF::bind(&orderedTestTask, 3, &result));
275 m_scheduler->postTask(FROM_HERE, WTF::bind(&orderedTestTask, 4, &result));
276 runPendingTasks();
277 EXPECT_EQ(0x1234, result);
278 }
279
280 TEST_F(SchedulerTest, TestPostMixedTaskTypes)
281 {
282 int result = 0;
283 m_scheduler->postTask(FROM_HERE, WTF::bind(&unorderedTestTask, 1, &result));
284 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&unorderedTestTask, 2, &resu lt));
285 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&unorderedTestTask, 4, &result));
286 m_scheduler->postTask(FROM_HERE, WTF::bind(&unorderedTestTask, 8, &result));
287 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&unorderedTestTask, 16, &resul t));
288 runPendingTasks();
289 EXPECT_EQ(31, result);
290 }
291
292 int s_sharedTimerTickCount;
293 void sharedTimerFunction()
294 {
295 s_sharedTimerTickCount++;
296 }
297
298 TEST_F(SchedulerTest, TestSharedTimer)
299 {
300 s_sharedTimerTickCount = 0;
301 m_scheduler->setSharedTimerFiredFunction(&sharedTimerFunction);
302 EXPECT_FALSE(m_platformSupport.sharedTimerRunning());
303 m_scheduler->setSharedTimerFireInterval(0);
304 EXPECT_TRUE(m_platformSupport.sharedTimerRunning());
305
306 m_platformSupport.triggerSharedTimer();
307 EXPECT_EQ(1, s_sharedTimerTickCount);
308
309 m_scheduler->stopSharedTimer();
310 EXPECT_FALSE(m_platformSupport.sharedTimerRunning());
311
312 m_scheduler->setSharedTimerFiredFunction(nullptr);
313 EXPECT_FALSE(m_platformSupport.sharedTimerRunning());
314 }
315
316 TEST_F(SchedulerTest, TestIdleTask)
317 {
318 bool taskRun = false;
319 double firstDeadline = 1.1;
320 double secondDeadline = 2.3;
321 m_platformSupport.setMonotonicTimeForTest(0.1);
322
323 m_scheduler->postIdleTask(FROM_HERE, WTF::bind<double>(&idleTestTask, &taskR un, secondDeadline));
324
325 runPendingTasks();
326 EXPECT_FALSE(taskRun); // Shouldn't run yet as no willBeginFrame.
327
328 m_scheduler->willBeginFrame(firstDeadline);
329 runPendingTasks();
330 EXPECT_FALSE(taskRun); // Shouldn't run yet as no didCommitFrameToCompositor .
331
332 m_platformSupport.setMonotonicTimeForTest(firstDeadline + 0.1);
333 m_scheduler->didCommitFrameToCompositor();
334 runPendingTasks();
335 EXPECT_FALSE(taskRun); // We missed the deadline.
336
337 m_scheduler->willBeginFrame(secondDeadline);
338 m_platformSupport.setMonotonicTimeForTest(secondDeadline - 0.1);
339 m_scheduler->didCommitFrameToCompositor();
340 runPendingTasks();
341 EXPECT_TRUE(taskRun);
342 }
343
344 TEST_F(SchedulerTest, TestRepostingIdleTask)
345 {
346 int runCount = 0;
347
348 m_scheduler->postIdleTask(FROM_HERE, WTF::bind<double>(&repostingIdleTestTas k, m_scheduler, &runCount));
349
350 enableIdleTasks();
351 runPendingTasks();
352 EXPECT_EQ(1, runCount);
353
354 runPendingTasks();
355 EXPECT_EQ(1, runCount); // Reposted tasks shouldn't run until next idle peri od.
356
357 enableIdleTasks();
358 runPendingTasks();
359 EXPECT_EQ(2, runCount);
360 }
361
362 TEST_F(SchedulerTest, TestTaskPrioritization_normalPolicy)
363 {
364 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, t his, std::string("L1")));
365 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, t his, std::string("L2")));
366 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("I1")));
367 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("C1")));
368 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("I2")));
369 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("C2")));
370 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector , this, std::string("IPC")));
371
372 runPendingTasks();
373 EXPECT_THAT(m_order, testing::ElementsAre(
374 std::string("L1"), std::string("L2"), std::string("I1"), std::string("C1 "), std::string("I2"), std::string("C2"),
375 std::string("IPC")));
376 }
377
378 TEST_F(SchedulerTest, TestRentrantTask)
379 {
380 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVectorRee ntrantTask, this));
381 runPendingTasks();
382
383 EXPECT_THAT(m_reentrantOrder, testing::ElementsAre(0, 1, 2, 3, 4));
384 }
385
386 TEST_F(SchedulerTest, TestTasksRunAfterShutdown)
387 {
388 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, t his, std::string("1")));
389 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("2")));
390 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("3")));
391 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector , this, std::string("4")));
392 // Idle task should not be run if scheduler is shutdown, but should not cras h when flushed.
393 m_scheduler->postIdleTask(FROM_HERE, WTF::bind<double>(&SchedulerTest::appen dToVectorIdleTask, this, std::string("Not Run")));
394 enableIdleTasks();
395
396 Scheduler::shutdown();
397 EXPECT_TRUE(m_order.empty());
398
399 runPendingTasks();
400 EXPECT_THAT(m_order, testing::ElementsAre(
401 std::string("1"), std::string("2"), std::string("3"), std::string("4"))) ;
402 }
403
404 bool s_shouldContinue;
405 void reentrantInputTask(Scheduler* scheduler)
406 {
407 if (s_shouldContinue)
408 scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantInputTask, sched uler));
409 }
410
411 void reentrantCompositorTask(Scheduler* scheduler)
412 {
413 if (s_shouldContinue)
414 scheduler->postCompositorTask(FROM_HERE, WTF::bind(&reentrantCompositorT ask, scheduler));
415 }
416
417 void stopReentrantTask()
418 {
419 s_shouldContinue = false;
420 }
421
422 TEST_F(SchedulerTest, TestRentrantInputTaskDoesNotStarveOutLowPriorityTask)
423 {
424 s_shouldContinue = true;
425 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantInputTask, m_sched uler));
426 m_scheduler->postTask(FROM_HERE, WTF::bind(&stopReentrantTask));
427
428 // If starvation occurs then this will never exit.
429 runPendingTasks();
430 }
431
432 TEST_F(SchedulerTest, TestRentrantCompositorTaskDoesNotStarveOutLowPriorityTask)
433 {
434 s_shouldContinue = true;
435 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantCompositorTask, m_ scheduler));
436 m_scheduler->postTask(FROM_HERE, WTF::bind(&stopReentrantTask));
437
438 // If starvation occurs then this will never exit.
439 runPendingTasks();
440 }
441
442 int s_dummyTaskCount;
443 void dummyTask()
444 {
445 s_dummyTaskCount++;
446 }
447
448 TEST_F(SchedulerTest, TestMainThreadTaskLifeCycle)
449 {
450 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks());
451
452 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask));
453 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks());
454
455 runPendingTasks();
456 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks());
457
458 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask));
459 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks());
460
461 runPendingTasks();
462 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks());
463 }
464
465 void postDummyInputTask()
466 {
467 Scheduler::shared()->postInputTask(FROM_HERE, WTF::bind(&dummyTask));
468 }
469
470 TEST_F(SchedulerTest, HighPriorityTasksOnlyDontRunBecauseOfSharedTimerFiring_InN ormalMode)
471 {
472 s_dummyTaskCount = 0;
473 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask));
474 // Trigger the posting of an input task during execution of the shared timer function.
475 m_scheduler->setSharedTimerFiredFunction(&postDummyInputTask);
476 m_scheduler->setSharedTimerFireInterval(0);
477 m_platformSupport.triggerSharedTimer();
478
479 EXPECT_EQ(0, s_dummyTaskCount);
480
481 // Clean up.
482 m_scheduler->stopSharedTimer();
483 m_scheduler->setSharedTimerFiredFunction(nullptr);
484 }
485
486 TEST_F(SchedulerTest, TestInputEventDoesNotTriggerShouldYield_InNormalMode)
487 {
488 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask));
489
490 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); 103 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
491 } 104 m_webScheduler->setShouldYieldForHighPriorityWork(true);
492
493 TEST_F(SchedulerTest, TestDidReceiveInputEventDoesNotTriggerShouldYield)
494 {
495 m_scheduler->didReceiveInputEvent();
496
497 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
498 }
499
500 TEST_F(SchedulerTest, TestCompositorTaskDoesNotTriggerShouldYield_InNormalMode)
501 {
502 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask));
503
504 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
505 }
506
507 TEST_F(SchedulerTest, TestIpcTaskDoesNotTriggerShouldYield_InNormalMode)
508 {
509 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&dummyTask));
510
511 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
512 }
513
514 TEST_F(SchedulerTest, TestCompositorTaskDoesTriggerShouldYieldAfterDidReceiveInp utEvent)
515 {
516 m_scheduler->didReceiveInputEvent();
517
518 ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
519 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask));
520
521 EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork()); 105 EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork());
522 } 106 }
523 107
524 TEST_F(SchedulerTest, TestInputTaskDoesTriggerShouldYield_InCompositorPriorityMo de) 108 void idleTestTask(double expectedDeadline, double deadlineSeconds)
525 { 109 {
526 m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); 110 EXPECT_EQ(expectedDeadline, deadlineSeconds);
527 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask));
528
529 EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork());
530 } 111 }
531 112
532 113 TEST_F(SchedulerTest, TestIdleTasks)
533 TEST_F(SchedulerTest, TestCompositorTaskDoesTriggerShouldYield_InCompositorPrior ityMode)
534 { 114 {
535 m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); 115 double deadline = 1.1;
536 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); 116 m_scheduler->postIdleTask(FROM_HERE, WTF::bind<double>(&idleTestTask, deadli ne));
537 117 m_webScheduler->runLatestIdleTask(deadline);
538 EXPECT_TRUE(m_scheduler->shouldYieldForHighPriorityWork());
539 }
540
541 TEST_F(SchedulerTest, TestIpcTaskDoesNotTriggerShouldYield_InCompositorPriorityM ode)
542 {
543 m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority);
544 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&dummyTask));
545
546 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
547 }
548
549 TEST_F(SchedulerTest, testDidReceiveInputEvent_DoesntTriggerLowLatencyModeForLon g)
550 {
551 m_platformSupport.setMonotonicTimeForTest(1000.0);
552
553 // Note the latency mode gets reset by executeHighPriorityTasks, so we need a dummy task here
554 // to make sure runPendingTasks triggers executeHighPriorityTasks.
555 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask));
556 m_scheduler->didReceiveInputEvent();
557 m_platformSupport.setMonotonicTimeForTest(1000.5);
558 runPendingTasks();
559
560 ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
561 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask));
562
563 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork());
564 } 118 }
565 119
566 } // namespace 120 } // namespace
OLDNEW
« no previous file with comments | « Source/platform/scheduler/Scheduler.cpp ('k') | Source/platform/scheduler/TracedTask.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698