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

Side by Side Diff: components/scheduler/renderer/web_view_scheduler_impl_unittest.cc

Issue 1652083002: Prepare for per-webview virtual time (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "components/scheduler/renderer/web_view_scheduler_impl.h" 5 #include "components/scheduler/renderer/web_view_scheduler_impl.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/test/simple_test_tick_clock.h" 9 #include "base/test/simple_test_tick_clock.h"
10 #include "cc/test/ordered_simple_task_runner.h" 10 #include "cc/test/ordered_simple_task_runner.h"
11 #include "components/scheduler/base/test_time_source.h" 11 #include "components/scheduler/base/test_time_source.h"
12 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h" 12 #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h"
13 #include "components/scheduler/renderer/renderer_scheduler_impl.h" 13 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
14 #include "components/scheduler/renderer/web_frame_scheduler_impl.h" 14 #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
15 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/WebKit/public/platform/WebTaskRunner.h" 17 #include "third_party/WebKit/public/platform/WebTaskRunner.h"
17 #include "third_party/WebKit/public/platform/WebTraceLocation.h" 18 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
18 19
20 using testing::ElementsAre;
21
19 namespace scheduler { 22 namespace scheduler {
20 23
21 class WebViewSchedulerImplTest : public testing::Test { 24 class WebViewSchedulerImplTest : public testing::Test {
22 public: 25 public:
23 WebViewSchedulerImplTest() {} 26 WebViewSchedulerImplTest() {}
24 ~WebViewSchedulerImplTest() override {} 27 ~WebViewSchedulerImplTest() override {}
25 28
26 void SetUp() override { 29 void SetUp() override {
27 clock_.reset(new base::SimpleTestTickClock()); 30 clock_.reset(new base::SimpleTestTickClock());
28 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); 31 clock_->Advance(base::TimeDelta::FromMicroseconds(5000));
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 web_frame_scheduler2->timerTaskRunner()->postDelayedTask( 148 web_frame_scheduler2->timerTaskRunner()->postDelayedTask(
146 BLINK_FROM_HERE, 149 BLINK_FROM_HERE,
147 new RepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2), 150 new RepeatingTask(web_frame_scheduler2->timerTaskRunner(), &run_count2),
148 1.0); 151 1.0);
149 152
150 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 153 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
151 EXPECT_EQ(1000, run_count1); 154 EXPECT_EQ(1000, run_count1);
152 EXPECT_EQ(1, run_count2); 155 EXPECT_EQ(1, run_count2);
153 } 156 }
154 157
158 namespace {
159 class VirtualTimeRecorderTask : public blink::WebTaskRunner::Task {
160 public:
161 VirtualTimeRecorderTask(RendererSchedulerImpl* scheduler,
162 std::vector<base::TimeTicks>* out_real_times,
163 std::vector<size_t>* out_virtual_times_ms)
164 : scheduler_(scheduler),
165 out_real_times_(out_real_times),
166 out_virtual_times_ms_(out_virtual_times_ms) {}
167
168 ~VirtualTimeRecorderTask() override {}
169
170 void run() override {
171 out_real_times_->push_back(scheduler_->tick_clock()->NowTicks());
172 out_virtual_times_ms_->push_back(
173 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0);
174 }
175
176 private:
177 RendererSchedulerImpl* scheduler_; // NOT OWNED
178 std::vector<base::TimeTicks>* out_real_times_; // NOT OWNED
179 std::vector<size_t>* out_virtual_times_ms_; // NOT OWNED
180 };
181 }
182
183 TEST_F(WebViewSchedulerImplTest, VirtualTime_TimerFastForwarding) {
184 std::vector<base::TimeTicks> real_times;
185 std::vector<size_t> virtual_times_ms;
186 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks();
187 size_t initial_virtual_time_ms =
188 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0;
189
190 web_view_scheduler_->enableVirtualTime();
191
192 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
193 BLINK_FROM_HERE,
194 new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
195 &virtual_times_ms),
196 2.0);
197
198 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
199 BLINK_FROM_HERE,
200 new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
201 &virtual_times_ms),
202 20.0);
203
204 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
205 BLINK_FROM_HERE,
206 new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
207 &virtual_times_ms),
208 200.0);
209
210 mock_task_runner_->RunUntilIdle();
211
212 EXPECT_THAT(real_times, ElementsAre(initial_real_time,
213 initial_real_time, initial_real_time));
214 EXPECT_THAT(virtual_times_ms,
215 ElementsAre(initial_virtual_time_ms + 2,
216 initial_virtual_time_ms + 20,
217 initial_virtual_time_ms + 200));
218 }
219
220 TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) {
221 std::vector<base::TimeTicks> real_times;
222 std::vector<size_t> virtual_times_ms;
223 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks();
224 size_t initial_virtual_time_ms =
225 scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0;
226
227 web_view_scheduler_->enableVirtualTime();
228
229 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
230 BLINK_FROM_HERE,
231 new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
232 &virtual_times_ms),
233 2.0);
234
235 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
236 BLINK_FROM_HERE,
237 new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
238 &virtual_times_ms),
239 20.0);
240
241 web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
242 BLINK_FROM_HERE,
243 new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
244 &virtual_times_ms),
245 200.0);
246
247 mock_task_runner_->RunUntilIdle();
248
249 EXPECT_THAT(real_times, ElementsAre(initial_real_time,
250 initial_real_time, initial_real_time));
251 EXPECT_THAT(virtual_times_ms,
252 ElementsAre(initial_virtual_time_ms + 2,
253 initial_virtual_time_ms + 20,
254 initial_virtual_time_ms + 200));
255 }
256
257 TEST_F(WebViewSchedulerImplTest,
258 RepeatingTimer_PageInBackground_MeansNothingForFirtualTime) {
259 web_view_scheduler_->enableVirtualTime();
260 web_view_scheduler_->setPageVisible(false);
261 base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks();
262
263 int run_count = 0;
264 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
265 BLINK_FROM_HERE,
266 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
267 1.0);
268
269 mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000));
270 EXPECT_EQ(1999, run_count);
271
272 // The global tick clock has not moved, yet we ran a large number of "delayed"
273 // tasks despite calling setPageVisible(false).
274 EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks());
275 }
276
277 namespace {
278 class RunOrderTask : public blink::WebTaskRunner::Task {
279 public:
280 RunOrderTask(int index, std::vector<int>* out_run_order)
281 : index_(index),
282 out_run_order_(out_run_order) {}
283
284 ~RunOrderTask() override {}
285
286 void run() override {
287 out_run_order_->push_back(index_);
288 }
289
290 private:
291 int index_;
292 std::vector<int>* out_run_order_; // NOT OWNED
293 };
294
295 class DelayedRunOrderTask : public blink::WebTaskRunner::Task {
296 public:
297 DelayedRunOrderTask(int index, blink::WebTaskRunner* task_runner,
298 std::vector<int>* out_run_order)
299 : index_(index),
300 task_runner_(task_runner),
301 out_run_order_(out_run_order) {}
302
303 ~DelayedRunOrderTask() override {}
304
305 void run() override {
306 out_run_order_->push_back(index_);
307 task_runner_->postTask(
308 BLINK_FROM_HERE, new RunOrderTask(index_ + 1, out_run_order_));
309 }
310
311 private:
312 int index_;
313 blink::WebTaskRunner* task_runner_; // NOT OWNED
314 std::vector<int>* out_run_order_; // NOT OWNED
315 };
316 }
317
318 TEST_F(WebViewSchedulerImplTest, VirtualTime_DelayedAndImmediateTaskOrdering) {
319 std::vector<int> run_order;
320
321 web_view_scheduler_->setAllowVirtualTimeToAdvance(false);
322 web_view_scheduler_->enableVirtualTime();
323
324 web_frame_scheduler_->timerTaskRunner()->postTask(
325 BLINK_FROM_HERE, new RunOrderTask(0, &run_order));
326
327 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
328 BLINK_FROM_HERE,
329 new DelayedRunOrderTask(1, web_frame_scheduler_->timerTaskRunner(),
330 &run_order),
331 2.0);
332
333 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
334 BLINK_FROM_HERE,
335 new DelayedRunOrderTask(3, web_frame_scheduler_->timerTaskRunner(),
336 &run_order),
337 4.0);
338
339 mock_task_runner_->RunUntilIdle();
340 EXPECT_TRUE(run_order.empty());
341
342 web_view_scheduler_->setAllowVirtualTimeToAdvance(true);
343 mock_task_runner_->RunUntilIdle();
344
345 EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4));
346 }
347
155 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling 348 class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling
156 : public WebViewSchedulerImplTest { 349 : public WebViewSchedulerImplTest {
157 public: 350 public:
158 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {} 351 WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() {}
159 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {} 352 ~WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling() override {}
160 353
161 bool DisableBackgroundTimerThrottling() const override { return true; } 354 bool DisableBackgroundTimerThrottling() const override { return true; }
162 }; 355 };
163 356
164 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling, 357 TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling,
165 RepeatingTimer_PageInBackground) { 358 RepeatingTimer_PageInBackground) {
166 web_view_scheduler_->setPageVisible(false); 359 web_view_scheduler_->setPageVisible(false);
167 360
168 int run_count = 0; 361 int run_count = 0;
169 web_frame_scheduler_->timerTaskRunner()->postDelayedTask( 362 web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
170 BLINK_FROM_HERE, 363 BLINK_FROM_HERE,
171 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count), 364 new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
172 1.0); 365 1.0);
173 366
174 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); 367 mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1));
175 EXPECT_EQ(1000, run_count); 368 EXPECT_EQ(1000, run_count);
176 } 369 }
177 370
371 TEST_F(WebViewSchedulerImplTest, VirtualTimeSettings_NewWebFrameScheduler) {
372 std::vector<int> run_order;
373
374 web_view_scheduler_->setAllowVirtualTimeToAdvance(false);
375 web_view_scheduler_->enableVirtualTime();
376
377 scoped_ptr<WebFrameSchedulerImpl> web_frame_scheduler =
378 web_view_scheduler_->createWebFrameSchedulerImpl();
379
380 web_frame_scheduler->timerTaskRunner()->postTask(
381 BLINK_FROM_HERE, new RunOrderTask(1, &run_order));
382
383 mock_task_runner_->RunUntilIdle();
384 EXPECT_TRUE(run_order.empty());
385
386 web_view_scheduler_->setAllowVirtualTimeToAdvance(true);
387 mock_task_runner_->RunUntilIdle();
388
389 EXPECT_THAT(run_order, ElementsAre(1));
390 }
391
178 } // namespace scheduler 392 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/renderer/web_view_scheduler_impl.cc ('k') | components/scheduler/scheduler.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698