| Index: components/scheduler/renderer/web_view_scheduler_impl_unittest.cc
|
| diff --git a/components/scheduler/renderer/web_view_scheduler_impl_unittest.cc b/components/scheduler/renderer/web_view_scheduler_impl_unittest.cc
|
| index c12544de7c8b9a5d301ac28a59f4bd149ccdf90b..c799eb9acd622a7b6b75d844a8cc2424eaff2309 100644
|
| --- a/components/scheduler/renderer/web_view_scheduler_impl_unittest.cc
|
| +++ b/components/scheduler/renderer/web_view_scheduler_impl_unittest.cc
|
| @@ -12,10 +12,13 @@
|
| #include "components/scheduler/child/scheduler_tqm_delegate_for_test.h"
|
| #include "components/scheduler/renderer/renderer_scheduler_impl.h"
|
| #include "components/scheduler/renderer/web_frame_scheduler_impl.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/WebKit/public/platform/WebTaskRunner.h"
|
| #include "third_party/WebKit/public/platform/WebTraceLocation.h"
|
|
|
| +using testing::ElementsAre;
|
| +
|
| namespace scheduler {
|
|
|
| class WebViewSchedulerImplTest : public testing::Test {
|
| @@ -152,6 +155,196 @@ TEST_F(WebViewSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) {
|
| EXPECT_EQ(1, run_count2);
|
| }
|
|
|
| +namespace {
|
| +class VirtualTimeRecorderTask : public blink::WebTaskRunner::Task {
|
| + public:
|
| + VirtualTimeRecorderTask(RendererSchedulerImpl* scheduler,
|
| + std::vector<base::TimeTicks>* out_real_times,
|
| + std::vector<size_t>* out_virtual_times_ms)
|
| + : scheduler_(scheduler),
|
| + out_real_times_(out_real_times),
|
| + out_virtual_times_ms_(out_virtual_times_ms) {}
|
| +
|
| + ~VirtualTimeRecorderTask() override {}
|
| +
|
| + void run() override {
|
| + out_real_times_->push_back(scheduler_->tick_clock()->NowTicks());
|
| + out_virtual_times_ms_->push_back(
|
| + scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0);
|
| + }
|
| +
|
| + private:
|
| + RendererSchedulerImpl* scheduler_; // NOT OWNED
|
| + std::vector<base::TimeTicks>* out_real_times_; // NOT OWNED
|
| + std::vector<size_t>* out_virtual_times_ms_; // NOT OWNED
|
| +};
|
| +}
|
| +
|
| +TEST_F(WebViewSchedulerImplTest, VirtualTime_TimerFastForwarding) {
|
| + std::vector<base::TimeTicks> real_times;
|
| + std::vector<size_t> virtual_times_ms;
|
| + base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks();
|
| + size_t initial_virtual_time_ms =
|
| + scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0;
|
| +
|
| + web_view_scheduler_->enableVirtualTime();
|
| +
|
| + web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
|
| + &virtual_times_ms),
|
| + 2.0);
|
| +
|
| + web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
|
| + &virtual_times_ms),
|
| + 20.0);
|
| +
|
| + web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
|
| + &virtual_times_ms),
|
| + 200.0);
|
| +
|
| + mock_task_runner_->RunUntilIdle();
|
| +
|
| + EXPECT_THAT(real_times, ElementsAre(initial_real_time,
|
| + initial_real_time, initial_real_time));
|
| + EXPECT_THAT(virtual_times_ms,
|
| + ElementsAre(initial_virtual_time_ms + 2,
|
| + initial_virtual_time_ms + 20,
|
| + initial_virtual_time_ms + 200));
|
| +}
|
| +
|
| +TEST_F(WebViewSchedulerImplTest, VirtualTime_LoadingTaskFastForwarding) {
|
| + std::vector<base::TimeTicks> real_times;
|
| + std::vector<size_t> virtual_times_ms;
|
| + base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks();
|
| + size_t initial_virtual_time_ms =
|
| + scheduler_->MonotonicallyIncreasingVirtualTimeSeconds() * 1000.0;
|
| +
|
| + web_view_scheduler_->enableVirtualTime();
|
| +
|
| + web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
|
| + &virtual_times_ms),
|
| + 2.0);
|
| +
|
| + web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
|
| + &virtual_times_ms),
|
| + 20.0);
|
| +
|
| + web_frame_scheduler_->loadingTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new VirtualTimeRecorderTask(scheduler_.get(), &real_times,
|
| + &virtual_times_ms),
|
| + 200.0);
|
| +
|
| + mock_task_runner_->RunUntilIdle();
|
| +
|
| + EXPECT_THAT(real_times, ElementsAre(initial_real_time,
|
| + initial_real_time, initial_real_time));
|
| + EXPECT_THAT(virtual_times_ms,
|
| + ElementsAre(initial_virtual_time_ms + 2,
|
| + initial_virtual_time_ms + 20,
|
| + initial_virtual_time_ms + 200));
|
| +}
|
| +
|
| +TEST_F(WebViewSchedulerImplTest,
|
| + RepeatingTimer_PageInBackground_MeansNothingForFirtualTime) {
|
| + web_view_scheduler_->enableVirtualTime();
|
| + web_view_scheduler_->setPageVisible(false);
|
| + base::TimeTicks initial_real_time = scheduler_->tick_clock()->NowTicks();
|
| +
|
| + int run_count = 0;
|
| + web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new RepeatingTask(web_frame_scheduler_->timerTaskRunner(), &run_count),
|
| + 1.0);
|
| +
|
| + mock_task_runner_->RunTasksWhile(mock_task_runner_->TaskRunCountBelow(2000));
|
| + EXPECT_EQ(1999, run_count);
|
| +
|
| + // The global tick clock has not moved, yet we ran a large number of "delayed"
|
| + // tasks despite calling setPageVisible(false).
|
| + EXPECT_EQ(initial_real_time, scheduler_->tick_clock()->NowTicks());
|
| +}
|
| +
|
| +namespace {
|
| +class RunOrderTask : public blink::WebTaskRunner::Task {
|
| + public:
|
| + RunOrderTask(int index, std::vector<int>* out_run_order)
|
| + : index_(index),
|
| + out_run_order_(out_run_order) {}
|
| +
|
| + ~RunOrderTask() override {}
|
| +
|
| + void run() override {
|
| + out_run_order_->push_back(index_);
|
| + }
|
| +
|
| + private:
|
| + int index_;
|
| + std::vector<int>* out_run_order_; // NOT OWNED
|
| +};
|
| +
|
| +class DelayedRunOrderTask : public blink::WebTaskRunner::Task {
|
| + public:
|
| + DelayedRunOrderTask(int index, blink::WebTaskRunner* task_runner,
|
| + std::vector<int>* out_run_order)
|
| + : index_(index),
|
| + task_runner_(task_runner),
|
| + out_run_order_(out_run_order) {}
|
| +
|
| + ~DelayedRunOrderTask() override {}
|
| +
|
| + void run() override {
|
| + out_run_order_->push_back(index_);
|
| + task_runner_->postTask(
|
| + BLINK_FROM_HERE, new RunOrderTask(index_ + 1, out_run_order_));
|
| + }
|
| +
|
| + private:
|
| + int index_;
|
| + blink::WebTaskRunner* task_runner_; // NOT OWNED
|
| + std::vector<int>* out_run_order_; // NOT OWNED
|
| +};
|
| +}
|
| +
|
| +TEST_F(WebViewSchedulerImplTest, VirtualTime_DelayedAndImmediateTaskOrdering) {
|
| + std::vector<int> run_order;
|
| +
|
| + web_view_scheduler_->setAllowVirtualTimeToAdvance(false);
|
| + web_view_scheduler_->enableVirtualTime();
|
| +
|
| + web_frame_scheduler_->timerTaskRunner()->postTask(
|
| + BLINK_FROM_HERE, new RunOrderTask(0, &run_order));
|
| +
|
| + web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new DelayedRunOrderTask(1, web_frame_scheduler_->timerTaskRunner(),
|
| + &run_order),
|
| + 2.0);
|
| +
|
| + web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
|
| + BLINK_FROM_HERE,
|
| + new DelayedRunOrderTask(3, web_frame_scheduler_->timerTaskRunner(),
|
| + &run_order),
|
| + 4.0);
|
| +
|
| + mock_task_runner_->RunUntilIdle();
|
| + EXPECT_TRUE(run_order.empty());
|
| +
|
| + web_view_scheduler_->setAllowVirtualTimeToAdvance(true);
|
| + mock_task_runner_->RunUntilIdle();
|
| +
|
| + EXPECT_THAT(run_order, ElementsAre(0, 1, 2, 3, 4));
|
| +}
|
| +
|
| class WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling
|
| : public WebViewSchedulerImplTest {
|
| public:
|
| @@ -175,4 +368,25 @@ TEST_F(WebViewSchedulerImplTestWithDisabledBackgroundTimerThrottling,
|
| EXPECT_EQ(1000, run_count);
|
| }
|
|
|
| +TEST_F(WebViewSchedulerImplTest, VirtualTimeSettings_NewWebFrameScheduler) {
|
| + std::vector<int> run_order;
|
| +
|
| + web_view_scheduler_->setAllowVirtualTimeToAdvance(false);
|
| + web_view_scheduler_->enableVirtualTime();
|
| +
|
| + scoped_ptr<WebFrameSchedulerImpl> web_frame_scheduler =
|
| + web_view_scheduler_->createWebFrameSchedulerImpl();
|
| +
|
| + web_frame_scheduler->timerTaskRunner()->postTask(
|
| + BLINK_FROM_HERE, new RunOrderTask(1, &run_order));
|
| +
|
| + mock_task_runner_->RunUntilIdle();
|
| + EXPECT_TRUE(run_order.empty());
|
| +
|
| + web_view_scheduler_->setAllowVirtualTimeToAdvance(true);
|
| + mock_task_runner_->RunUntilIdle();
|
| +
|
| + EXPECT_THAT(run_order, ElementsAre(1));
|
| +}
|
| +
|
| } // namespace scheduler
|
|
|