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 "platform/Timer.h" | 5 #include "platform/Timer.h" |
6 | 6 |
7 #include "platform/scheduler/base/task_queue_impl.h" | 7 #include "platform/scheduler/base/task_queue_impl.h" |
8 #include "platform/scheduler/child/web_task_runner_impl.h" | 8 #include "platform/scheduler/child/web_task_runner_impl.h" |
9 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" | 9 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" |
10 #include "platform/testing/TestingPlatformSupport.h" | 10 #include "platform/testing/TestingPlatformSupport.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include <queue> | 21 #include <queue> |
22 | 22 |
23 using testing::ElementsAre; | 23 using testing::ElementsAre; |
24 | 24 |
25 namespace blink { | 25 namespace blink { |
26 namespace { | 26 namespace { |
27 | 27 |
28 class TimerTest : public testing::Test { | 28 class TimerTest : public testing::Test { |
29 public: | 29 public: |
30 void SetUp() override { | 30 void SetUp() override { |
| 31 m_platform.reset(new TestingPlatformSupportWithMockScheduler); |
31 m_runTimes.clear(); | 32 m_runTimes.clear(); |
32 m_platform.advanceClockSeconds(10.0); | 33 m_platform->advanceClockSeconds(10.0); |
33 m_startTime = monotonicallyIncreasingTime(); | 34 m_startTime = monotonicallyIncreasingTime(); |
34 } | 35 } |
35 | 36 |
36 void countingTask(TimerBase*) { | 37 void countingTask(TimerBase*) { |
37 m_runTimes.append(monotonicallyIncreasingTime()); | 38 m_runTimes.append(monotonicallyIncreasingTime()); |
38 } | 39 } |
39 | 40 |
40 void recordNextFireTimeTask(TimerBase* timer) { | 41 void recordNextFireTimeTask(TimerBase* timer) { |
41 m_nextFireTimes.append(monotonicallyIncreasingTime() + | 42 m_nextFireTimes.append(monotonicallyIncreasingTime() + |
42 timer->nextFireInterval()); | 43 timer->nextFireInterval()); |
43 } | 44 } |
44 | 45 |
45 void runUntilDeadline(double deadline) { | 46 void runUntilDeadline(double deadline) { |
46 double period = deadline - monotonicallyIncreasingTime(); | 47 double period = deadline - monotonicallyIncreasingTime(); |
47 EXPECT_GE(period, 0.0); | 48 EXPECT_GE(period, 0.0); |
48 m_platform.runForPeriodSeconds(period); | 49 m_platform->runForPeriodSeconds(period); |
49 } | 50 } |
50 | 51 |
51 // Returns false if there are no pending delayed tasks, otherwise sets |time| | 52 // Returns false if there are no pending delayed tasks, otherwise sets |time| |
52 // to the delay in seconds till the next pending delayed task is scheduled to | 53 // to the delay in seconds till the next pending delayed task is scheduled to |
53 // fire. | 54 // fire. |
54 bool timeTillNextDelayedTask(double* time) const { | 55 bool timeTillNextDelayedTask(double* time) const { |
55 base::TimeTicks nextRunTime; | 56 base::TimeTicks nextRunTime; |
56 if (!m_platform.rendererScheduler() | 57 if (!m_platform->rendererScheduler() |
57 ->TimerTaskRunner() | 58 ->TimerTaskRunner() |
58 ->GetTimeDomain() | 59 ->GetTimeDomain() |
59 ->NextScheduledRunTime(&nextRunTime)) | 60 ->NextScheduledRunTime(&nextRunTime)) |
60 return false; | 61 return false; |
61 *time = (nextRunTime - | 62 *time = (nextRunTime - |
62 m_platform.rendererScheduler() | 63 m_platform->rendererScheduler() |
63 ->TimerTaskRunner() | 64 ->TimerTaskRunner() |
64 ->GetTimeDomain() | 65 ->GetTimeDomain() |
65 ->Now()) | 66 ->Now()) |
66 .InSecondsF(); | 67 .InSecondsF(); |
67 return true; | 68 return true; |
68 } | 69 } |
69 | 70 |
70 protected: | 71 protected: |
71 double m_startTime; | 72 double m_startTime; |
72 WTF::Vector<double> m_runTimes; | 73 WTF::Vector<double> m_runTimes; |
73 WTF::Vector<double> m_nextFireTimes; | 74 WTF::Vector<double> m_nextFireTimes; |
74 TestingPlatformSupportWithMockScheduler m_platform; | 75 ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler> |
| 76 m_platform; |
75 }; | 77 }; |
76 | 78 |
77 class OnHeapTimerOwner final | 79 class OnHeapTimerOwner final |
78 : public GarbageCollectedFinalized<OnHeapTimerOwner> { | 80 : public GarbageCollectedFinalized<OnHeapTimerOwner> { |
79 public: | 81 public: |
80 class Record final : public RefCounted<Record> { | 82 class Record final : public RefCounted<Record> { |
81 public: | 83 public: |
82 static PassRefPtr<Record> create() { return adoptRef(new Record); } | 84 static PassRefPtr<Record> create() { return adoptRef(new Record); } |
83 | 85 |
84 bool timerHasFired() const { return m_timerHasFired; } | 86 bool timerHasFired() const { return m_timerHasFired; } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 ~GCForbiddenScope() { ThreadState::current()->leaveGCForbiddenScope(); } | 125 ~GCForbiddenScope() { ThreadState::current()->leaveGCForbiddenScope(); } |
124 }; | 126 }; |
125 | 127 |
126 TEST_F(TimerTest, StartOneShot_Zero) { | 128 TEST_F(TimerTest, StartOneShot_Zero) { |
127 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 129 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
128 timer.startOneShot(0, BLINK_FROM_HERE); | 130 timer.startOneShot(0, BLINK_FROM_HERE); |
129 | 131 |
130 double runTime; | 132 double runTime; |
131 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); | 133 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); |
132 | 134 |
133 m_platform.runUntilIdle(); | 135 m_platform->runUntilIdle(); |
134 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); | 136 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); |
135 } | 137 } |
136 | 138 |
137 TEST_F(TimerTest, StartOneShot_ZeroAndCancel) { | 139 TEST_F(TimerTest, StartOneShot_ZeroAndCancel) { |
138 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 140 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
139 timer.startOneShot(0, BLINK_FROM_HERE); | 141 timer.startOneShot(0, BLINK_FROM_HERE); |
140 | 142 |
141 double runTime; | 143 double runTime; |
142 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); | 144 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); |
143 | 145 |
144 timer.stop(); | 146 timer.stop(); |
145 | 147 |
146 m_platform.runUntilIdle(); | 148 m_platform->runUntilIdle(); |
147 EXPECT_FALSE(m_runTimes.size()); | 149 EXPECT_FALSE(m_runTimes.size()); |
148 } | 150 } |
149 | 151 |
150 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) { | 152 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) { |
151 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 153 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
152 timer.startOneShot(0, BLINK_FROM_HERE); | 154 timer.startOneShot(0, BLINK_FROM_HERE); |
153 | 155 |
154 double runTime; | 156 double runTime; |
155 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); | 157 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); |
156 | 158 |
157 timer.stop(); | 159 timer.stop(); |
158 | 160 |
159 m_platform.runUntilIdle(); | 161 m_platform->runUntilIdle(); |
160 EXPECT_FALSE(m_runTimes.size()); | 162 EXPECT_FALSE(m_runTimes.size()); |
161 | 163 |
162 timer.startOneShot(0, BLINK_FROM_HERE); | 164 timer.startOneShot(0, BLINK_FROM_HERE); |
163 | 165 |
164 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); | 166 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); |
165 | 167 |
166 m_platform.runUntilIdle(); | 168 m_platform->runUntilIdle(); |
167 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); | 169 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); |
168 } | 170 } |
169 | 171 |
170 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) { | 172 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) { |
171 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 173 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
172 timer.startOneShot(0, BLINK_FROM_HERE); | 174 timer.startOneShot(0, BLINK_FROM_HERE); |
173 | 175 |
174 double runTime; | 176 double runTime; |
175 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); | 177 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); |
176 | 178 |
177 m_platform.runUntilIdle(); | 179 m_platform->runUntilIdle(); |
178 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); | 180 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime)); |
179 | 181 |
180 timer.startOneShot(0, BLINK_FROM_HERE); | 182 timer.startOneShot(0, BLINK_FROM_HERE); |
181 | 183 |
182 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); | 184 EXPECT_FALSE(timeTillNextDelayedTask(&runTime)); |
183 | 185 |
184 m_platform.runUntilIdle(); | 186 m_platform->runUntilIdle(); |
185 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime)); | 187 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime, m_startTime)); |
186 } | 188 } |
187 | 189 |
188 TEST_F(TimerTest, StartOneShot_NonZero) { | 190 TEST_F(TimerTest, StartOneShot_NonZero) { |
189 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 191 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
190 timer.startOneShot(10.0, BLINK_FROM_HERE); | 192 timer.startOneShot(10.0, BLINK_FROM_HERE); |
191 | 193 |
192 double runTime; | 194 double runTime; |
193 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 195 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
194 EXPECT_FLOAT_EQ(10.0, runTime); | 196 EXPECT_FLOAT_EQ(10.0, runTime); |
195 | 197 |
196 m_platform.runUntilIdle(); | 198 m_platform->runUntilIdle(); |
197 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 199 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
198 } | 200 } |
199 | 201 |
200 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) { | 202 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) { |
201 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 203 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
202 timer.startOneShot(10, BLINK_FROM_HERE); | 204 timer.startOneShot(10, BLINK_FROM_HERE); |
203 | 205 |
204 double runTime; | 206 double runTime; |
205 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 207 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
206 EXPECT_FLOAT_EQ(10.0, runTime); | 208 EXPECT_FLOAT_EQ(10.0, runTime); |
207 | 209 |
208 timer.stop(); | 210 timer.stop(); |
209 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 211 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
210 | 212 |
211 m_platform.runUntilIdle(); | 213 m_platform->runUntilIdle(); |
212 EXPECT_FALSE(m_runTimes.size()); | 214 EXPECT_FALSE(m_runTimes.size()); |
213 } | 215 } |
214 | 216 |
215 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) { | 217 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) { |
216 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 218 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
217 timer.startOneShot(10, BLINK_FROM_HERE); | 219 timer.startOneShot(10, BLINK_FROM_HERE); |
218 | 220 |
219 double runTime; | 221 double runTime; |
220 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 222 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
221 EXPECT_FLOAT_EQ(10.0, runTime); | 223 EXPECT_FLOAT_EQ(10.0, runTime); |
222 | 224 |
223 timer.stop(); | 225 timer.stop(); |
224 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 226 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
225 | 227 |
226 m_platform.runUntilIdle(); | 228 m_platform->runUntilIdle(); |
227 EXPECT_FALSE(m_runTimes.size()); | 229 EXPECT_FALSE(m_runTimes.size()); |
228 | 230 |
229 double secondPostTime = monotonicallyIncreasingTime(); | 231 double secondPostTime = monotonicallyIncreasingTime(); |
230 timer.startOneShot(10, BLINK_FROM_HERE); | 232 timer.startOneShot(10, BLINK_FROM_HERE); |
231 | 233 |
232 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 234 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
233 EXPECT_FLOAT_EQ(10.0, runTime); | 235 EXPECT_FLOAT_EQ(10.0, runTime); |
234 | 236 |
235 m_platform.runUntilIdle(); | 237 m_platform->runUntilIdle(); |
236 EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0)); | 238 EXPECT_THAT(m_runTimes, ElementsAre(secondPostTime + 10.0)); |
237 } | 239 } |
238 | 240 |
239 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) { | 241 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) { |
240 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 242 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
241 timer.startOneShot(10, BLINK_FROM_HERE); | 243 timer.startOneShot(10, BLINK_FROM_HERE); |
242 | 244 |
243 double runTime; | 245 double runTime; |
244 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 246 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
245 EXPECT_FLOAT_EQ(10.0, runTime); | 247 EXPECT_FLOAT_EQ(10.0, runTime); |
246 | 248 |
247 m_platform.runUntilIdle(); | 249 m_platform->runUntilIdle(); |
248 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 250 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
249 | 251 |
250 timer.startOneShot(20, BLINK_FROM_HERE); | 252 timer.startOneShot(20, BLINK_FROM_HERE); |
251 | 253 |
252 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 254 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
253 EXPECT_FLOAT_EQ(20.0, runTime); | 255 EXPECT_FLOAT_EQ(20.0, runTime); |
254 | 256 |
255 m_platform.runUntilIdle(); | 257 m_platform->runUntilIdle(); |
256 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0)); | 258 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0, m_startTime + 30.0)); |
257 } | 259 } |
258 | 260 |
259 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) { | 261 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) { |
260 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 262 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
261 timer.startOneShot(10, BLINK_FROM_HERE); | 263 timer.startOneShot(10, BLINK_FROM_HERE); |
262 timer.startOneShot(10, BLINK_FROM_HERE); | 264 timer.startOneShot(10, BLINK_FROM_HERE); |
263 | 265 |
264 double runTime; | 266 double runTime; |
265 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 267 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
266 EXPECT_FLOAT_EQ(10.0, runTime); | 268 EXPECT_FLOAT_EQ(10.0, runTime); |
267 | 269 |
268 m_platform.runUntilIdle(); | 270 m_platform->runUntilIdle(); |
269 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 271 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
270 } | 272 } |
271 | 273 |
272 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) { | 274 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) { |
273 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 275 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
274 timer.startOneShot(10, BLINK_FROM_HERE); | 276 timer.startOneShot(10, BLINK_FROM_HERE); |
275 timer.startOneShot(0, BLINK_FROM_HERE); | 277 timer.startOneShot(0, BLINK_FROM_HERE); |
276 | 278 |
277 m_platform.runUntilIdle(); | 279 m_platform->runUntilIdle(); |
278 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 0.0)); | 280 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 0.0)); |
279 } | 281 } |
280 | 282 |
281 TEST_F(TimerTest, PostingTimerTwiceWithLaterRunTimeCancelsOriginalTask) { | 283 TEST_F(TimerTest, PostingTimerTwiceWithLaterRunTimeCancelsOriginalTask) { |
282 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 284 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
283 timer.startOneShot(0, BLINK_FROM_HERE); | 285 timer.startOneShot(0, BLINK_FROM_HERE); |
284 timer.startOneShot(10, BLINK_FROM_HERE); | 286 timer.startOneShot(10, BLINK_FROM_HERE); |
285 | 287 |
286 m_platform.runUntilIdle(); | 288 m_platform->runUntilIdle(); |
287 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); | 289 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 10.0)); |
288 } | 290 } |
289 | 291 |
290 TEST_F(TimerTest, StartRepeatingTask) { | 292 TEST_F(TimerTest, StartRepeatingTask) { |
291 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 293 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
292 timer.startRepeating(1.0, BLINK_FROM_HERE); | 294 timer.startRepeating(1.0, BLINK_FROM_HERE); |
293 | 295 |
294 double runTime; | 296 double runTime; |
295 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 297 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
296 EXPECT_FLOAT_EQ(1.0, runTime); | 298 EXPECT_FLOAT_EQ(1.0, runTime); |
297 | 299 |
298 runUntilDeadline(m_startTime + 5.5); | 300 runUntilDeadline(m_startTime + 5.5); |
299 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, | 301 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, |
300 m_startTime + 3.0, m_startTime + 4.0, | 302 m_startTime + 3.0, m_startTime + 4.0, |
301 m_startTime + 5.0)); | 303 m_startTime + 5.0)); |
302 } | 304 } |
303 | 305 |
304 TEST_F(TimerTest, StartRepeatingTask_ThenCancel) { | 306 TEST_F(TimerTest, StartRepeatingTask_ThenCancel) { |
305 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 307 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
306 timer.startRepeating(1.0, BLINK_FROM_HERE); | 308 timer.startRepeating(1.0, BLINK_FROM_HERE); |
307 | 309 |
308 double runTime; | 310 double runTime; |
309 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 311 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
310 EXPECT_FLOAT_EQ(1.0, runTime); | 312 EXPECT_FLOAT_EQ(1.0, runTime); |
311 | 313 |
312 runUntilDeadline(m_startTime + 2.5); | 314 runUntilDeadline(m_startTime + 2.5); |
313 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); | 315 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); |
314 | 316 |
315 timer.stop(); | 317 timer.stop(); |
316 m_platform.runUntilIdle(); | 318 m_platform->runUntilIdle(); |
317 | 319 |
318 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); | 320 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); |
319 } | 321 } |
320 | 322 |
321 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) { | 323 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) { |
322 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 324 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
323 timer.startRepeating(1.0, BLINK_FROM_HERE); | 325 timer.startRepeating(1.0, BLINK_FROM_HERE); |
324 | 326 |
325 double runTime; | 327 double runTime; |
326 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); | 328 EXPECT_TRUE(timeTillNextDelayedTask(&runTime)); |
327 EXPECT_FLOAT_EQ(1.0, runTime); | 329 EXPECT_FLOAT_EQ(1.0, runTime); |
328 | 330 |
329 runUntilDeadline(m_startTime + 2.5); | 331 runUntilDeadline(m_startTime + 2.5); |
330 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); | 332 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0)); |
331 | 333 |
332 timer.startOneShot(0, BLINK_FROM_HERE); | 334 timer.startOneShot(0, BLINK_FROM_HERE); |
333 m_platform.runUntilIdle(); | 335 m_platform->runUntilIdle(); |
334 | 336 |
335 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, | 337 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 1.0, m_startTime + 2.0, |
336 m_startTime + 2.5)); | 338 m_startTime + 2.5)); |
337 } | 339 } |
338 | 340 |
339 TEST_F(TimerTest, IsActive_NeverPosted) { | 341 TEST_F(TimerTest, IsActive_NeverPosted) { |
340 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 342 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
341 | 343 |
342 EXPECT_FALSE(timer.isActive()); | 344 EXPECT_FALSE(timer.isActive()); |
343 } | 345 } |
(...skipping 16 matching lines...) Expand all Loading... |
360 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 362 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
361 timer.startRepeating(1.0, BLINK_FROM_HERE); | 363 timer.startRepeating(1.0, BLINK_FROM_HERE); |
362 | 364 |
363 EXPECT_TRUE(timer.isActive()); | 365 EXPECT_TRUE(timer.isActive()); |
364 } | 366 } |
365 | 367 |
366 TEST_F(TimerTest, IsActive_AfterRunning_OneShotZero) { | 368 TEST_F(TimerTest, IsActive_AfterRunning_OneShotZero) { |
367 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 369 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
368 timer.startOneShot(0, BLINK_FROM_HERE); | 370 timer.startOneShot(0, BLINK_FROM_HERE); |
369 | 371 |
370 m_platform.runUntilIdle(); | 372 m_platform->runUntilIdle(); |
371 EXPECT_FALSE(timer.isActive()); | 373 EXPECT_FALSE(timer.isActive()); |
372 } | 374 } |
373 | 375 |
374 TEST_F(TimerTest, IsActive_AfterRunning_OneShotNonZero) { | 376 TEST_F(TimerTest, IsActive_AfterRunning_OneShotNonZero) { |
375 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 377 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
376 timer.startOneShot(10, BLINK_FROM_HERE); | 378 timer.startOneShot(10, BLINK_FROM_HERE); |
377 | 379 |
378 m_platform.runUntilIdle(); | 380 m_platform->runUntilIdle(); |
379 EXPECT_FALSE(timer.isActive()); | 381 EXPECT_FALSE(timer.isActive()); |
380 } | 382 } |
381 | 383 |
382 TEST_F(TimerTest, IsActive_AfterRunning_Repeating) { | 384 TEST_F(TimerTest, IsActive_AfterRunning_Repeating) { |
383 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 385 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
384 timer.startRepeating(1.0, BLINK_FROM_HERE); | 386 timer.startRepeating(1.0, BLINK_FROM_HERE); |
385 | 387 |
386 runUntilDeadline(m_startTime + 10); | 388 runUntilDeadline(m_startTime + 10); |
387 EXPECT_TRUE(timer.isActive()); // It should run until cancelled. | 389 EXPECT_TRUE(timer.isActive()); // It should run until cancelled. |
388 } | 390 } |
389 | 391 |
390 TEST_F(TimerTest, NextFireInterval_OneShotZero) { | 392 TEST_F(TimerTest, NextFireInterval_OneShotZero) { |
391 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 393 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
392 timer.startOneShot(0, BLINK_FROM_HERE); | 394 timer.startOneShot(0, BLINK_FROM_HERE); |
393 | 395 |
394 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); | 396 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); |
395 } | 397 } |
396 | 398 |
397 TEST_F(TimerTest, NextFireInterval_OneShotNonZero) { | 399 TEST_F(TimerTest, NextFireInterval_OneShotNonZero) { |
398 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 400 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
399 timer.startOneShot(10, BLINK_FROM_HERE); | 401 timer.startOneShot(10, BLINK_FROM_HERE); |
400 | 402 |
401 EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval()); | 403 EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval()); |
402 } | 404 } |
403 | 405 |
404 TEST_F(TimerTest, NextFireInterval_OneShotNonZero_AfterAFewSeconds) { | 406 TEST_F(TimerTest, NextFireInterval_OneShotNonZero_AfterAFewSeconds) { |
405 m_platform.setAutoAdvanceNowToPendingTasks(false); | 407 m_platform->setAutoAdvanceNowToPendingTasks(false); |
406 | 408 |
407 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 409 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
408 timer.startOneShot(10, BLINK_FROM_HERE); | 410 timer.startOneShot(10, BLINK_FROM_HERE); |
409 | 411 |
410 m_platform.advanceClockSeconds(2.0); | 412 m_platform->advanceClockSeconds(2.0); |
411 EXPECT_FLOAT_EQ(8.0, timer.nextFireInterval()); | 413 EXPECT_FLOAT_EQ(8.0, timer.nextFireInterval()); |
412 } | 414 } |
413 | 415 |
414 TEST_F(TimerTest, NextFireInterval_Repeating) { | 416 TEST_F(TimerTest, NextFireInterval_Repeating) { |
415 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 417 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
416 timer.startRepeating(20, BLINK_FROM_HERE); | 418 timer.startRepeating(20, BLINK_FROM_HERE); |
417 | 419 |
418 EXPECT_FLOAT_EQ(20.0, timer.nextFireInterval()); | 420 EXPECT_FLOAT_EQ(20.0, timer.nextFireInterval()); |
419 } | 421 } |
420 | 422 |
(...skipping 23 matching lines...) Expand all Loading... |
444 | 446 |
445 EXPECT_FLOAT_EQ(20.0, timer.repeatInterval()); | 447 EXPECT_FLOAT_EQ(20.0, timer.repeatInterval()); |
446 } | 448 } |
447 | 449 |
448 TEST_F(TimerTest, AugmentRepeatInterval) { | 450 TEST_F(TimerTest, AugmentRepeatInterval) { |
449 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 451 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
450 timer.startRepeating(10, BLINK_FROM_HERE); | 452 timer.startRepeating(10, BLINK_FROM_HERE); |
451 EXPECT_FLOAT_EQ(10.0, timer.repeatInterval()); | 453 EXPECT_FLOAT_EQ(10.0, timer.repeatInterval()); |
452 EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval()); | 454 EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval()); |
453 | 455 |
454 m_platform.advanceClockSeconds(2.0); | 456 m_platform->advanceClockSeconds(2.0); |
455 timer.augmentRepeatInterval(10); | 457 timer.augmentRepeatInterval(10); |
456 | 458 |
457 EXPECT_FLOAT_EQ(20.0, timer.repeatInterval()); | 459 EXPECT_FLOAT_EQ(20.0, timer.repeatInterval()); |
458 EXPECT_FLOAT_EQ(18.0, timer.nextFireInterval()); | 460 EXPECT_FLOAT_EQ(18.0, timer.nextFireInterval()); |
459 | 461 |
460 // NOTE setAutoAdvanceNowToPendingTasks(true) (which uses | 462 // NOTE setAutoAdvanceNowToPendingTasks(true) (which uses |
461 // cc::OrderedSimpleTaskRunner) results in somewhat strange behavior of the | 463 // cc::OrderedSimpleTaskRunner) results in somewhat strange behavior of the |
462 // test clock which breaks this test. Specifically the test clock advancing | 464 // test clock which breaks this test. Specifically the test clock advancing |
463 // logic ignores newly posted delayed tasks and advances too far. | 465 // logic ignores newly posted delayed tasks and advances too far. |
464 runUntilDeadline(m_startTime + 50.0); | 466 runUntilDeadline(m_startTime + 50.0); |
465 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 20.0, m_startTime + 40.0)); | 467 EXPECT_THAT(m_runTimes, ElementsAre(m_startTime + 20.0, m_startTime + 40.0)); |
466 } | 468 } |
467 | 469 |
468 TEST_F(TimerTest, AugmentRepeatInterval_TimerFireDelayed) { | 470 TEST_F(TimerTest, AugmentRepeatInterval_TimerFireDelayed) { |
469 m_platform.setAutoAdvanceNowToPendingTasks(false); | 471 m_platform->setAutoAdvanceNowToPendingTasks(false); |
470 | 472 |
471 Timer<TimerTest> timer(this, &TimerTest::countingTask); | 473 Timer<TimerTest> timer(this, &TimerTest::countingTask); |
472 timer.startRepeating(10, BLINK_FROM_HERE); | 474 timer.startRepeating(10, BLINK_FROM_HERE); |
473 EXPECT_FLOAT_EQ(10.0, timer.repeatInterval()); | 475 EXPECT_FLOAT_EQ(10.0, timer.repeatInterval()); |
474 EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval()); | 476 EXPECT_FLOAT_EQ(10.0, timer.nextFireInterval()); |
475 | 477 |
476 m_platform.advanceClockSeconds(123.0); // Make the timer long overdue. | 478 m_platform->advanceClockSeconds(123.0); // Make the timer long overdue. |
477 timer.augmentRepeatInterval(10); | 479 timer.augmentRepeatInterval(10); |
478 | 480 |
479 EXPECT_FLOAT_EQ(20.0, timer.repeatInterval()); | 481 EXPECT_FLOAT_EQ(20.0, timer.repeatInterval()); |
480 // The timer is overdue so it should be scheduled to fire immediatly. | 482 // The timer is overdue so it should be scheduled to fire immediatly. |
481 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); | 483 EXPECT_FLOAT_EQ(0.0, timer.nextFireInterval()); |
482 } | 484 } |
483 | 485 |
484 TEST_F(TimerTest, RepeatingTimerDoesNotDrift) { | 486 TEST_F(TimerTest, RepeatingTimerDoesNotDrift) { |
485 m_platform.setAutoAdvanceNowToPendingTasks(false); | 487 m_platform->setAutoAdvanceNowToPendingTasks(false); |
486 | 488 |
487 Timer<TimerTest> timer(this, &TimerTest::recordNextFireTimeTask); | 489 Timer<TimerTest> timer(this, &TimerTest::recordNextFireTimeTask); |
488 timer.startRepeating(2.0, BLINK_FROM_HERE); | 490 timer.startRepeating(2.0, BLINK_FROM_HERE); |
489 | 491 |
490 recordNextFireTimeTask( | 492 recordNextFireTimeTask( |
491 &timer); // Next scheduled task to run at m_startTime + 2.0 | 493 &timer); // Next scheduled task to run at m_startTime + 2.0 |
492 | 494 |
493 // Simulate timer firing early. Next scheduled task to run at | 495 // Simulate timer firing early. Next scheduled task to run at |
494 // m_startTime + 4.0 | 496 // m_startTime + 4.0 |
495 m_platform.advanceClockSeconds(1.9); | 497 m_platform->advanceClockSeconds(1.9); |
496 runUntilDeadline(monotonicallyIncreasingTime() + 0.2); | 498 runUntilDeadline(monotonicallyIncreasingTime() + 0.2); |
497 | 499 |
498 // Next scheduled task to run at m_startTime + 6.0 | 500 // Next scheduled task to run at m_startTime + 6.0 |
499 m_platform.runForPeriodSeconds(2.0); | 501 m_platform->runForPeriodSeconds(2.0); |
500 // Next scheduled task to run at m_startTime + 8.0 | 502 // Next scheduled task to run at m_startTime + 8.0 |
501 m_platform.runForPeriodSeconds(2.1); | 503 m_platform->runForPeriodSeconds(2.1); |
502 // Next scheduled task to run at m_startTime + 10.0 | 504 // Next scheduled task to run at m_startTime + 10.0 |
503 m_platform.runForPeriodSeconds(2.9); | 505 m_platform->runForPeriodSeconds(2.9); |
504 // Next scheduled task to run at m_startTime + 14.0 (skips a beat) | 506 // Next scheduled task to run at m_startTime + 14.0 (skips a beat) |
505 m_platform.advanceClockSeconds(3.1); | 507 m_platform->advanceClockSeconds(3.1); |
506 m_platform.runUntilIdle(); | 508 m_platform->runUntilIdle(); |
507 // Next scheduled task to run at m_startTime + 18.0 (skips a beat) | 509 // Next scheduled task to run at m_startTime + 18.0 (skips a beat) |
508 m_platform.advanceClockSeconds(4.0); | 510 m_platform->advanceClockSeconds(4.0); |
509 m_platform.runUntilIdle(); | 511 m_platform->runUntilIdle(); |
510 // Next scheduled task to run at m_startTime + 28.0 (skips 5 beats) | 512 // Next scheduled task to run at m_startTime + 28.0 (skips 5 beats) |
511 m_platform.advanceClockSeconds(10.0); | 513 m_platform->advanceClockSeconds(10.0); |
512 m_platform.runUntilIdle(); | 514 m_platform->runUntilIdle(); |
513 | 515 |
514 EXPECT_THAT( | 516 EXPECT_THAT( |
515 m_nextFireTimes, | 517 m_nextFireTimes, |
516 ElementsAre(m_startTime + 2.0, m_startTime + 4.0, m_startTime + 6.0, | 518 ElementsAre(m_startTime + 2.0, m_startTime + 4.0, m_startTime + 6.0, |
517 m_startTime + 8.0, m_startTime + 10.0, m_startTime + 14.0, | 519 m_startTime + 8.0, m_startTime + 10.0, m_startTime + 14.0, |
518 m_startTime + 18.0, m_startTime + 28.0)); | 520 m_startTime + 18.0, m_startTime + 28.0)); |
519 } | 521 } |
520 | 522 |
521 template <typename TimerFiredClass> | 523 template <typename TimerFiredClass> |
522 class TimerForTest : public TaskRunnerTimer<TimerFiredClass> { | 524 class TimerForTest : public TaskRunnerTimer<TimerFiredClass> { |
523 public: | 525 public: |
524 using TimerFiredFunction = | 526 using TimerFiredFunction = |
525 typename TaskRunnerTimer<TimerFiredClass>::TimerFiredFunction; | 527 typename TaskRunnerTimer<TimerFiredClass>::TimerFiredFunction; |
526 | 528 |
527 ~TimerForTest() override {} | 529 ~TimerForTest() override {} |
528 | 530 |
529 TimerForTest(WebTaskRunner* webTaskRunner, | 531 TimerForTest(WebTaskRunner* webTaskRunner, |
530 TimerFiredClass* timerFiredClass, | 532 TimerFiredClass* timerFiredClass, |
531 TimerFiredFunction timerFiredFunction) | 533 TimerFiredFunction timerFiredFunction) |
532 : TaskRunnerTimer<TimerFiredClass>(webTaskRunner, | 534 : TaskRunnerTimer<TimerFiredClass>(webTaskRunner, |
533 timerFiredClass, | 535 timerFiredClass, |
534 timerFiredFunction) {} | 536 timerFiredFunction) {} |
535 }; | 537 }; |
536 | 538 |
537 TEST_F(TimerTest, UserSuppliedWebTaskRunner) { | 539 TEST_F(TimerTest, UserSuppliedWebTaskRunner) { |
538 scoped_refptr<scheduler::TaskQueue> taskRunner( | 540 scoped_refptr<scheduler::TaskQueue> taskRunner( |
539 m_platform.rendererScheduler()->NewTimerTaskRunner( | 541 m_platform->rendererScheduler()->NewTimerTaskRunner( |
540 scheduler::TaskQueue::QueueType::TEST)); | 542 scheduler::TaskQueue::QueueType::TEST)); |
541 scheduler::WebTaskRunnerImpl webTaskRunner(taskRunner); | 543 scheduler::WebTaskRunnerImpl webTaskRunner(taskRunner); |
542 TimerForTest<TimerTest> timer(&webTaskRunner, this, &TimerTest::countingTask); | 544 TimerForTest<TimerTest> timer(&webTaskRunner, this, &TimerTest::countingTask); |
543 timer.startOneShot(0, BLINK_FROM_HERE); | 545 timer.startOneShot(0, BLINK_FROM_HERE); |
544 | 546 |
545 // Make sure the task was posted on taskRunner. | 547 // Make sure the task was posted on taskRunner. |
546 EXPECT_FALSE(taskRunner->IsEmpty()); | 548 EXPECT_FALSE(taskRunner->IsEmpty()); |
547 } | 549 } |
548 | 550 |
549 TEST_F(TimerTest, RunOnHeapTimer) { | 551 TEST_F(TimerTest, RunOnHeapTimer) { |
550 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); | 552 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); |
551 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); | 553 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); |
552 | 554 |
553 owner->startOneShot(0, BLINK_FROM_HERE); | 555 owner->startOneShot(0, BLINK_FROM_HERE); |
554 | 556 |
555 EXPECT_FALSE(record->timerHasFired()); | 557 EXPECT_FALSE(record->timerHasFired()); |
556 m_platform.runUntilIdle(); | 558 m_platform->runUntilIdle(); |
557 EXPECT_TRUE(record->timerHasFired()); | 559 EXPECT_TRUE(record->timerHasFired()); |
558 } | 560 } |
559 | 561 |
560 TEST_F(TimerTest, DestructOnHeapTimer) { | 562 TEST_F(TimerTest, DestructOnHeapTimer) { |
561 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); | 563 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); |
562 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); | 564 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); |
563 | 565 |
564 record->dispose(); | 566 record->dispose(); |
565 owner->startOneShot(0, BLINK_FROM_HERE); | 567 owner->startOneShot(0, BLINK_FROM_HERE); |
566 | 568 |
567 owner = nullptr; | 569 owner = nullptr; |
568 ThreadState::current()->collectGarbage( | 570 ThreadState::current()->collectGarbage( |
569 BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); | 571 BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, BlinkGC::ForcedGC); |
570 EXPECT_TRUE(record->ownerIsDestructed()); | 572 EXPECT_TRUE(record->ownerIsDestructed()); |
571 | 573 |
572 EXPECT_FALSE(record->timerHasFired()); | 574 EXPECT_FALSE(record->timerHasFired()); |
573 m_platform.runUntilIdle(); | 575 m_platform->runUntilIdle(); |
574 EXPECT_FALSE(record->timerHasFired()); | 576 EXPECT_FALSE(record->timerHasFired()); |
575 } | 577 } |
576 | 578 |
577 TEST_F(TimerTest, MarkOnHeapTimerAsUnreachable) { | 579 TEST_F(TimerTest, MarkOnHeapTimerAsUnreachable) { |
578 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); | 580 RefPtr<OnHeapTimerOwner::Record> record = OnHeapTimerOwner::Record::create(); |
579 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); | 581 Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(record); |
580 | 582 |
581 record->dispose(); | 583 record->dispose(); |
582 owner->startOneShot(0, BLINK_FROM_HERE); | 584 owner->startOneShot(0, BLINK_FROM_HERE); |
583 | 585 |
584 owner = nullptr; | 586 owner = nullptr; |
585 ThreadState::current()->collectGarbage(BlinkGC::NoHeapPointersOnStack, | 587 ThreadState::current()->collectGarbage(BlinkGC::NoHeapPointersOnStack, |
586 BlinkGC::GCWithoutSweep, | 588 BlinkGC::GCWithoutSweep, |
587 BlinkGC::ForcedGC); | 589 BlinkGC::ForcedGC); |
588 EXPECT_FALSE(record->ownerIsDestructed()); | 590 EXPECT_FALSE(record->ownerIsDestructed()); |
589 | 591 |
590 { | 592 { |
591 GCForbiddenScope scope; | 593 GCForbiddenScope scope; |
592 EXPECT_FALSE(record->timerHasFired()); | 594 EXPECT_FALSE(record->timerHasFired()); |
593 m_platform.runUntilIdle(); | 595 m_platform->runUntilIdle(); |
594 EXPECT_FALSE(record->timerHasFired()); | 596 EXPECT_FALSE(record->timerHasFired()); |
595 EXPECT_FALSE(record->ownerIsDestructed()); | 597 EXPECT_FALSE(record->ownerIsDestructed()); |
596 } | 598 } |
597 } | 599 } |
598 | 600 |
599 namespace { | 601 namespace { |
600 | 602 |
601 class TaskObserver : public base::MessageLoop::TaskObserver { | 603 class TaskObserver : public base::MessageLoop::TaskObserver { |
602 public: | 604 public: |
603 TaskObserver(WebTaskRunner* task_runner, | 605 TaskObserver(WebTaskRunner* task_runner, |
(...skipping 10 matching lines...) Expand all Loading... |
614 WebTaskRunner* m_taskRunner; | 616 WebTaskRunner* m_taskRunner; |
615 std::vector<WebTaskRunner*>* m_runOrder; | 617 std::vector<WebTaskRunner*>* m_runOrder; |
616 }; | 618 }; |
617 | 619 |
618 } // namespace | 620 } // namespace |
619 | 621 |
620 TEST_F(TimerTest, MoveToNewTaskRunnerOneShot) { | 622 TEST_F(TimerTest, MoveToNewTaskRunnerOneShot) { |
621 std::vector<WebTaskRunner*> runOrder; | 623 std::vector<WebTaskRunner*> runOrder; |
622 | 624 |
623 scoped_refptr<scheduler::TaskQueue> taskRunner1( | 625 scoped_refptr<scheduler::TaskQueue> taskRunner1( |
624 m_platform.rendererScheduler()->NewTimerTaskRunner( | 626 m_platform->rendererScheduler()->NewTimerTaskRunner( |
625 scheduler::TaskQueue::QueueType::TEST)); | 627 scheduler::TaskQueue::QueueType::TEST)); |
626 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); | 628 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); |
627 TaskObserver taskObserver1(&webTaskRunner1, &runOrder); | 629 TaskObserver taskObserver1(&webTaskRunner1, &runOrder); |
628 taskRunner1->AddTaskObserver(&taskObserver1); | 630 taskRunner1->AddTaskObserver(&taskObserver1); |
629 | 631 |
630 scoped_refptr<scheduler::TaskQueue> taskRunner2( | 632 scoped_refptr<scheduler::TaskQueue> taskRunner2( |
631 m_platform.rendererScheduler()->NewTimerTaskRunner( | 633 m_platform->rendererScheduler()->NewTimerTaskRunner( |
632 scheduler::TaskQueue::QueueType::TEST)); | 634 scheduler::TaskQueue::QueueType::TEST)); |
633 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); | 635 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); |
634 TaskObserver taskObserver2(&webTaskRunner2, &runOrder); | 636 TaskObserver taskObserver2(&webTaskRunner2, &runOrder); |
635 taskRunner2->AddTaskObserver(&taskObserver2); | 637 taskRunner2->AddTaskObserver(&taskObserver2); |
636 | 638 |
637 TimerForTest<TimerTest> timer(&webTaskRunner1, this, | 639 TimerForTest<TimerTest> timer(&webTaskRunner1, this, |
638 &TimerTest::countingTask); | 640 &TimerTest::countingTask); |
639 | 641 |
640 double startTime = monotonicallyIncreasingTime(); | 642 double startTime = monotonicallyIncreasingTime(); |
641 | 643 |
642 timer.startOneShot(1, BLINK_FROM_HERE); | 644 timer.startOneShot(1, BLINK_FROM_HERE); |
643 | 645 |
644 m_platform.runForPeriodSeconds(0.5); | 646 m_platform->runForPeriodSeconds(0.5); |
645 | 647 |
646 timer.moveToNewTaskRunner(&webTaskRunner2); | 648 timer.moveToNewTaskRunner(&webTaskRunner2); |
647 | 649 |
648 m_platform.runUntilIdle(); | 650 m_platform->runUntilIdle(); |
649 | 651 |
650 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0)); | 652 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0)); |
651 | 653 |
652 EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner2)); | 654 EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner2)); |
653 | 655 |
654 EXPECT_TRUE(taskRunner1->IsEmpty()); | 656 EXPECT_TRUE(taskRunner1->IsEmpty()); |
655 EXPECT_TRUE(taskRunner2->IsEmpty()); | 657 EXPECT_TRUE(taskRunner2->IsEmpty()); |
656 } | 658 } |
657 | 659 |
658 TEST_F(TimerTest, MoveToNewTaskRunnerRepeating) { | 660 TEST_F(TimerTest, MoveToNewTaskRunnerRepeating) { |
659 std::vector<WebTaskRunner*> runOrder; | 661 std::vector<WebTaskRunner*> runOrder; |
660 | 662 |
661 scoped_refptr<scheduler::TaskQueue> taskRunner1( | 663 scoped_refptr<scheduler::TaskQueue> taskRunner1( |
662 m_platform.rendererScheduler()->NewTimerTaskRunner( | 664 m_platform->rendererScheduler()->NewTimerTaskRunner( |
663 scheduler::TaskQueue::QueueType::TEST)); | 665 scheduler::TaskQueue::QueueType::TEST)); |
664 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); | 666 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); |
665 TaskObserver taskObserver1(&webTaskRunner1, &runOrder); | 667 TaskObserver taskObserver1(&webTaskRunner1, &runOrder); |
666 taskRunner1->AddTaskObserver(&taskObserver1); | 668 taskRunner1->AddTaskObserver(&taskObserver1); |
667 | 669 |
668 scoped_refptr<scheduler::TaskQueue> taskRunner2( | 670 scoped_refptr<scheduler::TaskQueue> taskRunner2( |
669 m_platform.rendererScheduler()->NewTimerTaskRunner( | 671 m_platform->rendererScheduler()->NewTimerTaskRunner( |
670 scheduler::TaskQueue::QueueType::TEST)); | 672 scheduler::TaskQueue::QueueType::TEST)); |
671 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); | 673 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); |
672 TaskObserver taskObserver2(&webTaskRunner2, &runOrder); | 674 TaskObserver taskObserver2(&webTaskRunner2, &runOrder); |
673 taskRunner2->AddTaskObserver(&taskObserver2); | 675 taskRunner2->AddTaskObserver(&taskObserver2); |
674 | 676 |
675 TimerForTest<TimerTest> timer(&webTaskRunner1, this, | 677 TimerForTest<TimerTest> timer(&webTaskRunner1, this, |
676 &TimerTest::countingTask); | 678 &TimerTest::countingTask); |
677 | 679 |
678 double startTime = monotonicallyIncreasingTime(); | 680 double startTime = monotonicallyIncreasingTime(); |
679 | 681 |
680 timer.startRepeating(1, BLINK_FROM_HERE); | 682 timer.startRepeating(1, BLINK_FROM_HERE); |
681 | 683 |
682 m_platform.runForPeriodSeconds(2.5); | 684 m_platform->runForPeriodSeconds(2.5); |
683 | 685 |
684 timer.moveToNewTaskRunner(&webTaskRunner2); | 686 timer.moveToNewTaskRunner(&webTaskRunner2); |
685 | 687 |
686 m_platform.runForPeriodSeconds(2); | 688 m_platform->runForPeriodSeconds(2); |
687 | 689 |
688 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0, startTime + 2.0, | 690 EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0, startTime + 2.0, |
689 startTime + 3.0, startTime + 4.0)); | 691 startTime + 3.0, startTime + 4.0)); |
690 | 692 |
691 EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner1, &webTaskRunner1, | 693 EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner1, &webTaskRunner1, |
692 &webTaskRunner2, &webTaskRunner2)); | 694 &webTaskRunner2, &webTaskRunner2)); |
693 | 695 |
694 EXPECT_TRUE(taskRunner1->IsEmpty()); | 696 EXPECT_TRUE(taskRunner1->IsEmpty()); |
695 EXPECT_FALSE(taskRunner2->IsEmpty()); | 697 EXPECT_FALSE(taskRunner2->IsEmpty()); |
696 } | 698 } |
697 | 699 |
698 // This test checks that when inactive timer is moved to a different task | 700 // This test checks that when inactive timer is moved to a different task |
699 // runner it isn't activated. | 701 // runner it isn't activated. |
700 TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) { | 702 TEST_F(TimerTest, MoveToNewTaskRunnerWithoutTasks) { |
701 scoped_refptr<scheduler::TaskQueue> taskRunner1( | 703 scoped_refptr<scheduler::TaskQueue> taskRunner1( |
702 m_platform.rendererScheduler()->NewTimerTaskRunner( | 704 m_platform->rendererScheduler()->NewTimerTaskRunner( |
703 scheduler::TaskQueue::QueueType::TEST)); | 705 scheduler::TaskQueue::QueueType::TEST)); |
704 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); | 706 scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1); |
705 | 707 |
706 scoped_refptr<scheduler::TaskQueue> taskRunner2( | 708 scoped_refptr<scheduler::TaskQueue> taskRunner2( |
707 m_platform.rendererScheduler()->NewTimerTaskRunner( | 709 m_platform->rendererScheduler()->NewTimerTaskRunner( |
708 scheduler::TaskQueue::QueueType::TEST)); | 710 scheduler::TaskQueue::QueueType::TEST)); |
709 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); | 711 scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2); |
710 | 712 |
711 TimerForTest<TimerTest> timer(&webTaskRunner1, this, | 713 TimerForTest<TimerTest> timer(&webTaskRunner1, this, |
712 &TimerTest::countingTask); | 714 &TimerTest::countingTask); |
713 | 715 |
714 m_platform.runUntilIdle(); | 716 m_platform->runUntilIdle(); |
715 EXPECT_TRUE(!m_runTimes.size()); | 717 EXPECT_TRUE(!m_runTimes.size()); |
716 EXPECT_TRUE(taskRunner1->IsEmpty()); | 718 EXPECT_TRUE(taskRunner1->IsEmpty()); |
717 EXPECT_TRUE(taskRunner2->IsEmpty()); | 719 EXPECT_TRUE(taskRunner2->IsEmpty()); |
718 } | 720 } |
719 | 721 |
720 } // namespace | 722 } // namespace |
721 } // namespace blink | 723 } // namespace blink |
OLD | NEW |