Home | History | Annotate | Download | only in scheduler
      1 // Copyright 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "cc/scheduler/delay_based_time_source.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/test/test_simple_task_runner.h"
      9 #include "cc/test/scheduler_test_common.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 
     12 namespace cc {
     13 namespace {
     14 
     15 base::TimeDelta Interval() {
     16   return base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
     17                                            60);
     18 }
     19 
     20 TEST(DelayBasedTimeSourceTest, TaskPostedAndTickCalled) {
     21   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
     22       new base::TestSimpleTaskRunner;
     23   FakeTimeSourceClient client;
     24   scoped_refptr<FakeDelayBasedTimeSource> timer =
     25       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
     26   timer->SetClient(&client);
     27 
     28   timer->SetActive(true);
     29   EXPECT_TRUE(timer->Active());
     30   EXPECT_TRUE(task_runner->HasPendingTask());
     31 
     32   timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(16));
     33   task_runner->RunPendingTasks();
     34   EXPECT_TRUE(timer->Active());
     35   EXPECT_TRUE(client.TickCalled());
     36 }
     37 
     38 TEST(DelayBasedTimeSourceTest, TickNotCalledWithTaskPosted) {
     39   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
     40       new base::TestSimpleTaskRunner;
     41   FakeTimeSourceClient client;
     42   scoped_refptr<FakeDelayBasedTimeSource> timer =
     43       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
     44   timer->SetClient(&client);
     45   timer->SetActive(true);
     46   EXPECT_TRUE(task_runner->HasPendingTask());
     47   timer->SetActive(false);
     48   task_runner->RunPendingTasks();
     49   EXPECT_FALSE(client.TickCalled());
     50 }
     51 
     52 TEST(DelayBasedTimeSourceTest, StartTwiceEnqueuesOneTask) {
     53   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
     54       new base::TestSimpleTaskRunner;
     55   FakeTimeSourceClient client;
     56   scoped_refptr<FakeDelayBasedTimeSource> timer =
     57       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
     58   timer->SetClient(&client);
     59   timer->SetActive(true);
     60   EXPECT_TRUE(task_runner->HasPendingTask());
     61   task_runner->ClearPendingTasks();
     62   timer->SetActive(true);
     63   EXPECT_FALSE(task_runner->HasPendingTask());
     64 }
     65 
     66 TEST(DelayBasedTimeSourceTest, StartWhenRunningDoesntTick) {
     67   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
     68       new base::TestSimpleTaskRunner;
     69   FakeTimeSourceClient client;
     70   scoped_refptr<FakeDelayBasedTimeSource> timer =
     71       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
     72   timer->SetClient(&client);
     73   timer->SetActive(true);
     74   EXPECT_TRUE(task_runner->HasPendingTask());
     75   task_runner->RunPendingTasks();
     76   task_runner->ClearPendingTasks();
     77   timer->SetActive(true);
     78   EXPECT_FALSE(task_runner->HasPendingTask());
     79 }
     80 
     81 // At 60Hz, when the tick returns at exactly the requested next time, make sure
     82 // a 16ms next delay is posted.
     83 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenExactlyOnRequestedTime) {
     84   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
     85       new base::TestSimpleTaskRunner;
     86   FakeTimeSourceClient client;
     87   scoped_refptr<FakeDelayBasedTimeSource> timer =
     88       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
     89   timer->SetClient(&client);
     90   timer->SetActive(true);
     91   // Run the first tick.
     92   task_runner->RunPendingTasks();
     93 
     94   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
     95 
     96   timer->SetNow(timer->Now() + Interval());
     97   task_runner->RunPendingTasks();
     98 
     99   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    100 }
    101 
    102 // At 60Hz, when the tick returns at slightly after the requested next time,
    103 // make sure a 16ms next delay is posted.
    104 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenSlightlyAfterRequestedTime) {
    105   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    106       new base::TestSimpleTaskRunner;
    107   FakeTimeSourceClient client;
    108   scoped_refptr<FakeDelayBasedTimeSource> timer =
    109       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    110   timer->SetClient(&client);
    111   timer->SetActive(true);
    112   // Run the first tick.
    113   task_runner->RunPendingTasks();
    114 
    115   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    116 
    117   timer->SetNow(timer->Now() + Interval() +
    118                 base::TimeDelta::FromMicroseconds(1));
    119   task_runner->RunPendingTasks();
    120 
    121   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    122 }
    123 
    124 // At 60Hz, when the tick returns at exactly 2*interval after the requested next
    125 // time, make sure a 0ms next delay is posted.
    126 TEST(DelayBasedTimeSourceTest,
    127      NextDelaySaneWhenExactlyTwiceAfterRequestedTime) {
    128   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    129       new base::TestSimpleTaskRunner;
    130   FakeTimeSourceClient client;
    131   scoped_refptr<FakeDelayBasedTimeSource> timer =
    132       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    133   timer->SetClient(&client);
    134   timer->SetActive(true);
    135   // Run the first tick.
    136   task_runner->RunPendingTasks();
    137 
    138   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    139 
    140   timer->SetNow(timer->Now() + 2 * Interval());
    141   task_runner->RunPendingTasks();
    142 
    143   EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds());
    144 }
    145 
    146 // At 60Hz, when the tick returns at 2*interval and a bit after the requested
    147 // next time, make sure a 16ms next delay is posted.
    148 TEST(DelayBasedTimeSourceTest,
    149      NextDelaySaneWhenSlightlyAfterTwiceRequestedTime) {
    150   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    151       new base::TestSimpleTaskRunner;
    152   FakeTimeSourceClient client;
    153   scoped_refptr<FakeDelayBasedTimeSource> timer =
    154       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    155   timer->SetClient(&client);
    156   timer->SetActive(true);
    157   // Run the first tick.
    158   task_runner->RunPendingTasks();
    159 
    160   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    161 
    162   timer->SetNow(timer->Now() + 2 * Interval() +
    163                 base::TimeDelta::FromMicroseconds(1));
    164   task_runner->RunPendingTasks();
    165 
    166   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    167 }
    168 
    169 // At 60Hz, when the tick returns halfway to the next frame time, make sure
    170 // a correct next delay value is posted.
    171 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenHalfAfterRequestedTime) {
    172   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    173       new base::TestSimpleTaskRunner;
    174   FakeTimeSourceClient client;
    175   scoped_refptr<FakeDelayBasedTimeSource> timer =
    176       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    177   timer->SetClient(&client);
    178   timer->SetActive(true);
    179   // Run the first tick.
    180   task_runner->RunPendingTasks();
    181 
    182   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    183 
    184   timer->SetNow(timer->Now() + Interval() +
    185                 base::TimeDelta::FromMilliseconds(8));
    186   task_runner->RunPendingTasks();
    187 
    188   EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds());
    189 }
    190 
    191 // If the timebase and interval are updated with a jittery source, we want to
    192 // make sure we do not double tick.
    193 TEST(DelayBasedTimeSourceTest, SaneHandlingOfJitteryTimebase) {
    194   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    195       new base::TestSimpleTaskRunner;
    196   FakeTimeSourceClient client;
    197   scoped_refptr<FakeDelayBasedTimeSource> timer =
    198       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    199   timer->SetClient(&client);
    200   timer->SetActive(true);
    201   // Run the first tick.
    202   task_runner->RunPendingTasks();
    203 
    204   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    205 
    206   // Jitter timebase ~1ms late
    207   timer->SetNow(timer->Now() + Interval());
    208   timer->SetTimebaseAndInterval(
    209       timer->Now() + base::TimeDelta::FromMilliseconds(1), Interval());
    210   task_runner->RunPendingTasks();
    211 
    212   // Without double tick prevention, NextPendingTaskDelay would be 1.
    213   EXPECT_EQ(17, task_runner->NextPendingTaskDelay().InMilliseconds());
    214 
    215   // Jitter timebase ~1ms early
    216   timer->SetNow(timer->Now() + Interval());
    217   timer->SetTimebaseAndInterval(
    218       timer->Now() - base::TimeDelta::FromMilliseconds(1), Interval());
    219   task_runner->RunPendingTasks();
    220 
    221   EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds());
    222 }
    223 
    224 TEST(DelayBasedTimeSourceTest, HandlesSignificantTimebaseChangesImmediately) {
    225   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    226       new base::TestSimpleTaskRunner;
    227   FakeTimeSourceClient client;
    228   scoped_refptr<FakeDelayBasedTimeSource> timer =
    229       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    230   timer->SetClient(&client);
    231   timer->SetActive(true);
    232   // Run the first tick.
    233   task_runner->RunPendingTasks();
    234 
    235   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    236 
    237   // Tick, then shift timebase by +7ms.
    238   timer->SetNow(timer->Now() + Interval());
    239   task_runner->RunPendingTasks();
    240 
    241   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    242 
    243   client.Reset();
    244   task_runner->ClearPendingTasks();
    245   task_runner->RunPendingTasks();
    246   base::TimeDelta jitter = base::TimeDelta::FromMilliseconds(7) +
    247                            base::TimeDelta::FromMicroseconds(1);
    248   timer->SetTimebaseAndInterval(timer->Now() + jitter, Interval());
    249 
    250   EXPECT_FALSE(client.TickCalled());  // Make sure pending tasks were canceled.
    251   EXPECT_EQ(16 + 7, task_runner->NextPendingTaskDelay().InMilliseconds());
    252 
    253   // Tick, then shift timebase by -7ms.
    254   timer->SetNow(timer->Now() + Interval() + jitter);
    255   task_runner->RunPendingTasks();
    256 
    257   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    258 
    259   client.Reset();
    260   task_runner->ClearPendingTasks();
    261   task_runner->RunPendingTasks();
    262   timer->SetTimebaseAndInterval(base::TimeTicks() + Interval(), Interval());
    263 
    264   EXPECT_FALSE(client.TickCalled());  // Make sure pending tasks were canceled.
    265   EXPECT_EQ(16 - 7, task_runner->NextPendingTaskDelay().InMilliseconds());
    266 }
    267 
    268 TEST(DelayBasedTimeSourceTest, HanldlesSignificantIntervalChangesImmediately) {
    269   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    270       new base::TestSimpleTaskRunner;
    271   FakeTimeSourceClient client;
    272   scoped_refptr<FakeDelayBasedTimeSource> timer =
    273       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    274   timer->SetClient(&client);
    275   timer->SetActive(true);
    276   // Run the first tick.
    277   task_runner->RunPendingTasks();
    278 
    279   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    280 
    281   // Tick, then double the interval.
    282   timer->SetNow(timer->Now() + Interval());
    283   task_runner->RunPendingTasks();
    284 
    285   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    286 
    287   client.Reset();
    288   task_runner->ClearPendingTasks();
    289   task_runner->RunPendingTasks();
    290   timer->SetTimebaseAndInterval(base::TimeTicks() + Interval(), Interval() * 2);
    291 
    292   EXPECT_FALSE(client.TickCalled());  // Make sure pending tasks were canceled.
    293   EXPECT_EQ(33, task_runner->NextPendingTaskDelay().InMilliseconds());
    294 
    295   // Tick, then halve the interval.
    296   timer->SetNow(timer->Now() + Interval() * 2);
    297   task_runner->RunPendingTasks();
    298 
    299   EXPECT_EQ(33, task_runner->NextPendingTaskDelay().InMilliseconds());
    300 
    301   client.Reset();
    302   task_runner->ClearPendingTasks();
    303   task_runner->RunPendingTasks();
    304   timer->SetTimebaseAndInterval(base::TimeTicks() + Interval() * 3, Interval());
    305 
    306   EXPECT_FALSE(client.TickCalled());  // Make sure pending tasks were canceled.
    307   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    308 }
    309 
    310 TEST(DelayBasedTimeSourceTest, JitteryRuntimeWithFutureTimebases) {
    311   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    312       new base::TestSimpleTaskRunner;
    313   FakeTimeSourceClient client;
    314   scoped_refptr<FakeDelayBasedTimeSource> timer =
    315       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    316   timer->SetClient(&client);
    317   timer->SetActive(true);
    318 
    319   // Run the first tick.
    320   task_runner->RunPendingTasks();
    321   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    322 
    323   base::TimeTicks future_timebase = timer->Now() + Interval() * 10;
    324 
    325   // 1ms jitter
    326   base::TimeDelta jitter1 = base::TimeDelta::FromMilliseconds(1);
    327 
    328   // Tick with +1ms of jitter
    329   future_timebase += Interval();
    330   timer->SetTimebaseAndInterval(future_timebase, Interval());
    331   timer->SetNow(timer->Now() + Interval() + jitter1);
    332   task_runner->RunPendingTasks();
    333   EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds());
    334 
    335   // Tick with 0ms of jitter
    336   future_timebase += Interval();
    337   timer->SetTimebaseAndInterval(future_timebase, Interval());
    338   timer->SetNow(timer->Now() + Interval() - jitter1);
    339   task_runner->RunPendingTasks();
    340   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    341 
    342   // Tick with -1ms of jitter
    343   future_timebase += Interval();
    344   timer->SetTimebaseAndInterval(future_timebase, Interval());
    345   timer->SetNow(timer->Now() + Interval() - jitter1);
    346   task_runner->RunPendingTasks();
    347   EXPECT_EQ(17, task_runner->NextPendingTaskDelay().InMilliseconds());
    348 
    349   // Tick with 0ms of jitter
    350   future_timebase += Interval();
    351   timer->SetTimebaseAndInterval(future_timebase, Interval());
    352   timer->SetNow(timer->Now() + Interval() + jitter1);
    353   task_runner->RunPendingTasks();
    354   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    355 
    356   // 8 ms jitter
    357   base::TimeDelta jitter8 = base::TimeDelta::FromMilliseconds(8);
    358 
    359   // Tick with +8ms of jitter
    360   future_timebase += Interval();
    361   timer->SetTimebaseAndInterval(future_timebase, Interval());
    362   timer->SetNow(timer->Now() + Interval() + jitter8);
    363   task_runner->RunPendingTasks();
    364   EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds());
    365 
    366   // Tick with 0ms of jitter
    367   future_timebase += Interval();
    368   timer->SetTimebaseAndInterval(future_timebase, Interval());
    369   timer->SetNow(timer->Now() + Interval() - jitter8);
    370   task_runner->RunPendingTasks();
    371   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    372 
    373   // Tick with -8ms of jitter
    374   future_timebase += Interval();
    375   timer->SetTimebaseAndInterval(future_timebase, Interval());
    376   timer->SetNow(timer->Now() + Interval() - jitter8);
    377   task_runner->RunPendingTasks();
    378   EXPECT_EQ(24, task_runner->NextPendingTaskDelay().InMilliseconds());
    379 
    380   // Tick with 0ms of jitter
    381   future_timebase += Interval();
    382   timer->SetTimebaseAndInterval(future_timebase, Interval());
    383   timer->SetNow(timer->Now() + Interval() + jitter8);
    384   task_runner->RunPendingTasks();
    385   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    386 
    387   // 15 ms jitter
    388   base::TimeDelta jitter15  = base::TimeDelta::FromMilliseconds(15);
    389 
    390   // Tick with +15ms jitter
    391   future_timebase += Interval();
    392   timer->SetTimebaseAndInterval(future_timebase, Interval());
    393   timer->SetNow(timer->Now() + Interval() + jitter15);
    394   task_runner->RunPendingTasks();
    395   EXPECT_EQ(1, task_runner->NextPendingTaskDelay().InMilliseconds());
    396 
    397   // Tick with 0ms of jitter
    398   future_timebase += Interval();
    399   timer->SetTimebaseAndInterval(future_timebase, Interval());
    400   timer->SetNow(timer->Now() + Interval() - jitter15);
    401   task_runner->RunPendingTasks();
    402   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    403 
    404   // Tick with -15ms of jitter
    405   future_timebase += Interval();
    406   timer->SetTimebaseAndInterval(future_timebase, Interval());
    407   timer->SetNow(timer->Now() + Interval() - jitter15);
    408   task_runner->RunPendingTasks();
    409   EXPECT_EQ(31, task_runner->NextPendingTaskDelay().InMilliseconds());
    410 
    411   // Tick with 0ms of jitter
    412   future_timebase += Interval();
    413   timer->SetTimebaseAndInterval(future_timebase, Interval());
    414   timer->SetNow(timer->Now() + Interval() + jitter15);
    415   task_runner->RunPendingTasks();
    416   EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
    417 }
    418 
    419 TEST(DelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise) {
    420   int num_iterations = 10;
    421 
    422   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    423       new base::TestSimpleTaskRunner;
    424   FakeTimeSourceClient client;
    425   scoped_refptr<FakeDelayBasedTimeSource> timer =
    426       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    427   timer->SetClient(&client);
    428   timer->SetActive(true);
    429 
    430   double total_frame_time = 0.0;
    431   for (int i = 0; i < num_iterations; ++i) {
    432     int64 delay_ms = task_runner->NextPendingTaskDelay().InMilliseconds();
    433 
    434     // accumulate the "delay"
    435     total_frame_time += delay_ms / 1000.0;
    436 
    437     // Run the callback exactly when asked
    438     timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(delay_ms));
    439     task_runner->RunPendingTasks();
    440   }
    441   double average_interval =
    442       total_frame_time / static_cast<double>(num_iterations);
    443   EXPECT_NEAR(1.0 / 60.0, average_interval, 0.1);
    444 }
    445 
    446 TEST(DelayBasedTimeSourceTest, TestDeactivateWhilePending) {
    447   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    448       new base::TestSimpleTaskRunner;
    449   FakeTimeSourceClient client;
    450   scoped_refptr<FakeDelayBasedTimeSource> timer =
    451       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    452   timer->SetClient(&client);
    453   timer->SetActive(true);  // Should post a task.
    454   timer->SetActive(false);
    455   timer = NULL;
    456   // Should run the posted task without crashing.
    457   EXPECT_TRUE(task_runner->HasPendingTask());
    458   task_runner->RunPendingTasks();
    459 }
    460 
    461 TEST(DelayBasedTimeSourceTest, TestDeactivateAndReactivateBeforeNextTickTime) {
    462   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    463       new base::TestSimpleTaskRunner;
    464   FakeTimeSourceClient client;
    465   scoped_refptr<FakeDelayBasedTimeSource> timer =
    466       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    467   timer->SetClient(&client);
    468 
    469   // Should run the activate task, and pick up a new timebase.
    470   timer->SetActive(true);
    471   task_runner->RunPendingTasks();
    472 
    473   // Stop the timer
    474   timer->SetActive(false);
    475 
    476   // Task will be pending anyway, run it
    477   task_runner->RunPendingTasks();
    478 
    479   // Start the timer again, but before the next tick time the timer previously
    480   // planned on using. That same tick time should still be targeted.
    481   timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(4));
    482   timer->SetActive(true);
    483   EXPECT_EQ(12, task_runner->NextPendingTaskDelay().InMilliseconds());
    484 }
    485 
    486 TEST(DelayBasedTimeSourceTest, TestDeactivateAndReactivateAfterNextTickTime) {
    487   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    488       new base::TestSimpleTaskRunner;
    489   FakeTimeSourceClient client;
    490   scoped_refptr<FakeDelayBasedTimeSource> timer =
    491       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    492   timer->SetClient(&client);
    493 
    494   // Should run the activate task, and pick up a new timebase.
    495   timer->SetActive(true);
    496   task_runner->RunPendingTasks();
    497 
    498   // Stop the timer.
    499   timer->SetActive(false);
    500 
    501   // Task will be pending anyway, run it.
    502   task_runner->RunPendingTasks();
    503 
    504   // Start the timer again, but before the next tick time the timer previously
    505   // planned on using. That same tick time should still be targeted.
    506   timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(20));
    507   timer->SetActive(true);
    508   EXPECT_EQ(13, task_runner->NextPendingTaskDelay().InMilliseconds());
    509 }
    510 
    511 TEST(DelayBasedTimeSourceTest, TestOverflow) {
    512   // int(big_now / interval) < 0, so this causes a crash if the number of
    513   // intervals elapsed is attempted to be stored in an int.
    514   base::TimeDelta interval = base::TimeDelta::FromInternalValue(4000);
    515   base::TimeTicks big_now = base::TimeTicks::FromInternalValue(8635916564000);
    516 
    517   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    518       new base::TestSimpleTaskRunner;
    519   FakeTimeSourceClient client;
    520   scoped_refptr<FakeDelayBasedTimeSource> timer =
    521       FakeDelayBasedTimeSource::Create(interval, task_runner.get());
    522   timer->SetClient(&client);
    523   timer->SetNow(big_now);
    524   timer->SetActive(true);
    525   EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds());
    526 }
    527 
    528 TEST(DelayBasedTimeSourceTest, TestReturnValueWhenTimerIsDeActivated) {
    529   scoped_refptr<base::TestSimpleTaskRunner> task_runner =
    530       new base::TestSimpleTaskRunner;
    531   FakeTimeSourceClient client;
    532   scoped_refptr<FakeDelayBasedTimeSource> timer =
    533       FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
    534   timer->SetClient(&client);
    535 
    536   timer->SetActive(true);
    537   task_runner->RunPendingTasks();
    538 
    539   // SetActive should return empty TimeTicks when the timer is deactivated.
    540   base::TimeTicks missed_tick_time = timer->SetActive(false);
    541   EXPECT_TRUE(missed_tick_time.is_null());
    542 }
    543 
    544 }  // namespace
    545 }  // namespace cc
    546