Chromium Code Reviews| 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..16e3518e7d4b60a970ba9961cbb230e3443d1b0f 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(); |
| + time_zero_ = clock_->NowTicks(); |
|
alex clarke (OOO till 29th)
2017/04/21 09:14:19
I think start_time_ would be a better name.
altimin
2017/04/25 13:22:35
Done.
|
| } |
| void TearDown() override { |
| @@ -45,12 +46,21 @@ class BudgetPoolTest : public testing::Test { |
| scheduler_.reset(); |
| } |
| + base::TimeTicks Milliseconds(int milliseconds) { |
|
alex clarke (OOO till 29th)
2017/04/21 09:14:19
I'd prefer if this and the function below had an
altimin
2017/04/25 13:22:35
Done.
|
| + return time_zero_ + base::TimeDelta::FromMilliseconds(milliseconds); |
| + } |
| + |
| + base::TimeTicks Seconds(int seconds) { |
| + return time_zero_ + 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 time_zero_; |
| DISALLOW_COPY_AND_ASSIGN(BudgetPoolTest); |
| }; |
| @@ -63,29 +73,30 @@ TEST_F(BudgetPoolTest, CPUTimeBudgetPool) { |
| pool->SetTimeBudgetRecoveryRate(time_zero, 0.1); |
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(time_zero)); |
| - EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime()); |
| + EXPECT_TRUE(pool->CanRunTasksAt(time_zero)); |
| + EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime(time_zero)); |
| // Run an expensive task and make sure that we're throttled. |
| - pool->RecordTaskRunTime(time_zero, |
| + pool->RecordTaskRunTime(nullptr, time_zero, |
| time_zero + base::TimeDelta::FromMilliseconds(100)); |
| - EXPECT_FALSE(pool->HasEnoughBudgetToRun( |
| - time_zero + base::TimeDelta::FromMilliseconds(500))); |
| + EXPECT_FALSE( |
| + pool->CanRunTasksAt(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))); |
| + pool->GetNextAllowedRunTime(time_zero)); |
| + EXPECT_TRUE( |
| + pool->CanRunTasksAt(time_zero + base::TimeDelta::FromMilliseconds(1000))); |
| // 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), |
| + EXPECT_TRUE( |
| + pool->CanRunTasksAt(time_zero + base::TimeDelta::FromMilliseconds(2000))); |
| + pool->RecordTaskRunTime(nullptr, |
| + time_zero + base::TimeDelta::FromMilliseconds(2000), |
| time_zero + base::TimeDelta::FromMilliseconds(2020)); |
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun( |
| - time_zero + base::TimeDelta::FromMilliseconds(2020))); |
| + EXPECT_TRUE( |
| + pool->CanRunTasksAt(time_zero + base::TimeDelta::FromMilliseconds(2020))); |
| EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(2020), |
| - pool->GetNextAllowedRunTime()); |
| + pool->GetNextAllowedRunTime(time_zero)); |
| pool->Close(); |
| } |
| @@ -100,29 +111,78 @@ TEST_F(BudgetPoolTest, CPUTimeBudgetPoolMinBudgetLevelToRun) { |
| base::TimeDelta::FromMilliseconds(10)); |
| pool->SetTimeBudgetRecoveryRate(time_zero, 0.1); |
| - EXPECT_TRUE(pool->HasEnoughBudgetToRun(time_zero)); |
| - EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime()); |
| + EXPECT_TRUE(pool->CanRunTasksAt(time_zero)); |
| + EXPECT_EQ(time_zero, pool->GetNextAllowedRunTime(time_zero)); |
| - pool->RecordTaskRunTime(time_zero, |
| + pool->RecordTaskRunTime(nullptr, 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))); |
| + EXPECT_FALSE( |
| + pool->CanRunTasksAt(time_zero + base::TimeDelta::FromMilliseconds(15))); |
| + EXPECT_FALSE( |
| + pool->CanRunTasksAt(time_zero + base::TimeDelta::FromMilliseconds(150))); |
| // We need to wait extra 100ms to get budget of 10ms. |
| EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(200), |
| - pool->GetNextAllowedRunTime()); |
| + pool->GetNextAllowedRunTime(time_zero)); |
| - pool->RecordTaskRunTime(time_zero + base::TimeDelta::FromMilliseconds(200), |
| + pool->RecordTaskRunTime(nullptr, |
| + time_zero + base::TimeDelta::FromMilliseconds(200), |
| time_zero + base::TimeDelta::FromMilliseconds(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()); |
| + pool->GetNextAllowedRunTime(time_zero)); |
| - pool->RecordTaskRunTime(time_zero + base::TimeDelta::FromMilliseconds(205), |
| + pool->RecordTaskRunTime(nullptr, |
| + time_zero + base::TimeDelta::FromMilliseconds(205), |
| time_zero + base::TimeDelta::FromMilliseconds(215)); |
| EXPECT_EQ(time_zero + base::TimeDelta::FromMilliseconds(350), |
| - pool->GetNextAllowedRunTime()); |
| + pool->GetNextAllowedRunTime(time_zero)); |
| +} |
| + |
| +TEST_F(BudgetPoolTest, WakeupBudgetPool) { |
| + WakeupBudgetPool* pool = |
| + task_queue_throttler_->CreateWakeupBudgetPool("test"); |
| + |
| + scoped_refptr<TaskQueue> queue = |
| + scheduler_->NewTimerTaskRunner(TaskQueue::QueueType::TEST); |
| + |
| + pool->SetWakeupRate(time_zero_, 0.1); |
| + pool->SetWakeupDuration(time_zero_, base::TimeDelta::FromMilliseconds(10)); |
| + |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(0))); |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(5))); |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(9))); |
| + EXPECT_FALSE(pool->CanRunTasksAt(Milliseconds(10))); |
| + EXPECT_FALSE(pool->CanRunTasksAt(Milliseconds(11))); |
| + |
| + // GetNextAllowedRunTime should return the desired time when in the |
| + // wakeup window and return the next wakeup otherwise. |
| + EXPECT_EQ(time_zero_, pool->GetNextAllowedRunTime(time_zero_)); |
| + EXPECT_EQ(Seconds(10) - base::TimeDelta::FromMicroseconds(1), |
| + pool->GetNextAllowedRunTime(Milliseconds(15))); |
| + |
| + pool->RecordTaskRunTime(queue.get(), Milliseconds(5), Milliseconds(7)); |
| + |
| + // Make sure that nothing changes after a task inside wakeup window. |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(0))); |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(5))); |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(9))); |
| + EXPECT_FALSE(pool->CanRunTasksAt(Milliseconds(10))); |
| + EXPECT_FALSE(pool->CanRunTasksAt(Milliseconds(11))); |
| + EXPECT_EQ(time_zero_, pool->GetNextAllowedRunTime(time_zero_)); |
| + EXPECT_EQ(Seconds(10) - base::TimeDelta::FromMicroseconds(1), |
| + pool->GetNextAllowedRunTime(Milliseconds(15))); |
| + |
| + pool->OnWakeup(Milliseconds(12005)); |
| + pool->RecordTaskRunTime(queue.get(), Milliseconds(12005), |
| + Milliseconds(12007)); |
| + |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(12005))); |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(12007))); |
| + EXPECT_TRUE(pool->CanRunTasksAt(Milliseconds(12014))); |
| + EXPECT_FALSE(pool->CanRunTasksAt(Milliseconds(12015))); |
| + EXPECT_FALSE(pool->CanRunTasksAt(Milliseconds(12016))); |
| + EXPECT_EQ(Milliseconds(22005) - base::TimeDelta::FromMicroseconds(1), |
| + pool->GetNextAllowedRunTime(Seconds(13))); |
| } |
| } // namespace scheduler |