OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/scheduler/renderer/web_view_scheduler_impl.h" | |
6 | |
7 #include <memory> | |
8 | |
9 #include "base/callback.h" | |
10 #include "base/memory/ptr_util.h" | |
11 #include "base/test/simple_test_tick_clock.h" | |
12 #include "cc/test/ordered_simple_task_runner.h" | |
13 #include "components/scheduler/base/test_time_source.h" | |
14 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h" | |
15 #include "components/scheduler/renderer/renderer_scheduler_impl.h" | |
16 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" | |
17 #include "testing/gmock/include/gmock/gmock.h" | |
18 #include "testing/gtest/include/gtest/gtest.h" | |
19 #include "third_party/WebKit/public/platform/WebTaskRunner.h" | |
20 #include "third_party/WebKit/public/platform/WebTraceLocation.h" | |
21 | |
22 using testing::ElementsAre; | |
23 using VirtualTimePolicy = blink::WebViewScheduler::VirtualTimePolicy; | |
24 | |
25 namespace scheduler { | |
26 | |
27 class WebViewSchedulerImplTest : public testing::Test { | |
28 public: | |
29 WebViewSchedulerImplTest() {} | |
30 ~WebViewSchedulerImplTest() override {} | |
31 | |
32 void SetUp() override { | |
33 clock_.reset(new base::SimpleTestTickClock()); | |
34 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | |
35 mock_task_runner_ = | |
36 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(clock_.get(), true)); | |
37 delegate_ = SchedulerTqmDelegateForTest::Create( | |
38 mock_task_runner_, base::WrapUnique(new TestTimeSource(clock_.get()))); | |
39 scheduler_.reset(new RendererSchedulerImpl(delegate_)); | |
40 web_view_scheduler_.reset(new WebViewSchedulerImpl( | |
41 nullptr, scheduler_.get(), DisableBackgroundTimerThrottling())); | |
42 web_frame_scheduler_ = | |
43 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr); | |
44 } | |
45 | |
46 void TearDown() override { | |
47 web_frame_scheduler_.reset(); | |
48 web_view_scheduler_.reset(); | |
49 scheduler_->Shutdown(); | |
50 scheduler_.reset(); | |
51 } | |
52 | |
53 virtual bool DisableBackgroundTimerThrottling() const { return false; } | |
54 | |
55 std::unique_ptr<base::SimpleTestTickClock> clock_; | |
56 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; | |
57 scoped_refptr<SchedulerTqmDelegate> delegate_; | |
58 std::unique_ptr<RendererSchedulerImpl> scheduler_; | |
59 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler_; | |
60 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler_; | |
61 }; | |
62 | |
63 TEST_F(WebViewSchedulerImplTest, TestDestructionOfFrameSchedulersBefore) { | |
64 std::unique_ptr<blink::WebFrameScheduler> frame1( | |
65 web_view_scheduler_->createFrameScheduler(nullptr)); | |
66 std::unique_ptr<blink::WebFrameScheduler> frame2( | |
67 web_view_scheduler_->createFrameScheduler(nullptr)); | |
68 } | |
69 | |
70 TEST_F(WebViewSchedulerImplTest, TestDestructionOfFrameSchedulersAfter) { | |
71 std::unique_ptr<blink::WebFrameScheduler> frame1( | |
72 web_view_scheduler_->createFrameScheduler(nullptr)); | |
73 std::unique_ptr<blink::WebFrameScheduler> frame2( | |
74 web_view_scheduler_->createFrameScheduler(nullptr)); | |
75 web_view_scheduler_.reset(); | |
76 } | |
77 | |
78 namespace { | |
79 class RepeatingTask : public blink::WebTaskRunner::Task { | |
80 public: | |
81 RepeatingTask(blink::WebTaskRunner* web_task_runner, int* run_count) | |
82 : web_task_runner_(web_task_runner), run_count_(run_count) {} | |
83 | |
84 ~RepeatingTask() override {} | |
85 | |
86 void run() override { | |
87 (*run_count_)++; | |
88 web_task_runner_->postDelayedTask( | |
89 BLINK_FROM_HERE, new RepeatingTask(web_task_runner_, run_count_), 1.0); | |
90 } | |
91 | |
92 private: | |
93 blink::WebTaskRunner* web_task_runner_; // NOT OWNED | |
94 int* run_count_; // NOT OWNED | |
95 }; | |
96 } // namespace | |
97 | |
98 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInForeground) { | |
99 web_view_scheduler_->setPageVisible(true); | |
100 | |
101 int run_count = 0; | |
102 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
103 BLINK_FROM_HERE, | |
104 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | |
105 1.0); | |
106 | |
107 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
108 EXPECT_EQ(1000, run_count); | |
109 } | |
110 | |
111 TEST_F(WebViewSchedulerImplTest, RepeatingTimer_PageInBackground) { | |
112 web_view_scheduler_->setPageVisible(false); | |
113 | |
114 int run_count = 0; | |
115 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
116 BLINK_FROM_HERE, | |
117 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | |
118 1.0); | |
119 | |
120 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
121 EXPECT_EQ(1, run_count); | |
122 } | |
123 | |
124 TEST_F(WebViewSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { | |
125 web_view_scheduler_->setPageVisible(false); | |
126 | |
127 int run_count = 0; | |
128 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | |
129 BLINK_FROM_HERE, | |
130 new RepeatingTask(web_frame_scheduler_->loadingTaskRunner(), &run_count), | |
131 1.0); | |
132 | |
133 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
134 EXPECT_EQ(1000, run_count); // Loading tasks should not be throttled | |
135 } | |
136 | |
137 TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { | |
138 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler2( | |
139 new WebViewSchedulerImpl(nullptr, scheduler_.get(), false)); | |
140 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler2 = | |
141 web_view_scheduler2->createWebFrameSchedulerImpl(nullptr); | |
142 | |
143 web_view_scheduler_->setPageVisible(true); | |
144 web_view_scheduler2->setPageVisible(false); | |
145 | |
146 int run_count1 = 0; | |
147 int run_count2 = 0; | |
148 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
149 BLINK_FROM_HERE, | |
150 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count1), | |
151 1.0); | |
152 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( | |
153 BLINK_FROM_HERE, | |
154 new RepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), | |
155 1.0); | |
156 | |
157 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
158 EXPECT_EQ(1000, run_count1); | |
159 EXPECT_EQ(1, run_count2); | |
160 } | |
161 | |
162 namespace { | |
163 class VirtualTimeRecorderTask : public blink::WebTaskRunner::Task { | |
164 public: | |
165 VirtualTimeRecorderTask(base::SimpleTestTickClock* clock, | |
166 blink::WebTaskRunner* web_task_runner, | |
167 std::vector<base::TimeTicks>* out_real_times, | |
168 std::vector<size_t>* out_virtual_times_ms) | |
169 : clock_(clock), | |
170 web_task_runner_(web_task_runner), | |
171 out_real_times_(out_real_times), | |
172 out_virtual_times_ms_(out_virtual_times_ms) {} | |
173 | |
174 ~VirtualTimeRecorderTask() override {} | |
175 | |
176 void run() override { | |
177 out_real_times_->push_back(clock_->NowTicks()); | |
178 out_virtual_times_ms_->push_back( | |
179 web_task_runner_->monotonicallyIncreasingVirtualTimeSeconds() * 1000.0); | |
180 } | |
181 | |
182 private: | |
183 base::SimpleTestTickClock* clock_; // NOT OWNED | |
184 blink::WebTaskRunner* web_task_runner_; // NOT OWNED | |
185 std::vector<base::TimeTicks>* out_real_times_; // NOT OWNED | |
186 std::vector<size_t>* out_virtual_times_ms_; // NOT OWNED | |
187 }; | |
188 } | |
189 | |
190 TEST_F(WebViewSchedulerImplTest, VirtualTime_TimerFastForwarding) { | |
191 std::vector<base::TimeTicks> real_times; | |
192 std::vector<size_t> virtual_times_ms; | |
193 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | |
194 size_t initial_virtual_time_ms = | |
195 web_frame_scheduler_->timerTaskRunner() | |
196 ->monotonicallyIncreasingVirtualTimeSeconds() * | |
197 1000.0; | |
198 | |
199 web_view_scheduler_->enableVirtualTime(); | |
200 | |
201 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
202 BLINK_FROM_HERE, | |
203 new VirtualTimeRecorderTask(clock_.get(), | |
204 web_frame_scheduler_->timerTaskRunner(), | |
205 &real_times, &virtual_times_ms), | |
206 2.0); | |
207 | |
208 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
209 BLINK_FROM_HERE, | |
210 new VirtualTimeRecorderTask(clock_.get(), | |
211 web_frame_scheduler_->timerTaskRunner(), | |
212 &real_times, &virtual_times_ms), | |
213 20.0); | |
214 | |
215 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
216 BLINK_FROM_HERE, | |
217 new VirtualTimeRecorderTask(clock_.get(), | |
218 web_frame_scheduler_->timerTaskRunner(), | |
219 &real_times, &virtual_times_ms), | |
220 200.0); | |
221 | |
222 mock_task_runner_->RunUntilIdle(); | |
223 | |
224 EXPECT_THAT(real_times, ElementsAre(initial_real_time, | |
225 initial_real_time, initial_real_time)); | |
226 EXPECT_THAT(virtual_times_ms, | |
227 ElementsAre(initial_virtual_time_ms + 2, | |
228 initial_virtual_time_ms + 20, | |
229 initial_virtual_time_ms + 200)); | |
230 } | |
231 | |
232 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) { | |
233 std::vector<base::TimeTicks> real_times; | |
234 std::vector<size_t> virtual_times_ms; | |
235 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | |
236 size_t initial_virtual_time_ms = | |
237 web_frame_scheduler_->timerTaskRunner() | |
238 ->monotonicallyIncreasingVirtualTimeSeconds() * | |
239 1000.0; | |
240 | |
241 web_view_scheduler_->enableVirtualTime(); | |
242 | |
243 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | |
244 BLINK_FROM_HERE, | |
245 new VirtualTimeRecorderTask(clock_.get(), | |
246 web_frame_scheduler_->loadingTaskRunner(), | |
247 &real_times, &virtual_times_ms), | |
248 2.0); | |
249 | |
250 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | |
251 BLINK_FROM_HERE, | |
252 new VirtualTimeRecorderTask(clock_.get(), | |
253 web_frame_scheduler_->loadingTaskRunner(), | |
254 &real_times, &virtual_times_ms), | |
255 20.0); | |
256 | |
257 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask( | |
258 BLINK_FROM_HERE, | |
259 new VirtualTimeRecorderTask(clock_.get(), | |
260 web_frame_scheduler_->loadingTaskRunner(), | |
261 &real_times, &virtual_times_ms), | |
262 200.0); | |
263 | |
264 mock_task_runner_->RunUntilIdle(); | |
265 | |
266 EXPECT_THAT(real_times, ElementsAre(initial_real_time, | |
267 initial_real_time, initial_real_time)); | |
268 EXPECT_THAT(virtual_times_ms, | |
269 ElementsAre(initial_virtual_time_ms + 2, | |
270 initial_virtual_time_ms + 20, | |
271 initial_virtual_time_ms + 200)); | |
272 } | |
273 | |
274 TEST_F(WebViewSchedulerImplTest, | |
275 RepeatingTimer_PageInBackground_MeansNothingForVirtualTime) { | |
276 web_view_scheduler_->enableVirtualTime(); | |
277 web_view_scheduler_->setPageVisible(false); | |
278 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks(); | |
279 | |
280 int run_count = 0; | |
281 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
282 BLINK_FROM_HERE, | |
283 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | |
284 1.0); | |
285 | |
286 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000)); | |
287 // Virtual time means page visibility is ignored. | |
288 EXPECT_EQ(1999, run_count); | |
289 | |
290 // The global tick clock has not moved, yet we ran a large number of "delayed" | |
291 // tasks despite calling setPageVisible(false). | |
292 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks()); | |
293 } | |
294 | |
295 namespace { | |
296 class RunOrderTask : public blink::WebTaskRunner::Task { | |
297 public: | |
298 RunOrderTask(int index, std::vector<int>* out_run_order) | |
299 : index_(index), | |
300 out_run_order_(out_run_order) {} | |
301 | |
302 ~RunOrderTask() override {} | |
303 | |
304 void run() override { | |
305 out_run_order_->push_back(index_); | |
306 } | |
307 | |
308 private: | |
309 int index_; | |
310 std::vector<int>* out_run_order_; // NOT OWNED | |
311 }; | |
312 | |
313 class DelayedRunOrderTask : public blink::WebTaskRunner::Task { | |
314 public: | |
315 DelayedRunOrderTask(int index, blink::WebTaskRunner* task_runner, | |
316 std::vector<int>* out_run_order) | |
317 : index_(index), | |
318 task_runner_(task_runner), | |
319 out_run_order_(out_run_order) {} | |
320 | |
321 ~DelayedRunOrderTask() override {} | |
322 | |
323 void run() override { | |
324 out_run_order_->push_back(index_); | |
325 task_runner_->postTask( | |
326 BLINK_FROM_HERE, new RunOrderTask(index_ + 1, out_run_order_)); | |
327 } | |
328 | |
329 private: | |
330 int index_; | |
331 blink::WebTaskRunner* task_runner_; // NOT OWNED | |
332 std::vector<int>* out_run_order_; // NOT OWNED | |
333 }; | |
334 } | |
335 | |
336 TEST_F(WebViewSchedulerImplTest, VirtualTime_NotAllowedToAdvance) { | |
337 std::vector<int> run_order; | |
338 | |
339 web_view_scheduler_->setVirtualTimePolicy(VirtualTimePolicy::PAUSE); | |
340 web_view_scheduler_->enableVirtualTime(); | |
341 | |
342 web_frame_scheduler_->timerTaskRunner()->postTask( | |
343 BLINK_FROM_HERE, new RunOrderTask(0, &run_order)); | |
344 | |
345 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
346 BLINK_FROM_HERE, | |
347 new DelayedRunOrderTask(1, web_frame_scheduler_->timerTaskRunner(), | |
348 &run_order), | |
349 2.0); | |
350 | |
351 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
352 BLINK_FROM_HERE, | |
353 new DelayedRunOrderTask(3, web_frame_scheduler_->timerTaskRunner(), | |
354 &run_order), | |
355 4.0); | |
356 | |
357 mock_task_runner_->RunUntilIdle(); | |
358 | |
359 // Immediate tasks are allowed to run even if delayed tasks are not. | |
360 EXPECT_THAT(run_order, ElementsAre(0)); | |
361 } | |
362 | |
363 TEST_F(WebViewSchedulerImplTest, VirtualTime_AllowedToAdvance) { | |
364 std::vector<int> run_order; | |
365 | |
366 web_view_scheduler_->setVirtualTimePolicy(VirtualTimePolicy::ADVANCE); | |
367 web_view_scheduler_->enableVirtualTime(); | |
368 | |
369 web_frame_scheduler_->timerTaskRunner()->postTask( | |
370 BLINK_FROM_HERE, new RunOrderTask(0, &run_order)); | |
371 | |
372 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
373 BLINK_FROM_HERE, | |
374 new DelayedRunOrderTask(1, web_frame_scheduler_->timerTaskRunner(), | |
375 &run_order), | |
376 2.0); | |
377 | |
378 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
379 BLINK_FROM_HERE, | |
380 new DelayedRunOrderTask(3, web_frame_scheduler_->timerTaskRunner(), | |
381 &run_order), | |
382 4.0); | |
383 | |
384 mock_task_runner_->RunUntilIdle(); | |
385 | |
386 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4)); | |
387 } | |
388 | |
389 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling | |
390 : public WebViewSchedulerImplTest { | |
391 public: | |
392 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {} | |
393 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {} | |
394 | |
395 bool DisableBackgroundTimerThrottling() const override { return true; } | |
396 }; | |
397 | |
398 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling, | |
399 RepeatingTimer_PageInBackground) { | |
400 web_view_scheduler_->setPageVisible(false); | |
401 | |
402 int run_count = 0; | |
403 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( | |
404 BLINK_FROM_HERE, | |
405 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), | |
406 1.0); | |
407 | |
408 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); | |
409 EXPECT_EQ(1000, run_count); | |
410 } | |
411 | |
412 TEST_F(WebViewSchedulerImplTest, VirtualTimeSettings_NewWebFrameScheduler) { | |
413 std::vector<int> run_order; | |
414 | |
415 web_view_scheduler_->setVirtualTimePolicy(VirtualTimePolicy::PAUSE); | |
416 web_view_scheduler_->enableVirtualTime(); | |
417 | |
418 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler = | |
419 web_view_scheduler_->createWebFrameSchedulerImpl(nullptr); | |
420 | |
421 web_frame_scheduler->timerTaskRunner()->postDelayedTask( | |
422 BLINK_FROM_HERE, new RunOrderTask(1, &run_order), 0.1); | |
423 | |
424 mock_task_runner_->RunUntilIdle(); | |
425 EXPECT_TRUE(run_order.empty()); | |
426 | |
427 web_view_scheduler_->setVirtualTimePolicy(VirtualTimePolicy::ADVANCE); | |
428 mock_task_runner_->RunUntilIdle(); | |
429 | |
430 EXPECT_THAT(run_order, ElementsAre(1)); | |
431 } | |
432 | |
433 namespace { | |
434 class DeleteWebFrameSchedulerTask : public blink::WebTaskRunner::Task { | |
435 public: | |
436 explicit DeleteWebFrameSchedulerTask(WebViewSchedulerImpl* web_view_scheduler) | |
437 : web_frame_scheduler_( | |
438 web_view_scheduler->createWebFrameSchedulerImpl(nullptr)) {} | |
439 | |
440 ~DeleteWebFrameSchedulerTask() override {} | |
441 | |
442 void run() override { web_frame_scheduler_.reset(); } | |
443 | |
444 WebFrameSchedulerImpl* web_frame_scheduler() const { | |
445 return web_frame_scheduler_.get(); | |
446 } | |
447 | |
448 private: | |
449 std::unique_ptr<WebFrameSchedulerImpl> web_frame_scheduler_; | |
450 }; | |
451 | |
452 class DeleteWebViewSchedulerTask : public blink::WebTaskRunner::Task { | |
453 public: | |
454 explicit DeleteWebViewSchedulerTask(WebViewSchedulerImpl* web_view_scheduler) | |
455 : web_view_scheduler_(web_view_scheduler) {} | |
456 | |
457 ~DeleteWebViewSchedulerTask() override {} | |
458 | |
459 void run() override { web_view_scheduler_.reset(); } | |
460 | |
461 private: | |
462 std::unique_ptr<WebViewSchedulerImpl> web_view_scheduler_; | |
463 }; | |
464 } // namespace | |
465 | |
466 TEST_F(WebViewSchedulerImplTest, DeleteWebFrameSchedulers_InTask) { | |
467 for (int i = 0; i < 10; i++) { | |
468 DeleteWebFrameSchedulerTask* task = | |
469 new DeleteWebFrameSchedulerTask(web_view_scheduler_.get()); | |
470 task->web_frame_scheduler()->timerTaskRunner()->postDelayedTask( | |
471 BLINK_FROM_HERE, task, 1.0); | |
472 } | |
473 mock_task_runner_->RunUntilIdle(); | |
474 } | |
475 | |
476 TEST_F(WebViewSchedulerImplTest, DeleteWebViewScheduler_InTask) { | |
477 web_frame_scheduler_->timerTaskRunner()->postTask( | |
478 BLINK_FROM_HERE, | |
479 new DeleteWebViewSchedulerTask(web_view_scheduler_.release())); | |
480 mock_task_runner_->RunUntilIdle(); | |
481 } | |
482 | |
483 TEST_F(WebViewSchedulerImplTest, DeleteThrottledQueue_InTask) { | |
484 web_view_scheduler_->setPageVisible(false); | |
485 | |
486 DeleteWebFrameSchedulerTask* delete_frame_task = | |
487 new DeleteWebFrameSchedulerTask(web_view_scheduler_.get()); | |
488 blink::WebTaskRunner* timer_task_runner = | |
489 delete_frame_task->web_frame_scheduler()->timerTaskRunner(); | |
490 | |
491 int run_count = 0; | |
492 timer_task_runner->postDelayedTask( | |
493 BLINK_FROM_HERE, new RepeatingTask(timer_task_runner, &run_count), 1.0); | |
494 | |
495 // Note this will run at time t = 10s since we start at time t = 5000us, and | |
496 // it will prevent further tasks from running (i.e. the RepeatingTask) by | |
497 // deleting the WebFrameScheduler. | |
498 timer_task_runner->postDelayedTask(BLINK_FROM_HERE, delete_frame_task, | |
499 9990.0); | |
500 | |
501 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(100)); | |
502 EXPECT_EQ(10, run_count); | |
503 } | |
504 | |
505 TEST_F(WebViewSchedulerImplTest, VirtualTimePolicy_DETERMINISTIC_LOADING) { | |
506 web_view_scheduler_->setVirtualTimePolicy( | |
507 VirtualTimePolicy::DETERMINISTIC_LOADING); | |
508 // Initially virtual time is not allowed to advance until we have seen at | |
509 // least one load. | |
510 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
511 | |
512 web_view_scheduler_->DidStartLoading(1u); | |
513 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
514 | |
515 web_view_scheduler_->DidStartLoading(2u); | |
516 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
517 | |
518 web_view_scheduler_->DidStopLoading(2u); | |
519 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
520 | |
521 web_view_scheduler_->DidStartLoading(3u); | |
522 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
523 | |
524 web_view_scheduler_->DidStopLoading(1u); | |
525 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
526 | |
527 web_view_scheduler_->DidStopLoading(3u); | |
528 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
529 | |
530 web_view_scheduler_->DidStartLoading(4u); | |
531 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
532 | |
533 web_view_scheduler_->DidStopLoading(4u); | |
534 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
535 } | |
536 | |
537 TEST_F(WebViewSchedulerImplTest, RedundantDidStopLoadingCallsAreHarmless) { | |
538 web_view_scheduler_->setVirtualTimePolicy( | |
539 VirtualTimePolicy::DETERMINISTIC_LOADING); | |
540 | |
541 web_view_scheduler_->DidStartLoading(1u); | |
542 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
543 | |
544 web_view_scheduler_->DidStopLoading(1u); | |
545 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
546 | |
547 web_view_scheduler_->DidStopLoading(1u); | |
548 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
549 | |
550 web_view_scheduler_->DidStopLoading(1u); | |
551 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
552 | |
553 web_view_scheduler_->DidStartLoading(2u); | |
554 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
555 | |
556 web_view_scheduler_->DidStopLoading(2u); | |
557 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
558 } | |
559 | |
560 TEST_F(WebViewSchedulerImplTest, BackgroundParser_DETERMINISTIC_LOADING) { | |
561 web_view_scheduler_->setVirtualTimePolicy( | |
562 VirtualTimePolicy::DETERMINISTIC_LOADING); | |
563 // Initially virtual time is not allowed to advance until we have seen at | |
564 // least one load. | |
565 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
566 | |
567 web_view_scheduler_->IncrementBackgroundParserCount(); | |
568 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
569 | |
570 web_view_scheduler_->DidStartLoading(1u); | |
571 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
572 | |
573 web_view_scheduler_->DidStopLoading(1u); | |
574 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
575 | |
576 web_view_scheduler_->IncrementBackgroundParserCount(); | |
577 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
578 | |
579 web_view_scheduler_->DecrementBackgroundParserCount(); | |
580 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
581 | |
582 web_view_scheduler_->DecrementBackgroundParserCount(); | |
583 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
584 | |
585 web_view_scheduler_->IncrementBackgroundParserCount(); | |
586 EXPECT_FALSE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
587 | |
588 web_view_scheduler_->DecrementBackgroundParserCount(); | |
589 EXPECT_TRUE(web_view_scheduler_->virtualTimeAllowedToAdvance()); | |
590 } | |
591 | |
592 } // namespace scheduler | |
OLD | NEW |