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