diff options
Diffstat (limited to 'chromium/cc/scheduler/delay_based_time_source_unittest.cc')
-rw-r--r-- | chromium/cc/scheduler/delay_based_time_source_unittest.cc | 150 |
1 files changed, 138 insertions, 12 deletions
diff --git a/chromium/cc/scheduler/delay_based_time_source_unittest.cc b/chromium/cc/scheduler/delay_based_time_source_unittest.cc index df84c978e57..42652e21868 100644 --- a/chromium/cc/scheduler/delay_based_time_source_unittest.cc +++ b/chromium/cc/scheduler/delay_based_time_source_unittest.cc @@ -88,7 +88,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyOnRequestedTime) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -109,7 +109,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -122,7 +122,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime) { } // At 60Hz, when the tick returns at exactly 2*interval after the requested next -// time, make sure a 16ms next delay is posted. +// time, make sure a 0ms next delay is posted. TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) { scoped_refptr<base::TestSimpleTaskRunner> task_runner = new base::TestSimpleTaskRunner; @@ -131,7 +131,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -139,7 +139,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) { timer->SetNow(timer->Now() + 2 * Interval()); task_runner->RunPendingTasks(); - EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds()); } // At 60Hz, when the tick returns at 2*interval and a bit after the requested @@ -152,7 +152,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterTwiceRequestedTime) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -174,7 +174,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenHalfAfterRequestedTime) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -196,7 +196,7 @@ TEST(DelayBasedTimeSource, SaneHandlingOfJitteryTimebase) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -227,7 +227,7 @@ TEST(DelayBasedTimeSource, HandlesSignificantTimebaseChangesImmediately) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -246,10 +246,10 @@ TEST(DelayBasedTimeSource, HandlesSignificantTimebaseChangesImmediately) { timer->SetTimebaseAndInterval(timer->Now() + jitter, Interval()); EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. - EXPECT_EQ(7, task_runner->NextPendingTaskDelay().InMilliseconds()); + EXPECT_EQ(16 + 7, task_runner->NextPendingTaskDelay().InMilliseconds()); // Tick, then shift timebase by -7ms. - timer->SetNow(timer->Now() + jitter); + timer->SetNow(timer->Now() + Interval() + jitter); task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -271,7 +271,7 @@ TEST(DelayBasedTimeSource, HanldlesSignificantIntervalChangesImmediately) { FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); timer->SetClient(&client); timer->SetActive(true); - // Run the first task, as that activates the timer and picks up a timebase. + // Run the first tick. task_runner->RunPendingTasks(); EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); @@ -305,6 +305,115 @@ TEST(DelayBasedTimeSource, HanldlesSignificantIntervalChangesImmediately) { EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); } +TEST(DelayBasedTimeSource, JitteryRuntimeWithFutureTimebases) { + scoped_refptr<base::TestSimpleTaskRunner> task_runner = + new base::TestSimpleTaskRunner; + FakeTimeSourceClient client; + scoped_refptr<FakeDelayBasedTimeSource> timer = + FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); + timer->SetClient(&client); + timer->SetActive(true); + + // Run the first tick. + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + + base::TimeTicks future_timebase = timer->Now() + Interval() * 10; + + // 1ms jitter + base::TimeDelta jitter1 = base::TimeDelta::FromMilliseconds(1); + + // Tick with +1ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() + jitter1); + task_runner->RunPendingTasks(); + EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with 0ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() - jitter1); + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with -1ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() - jitter1); + task_runner->RunPendingTasks(); + EXPECT_EQ(17, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with 0ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() + jitter1); + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // 8 ms jitter + base::TimeDelta jitter8 = base::TimeDelta::FromMilliseconds(8); + + // Tick with +8ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() + jitter8); + task_runner->RunPendingTasks(); + EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with 0ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() - jitter8); + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with -8ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() - jitter8); + task_runner->RunPendingTasks(); + EXPECT_EQ(24, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with 0ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() + jitter8); + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // 15 ms jitter + base::TimeDelta jitter15 = base::TimeDelta::FromMilliseconds(15); + + // Tick with +15ms jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() + jitter15); + task_runner->RunPendingTasks(); + EXPECT_EQ(1, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with 0ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() - jitter15); + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with -15ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() - jitter15); + task_runner->RunPendingTasks(); + EXPECT_EQ(31, task_runner->NextPendingTaskDelay().InMilliseconds()); + + // Tick with 0ms of jitter + future_timebase += Interval(); + timer->SetTimebaseAndInterval(future_timebase, Interval()); + timer->SetNow(timer->Now() + Interval() + jitter15); + task_runner->RunPendingTasks(); + EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); +} + TEST(DelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise) { int num_iterations = 10; @@ -397,5 +506,22 @@ TEST(DelayBasedTimeSource, TestDeactivateAndReactivateAfterNextTickTime) { EXPECT_EQ(13, task_runner->NextPendingTaskDelay().InMilliseconds()); } +TEST(DelayBasedTimeSource, TestOverflow) { + // int(big_now / interval) < 0, so this causes a crash if the number of + // intervals elapsed is attempted to be stored in an int. + base::TimeDelta interval = base::TimeDelta::FromInternalValue(4000); + base::TimeTicks big_now = base::TimeTicks::FromInternalValue(8635916564000); + + scoped_refptr<base::TestSimpleTaskRunner> task_runner = + new base::TestSimpleTaskRunner; + FakeTimeSourceClient client; + scoped_refptr<FakeDelayBasedTimeSource> timer = + FakeDelayBasedTimeSource::Create(interval, task_runner.get()); + timer->SetClient(&client); + timer->SetNow(big_now); + timer->SetActive(true); + EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds()); +} + } // namespace } // namespace cc |