summaryrefslogtreecommitdiff
path: root/chromium/cc/scheduler/delay_based_time_source_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/scheduler/delay_based_time_source_unittest.cc')
-rw-r--r--chromium/cc/scheduler/delay_based_time_source_unittest.cc150
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