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

Side by Side Diff: cc/scheduler/delay_based_time_source_unittest.cc

Issue 1200113003: cc: Cleanup DelayBasedTimeSource code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@task_runner_refptr
Patch Set: mithro's review Created 5 years, 5 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
« no previous file with comments | « cc/scheduler/delay_based_time_source.cc ('k') | cc/test/scheduler_test_common.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 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 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 "cc/scheduler/delay_based_time_source.h" 5 #include "cc/scheduler/delay_based_time_source.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/test/test_simple_task_runner.h" 8 #include "base/test/test_simple_task_runner.h"
9 #include "cc/test/scheduler_test_common.h" 9 #include "cc/test/scheduler_test_common.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 11
12 namespace cc { 12 namespace cc {
13 namespace { 13 namespace {
14 14
15 base::TimeDelta Interval() { 15 base::TimeDelta Interval() {
16 return base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / 16 return base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
17 60); 17 60);
18 } 18 }
19 19
20 TEST(DelayBasedTimeSourceTest, TaskPostedAndTickCalled) { 20 TEST(DelayBasedTimeSourceTest, TaskPostedAndTickCalled) {
21 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 21 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
22 new base::TestSimpleTaskRunner; 22 new base::TestSimpleTaskRunner;
23 FakeTimeSourceClient client; 23 FakeDelayBasedTimeSourceClient client;
24 scoped_ptr<FakeDelayBasedTimeSource> timer = 24 scoped_ptr<FakeDelayBasedTimeSource> timer =
25 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 25 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
26 timer->SetClient(&client); 26 timer->SetClient(&client);
27 27
28 timer->SetActive(true); 28 timer->SetActive(true);
29 EXPECT_TRUE(timer->Active()); 29 EXPECT_TRUE(timer->Active());
30 EXPECT_TRUE(task_runner->HasPendingTask()); 30 EXPECT_TRUE(task_runner->HasPendingTask());
31 31
32 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(16)); 32 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(16));
33 task_runner->RunPendingTasks(); 33 task_runner->RunPendingTasks();
34 EXPECT_TRUE(timer->Active()); 34 EXPECT_TRUE(timer->Active());
35 EXPECT_TRUE(client.TickCalled()); 35 EXPECT_TRUE(client.TickCalled());
36 } 36 }
37 37
38 TEST(DelayBasedTimeSourceTest, TickNotCalledWithTaskPosted) { 38 TEST(DelayBasedTimeSourceTest, TickNotCalledWithTaskPosted) {
39 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 39 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
40 new base::TestSimpleTaskRunner; 40 new base::TestSimpleTaskRunner;
41 FakeTimeSourceClient client; 41 FakeDelayBasedTimeSourceClient client;
42 scoped_ptr<FakeDelayBasedTimeSource> timer = 42 scoped_ptr<FakeDelayBasedTimeSource> timer =
43 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 43 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
44 timer->SetClient(&client); 44 timer->SetClient(&client);
45 timer->SetActive(true); 45 timer->SetActive(true);
46 EXPECT_TRUE(task_runner->HasPendingTask()); 46 EXPECT_TRUE(task_runner->HasPendingTask());
47 timer->SetActive(false); 47 timer->SetActive(false);
48 task_runner->RunPendingTasks(); 48 task_runner->RunPendingTasks();
49 EXPECT_FALSE(client.TickCalled()); 49 EXPECT_FALSE(client.TickCalled());
50 } 50 }
51 51
52 TEST(DelayBasedTimeSourceTest, StartTwiceEnqueuesOneTask) { 52 TEST(DelayBasedTimeSourceTest, StartTwiceEnqueuesOneTask) {
53 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 53 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
54 new base::TestSimpleTaskRunner; 54 new base::TestSimpleTaskRunner;
55 FakeTimeSourceClient client; 55 FakeDelayBasedTimeSourceClient client;
56 scoped_ptr<FakeDelayBasedTimeSource> timer = 56 scoped_ptr<FakeDelayBasedTimeSource> timer =
57 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 57 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
58 timer->SetClient(&client); 58 timer->SetClient(&client);
59 timer->SetActive(true); 59 timer->SetActive(true);
60 EXPECT_TRUE(task_runner->HasPendingTask()); 60 EXPECT_TRUE(task_runner->HasPendingTask());
61 task_runner->ClearPendingTasks(); 61 task_runner->ClearPendingTasks();
62 timer->SetActive(true); 62 timer->SetActive(true);
63 EXPECT_FALSE(task_runner->HasPendingTask()); 63 EXPECT_FALSE(task_runner->HasPendingTask());
64 } 64 }
65 65
66 TEST(DelayBasedTimeSourceTest, StartWhenRunningDoesntTick) { 66 TEST(DelayBasedTimeSourceTest, StartWhenRunningDoesntTick) {
67 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 67 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
68 new base::TestSimpleTaskRunner; 68 new base::TestSimpleTaskRunner;
69 FakeTimeSourceClient client; 69 FakeDelayBasedTimeSourceClient client;
70 scoped_ptr<FakeDelayBasedTimeSource> timer = 70 scoped_ptr<FakeDelayBasedTimeSource> timer =
71 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 71 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
72 timer->SetClient(&client); 72 timer->SetClient(&client);
73 timer->SetActive(true); 73 timer->SetActive(true);
74 EXPECT_TRUE(task_runner->HasPendingTask()); 74 EXPECT_TRUE(task_runner->HasPendingTask());
75 task_runner->RunPendingTasks(); 75 task_runner->RunPendingTasks();
76 task_runner->ClearPendingTasks(); 76 task_runner->ClearPendingTasks();
77 timer->SetActive(true); 77 timer->SetActive(true);
78 EXPECT_FALSE(task_runner->HasPendingTask()); 78 EXPECT_FALSE(task_runner->HasPendingTask());
79 } 79 }
80 80
81 // At 60Hz, when the tick returns at exactly the requested next time, make sure 81 // At 60Hz, when the tick returns at exactly the requested next time, make sure
82 // a 16ms next delay is posted. 82 // a 16ms next delay is posted.
83 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenExactlyOnRequestedTime) { 83 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenExactlyOnRequestedTime) {
84 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 84 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
85 new base::TestSimpleTaskRunner; 85 new base::TestSimpleTaskRunner;
86 FakeTimeSourceClient client; 86 FakeDelayBasedTimeSourceClient client;
87 scoped_ptr<FakeDelayBasedTimeSource> timer = 87 scoped_ptr<FakeDelayBasedTimeSource> timer =
88 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 88 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
89 timer->SetClient(&client); 89 timer->SetClient(&client);
90 timer->SetActive(true); 90 timer->SetActive(true);
91 // Run the first tick. 91 // Run the first tick.
92 task_runner->RunPendingTasks(); 92 task_runner->RunPendingTasks();
93 93
94 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 94 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
95 95
96 timer->SetNow(timer->Now() + Interval()); 96 timer->SetNow(timer->Now() + Interval());
97 task_runner->RunPendingTasks(); 97 task_runner->RunPendingTasks();
98 98
99 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 99 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
100 } 100 }
101 101
102 // At 60Hz, when the tick returns at slightly after the requested next time, 102 // At 60Hz, when the tick returns at slightly after the requested next time,
103 // make sure a 16ms next delay is posted. 103 // make sure a 16ms next delay is posted.
104 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenSlightlyAfterRequestedTime) { 104 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenSlightlyAfterRequestedTime) {
105 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 105 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
106 new base::TestSimpleTaskRunner; 106 new base::TestSimpleTaskRunner;
107 FakeTimeSourceClient client; 107 FakeDelayBasedTimeSourceClient client;
108 scoped_ptr<FakeDelayBasedTimeSource> timer = 108 scoped_ptr<FakeDelayBasedTimeSource> timer =
109 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 109 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
110 timer->SetClient(&client); 110 timer->SetClient(&client);
111 timer->SetActive(true); 111 timer->SetActive(true);
112 // Run the first tick. 112 // Run the first tick.
113 task_runner->RunPendingTasks(); 113 task_runner->RunPendingTasks();
114 114
115 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 115 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
116 116
117 timer->SetNow(timer->Now() + Interval() + 117 timer->SetNow(timer->Now() + Interval() +
118 base::TimeDelta::FromMicroseconds(1)); 118 base::TimeDelta::FromMicroseconds(1));
119 task_runner->RunPendingTasks(); 119 task_runner->RunPendingTasks();
120 120
121 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 121 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
122 } 122 }
123 123
124 // At 60Hz, when the tick returns at exactly 2*interval after the requested next 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. 125 // time, make sure a 0ms next delay is posted.
126 TEST(DelayBasedTimeSourceTest, 126 TEST(DelayBasedTimeSourceTest,
127 NextDelaySaneWhenExactlyTwiceAfterRequestedTime) { 127 NextDelaySaneWhenExactlyTwiceAfterRequestedTime) {
128 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 128 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
129 new base::TestSimpleTaskRunner; 129 new base::TestSimpleTaskRunner;
130 FakeTimeSourceClient client; 130 FakeDelayBasedTimeSourceClient client;
131 scoped_ptr<FakeDelayBasedTimeSource> timer = 131 scoped_ptr<FakeDelayBasedTimeSource> timer =
132 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 132 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
133 timer->SetClient(&client); 133 timer->SetClient(&client);
134 timer->SetActive(true); 134 timer->SetActive(true);
135 // Run the first tick. 135 // Run the first tick.
136 task_runner->RunPendingTasks(); 136 task_runner->RunPendingTasks();
137 137
138 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 138 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
139 139
140 timer->SetNow(timer->Now() + 2 * Interval()); 140 timer->SetNow(timer->Now() + 2 * Interval());
141 task_runner->RunPendingTasks(); 141 task_runner->RunPendingTasks();
142 142
143 EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds()); 143 EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds());
144 } 144 }
145 145
146 // At 60Hz, when the tick returns at 2*interval and a bit after the requested 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. 147 // next time, make sure a 16ms next delay is posted.
148 TEST(DelayBasedTimeSourceTest, 148 TEST(DelayBasedTimeSourceTest,
149 NextDelaySaneWhenSlightlyAfterTwiceRequestedTime) { 149 NextDelaySaneWhenSlightlyAfterTwiceRequestedTime) {
150 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 150 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
151 new base::TestSimpleTaskRunner; 151 new base::TestSimpleTaskRunner;
152 FakeTimeSourceClient client; 152 FakeDelayBasedTimeSourceClient client;
153 scoped_ptr<FakeDelayBasedTimeSource> timer = 153 scoped_ptr<FakeDelayBasedTimeSource> timer =
154 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 154 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
155 timer->SetClient(&client); 155 timer->SetClient(&client);
156 timer->SetActive(true); 156 timer->SetActive(true);
157 // Run the first tick. 157 // Run the first tick.
158 task_runner->RunPendingTasks(); 158 task_runner->RunPendingTasks();
159 159
160 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 160 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
161 161
162 timer->SetNow(timer->Now() + 2 * Interval() + 162 timer->SetNow(timer->Now() + 2 * Interval() +
163 base::TimeDelta::FromMicroseconds(1)); 163 base::TimeDelta::FromMicroseconds(1));
164 task_runner->RunPendingTasks(); 164 task_runner->RunPendingTasks();
165 165
166 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 166 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
167 } 167 }
168 168
169 // At 60Hz, when the tick returns halfway to the next frame time, make sure 169 // At 60Hz, when the tick returns halfway to the next frame time, make sure
170 // a correct next delay value is posted. 170 // a correct next delay value is posted.
171 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenHalfAfterRequestedTime) { 171 TEST(DelayBasedTimeSourceTest, NextDelaySaneWhenHalfAfterRequestedTime) {
172 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 172 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
173 new base::TestSimpleTaskRunner; 173 new base::TestSimpleTaskRunner;
174 FakeTimeSourceClient client; 174 FakeDelayBasedTimeSourceClient client;
175 scoped_ptr<FakeDelayBasedTimeSource> timer = 175 scoped_ptr<FakeDelayBasedTimeSource> timer =
176 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 176 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
177 timer->SetClient(&client); 177 timer->SetClient(&client);
178 timer->SetActive(true); 178 timer->SetActive(true);
179 // Run the first tick. 179 // Run the first tick.
180 task_runner->RunPendingTasks(); 180 task_runner->RunPendingTasks();
181 181
182 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 182 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
183 183
184 timer->SetNow(timer->Now() + Interval() + 184 timer->SetNow(timer->Now() + Interval() +
185 base::TimeDelta::FromMilliseconds(8)); 185 base::TimeDelta::FromMilliseconds(8));
186 task_runner->RunPendingTasks(); 186 task_runner->RunPendingTasks();
187 187
188 EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds()); 188 EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds());
189 } 189 }
190 190
191 // If the timebase and interval are updated with a jittery source, we want to 191 // If the timebase and interval are updated with a jittery source, we want to
192 // make sure we do not double tick. 192 // make sure we do not double tick.
193 TEST(DelayBasedTimeSourceTest, SaneHandlingOfJitteryTimebase) { 193 TEST(DelayBasedTimeSourceTest, SaneHandlingOfJitteryTimebase) {
194 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 194 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
195 new base::TestSimpleTaskRunner; 195 new base::TestSimpleTaskRunner;
196 FakeTimeSourceClient client; 196 FakeDelayBasedTimeSourceClient client;
197 scoped_ptr<FakeDelayBasedTimeSource> timer = 197 scoped_ptr<FakeDelayBasedTimeSource> timer =
198 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 198 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
199 timer->SetClient(&client); 199 timer->SetClient(&client);
200 timer->SetActive(true); 200 timer->SetActive(true);
201 // Run the first tick. 201 // Run the first tick.
202 task_runner->RunPendingTasks(); 202 task_runner->RunPendingTasks();
203 203
204 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 204 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
205 205
206 // Jitter timebase ~1ms late 206 // Jitter timebase ~1ms late
(...skipping 10 matching lines...) Expand all
217 timer->SetTimebaseAndInterval( 217 timer->SetTimebaseAndInterval(
218 timer->Now() - base::TimeDelta::FromMilliseconds(1), Interval()); 218 timer->Now() - base::TimeDelta::FromMilliseconds(1), Interval());
219 task_runner->RunPendingTasks(); 219 task_runner->RunPendingTasks();
220 220
221 EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds()); 221 EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds());
222 } 222 }
223 223
224 TEST(DelayBasedTimeSourceTest, HandlesSignificantTimebaseChangesImmediately) { 224 TEST(DelayBasedTimeSourceTest, HandlesSignificantTimebaseChangesImmediately) {
225 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 225 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
226 new base::TestSimpleTaskRunner; 226 new base::TestSimpleTaskRunner;
227 FakeTimeSourceClient client; 227 FakeDelayBasedTimeSourceClient client;
228 scoped_ptr<FakeDelayBasedTimeSource> timer = 228 scoped_ptr<FakeDelayBasedTimeSource> timer =
229 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 229 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
230 timer->SetClient(&client); 230 timer->SetClient(&client);
231 timer->SetActive(true); 231 timer->SetActive(true);
232 // Run the first tick. 232 // Run the first tick.
233 task_runner->RunPendingTasks(); 233 task_runner->RunPendingTasks();
234 234
235 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 235 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
236 236
237 // Tick, then shift timebase by +7ms. 237 // Tick, then shift timebase by +7ms.
(...skipping 23 matching lines...) Expand all
261 task_runner->RunPendingTasks(); 261 task_runner->RunPendingTasks();
262 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval(), Interval()); 262 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval(), Interval());
263 263
264 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. 264 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled.
265 EXPECT_EQ(16 - 7, task_runner->NextPendingTaskDelay().InMilliseconds()); 265 EXPECT_EQ(16 - 7, task_runner->NextPendingTaskDelay().InMilliseconds());
266 } 266 }
267 267
268 TEST(DelayBasedTimeSourceTest, HanldlesSignificantIntervalChangesImmediately) { 268 TEST(DelayBasedTimeSourceTest, HanldlesSignificantIntervalChangesImmediately) {
269 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 269 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
270 new base::TestSimpleTaskRunner; 270 new base::TestSimpleTaskRunner;
271 FakeTimeSourceClient client; 271 FakeDelayBasedTimeSourceClient client;
272 scoped_ptr<FakeDelayBasedTimeSource> timer = 272 scoped_ptr<FakeDelayBasedTimeSource> timer =
273 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 273 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
274 timer->SetClient(&client); 274 timer->SetClient(&client);
275 timer->SetActive(true); 275 timer->SetActive(true);
276 // Run the first tick. 276 // Run the first tick.
277 task_runner->RunPendingTasks(); 277 task_runner->RunPendingTasks();
278 278
279 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 279 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
280 280
281 // Tick, then double the interval. 281 // Tick, then double the interval.
(...skipping 21 matching lines...) Expand all
303 task_runner->RunPendingTasks(); 303 task_runner->RunPendingTasks();
304 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval() * 3, Interval()); 304 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval() * 3, Interval());
305 305
306 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. 306 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled.
307 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 307 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
308 } 308 }
309 309
310 TEST(DelayBasedTimeSourceTest, JitteryRuntimeWithFutureTimebases) { 310 TEST(DelayBasedTimeSourceTest, JitteryRuntimeWithFutureTimebases) {
311 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 311 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
312 new base::TestSimpleTaskRunner; 312 new base::TestSimpleTaskRunner;
313 FakeTimeSourceClient client; 313 FakeDelayBasedTimeSourceClient client;
314 scoped_ptr<FakeDelayBasedTimeSource> timer = 314 scoped_ptr<FakeDelayBasedTimeSource> timer =
315 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 315 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
316 timer->SetClient(&client); 316 timer->SetClient(&client);
317 timer->SetActive(true); 317 timer->SetActive(true);
318 318
319 // Run the first tick. 319 // Run the first tick.
320 task_runner->RunPendingTasks(); 320 task_runner->RunPendingTasks();
321 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 321 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
322 322
323 base::TimeTicks future_timebase = timer->Now() + Interval() * 10; 323 base::TimeTicks future_timebase = timer->Now() + Interval() * 10;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 timer->SetNow(timer->Now() + Interval() + jitter15); 414 timer->SetNow(timer->Now() + Interval() + jitter15);
415 task_runner->RunPendingTasks(); 415 task_runner->RunPendingTasks();
416 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 416 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
417 } 417 }
418 418
419 TEST(DelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise) { 419 TEST(DelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise) {
420 int num_iterations = 10; 420 int num_iterations = 10;
421 421
422 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 422 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
423 new base::TestSimpleTaskRunner; 423 new base::TestSimpleTaskRunner;
424 FakeTimeSourceClient client; 424 FakeDelayBasedTimeSourceClient client;
425 scoped_ptr<FakeDelayBasedTimeSource> timer = 425 scoped_ptr<FakeDelayBasedTimeSource> timer =
426 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 426 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
427 timer->SetClient(&client); 427 timer->SetClient(&client);
428 timer->SetActive(true); 428 timer->SetActive(true);
429 429
430 double total_frame_time = 0.0; 430 double total_frame_time = 0.0;
431 for (int i = 0; i < num_iterations; ++i) { 431 for (int i = 0; i < num_iterations; ++i) {
432 int64 delay_ms = task_runner->NextPendingTaskDelay().InMilliseconds(); 432 int64 delay_ms = task_runner->NextPendingTaskDelay().InMilliseconds();
433 433
434 // accumulate the "delay" 434 // accumulate the "delay"
435 total_frame_time += delay_ms / 1000.0; 435 total_frame_time += delay_ms / 1000.0;
436 436
437 // Run the callback exactly when asked 437 // Run the callback exactly when asked
438 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(delay_ms)); 438 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(delay_ms));
439 task_runner->RunPendingTasks(); 439 task_runner->RunPendingTasks();
440 } 440 }
441 double average_interval = 441 double average_interval =
442 total_frame_time / static_cast<double>(num_iterations); 442 total_frame_time / static_cast<double>(num_iterations);
443 EXPECT_NEAR(1.0 / 60.0, average_interval, 0.1); 443 EXPECT_NEAR(1.0 / 60.0, average_interval, 0.1);
444 } 444 }
445 445
446 TEST(DelayBasedTimeSourceTest, TestDeactivateWhilePending) { 446 TEST(DelayBasedTimeSourceTest, TestDeactivateWhilePending) {
447 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 447 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
448 new base::TestSimpleTaskRunner; 448 new base::TestSimpleTaskRunner;
449 FakeTimeSourceClient client; 449 FakeDelayBasedTimeSourceClient client;
450 scoped_ptr<FakeDelayBasedTimeSource> timer = 450 scoped_ptr<FakeDelayBasedTimeSource> timer =
451 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 451 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
452 timer->SetClient(&client); 452 timer->SetClient(&client);
453 timer->SetActive(true); // Should post a task. 453 timer->SetActive(true); // Should post a task.
454 timer->SetActive(false); 454 timer->SetActive(false);
455 timer = NULL; 455 timer = NULL;
456 // Should run the posted task without crashing. 456 // Should run the posted task without crashing.
457 EXPECT_TRUE(task_runner->HasPendingTask()); 457 EXPECT_TRUE(task_runner->HasPendingTask());
458 task_runner->RunPendingTasks(); 458 task_runner->RunPendingTasks();
459 } 459 }
460 460
461 TEST(DelayBasedTimeSourceTest, TestDeactivateAndReactivateBeforeNextTickTime) { 461 TEST(DelayBasedTimeSourceTest, TestDeactivateAndReactivateBeforeNextTickTime) {
462 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 462 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
463 new base::TestSimpleTaskRunner; 463 new base::TestSimpleTaskRunner;
464 FakeTimeSourceClient client; 464 FakeDelayBasedTimeSourceClient client;
465 scoped_ptr<FakeDelayBasedTimeSource> timer = 465 scoped_ptr<FakeDelayBasedTimeSource> timer =
466 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 466 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
467 timer->SetClient(&client); 467 timer->SetClient(&client);
468 468
469 // Should run the activate task, and pick up a new timebase. 469 // Should run the activate task, and pick up a new timebase.
470 timer->SetActive(true); 470 timer->SetActive(true);
471 task_runner->RunPendingTasks(); 471 task_runner->RunPendingTasks();
472 472
473 // Stop the timer 473 // Stop the timer
474 timer->SetActive(false); 474 timer->SetActive(false);
475 475
476 // Task will be pending anyway, run it 476 // Task will be pending anyway, run it
477 task_runner->RunPendingTasks(); 477 task_runner->RunPendingTasks();
478 478
479 // Start the timer again, but before the next tick time the timer previously 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. 480 // planned on using. That same tick time should still be targeted.
481 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(4)); 481 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(4));
482 timer->SetActive(true); 482 timer->SetActive(true);
483 EXPECT_EQ(12, task_runner->NextPendingTaskDelay().InMilliseconds()); 483 EXPECT_EQ(12, task_runner->NextPendingTaskDelay().InMilliseconds());
484 } 484 }
485 485
486 TEST(DelayBasedTimeSourceTest, TestDeactivateAndReactivateAfterNextTickTime) { 486 TEST(DelayBasedTimeSourceTest, TestDeactivateAndReactivateAfterNextTickTime) {
487 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 487 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
488 new base::TestSimpleTaskRunner; 488 new base::TestSimpleTaskRunner;
489 FakeTimeSourceClient client; 489 FakeDelayBasedTimeSourceClient client;
490 scoped_ptr<FakeDelayBasedTimeSource> timer = 490 scoped_ptr<FakeDelayBasedTimeSource> timer =
491 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 491 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
492 timer->SetClient(&client); 492 timer->SetClient(&client);
493 493
494 // Should run the activate task, and pick up a new timebase. 494 // Should run the activate task, and pick up a new timebase.
495 timer->SetActive(true); 495 timer->SetActive(true);
496 task_runner->RunPendingTasks(); 496 task_runner->RunPendingTasks();
497 497
498 // Stop the timer. 498 // Stop the timer.
499 timer->SetActive(false); 499 timer->SetActive(false);
500 500
501 // Task will be pending anyway, run it. 501 // Task will be pending anyway, run it.
502 task_runner->RunPendingTasks(); 502 task_runner->RunPendingTasks();
503 503
504 // Start the timer again, but before the next tick time the timer previously 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. 505 // planned on using. That same tick time should still be targeted.
506 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(20)); 506 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(20));
507 timer->SetActive(true); 507 timer->SetActive(true);
508 EXPECT_EQ(13, task_runner->NextPendingTaskDelay().InMilliseconds()); 508 EXPECT_EQ(13, task_runner->NextPendingTaskDelay().InMilliseconds());
509 } 509 }
510 510
511 TEST(DelayBasedTimeSourceTest, TestReturnValueWhenTimerIsDeActivated) { 511 TEST(DelayBasedTimeSourceTest, TestReturnValueWhenTimerIsDeActivated) {
512 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 512 scoped_refptr<base::TestSimpleTaskRunner> task_runner =
513 new base::TestSimpleTaskRunner; 513 new base::TestSimpleTaskRunner;
514 FakeTimeSourceClient client; 514 FakeDelayBasedTimeSourceClient client;
515 scoped_ptr<FakeDelayBasedTimeSource> timer = 515 scoped_ptr<FakeDelayBasedTimeSource> timer =
516 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 516 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
517 timer->SetClient(&client); 517 timer->SetClient(&client);
518 518
519 timer->SetActive(true); 519 timer->SetActive(true);
520 task_runner->RunPendingTasks(); 520 task_runner->RunPendingTasks();
521 521
522 // SetActive should return empty TimeTicks when the timer is deactivated. 522 // SetActive should return empty TimeTicks when the timer is deactivated.
523 base::TimeTicks missed_tick_time = timer->SetActive(false); 523 base::TimeTicks missed_tick_time = timer->SetActive(false);
524 EXPECT_TRUE(missed_tick_time.is_null()); 524 EXPECT_TRUE(missed_tick_time.is_null());
525 } 525 }
526 526
527 } // namespace 527 } // namespace
528 } // namespace cc 528 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/delay_based_time_source.cc ('k') | cc/test/scheduler_test_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698