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

Side by Side Diff: third_party/WebKit/Source/platform/TimerTest.cpp

Issue 1373503002: Fix the drift in repeating timers (try #2) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rename some variables and add a todo Created 5 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/Timer.h" 6 #include "platform/Timer.h"
7 7
8 #include "public/platform/Platform.h" 8 #include "public/platform/Platform.h"
9 #include "public/platform/WebScheduler.h" 9 #include "public/platform/WebScheduler.h"
10 #include "public/platform/WebThread.h" 10 #include "public/platform/WebThread.h"
(...skipping 23 matching lines...) Expand all
34 { 34 {
35 m_task->run(); 35 m_task->run();
36 } 36 }
37 37
38 private: 38 private:
39 OwnPtr<WebTaskRunner::Task> m_task; 39 OwnPtr<WebTaskRunner::Task> m_task;
40 }; 40 };
41 41
42 class DelayedTask { 42 class DelayedTask {
43 public: 43 public:
44 DelayedTask(WebTaskRunner::Task* task, long long delayMs) 44 DelayedTask(WebTaskRunner::Task* task, double delaySeconds)
45 : m_task(adoptRef(new RefCountedTaskContainer(task))) 45 : m_task(adoptRef(new RefCountedTaskContainer(task)))
46 , m_runTimeSecs(monotonicallyIncreasingTime() + 0.001 * static_cast<doub le>(delayMs)) 46 , m_runTimeSeconds(monotonicallyIncreasingTime() + delaySeconds)
47 , m_delayMs(delayMs) { } 47 , m_delaySeconds(delaySeconds) { }
48 48
49 bool operator<(const DelayedTask& other) const 49 bool operator<(const DelayedTask& other) const
50 { 50 {
51 return m_runTimeSecs > other.m_runTimeSecs; 51 return m_runTimeSeconds > other.m_runTimeSeconds;
52 } 52 }
53 53
54 void run() const 54 void run() const
55 { 55 {
56 m_task->run(); 56 m_task->run();
57 } 57 }
58 58
59 double runTimeSecs() const 59 double runTimeSeconds() const
60 { 60 {
61 return m_runTimeSecs; 61 return m_runTimeSeconds;
62 } 62 }
63 63
64 long long delayMs() const 64 double delaySeconds() const
65 { 65 {
66 return m_delayMs; 66 return m_delaySeconds;
67 } 67 }
68 68
69 private: 69 private:
70 RefPtr<RefCountedTaskContainer> m_task; 70 RefPtr<RefCountedTaskContainer> m_task;
71 double m_runTimeSecs; 71 double m_runTimeSeconds;
72 long long m_delayMs; 72 double m_delaySeconds;
73 }; 73 };
74 74
75 class MockWebTaskRunner : public WebTaskRunner { 75 class MockWebTaskRunner : public WebTaskRunner {
76 public: 76 public:
77 explicit MockWebTaskRunner(std::priority_queue<DelayedTask>* timerTasks) : m _timerTasks(timerTasks) { } 77 explicit MockWebTaskRunner(std::priority_queue<DelayedTask>* timerTasks) : m _timerTasks(timerTasks) { }
78 ~MockWebTaskRunner() override { } 78 ~MockWebTaskRunner() override { }
79 79
80 virtual void postTask(const WebTraceLocation&, Task* task) 80 virtual void postTask(const WebTraceLocation&, Task* task)
81 { 81 {
82 m_timerTasks->push(DelayedTask(task, 0)); 82 m_timerTasks->push(DelayedTask(task, 0));
83 } 83 }
84 84
85 void postDelayedTask(const WebTraceLocation&, Task* task, long long delayMs) override 85 void postDelayedTask(const WebTraceLocation&, Task* task, double delayMs) ov erride
86 { 86 {
87 m_timerTasks->push(DelayedTask(task, delayMs)); 87 m_timerTasks->push(DelayedTask(task, delayMs * 0.001));
88 } 88 }
89 89
90 std::priority_queue<DelayedTask>* m_timerTasks; // NOT OWNED 90 std::priority_queue<DelayedTask>* m_timerTasks; // NOT OWNED
91 }; 91 };
92 92
93 class MockWebScheduler : public WebScheduler { 93 class MockWebScheduler : public WebScheduler {
94 public: 94 public:
95 MockWebScheduler() : m_timerWebTaskRunner(&m_timerTasks) { } 95 MockWebScheduler() : m_timerWebTaskRunner(&m_timerTasks) { }
96 ~MockWebScheduler() override { } 96 ~MockWebScheduler() override { }
97 97
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 } 129 }
130 130
131 void postTimerTaskAt(const WebTraceLocation&, WebTaskRunner::Task* task, dou ble monotonicTime) override 131 void postTimerTaskAt(const WebTraceLocation&, WebTaskRunner::Task* task, dou ble monotonicTime) override
132 { 132 {
133 m_timerTasks.push(DelayedTask(task, (monotonicTime - monotonicallyIncrea singTime()) * 1000)); 133 m_timerTasks.push(DelayedTask(task, (monotonicTime - monotonicallyIncrea singTime()) * 1000));
134 } 134 }
135 135
136 void runUntilIdle() 136 void runUntilIdle()
137 { 137 {
138 while (!m_timerTasks.empty()) { 138 while (!m_timerTasks.empty()) {
139 gCurrentTimeSecs = m_timerTasks.top().runTimeSecs(); 139 gCurrentTimeSecs = m_timerTasks.top().runTimeSeconds();
140 m_timerTasks.top().run(); 140 m_timerTasks.top().run();
141 m_timerTasks.pop(); 141 m_timerTasks.pop();
142 } 142 }
143 } 143 }
144 144
145 void runUntilIdleOrDeadlinePassed(double deadline) 145 void runUntilIdleOrDeadlinePassed(double deadline)
146 { 146 {
147 while (!m_timerTasks.empty()) { 147 while (!m_timerTasks.empty()) {
148 if (m_timerTasks.top().runTimeSecs() > deadline) { 148 if (m_timerTasks.top().runTimeSeconds() > deadline) {
149 gCurrentTimeSecs = deadline; 149 gCurrentTimeSecs = deadline;
150 break; 150 break;
151 } 151 }
152 gCurrentTimeSecs = m_timerTasks.top().runTimeSecs(); 152 gCurrentTimeSecs = m_timerTasks.top().runTimeSeconds();
153 m_timerTasks.top().run(); 153 m_timerTasks.top().run();
154 m_timerTasks.pop(); 154 m_timerTasks.pop();
155 } 155 }
156 }
157
158 void runPendingTasks()
159 {
160 while (!m_timerTasks.empty() && m_timerTasks.top().runTimeSeconds() <= g CurrentTimeSecs) {
161 m_timerTasks.top().run();
162 m_timerTasks.pop();
163 }
156 } 164 }
157 165
158 bool hasOneTimerTask() const 166 bool hasOneTimerTask() const
159 { 167 {
160 return m_timerTasks.size() == 1; 168 return m_timerTasks.size() == 1;
161 } 169 }
162 170
163 long nextTimerTaskDelayMillis() const 171 double nextTimerTaskDelaySecs() const
164 { 172 {
165 ASSERT(hasOneTimerTask()); 173 ASSERT(hasOneTimerTask());
166 return m_timerTasks.top().delayMs(); 174 return m_timerTasks.top().delaySeconds();
167 } 175 }
168 176
169 private: 177 private:
170 std::priority_queue<DelayedTask> m_timerTasks; 178 std::priority_queue<DelayedTask> m_timerTasks;
171 MockWebTaskRunner m_timerWebTaskRunner; 179 MockWebTaskRunner m_timerWebTaskRunner;
172 }; 180 };
173 181
174 class FakeWebThread : public WebThread { 182 class FakeWebThread : public WebThread {
175 public: 183 public:
176 FakeWebThread() : m_webScheduler(adoptPtr(new MockWebScheduler())) { } 184 FakeWebThread() : m_webScheduler(adoptPtr(new MockWebScheduler())) { }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 { 241 {
234 static const unsigned char enabled[] = {0}; 242 static const unsigned char enabled[] = {0};
235 return enabled; 243 return enabled;
236 } 244 }
237 245
238 void runUntilIdle() 246 void runUntilIdle()
239 { 247 {
240 mockScheduler()->runUntilIdle(); 248 mockScheduler()->runUntilIdle();
241 } 249 }
242 250
251 void runPendingTasks()
252 {
253 mockScheduler()->runPendingTasks();
254 }
255
243 void runUntilIdleOrDeadlinePassed(double deadline) 256 void runUntilIdleOrDeadlinePassed(double deadline)
244 { 257 {
245 mockScheduler()->runUntilIdleOrDeadlinePassed(deadline); 258 mockScheduler()->runUntilIdleOrDeadlinePassed(deadline);
246 } 259 }
247 260
248 bool hasOneTimerTask() const 261 bool hasOneTimerTask() const
249 { 262 {
250 return mockScheduler()->hasOneTimerTask(); 263 return mockScheduler()->hasOneTimerTask();
251 } 264 }
252 265
253 long nextTimerTaskDelayMillis() const 266 double nextTimerTaskDelaySecs() const
254 { 267 {
255 return mockScheduler()->nextTimerTaskDelayMillis(); 268 return mockScheduler()->nextTimerTaskDelaySecs();
256 } 269 }
257 270
258 private: 271 private:
259 MockWebScheduler* mockScheduler() const 272 MockWebScheduler* mockScheduler() const
260 { 273 {
261 return static_cast<MockWebScheduler*>(m_webThread->scheduler()); 274 return static_cast<MockWebScheduler*>(m_webThread->scheduler());
262 } 275 }
263 276
264 OwnPtr<FakeWebThread> m_webThread; 277 OwnPtr<FakeWebThread> m_webThread;
265 }; 278 };
(...skipping 15 matching lines...) Expand all
281 void TearDown() override 294 void TearDown() override
282 { 295 {
283 Platform::initialize(m_oldPlatform); 296 Platform::initialize(m_oldPlatform);
284 } 297 }
285 298
286 void countingTask(Timer<TimerTest>*) 299 void countingTask(Timer<TimerTest>*)
287 { 300 {
288 m_runTimes.push_back(monotonicallyIncreasingTime()); 301 m_runTimes.push_back(monotonicallyIncreasingTime());
289 } 302 }
290 303
304 void recordNextFireTimeTask(Timer<TimerTest>* timer)
305 {
306 m_nextFireTimes.push_back(monotonicallyIncreasingTime() + timer->nextFir eInterval());
307 }
308
291 void advanceTimeBy(double timeSecs) 309 void advanceTimeBy(double timeSecs)
292 { 310 {
293 gCurrentTimeSecs += timeSecs; 311 gCurrentTimeSecs += timeSecs;
294 } 312 }
295 313
296 void runUntilIdle() 314 void runUntilIdle()
297 { 315 {
298 m_platform->runUntilIdle(); 316 m_platform->runUntilIdle();
299 } 317 }
300 318
319 void runPendingTasks()
320 {
321 m_platform->runPendingTasks();
322 }
323
301 void runUntilIdleOrDeadlinePassed(double deadline) 324 void runUntilIdleOrDeadlinePassed(double deadline)
302 { 325 {
303 m_platform->runUntilIdleOrDeadlinePassed(deadline); 326 m_platform->runUntilIdleOrDeadlinePassed(deadline);
304 } 327 }
305 328
306 bool hasOneTimerTask() const 329 bool hasOneTimerTask() const
307 { 330 {
308 return m_platform->hasOneTimerTask(); 331 return m_platform->hasOneTimerTask();
309 } 332 }
310 333
311 long nextTimerTaskDelayMillis() const 334 double nextTimerTaskDelaySecs() const
312 { 335 {
313 return m_platform->nextTimerTaskDelayMillis(); 336 return m_platform->nextTimerTaskDelaySecs();
314 } 337 }
315 338
316 protected: 339 protected:
317 double m_startTime; 340 double m_startTime;
341 // TODO(alexclarke): Migrate to WTF::Vector and add gmock matcher support.
318 std::vector<double> m_runTimes; 342 std::vector<double> m_runTimes;
343 std::vector<double> m_nextFireTimes;
319 344
320 private: 345 private:
321 OwnPtr<TimerTestPlatform> m_platform; 346 OwnPtr<TimerTestPlatform> m_platform;
322 Platform* m_oldPlatform; 347 Platform* m_oldPlatform;
323 }; 348 };
324 349
325 TEST_F(TimerTest, StartOneShot_Zero) 350 TEST_F(TimerTest, StartOneShot_Zero)
326 { 351 {
327 Timer<TimerTest> timer(this, &TimerTest::countingTask); 352 Timer<TimerTest> timer(this, &TimerTest::countingTask);
328 timer.startOneShot(0, FROM_HERE); 353 timer.startOneShot(0, FROM_HERE);
329 354
330 ASSERT(hasOneTimerTask()); 355 ASSERT(hasOneTimerTask());
331 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); 356 EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
332 357
333 runUntilIdle(); 358 runUntilIdle();
334 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); 359 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime));
335 } 360 }
336 361
337 TEST_F(TimerTest, StartOneShot_ZeroAndCancel) 362 TEST_F(TimerTest, StartOneShot_ZeroAndCancel)
338 { 363 {
339 Timer<TimerTest> timer(this, &TimerTest::countingTask); 364 Timer<TimerTest> timer(this, &TimerTest::countingTask);
340 timer.startOneShot(0, FROM_HERE); 365 timer.startOneShot(0, FROM_HERE);
341 366
342 ASSERT(hasOneTimerTask()); 367 ASSERT(hasOneTimerTask());
343 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); 368 EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
344 369
345 timer.stop(); 370 timer.stop();
346 371
347 runUntilIdle(); 372 runUntilIdle();
348 EXPECT_TRUE(m_runTimes.empty()); 373 EXPECT_TRUE(m_runTimes.empty());
349 } 374 }
350 375
351 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) 376 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost)
352 { 377 {
353 Timer<TimerTest> timer(this, &TimerTest::countingTask); 378 Timer<TimerTest> timer(this, &TimerTest::countingTask);
354 timer.startOneShot(0, FROM_HERE); 379 timer.startOneShot(0, FROM_HERE);
355 380
356 ASSERT(hasOneTimerTask()); 381 ASSERT(hasOneTimerTask());
357 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); 382 EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
358 383
359 timer.stop(); 384 timer.stop();
360 385
361 runUntilIdle(); 386 runUntilIdle();
362 EXPECT_TRUE(m_runTimes.empty()); 387 EXPECT_TRUE(m_runTimes.empty());
363 388
364 timer.startOneShot(0, FROM_HERE); 389 timer.startOneShot(0, FROM_HERE);
365 390
366 ASSERT(hasOneTimerTask()); 391 ASSERT(hasOneTimerTask());
367 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); 392 EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
368 393
369 runUntilIdle(); 394 runUntilIdle();
370 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); 395 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime));
371 } 396 }
372 397
373 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) 398 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning)
374 { 399 {
375 Timer<TimerTest> timer(this, &TimerTest::countingTask); 400 Timer<TimerTest> timer(this, &TimerTest::countingTask);
376 timer.startOneShot(0, FROM_HERE); 401 timer.startOneShot(0, FROM_HERE);
377 402
378 ASSERT(hasOneTimerTask()); 403 ASSERT(hasOneTimerTask());
379 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); 404 EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
380 405
381 runUntilIdle(); 406 runUntilIdle();
382 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); 407 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime));
383 408
384 timer.startOneShot(0, FROM_HERE); 409 timer.startOneShot(0, FROM_HERE);
385 410
386 ASSERT(hasOneTimerTask()); 411 ASSERT(hasOneTimerTask());
387 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); 412 EXPECT_FLOAT_EQ(0.0, nextTimerTaskDelaySecs());
388 413
389 runUntilIdle(); 414 runUntilIdle();
390 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime)); 415 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime));
391 } 416 }
392 417
393 TEST_F(TimerTest, StartOneShot_NonZero) 418 TEST_F(TimerTest, StartOneShot_NonZero)
394 { 419 {
395 Timer<TimerTest> timer(this, &TimerTest::countingTask); 420 Timer<TimerTest> timer(this, &TimerTest::countingTask);
396 timer.startOneShot(10.0, FROM_HERE); 421 timer.startOneShot(10.0, FROM_HERE);
397 422
398 ASSERT(hasOneTimerTask()); 423 ASSERT(hasOneTimerTask());
399 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); 424 EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
400 425
401 runUntilIdle(); 426 runUntilIdle();
402 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); 427 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
403 } 428 }
404 429
405 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) 430 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel)
406 { 431 {
407 Timer<TimerTest> timer(this, &TimerTest::countingTask); 432 Timer<TimerTest> timer(this, &TimerTest::countingTask);
408 timer.startOneShot(10, FROM_HERE); 433 timer.startOneShot(10, FROM_HERE);
409 434
410 ASSERT(hasOneTimerTask()); 435 ASSERT(hasOneTimerTask());
411 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); 436 EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
412 437
413 timer.stop(); 438 timer.stop();
414 439
415 runUntilIdle(); 440 runUntilIdle();
416 EXPECT_TRUE(m_runTimes.empty()); 441 EXPECT_TRUE(m_runTimes.empty());
417 } 442 }
418 443
419 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) 444 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost)
420 { 445 {
421 Timer<TimerTest> timer(this, &TimerTest::countingTask); 446 Timer<TimerTest> timer(this, &TimerTest::countingTask);
422 timer.startOneShot(10, FROM_HERE); 447 timer.startOneShot(10, FROM_HERE);
423 448
424 ASSERT(hasOneTimerTask()); 449 ASSERT(hasOneTimerTask());
425 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); 450 EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
426 451
427 timer.stop(); 452 timer.stop();
428 453
429 runUntilIdle(); 454 runUntilIdle();
430 EXPECT_TRUE(m_runTimes.empty()); 455 EXPECT_TRUE(m_runTimes.empty());
431 456
432 double secondPostTime = monotonicallyIncreasingTime(); 457 double secondPostTime = monotonicallyIncreasingTime();
433 timer.startOneShot(10, FROM_HERE); 458 timer.startOneShot(10, FROM_HERE);
434 459
435 ASSERT(hasOneTimerTask()); 460 ASSERT(hasOneTimerTask());
436 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); 461 EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
437 462
438 runUntilIdle(); 463 runUntilIdle();
439 EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0)); 464 EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0));
440 } 465 }
441 466
442 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) 467 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning)
443 { 468 {
444 Timer<TimerTest> timer(this, &TimerTest::countingTask); 469 Timer<TimerTest> timer(this, &TimerTest::countingTask);
445 timer.startOneShot(10, FROM_HERE); 470 timer.startOneShot(10, FROM_HERE);
446 471
447 ASSERT(hasOneTimerTask()); 472 ASSERT(hasOneTimerTask());
448 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); 473 EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
449 474
450 runUntilIdle(); 475 runUntilIdle();
451 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); 476 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
452 477
453 timer.startOneShot(20, FROM_HERE); 478 timer.startOneShot(20, FROM_HERE);
454 479
455 ASSERT(hasOneTimerTask()); 480 ASSERT(hasOneTimerTask());
456 EXPECT_EQ(20000ll, nextTimerTaskDelayMillis()); 481 EXPECT_FLOAT_EQ(20.0, nextTimerTaskDelaySecs());
457 482
458 runUntilIdle(); 483 runUntilIdle();
459 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0)) ; 484 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0)) ;
460 } 485 }
461 486
462 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) 487 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing)
463 { 488 {
464 Timer<TimerTest> timer(this, &TimerTest::countingTask); 489 Timer<TimerTest> timer(this, &TimerTest::countingTask);
465 timer.startOneShot(10, FROM_HERE); 490 timer.startOneShot(10, FROM_HERE);
466 timer.startOneShot(10, FROM_HERE); 491 timer.startOneShot(10, FROM_HERE);
467 492
468 ASSERT(hasOneTimerTask()); 493 ASSERT(hasOneTimerTask());
469 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); 494 EXPECT_FLOAT_EQ(10.0, nextTimerTaskDelaySecs());
470 495
471 runUntilIdle(); 496 runUntilIdle();
472 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); 497 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
473 } 498 }
474 499
475 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) 500 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask)
476 { 501 {
477 Timer<TimerTest> timer(this, &TimerTest::countingTask); 502 Timer<TimerTest> timer(this, &TimerTest::countingTask);
478 timer.startOneShot(10, FROM_HERE); 503 timer.startOneShot(10, FROM_HERE);
479 timer.startOneShot(0, FROM_HERE); 504 timer.startOneShot(0, FROM_HERE);
(...skipping 11 matching lines...) Expand all
491 runUntilIdle(); 516 runUntilIdle();
492 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); 517 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0));
493 } 518 }
494 519
495 TEST_F(TimerTest, StartRepeatingTask) 520 TEST_F(TimerTest, StartRepeatingTask)
496 { 521 {
497 Timer<TimerTest> timer(this, &TimerTest::countingTask); 522 Timer<TimerTest> timer(this, &TimerTest::countingTask);
498 timer.startRepeating(1.0, FROM_HERE); 523 timer.startRepeating(1.0, FROM_HERE);
499 524
500 ASSERT(hasOneTimerTask()); 525 ASSERT(hasOneTimerTask());
501 EXPECT_EQ(1000ll, nextTimerTaskDelayMillis()); 526 EXPECT_FLOAT_EQ(1.0, nextTimerTaskDelaySecs());
502 527
503 runUntilIdleOrDeadlinePassed(m_startTime + 5.5); 528 runUntilIdleOrDeadlinePassed(m_startTime + 5.5);
504 EXPECT_THAT(m_runTimes, ElementsAre( 529 EXPECT_THAT(m_runTimes, ElementsAre(
505 m_startTime + 1.0, m_startTime + 2.0, m_startTime + 3.0, m_startTime + 4 .0, m_startTime + 5.0)); 530 m_startTime + 1.0, m_startTime + 2.0, m_startTime + 3.0, m_startTime + 4 .0, m_startTime + 5.0));
506 } 531 }
507 532
508 TEST_F(TimerTest, StartRepeatingTask_ThenCancel) 533 TEST_F(TimerTest, StartRepeatingTask_ThenCancel)
509 { 534 {
510 Timer<TimerTest> timer(this, &TimerTest::countingTask); 535 Timer<TimerTest> timer(this, &TimerTest::countingTask);
511 timer.startRepeating(1.0, FROM_HERE); 536 timer.startRepeating(1.0, FROM_HERE);
512 537
513 ASSERT(hasOneTimerTask()); 538 ASSERT(hasOneTimerTask());
514 EXPECT_EQ(1000ll, nextTimerTaskDelayMillis()); 539 EXPECT_FLOAT_EQ(1.0, nextTimerTaskDelaySecs());
515 540
516 runUntilIdleOrDeadlinePassed(m_startTime + 2.5); 541 runUntilIdleOrDeadlinePassed(m_startTime + 2.5);
517 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); 542 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0));
518 543
519 timer.stop(); 544 timer.stop();
520 runUntilIdle(); 545 runUntilIdle();
521 546
522 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); 547 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0));
523 } 548 }
524 549
525 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) 550 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot)
526 { 551 {
527 Timer<TimerTest> timer(this, &TimerTest::countingTask); 552 Timer<TimerTest> timer(this, &TimerTest::countingTask);
528 timer.startRepeating(1.0, FROM_HERE); 553 timer.startRepeating(1.0, FROM_HERE);
529 554
530 ASSERT(hasOneTimerTask()); 555 ASSERT(hasOneTimerTask());
531 EXPECT_EQ(1000ll, nextTimerTaskDelayMillis()); 556 EXPECT_FLOAT_EQ(1.0, nextTimerTaskDelaySecs());
532 557
533 runUntilIdleOrDeadlinePassed(m_startTime + 2.5); 558 runUntilIdleOrDeadlinePassed(m_startTime + 2.5);
534 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); 559 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0));
535 560
536 timer.startOneShot(0, FROM_HERE); 561 timer.startOneShot(0, FROM_HERE);
537 runUntilIdle(); 562 runUntilIdle();
538 563
539 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, m_ startTime + 2.5)); 564 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, m_ startTime + 2.5));
540 } 565 }
541 566
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime()); 770 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime());
746 771
747 timer.setAlignedFireTime(m_startTime); 772 timer.setAlignedFireTime(m_startTime);
748 timer.didChangeAlignmentInterval(monotonicallyIncreasingTime()); 773 timer.didChangeAlignmentInterval(monotonicallyIncreasingTime());
749 774
750 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); 775 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval());
751 EXPECT_FLOAT_EQ(0.0, timer.nextUnalignedFireInterval()); 776 EXPECT_FLOAT_EQ(0.0, timer.nextUnalignedFireInterval());
752 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime()); 777 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime());
753 } 778 }
754 779
780 TEST_F(TimerTest, RepeatingTimerDoesNotDrift)
781 {
782 Timer<TimerTest> timer(this, &TimerTest::recordNextFireTimeTask);
783 timer.startRepeating(2.0, FROM_HERE);
784
785 ASSERT(hasOneTimerTask());
786 recordNextFireTimeTask(&timer); // Next scheduled task to run at m_startTime + 2.0
787
788 // Simulate timer firing early. Next scheduled task to run at m_startTime + 4.0
789 advanceTimeBy(1.9);
790 runUntilIdleOrDeadlinePassed(gCurrentTimeSecs + 0.2);
791
792 advanceTimeBy(2.0);
793 runPendingTasks(); // Next scheduled task to run at m_startTime + 6.0
794
795 advanceTimeBy(2.1);
796 runPendingTasks(); // Next scheduled task to run at m_startTime + 8.0
797
798 advanceTimeBy(2.9);
799 runPendingTasks(); // Next scheduled task to run at m_startTime + 10.0
800
801 advanceTimeBy(3.1);
802 runPendingTasks(); // Next scheduled task to run at m_startTime + 14.0 (skip s a beat)
803
804 advanceTimeBy(4.0);
805 runPendingTasks(); // Next scheduled task to run at m_startTime + 18.0 (skip s a beat)
806
807 advanceTimeBy(10.0); // Next scheduled task to run at m_startTime + 28.0 (sk ips 5 beats)
808 runPendingTasks();
809
810 runUntilIdleOrDeadlinePassed(m_startTime + 5.5);
811 EXPECT_THAT(m_nextFireTimes, ElementsAre(
812 m_startTime + 2.0,
813 m_startTime + 4.0,
814 m_startTime + 6.0,
815 m_startTime + 8.0,
816 m_startTime + 10.0,
817 m_startTime + 14.0,
818 m_startTime + 18.0,
819 m_startTime + 28.0));
820 }
755 821
756 } // namespace 822 } // namespace
757 } // namespace blink 823 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698