OLD | NEW |
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 Loading... |
34 { | 34 { |
35 m_task->run(); | 35 m_task->run(); |
36 } | 36 } |
37 | 37 |
38 private: | 38 private: |
39 OwnPtr<WebThread::Task> m_task; | 39 OwnPtr<WebThread::Task> m_task; |
40 }; | 40 }; |
41 | 41 |
42 class DelayedTask { | 42 class DelayedTask { |
43 public: | 43 public: |
44 DelayedTask(WebThread::Task* task, double delaySecs) | 44 DelayedTask(WebThread::Task* task, long long delayMs) |
45 : m_task(adoptRef(new RefCountedTaskContainer(task))) | 45 : m_task(adoptRef(new RefCountedTaskContainer(task))) |
46 , m_runTimeSecs(monotonicallyIncreasingTime() + delaySecs) | 46 , m_runTimeSecs(monotonicallyIncreasingTime() + 0.001 * static_cast<doub
le>(delayMs)) |
47 , m_delaySecs(delaySecs) { } | 47 , m_delayMs(delayMs) { } |
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_runTimeSecs > other.m_runTimeSecs; |
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 runTimeSecs() const |
60 { | 60 { |
61 return m_runTimeSecs; | 61 return m_runTimeSecs; |
62 } | 62 } |
63 | 63 |
64 double delaySecs() const | 64 long long delayMs() const |
65 { | 65 { |
66 return m_delaySecs; | 66 return m_delayMs; |
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_runTimeSecs; |
72 double m_delaySecs; | 72 long long m_delayMs; |
73 }; | 73 }; |
74 | 74 |
75 class MockWebScheduler : public WebScheduler { | 75 class MockWebScheduler : public WebScheduler { |
76 public: | 76 public: |
77 MockWebScheduler() { } | 77 MockWebScheduler() { } |
78 ~MockWebScheduler() override { } | 78 ~MockWebScheduler() override { } |
79 | 79 |
80 bool shouldYieldForHighPriorityWork() override | 80 bool shouldYieldForHighPriorityWork() override |
81 { | 81 { |
82 return false; | 82 return false; |
(...skipping 13 matching lines...) Expand all Loading... |
96 } | 96 } |
97 | 97 |
98 void postIdleTaskAfterWakeup(const WebTraceLocation&, WebThread::IdleTask*)
override | 98 void postIdleTaskAfterWakeup(const WebTraceLocation&, WebThread::IdleTask*)
override |
99 { | 99 { |
100 } | 100 } |
101 | 101 |
102 void postLoadingTask(const WebTraceLocation&, WebThread::Task*) override | 102 void postLoadingTask(const WebTraceLocation&, WebThread::Task*) override |
103 { | 103 { |
104 } | 104 } |
105 | 105 |
106 void postTimerTask(const WebTraceLocation&, WebThread::Task* task, double de
laySecs) override | 106 void postTimerTask(const WebTraceLocation&, WebThread::Task* task, long long
delayMs) override |
107 { | 107 { |
108 m_timerTasks.push(DelayedTask(task, delaySecs)); | 108 m_timerTasks.push(DelayedTask(task, delayMs)); |
109 } | 109 } |
110 | 110 |
111 void postTimerTaskAt(const WebTraceLocation&, WebThread::Task* task, double
monotonicTime) override | 111 void postTimerTaskAt(const WebTraceLocation&, WebThread::Task* task, double
monotonicTime) override |
112 { | 112 { |
113 m_timerTasks.push(DelayedTask(task, (monotonicTime - monotonicallyIncrea
singTime()) * 1000)); | 113 m_timerTasks.push(DelayedTask(task, (monotonicTime - monotonicallyIncrea
singTime()) * 1000)); |
114 } | 114 } |
115 | 115 |
116 void runUntilIdle() | 116 void runUntilIdle() |
117 { | 117 { |
118 while (!m_timerTasks.empty()) { | 118 while (!m_timerTasks.empty()) { |
119 gCurrentTimeSecs = m_timerTasks.top().runTimeSecs(); | 119 gCurrentTimeSecs = m_timerTasks.top().runTimeSecs(); |
120 m_timerTasks.top().run(); | 120 m_timerTasks.top().run(); |
121 m_timerTasks.pop(); | 121 m_timerTasks.pop(); |
122 } | 122 } |
123 } | 123 } |
124 | 124 |
125 void runUntilIdleOrDeadlinePassed(double deadline) | 125 void runUntilIdleOrDeadlinePassed(double deadline) |
126 { | 126 { |
127 while (!m_timerTasks.empty()) { | 127 while (!m_timerTasks.empty()) { |
128 if (m_timerTasks.top().runTimeSecs() > deadline) { | 128 if (m_timerTasks.top().runTimeSecs() > deadline) { |
129 gCurrentTimeSecs = deadline; | 129 gCurrentTimeSecs = deadline; |
130 break; | 130 break; |
131 } | 131 } |
132 gCurrentTimeSecs = m_timerTasks.top().runTimeSecs(); | 132 gCurrentTimeSecs = m_timerTasks.top().runTimeSecs(); |
133 m_timerTasks.top().run(); | 133 m_timerTasks.top().run(); |
134 m_timerTasks.pop(); | 134 m_timerTasks.pop(); |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 void runPendingTasks() | |
139 { | |
140 while (!m_timerTasks.empty() && m_timerTasks.top().runTimeSecs() <= gCur
rentTimeSecs) { | |
141 m_timerTasks.top().run(); | |
142 m_timerTasks.pop(); | |
143 } | |
144 } | |
145 | |
146 bool hasOneTimerTask() const | 138 bool hasOneTimerTask() const |
147 { | 139 { |
148 return m_timerTasks.size() == 1; | 140 return m_timerTasks.size() == 1; |
149 } | 141 } |
150 | 142 |
151 double nextTimerTaskDelaySecs() const | 143 long nextTimerTaskDelayMillis() const |
152 { | 144 { |
153 ASSERT(hasOneTimerTask()); | 145 ASSERT(hasOneTimerTask()); |
154 return m_timerTasks.top().delaySecs(); | 146 return m_timerTasks.top().delayMs(); |
155 } | 147 } |
156 | 148 |
157 private: | 149 private: |
158 std::priority_queue<DelayedTask> m_timerTasks; | 150 std::priority_queue<DelayedTask> m_timerTasks; |
159 }; | 151 }; |
160 | 152 |
161 class FakeWebThread : public WebThread { | 153 class FakeWebThread : public WebThread { |
162 public: | 154 public: |
163 FakeWebThread() : m_webScheduler(adoptPtr(new MockWebScheduler())) { } | 155 FakeWebThread() : m_webScheduler(adoptPtr(new MockWebScheduler())) { } |
164 ~FakeWebThread() override { } | 156 ~FakeWebThread() override { } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 { | 217 { |
226 static const unsigned char enabled[] = {0}; | 218 static const unsigned char enabled[] = {0}; |
227 return enabled; | 219 return enabled; |
228 } | 220 } |
229 | 221 |
230 void runUntilIdle() | 222 void runUntilIdle() |
231 { | 223 { |
232 mockScheduler()->runUntilIdle(); | 224 mockScheduler()->runUntilIdle(); |
233 } | 225 } |
234 | 226 |
235 void runPendingTasks() | |
236 { | |
237 mockScheduler()->runPendingTasks(); | |
238 } | |
239 | |
240 void runUntilIdleOrDeadlinePassed(double deadline) | 227 void runUntilIdleOrDeadlinePassed(double deadline) |
241 { | 228 { |
242 mockScheduler()->runUntilIdleOrDeadlinePassed(deadline); | 229 mockScheduler()->runUntilIdleOrDeadlinePassed(deadline); |
243 } | 230 } |
244 | 231 |
245 bool hasOneTimerTask() const | 232 bool hasOneTimerTask() const |
246 { | 233 { |
247 return mockScheduler()->hasOneTimerTask(); | 234 return mockScheduler()->hasOneTimerTask(); |
248 } | 235 } |
249 | 236 |
250 double nextTimerTaskDelaySecs() const | 237 long nextTimerTaskDelayMillis() const |
251 { | 238 { |
252 return mockScheduler()->nextTimerTaskDelaySecs(); | 239 return mockScheduler()->nextTimerTaskDelayMillis(); |
253 } | 240 } |
254 | 241 |
255 private: | 242 private: |
256 MockWebScheduler* mockScheduler() const | 243 MockWebScheduler* mockScheduler() const |
257 { | 244 { |
258 return static_cast<MockWebScheduler*>(m_webThread->scheduler()); | 245 return static_cast<MockWebScheduler*>(m_webThread->scheduler()); |
259 } | 246 } |
260 | 247 |
261 OwnPtr<FakeWebThread> m_webThread; | 248 OwnPtr<FakeWebThread> m_webThread; |
262 }; | 249 }; |
(...skipping 15 matching lines...) Expand all Loading... |
278 void TearDown() override | 265 void TearDown() override |
279 { | 266 { |
280 Platform::initialize(m_oldPlatform); | 267 Platform::initialize(m_oldPlatform); |
281 } | 268 } |
282 | 269 |
283 void countingTask(Timer<TimerTest>*) | 270 void countingTask(Timer<TimerTest>*) |
284 { | 271 { |
285 m_runTimes.push_back(monotonicallyIncreasingTime()); | 272 m_runTimes.push_back(monotonicallyIncreasingTime()); |
286 } | 273 } |
287 | 274 |
288 void recordNextFireTimeTask(Timer<TimerTest>* timer) | |
289 { | |
290 m_nextFireTimes.push_back(monotonicallyIncreasingTime() + timer->nextFir
eInterval()); | |
291 } | |
292 | |
293 void advanceTimeBy(double timeSecs) | 275 void advanceTimeBy(double timeSecs) |
294 { | 276 { |
295 gCurrentTimeSecs += timeSecs; | 277 gCurrentTimeSecs += timeSecs; |
296 } | 278 } |
297 | 279 |
298 void runUntilIdle() | 280 void runUntilIdle() |
299 { | 281 { |
300 m_platform->runUntilIdle(); | 282 m_platform->runUntilIdle(); |
301 } | 283 } |
302 | 284 |
303 void runPendingTasks() | |
304 { | |
305 m_platform->runPendingTasks(); | |
306 } | |
307 | |
308 void runUntilIdleOrDeadlinePassed(double deadline) | 285 void runUntilIdleOrDeadlinePassed(double deadline) |
309 { | 286 { |
310 m_platform->runUntilIdleOrDeadlinePassed(deadline); | 287 m_platform->runUntilIdleOrDeadlinePassed(deadline); |
311 } | 288 } |
312 | 289 |
313 bool hasOneTimerTask() const | 290 bool hasOneTimerTask() const |
314 { | 291 { |
315 return m_platform->hasOneTimerTask(); | 292 return m_platform->hasOneTimerTask(); |
316 } | 293 } |
317 | 294 |
318 double nextTimerTaskDelaySecs() const | 295 long nextTimerTaskDelayMillis() const |
319 { | 296 { |
320 return m_platform->nextTimerTaskDelaySecs(); | 297 return m_platform->nextTimerTaskDelayMillis(); |
321 } | 298 } |
322 | 299 |
323 protected: | 300 protected: |
324 double m_startTime; | 301 double m_startTime; |
325 std::vector<double> m_runTimes; | 302 std::vector<double> m_runTimes; |
326 std::vector<double> m_nextFireTimes; | |
327 | 303 |
328 private: | 304 private: |
329 OwnPtr<TimerTestPlatform> m_platform; | 305 OwnPtr<TimerTestPlatform> m_platform; |
330 Platform* m_oldPlatform; | 306 Platform* m_oldPlatform; |
331 }; | 307 }; |
332 | 308 |
333 TEST_F(TimerTest, StartOneShot_Zero) | 309 TEST_F(TimerTest, StartOneShot_Zero) |
334 { | 310 { |
335 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 311 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
336 timer.startOneShot(0, FROM_HERE); | 312 timer.startOneShot(0, FROM_HERE); |
337 | 313 |
338 ASSERT(hasOneTimerTask()); | 314 ASSERT(hasOneTimerTask()); |
339 EXPECT_EQ(0.0, nextTimerTaskDelaySecs()); | 315 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); |
340 | 316 |
341 runUntilIdle(); | 317 runUntilIdle(); |
342 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); | 318 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); |
343 } | 319 } |
344 | 320 |
345 TEST_F(TimerTest, StartOneShot_ZeroAndCancel) | 321 TEST_F(TimerTest, StartOneShot_ZeroAndCancel) |
346 { | 322 { |
347 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 323 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
348 timer.startOneShot(0, FROM_HERE); | 324 timer.startOneShot(0, FROM_HERE); |
349 | 325 |
350 ASSERT(hasOneTimerTask()); | 326 ASSERT(hasOneTimerTask()); |
351 EXPECT_EQ(0.0, nextTimerTaskDelaySecs()); | 327 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); |
352 | 328 |
353 timer.stop(); | 329 timer.stop(); |
354 | 330 |
355 runUntilIdle(); | 331 runUntilIdle(); |
356 EXPECT_TRUE(m_runTimes.empty()); | 332 EXPECT_TRUE(m_runTimes.empty()); |
357 } | 333 } |
358 | 334 |
359 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) | 335 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) |
360 { | 336 { |
361 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 337 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
362 timer.startOneShot(0, FROM_HERE); | 338 timer.startOneShot(0, FROM_HERE); |
363 | 339 |
364 ASSERT(hasOneTimerTask()); | 340 ASSERT(hasOneTimerTask()); |
365 EXPECT_EQ(0.0, nextTimerTaskDelaySecs()); | 341 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); |
366 | 342 |
367 timer.stop(); | 343 timer.stop(); |
368 | 344 |
369 runUntilIdle(); | 345 runUntilIdle(); |
370 EXPECT_TRUE(m_runTimes.empty()); | 346 EXPECT_TRUE(m_runTimes.empty()); |
371 | 347 |
372 timer.startOneShot(0, FROM_HERE); | 348 timer.startOneShot(0, FROM_HERE); |
373 | 349 |
374 ASSERT(hasOneTimerTask()); | 350 ASSERT(hasOneTimerTask()); |
375 EXPECT_EQ(0.0, nextTimerTaskDelaySecs()); | 351 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); |
376 | 352 |
377 runUntilIdle(); | 353 runUntilIdle(); |
378 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); | 354 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); |
379 } | 355 } |
380 | 356 |
381 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) | 357 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) |
382 { | 358 { |
383 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 359 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
384 timer.startOneShot(0, FROM_HERE); | 360 timer.startOneShot(0, FROM_HERE); |
385 | 361 |
386 ASSERT(hasOneTimerTask()); | 362 ASSERT(hasOneTimerTask()); |
387 EXPECT_EQ(0.0, nextTimerTaskDelaySecs()); | 363 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); |
388 | 364 |
389 runUntilIdle(); | 365 runUntilIdle(); |
390 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); | 366 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); |
391 | 367 |
392 timer.startOneShot(0, FROM_HERE); | 368 timer.startOneShot(0, FROM_HERE); |
393 | 369 |
394 ASSERT(hasOneTimerTask()); | 370 ASSERT(hasOneTimerTask()); |
395 EXPECT_EQ(0.0, nextTimerTaskDelaySecs()); | 371 EXPECT_EQ(0ll, nextTimerTaskDelayMillis()); |
396 | 372 |
397 runUntilIdle(); | 373 runUntilIdle(); |
398 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime)); | 374 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime)); |
399 } | 375 } |
400 | 376 |
401 TEST_F(TimerTest, StartOneShot_NonZero) | 377 TEST_F(TimerTest, StartOneShot_NonZero) |
402 { | 378 { |
403 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 379 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
404 timer.startOneShot(10.0, FROM_HERE); | 380 timer.startOneShot(10.0, FROM_HERE); |
405 | 381 |
406 ASSERT(hasOneTimerTask()); | 382 ASSERT(hasOneTimerTask()); |
407 EXPECT_EQ(10.0, nextTimerTaskDelaySecs()); | 383 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); |
408 | 384 |
409 runUntilIdle(); | 385 runUntilIdle(); |
410 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 386 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
411 } | 387 } |
412 | 388 |
413 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) | 389 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) |
414 { | 390 { |
415 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 391 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
416 timer.startOneShot(10, FROM_HERE); | 392 timer.startOneShot(10, FROM_HERE); |
417 | 393 |
418 ASSERT(hasOneTimerTask()); | 394 ASSERT(hasOneTimerTask()); |
419 EXPECT_EQ(10.0, nextTimerTaskDelaySecs()); | 395 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); |
420 | 396 |
421 timer.stop(); | 397 timer.stop(); |
422 | 398 |
423 runUntilIdle(); | 399 runUntilIdle(); |
424 EXPECT_TRUE(m_runTimes.empty()); | 400 EXPECT_TRUE(m_runTimes.empty()); |
425 } | 401 } |
426 | 402 |
427 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) | 403 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) |
428 { | 404 { |
429 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 405 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
430 timer.startOneShot(10, FROM_HERE); | 406 timer.startOneShot(10, FROM_HERE); |
431 | 407 |
432 ASSERT(hasOneTimerTask()); | 408 ASSERT(hasOneTimerTask()); |
433 EXPECT_EQ(10.0, nextTimerTaskDelaySecs()); | 409 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); |
434 | 410 |
435 timer.stop(); | 411 timer.stop(); |
436 | 412 |
437 runUntilIdle(); | 413 runUntilIdle(); |
438 EXPECT_TRUE(m_runTimes.empty()); | 414 EXPECT_TRUE(m_runTimes.empty()); |
439 | 415 |
440 double secondPostTime = monotonicallyIncreasingTime(); | 416 double secondPostTime = monotonicallyIncreasingTime(); |
441 timer.startOneShot(10, FROM_HERE); | 417 timer.startOneShot(10, FROM_HERE); |
442 | 418 |
443 ASSERT(hasOneTimerTask()); | 419 ASSERT(hasOneTimerTask()); |
444 EXPECT_EQ(10.0, nextTimerTaskDelaySecs()); | 420 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); |
445 | 421 |
446 runUntilIdle(); | 422 runUntilIdle(); |
447 EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0)); | 423 EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0)); |
448 } | 424 } |
449 | 425 |
450 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) | 426 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) |
451 { | 427 { |
452 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 428 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
453 timer.startOneShot(10, FROM_HERE); | 429 timer.startOneShot(10, FROM_HERE); |
454 | 430 |
455 ASSERT(hasOneTimerTask()); | 431 ASSERT(hasOneTimerTask()); |
456 EXPECT_EQ(10.0, nextTimerTaskDelaySecs()); | 432 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); |
457 | 433 |
458 runUntilIdle(); | 434 runUntilIdle(); |
459 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 435 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
460 | 436 |
461 timer.startOneShot(20, FROM_HERE); | 437 timer.startOneShot(20, FROM_HERE); |
462 | 438 |
463 ASSERT(hasOneTimerTask()); | 439 ASSERT(hasOneTimerTask()); |
464 EXPECT_EQ(20.0, nextTimerTaskDelaySecs()); | 440 EXPECT_EQ(20000ll, nextTimerTaskDelayMillis()); |
465 | 441 |
466 runUntilIdle(); | 442 runUntilIdle(); |
467 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0))
; | 443 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0))
; |
468 } | 444 } |
469 | 445 |
470 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) | 446 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) |
471 { | 447 { |
472 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 448 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
473 timer.startOneShot(10, FROM_HERE); | 449 timer.startOneShot(10, FROM_HERE); |
474 timer.startOneShot(10, FROM_HERE); | 450 timer.startOneShot(10, FROM_HERE); |
475 | 451 |
476 ASSERT(hasOneTimerTask()); | 452 ASSERT(hasOneTimerTask()); |
477 EXPECT_EQ(10.0, nextTimerTaskDelaySecs()); | 453 EXPECT_EQ(10000ll, nextTimerTaskDelayMillis()); |
478 | 454 |
479 runUntilIdle(); | 455 runUntilIdle(); |
480 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 456 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
481 } | 457 } |
482 | 458 |
483 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) | 459 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) |
484 { | 460 { |
485 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 461 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
486 timer.startOneShot(10, FROM_HERE); | 462 timer.startOneShot(10, FROM_HERE); |
487 timer.startOneShot(0, FROM_HERE); | 463 timer.startOneShot(0, FROM_HERE); |
(...skipping 11 matching lines...) Expand all Loading... |
499 runUntilIdle(); | 475 runUntilIdle(); |
500 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 476 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
501 } | 477 } |
502 | 478 |
503 TEST_F(TimerTest, StartRepeatingTask) | 479 TEST_F(TimerTest, StartRepeatingTask) |
504 { | 480 { |
505 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 481 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
506 timer.startRepeating(1.0, FROM_HERE); | 482 timer.startRepeating(1.0, FROM_HERE); |
507 | 483 |
508 ASSERT(hasOneTimerTask()); | 484 ASSERT(hasOneTimerTask()); |
509 EXPECT_EQ(1.0, nextTimerTaskDelaySecs()); | 485 EXPECT_EQ(1000ll, nextTimerTaskDelayMillis()); |
510 | 486 |
511 runUntilIdleOrDeadlinePassed(m_startTime + 5.5); | 487 runUntilIdleOrDeadlinePassed(m_startTime + 5.5); |
512 EXPECT_THAT(m_runTimes, ElementsAre( | 488 EXPECT_THAT(m_runTimes, ElementsAre( |
513 m_startTime + 1.0, m_startTime + 2.0, m_startTime + 3.0, m_startTime + 4
.0, m_startTime + 5.0)); | 489 m_startTime + 1.0, m_startTime + 2.0, m_startTime + 3.0, m_startTime + 4
.0, m_startTime + 5.0)); |
514 } | 490 } |
515 | 491 |
516 TEST_F(TimerTest, StartRepeatingTask_ThenCancel) | 492 TEST_F(TimerTest, StartRepeatingTask_ThenCancel) |
517 { | 493 { |
518 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 494 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
519 timer.startRepeating(1.0, FROM_HERE); | 495 timer.startRepeating(1.0, FROM_HERE); |
520 | 496 |
521 ASSERT(hasOneTimerTask()); | 497 ASSERT(hasOneTimerTask()); |
522 EXPECT_EQ(1.0, nextTimerTaskDelaySecs()); | 498 EXPECT_EQ(1000ll, nextTimerTaskDelayMillis()); |
523 | 499 |
524 runUntilIdleOrDeadlinePassed(m_startTime + 2.5); | 500 runUntilIdleOrDeadlinePassed(m_startTime + 2.5); |
525 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); | 501 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); |
526 | 502 |
527 timer.stop(); | 503 timer.stop(); |
528 runUntilIdle(); | 504 runUntilIdle(); |
529 | 505 |
530 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); | 506 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); |
531 } | 507 } |
532 | 508 |
533 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) | 509 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) |
534 { | 510 { |
535 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 511 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
536 timer.startRepeating(1.0, FROM_HERE); | 512 timer.startRepeating(1.0, FROM_HERE); |
537 | 513 |
538 ASSERT(hasOneTimerTask()); | 514 ASSERT(hasOneTimerTask()); |
539 EXPECT_EQ(1.0, nextTimerTaskDelaySecs()); | 515 EXPECT_EQ(1000ll, nextTimerTaskDelayMillis()); |
540 | 516 |
541 runUntilIdleOrDeadlinePassed(m_startTime + 2.5); | 517 runUntilIdleOrDeadlinePassed(m_startTime + 2.5); |
542 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); | 518 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); |
543 | 519 |
544 timer.startOneShot(0, FROM_HERE); | 520 timer.startOneShot(0, FROM_HERE); |
545 runUntilIdle(); | 521 runUntilIdle(); |
546 | 522 |
547 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, m_
startTime + 2.5)); | 523 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, m_
startTime + 2.5)); |
548 } | 524 } |
549 | 525 |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime()); | 729 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime()); |
754 | 730 |
755 timer.setAlignedFireTime(m_startTime); | 731 timer.setAlignedFireTime(m_startTime); |
756 timer.didChangeAlignmentInterval(monotonicallyIncreasingTime()); | 732 timer.didChangeAlignmentInterval(monotonicallyIncreasingTime()); |
757 | 733 |
758 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); | 734 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); |
759 EXPECT_FLOAT_EQ(0.0, timer.nextUnalignedFireInterval()); | 735 EXPECT_FLOAT_EQ(0.0, timer.nextUnalignedFireInterval()); |
760 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime()); | 736 EXPECT_FLOAT_EQ(m_startTime, timer.lastFireTime()); |
761 } | 737 } |
762 | 738 |
763 TEST_F(TimerTest, RepeatingTimerDoesNotDrift) | |
764 { | |
765 Timer<TimerTest> timer(this, &TimerTest::recordNextFireTimeTask); | |
766 timer.startRepeating(2.0, FROM_HERE); | |
767 | |
768 ASSERT(hasOneTimerTask()); | |
769 recordNextFireTimeTask(&timer); // Scheduled to run at m_startTime + 2.0 | |
770 | |
771 advanceTimeBy(2.0); | |
772 runPendingTasks(); // Scheduled to run at m_startTime + 4.0 | |
773 | |
774 advanceTimeBy(2.1); | |
775 runPendingTasks(); // Scheduled to run at m_startTime + 6.0 | |
776 | |
777 advanceTimeBy(2.9); | |
778 runPendingTasks(); // Scheduled to run at m_startTime + 8.0 | |
779 | |
780 advanceTimeBy(3.1); | |
781 runPendingTasks(); // Scheduled to run at m_startTime + 12.0 (skips a beat) | |
782 | |
783 advanceTimeBy(4.0); | |
784 runPendingTasks(); // Scheduled to run at m_startTime + 16.0 (skips a beat) | |
785 | |
786 advanceTimeBy(10.0); // Scheduled to run at m_startTime + 22.0 (skips a few
beats) | |
787 runPendingTasks(); | |
788 | |
789 runUntilIdleOrDeadlinePassed(m_startTime + 5.5); | |
790 EXPECT_THAT(m_nextFireTimes, ElementsAre( | |
791 m_startTime + 2.0, | |
792 m_startTime + 4.0, | |
793 m_startTime + 6.0, | |
794 m_startTime + 8.0, | |
795 m_startTime + 12.0, | |
796 m_startTime + 16.0, | |
797 m_startTime + 26.0)); | |
798 } | |
799 | 739 |
800 } // namespace | 740 } // namespace |
801 } // namespace blink | 741 } // namespace blink |
OLD | NEW |