| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/test/simple_test_tick_clock.h" |
| #include "components/scheduler/base/test_time_source.h" |
| #include "components/scheduler/renderer/task_cost_estimator.h" |
| |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace scheduler { |
| |
| class TaskCostEstimatorTest : public testing::Test { |
| public: |
| TaskCostEstimatorTest() {} |
| ~TaskCostEstimatorTest() override {} |
| |
| void SetUp() override { |
| test_time_source_.reset(new TestTimeSource(&clock_)); |
| } |
| |
| base::SimpleTestTickClock clock_; |
| scoped_ptr<TestTimeSource> test_time_source_; |
| }; |
| |
| class TaskCostEstimatorForTest : public TaskCostEstimator { |
| public: |
| TaskCostEstimatorForTest(TestTimeSource* test_time_source, |
| int sample_count, |
| double estimation_percentile) |
| : TaskCostEstimator(test_time_source, |
| sample_count, |
| estimation_percentile) {} |
| }; |
| |
| TEST_F(TaskCostEstimatorTest, BasicEstimation) { |
| TaskCostEstimatorForTest estimator(test_time_source_.get(), 1, 100); |
| base::PendingTask task(FROM_HERE, base::Closure()); |
| |
| estimator.WillProcessTask(task); |
| clock_.Advance(base::TimeDelta::FromMilliseconds(500)); |
| estimator.DidProcessTask(task); |
| |
| EXPECT_EQ(base::TimeDelta::FromMilliseconds(500), |
| estimator.expected_task_duration()); |
| } |
| |
| TEST_F(TaskCostEstimatorTest, Clear) { |
| TaskCostEstimatorForTest estimator(test_time_source_.get(), 1, 100); |
| base::PendingTask task(FROM_HERE, base::Closure()); |
| |
| estimator.WillProcessTask(task); |
| clock_.Advance(base::TimeDelta::FromMilliseconds(500)); |
| estimator.DidProcessTask(task); |
| |
| estimator.Clear(); |
| |
| EXPECT_EQ(base::TimeDelta(), estimator.expected_task_duration()); |
| } |
| |
| TEST_F(TaskCostEstimatorTest, NestedRunLoop) { |
| TaskCostEstimatorForTest estimator(test_time_source_.get(), 1, 100); |
| base::PendingTask task(FROM_HERE, base::Closure()); |
| |
| // Make sure we ignore the tasks inside the nested run loop. |
| estimator.WillProcessTask(task); |
| estimator.WillProcessTask(task); |
| clock_.Advance(base::TimeDelta::FromMilliseconds(500)); |
| estimator.DidProcessTask(task); |
| clock_.Advance(base::TimeDelta::FromMilliseconds(500)); |
| estimator.DidProcessTask(task); |
| |
| EXPECT_EQ(base::TimeDelta::FromMilliseconds(1000), |
| estimator.expected_task_duration()); |
| } |
| |
| } // namespace scheduler |