| Index: third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
|
| index a02778d4a2388e0e17f4f089aadf983a1bf8ada2..49234b4f8b1c058b70c3674a3469348a75fc4831 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
|
| @@ -38,6 +38,7 @@ class BudgetPoolTest : public testing::Test {
|
| mock_task_runner_, base::MakeUnique<TestTimeSource>(clock_.get()));
|
| scheduler_.reset(new RendererSchedulerImpl(delegate_));
|
| task_queue_throttler_ = scheduler_->task_queue_throttler();
|
| + start_time_ = clock_->NowTicks();
|
| }
|
|
|
| void TearDown() override {
|
| @@ -45,12 +46,21 @@ class BudgetPoolTest : public testing::Test {
|
| scheduler_.reset();
|
| }
|
|
|
| + base::TimeTicks MillisecondsAfterStart(int milliseconds) {
|
| + return start_time_ + base::TimeDelta::FromMilliseconds(milliseconds);
|
| + }
|
| +
|
| + base::TimeTicks SecondsAfterStart(int seconds) {
|
| + return start_time_ + base::TimeDelta::FromSeconds(seconds);
|
| + }
|
| +
|
| protected:
|
| std::unique_ptr<base::SimpleTestTickClock> clock_;
|
| scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_;
|
| scoped_refptr<SchedulerTqmDelegate> delegate_;
|
| std::unique_ptr<RendererSchedulerImpl> scheduler_;
|
| TaskQueueThrottler* task_queue_throttler_; // NOT OWNED
|
| + base::TimeTicks start_time_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(BudgetPoolTest);
|
| };
|
| @@ -59,33 +69,28 @@ TEST_F(BudgetPoolTest, CPUTimeBudgetPool) {
|
| CPUTimeBudgetPool* pool =
|
| task_queue_throttler_->CreateCPUTimeBudgetPool("test");
|
|
|
| - base::TimeTicks time_zero = clock_->NowTicks();
|
| + pool->SetTimeBudgetRecoveryRate(SecondsAfterStart(0), 0.1);
|
|
|
| - pool->SetTimeBudgetRecoveryRate(time_zero, 0.1);
|
| -
|
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(time_zero));
|
| - EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime());
|
| + EXPECT_TRUE(pool->CanRunTasksAt(SecondsAfterStart(0), false));
|
| + EXPECT_EQ(SecondsAfterStart(0),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
|
|
| // Run an expensive task and make sure that we're throttled.
|
| - pool->RecordTaskRunTime(time_zero,
|
| - time_zero + base::TimeDelta::FromMilliseconds(100));
|
| + pool->RecordTaskRunTime(nullptr, SecondsAfterStart(0),
|
| + MillisecondsAfterStart(100));
|
|
|
| - EXPECT_FALSE(pool->HasEnoughBudgetToRun(
|
| - time_zero + base::TimeDelta::FromMilliseconds(500)));
|
| - EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(1000),
|
| - pool->GetNextAllowedRunTime());
|
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(
|
| - time_zero + base::TimeDelta::FromMilliseconds(1000)));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(500), false));
|
| + EXPECT_EQ(MillisecondsAfterStart(1000),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(1000), false));
|
|
|
| // Run a cheap task and make sure that it doesn't affect anything.
|
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(
|
| - time_zero + base::TimeDelta::FromMilliseconds(2000)));
|
| - pool->RecordTaskRunTime(time_zero + base::TimeDelta::FromMilliseconds(2000),
|
| - time_zero + base::TimeDelta::FromMilliseconds(2020));
|
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(
|
| - time_zero + base::TimeDelta::FromMilliseconds(2020)));
|
| - EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(2020),
|
| - pool->GetNextAllowedRunTime());
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(2000), false));
|
| + pool->RecordTaskRunTime(nullptr, MillisecondsAfterStart(2000),
|
| + MillisecondsAfterStart(2020));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(2020), false));
|
| + EXPECT_EQ(MillisecondsAfterStart(2020),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
|
|
| pool->Close();
|
| }
|
| @@ -94,35 +99,90 @@ TEST_F(BudgetPoolTest, CPUTimeBudgetPoolMinBudgetLevelToRun) {
|
| CPUTimeBudgetPool* pool =
|
| task_queue_throttler_->CreateCPUTimeBudgetPool("test");
|
|
|
| - base::TimeTicks time_zero = clock_->NowTicks();
|
| -
|
| - pool->SetMinBudgetLevelToRun(time_zero,
|
| + pool->SetMinBudgetLevelToRun(SecondsAfterStart(0),
|
| base::TimeDelta::FromMilliseconds(10));
|
| - pool->SetTimeBudgetRecoveryRate(time_zero, 0.1);
|
| + pool->SetTimeBudgetRecoveryRate(SecondsAfterStart(0), 0.1);
|
|
|
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(time_zero));
|
| - EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime());
|
| + EXPECT_TRUE(pool->CanRunTasksAt(SecondsAfterStart(0), false));
|
| + EXPECT_EQ(SecondsAfterStart(0),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
|
|
| - pool->RecordTaskRunTime(time_zero,
|
| - time_zero + base::TimeDelta::FromMilliseconds(10));
|
| - EXPECT_FALSE(pool->HasEnoughBudgetToRun(
|
| - time_zero + base::TimeDelta::FromMilliseconds(15)));
|
| - EXPECT_FALSE(pool->HasEnoughBudgetToRun(
|
| - time_zero + base::TimeDelta::FromMilliseconds(150)));
|
| + pool->RecordTaskRunTime(nullptr, SecondsAfterStart(0),
|
| + MillisecondsAfterStart(10));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(15), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(150), false));
|
| // We need to wait extra 100ms to get budget of 10ms.
|
| - EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(200),
|
| - pool->GetNextAllowedRunTime());
|
| + EXPECT_EQ(MillisecondsAfterStart(200),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
|
|
| - pool->RecordTaskRunTime(time_zero + base::TimeDelta::FromMilliseconds(200),
|
| - time_zero + base::TimeDelta::FromMilliseconds(205));
|
| + pool->RecordTaskRunTime(nullptr, MillisecondsAfterStart(200),
|
| + MillisecondsAfterStart(205));
|
| // We can run when budget is non-negative even when it less than 10ms.
|
| - EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(205),
|
| - pool->GetNextAllowedRunTime());
|
| + EXPECT_EQ(MillisecondsAfterStart(205),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
| +
|
| + pool->RecordTaskRunTime(nullptr, MillisecondsAfterStart(205),
|
| + MillisecondsAfterStart(215));
|
| + EXPECT_EQ(MillisecondsAfterStart(350),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(0)));
|
| +}
|
|
|
| - pool->RecordTaskRunTime(time_zero + base::TimeDelta::FromMilliseconds(205),
|
| - time_zero + base::TimeDelta::FromMilliseconds(215));
|
| - EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(350),
|
| - pool->GetNextAllowedRunTime());
|
| +TEST_F(BudgetPoolTest, WakeUpBudgetPool) {
|
| + WakeUpBudgetPool* pool =
|
| + task_queue_throttler_->CreateWakeUpBudgetPool("test");
|
| +
|
| + scoped_refptr<TaskQueue> queue =
|
| + scheduler_->NewTimerTaskQueue(TaskQueue::QueueType::TEST);
|
| +
|
| + pool->SetWakeUpRate(0.1);
|
| + pool->SetWakeUpDuration(base::TimeDelta::FromMilliseconds(10));
|
| +
|
| + // Can't run tasks until a wake-up.
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(0), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(5), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(9), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(10), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(11), false));
|
| +
|
| + pool->OnWakeUp(MillisecondsAfterStart(0));
|
| +
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(0), false));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(5), false));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(9), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(10), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(11), false));
|
| +
|
| + // GetNextAllowedRunTime should return the desired time when in the
|
| + // wakeup window and return the next wakeup otherwise.
|
| + EXPECT_EQ(start_time_, pool->GetNextAllowedRunTime(start_time_));
|
| + EXPECT_EQ(SecondsAfterStart(10) - base::TimeDelta::FromMicroseconds(1),
|
| + pool->GetNextAllowedRunTime(MillisecondsAfterStart(15)));
|
| +
|
| + pool->RecordTaskRunTime(queue.get(), MillisecondsAfterStart(5),
|
| + MillisecondsAfterStart(7));
|
| +
|
| + // Make sure that nothing changes after a task inside wakeup window.
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(0), false));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(5), false));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(9), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(10), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(11), false));
|
| + EXPECT_EQ(start_time_, pool->GetNextAllowedRunTime(start_time_));
|
| + EXPECT_EQ(SecondsAfterStart(10) - base::TimeDelta::FromMicroseconds(1),
|
| + pool->GetNextAllowedRunTime(MillisecondsAfterStart(15)));
|
| +
|
| + pool->OnWakeUp(MillisecondsAfterStart(12005));
|
| + pool->RecordTaskRunTime(queue.get(), MillisecondsAfterStart(12005),
|
| + MillisecondsAfterStart(12007));
|
| +
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(12005), false));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(12007), false));
|
| + EXPECT_TRUE(pool->CanRunTasksAt(MillisecondsAfterStart(12014), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(12015), false));
|
| + EXPECT_FALSE(pool->CanRunTasksAt(MillisecondsAfterStart(12016), false));
|
| + EXPECT_EQ(
|
| + MillisecondsAfterStart(22005) - base::TimeDelta::FromMicroseconds(1),
|
| + pool->GetNextAllowedRunTime(SecondsAfterStart(13)));
|
| }
|
|
|
| } // namespace scheduler
|
|
|