Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "base/task_scheduler/delayed_task_manager.h" | 5 #include "base/task_scheduler/delayed_task_manager.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/sequenced_task_runner.h" | 12 #include "base/sequenced_task_runner.h" |
| 13 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
| 14 #include "base/task_runner.h" | 14 #include "base/task_runner.h" |
| 15 #include "base/task_scheduler/scheduler_worker_pool.h" | 15 #include "base/task_scheduler/scheduler_worker_pool.h" |
| 16 #include "base/task_scheduler/sequence.h" | 16 #include "base/task_scheduler/sequence.h" |
| 17 #include "base/task_scheduler/task.h" | 17 #include "base/task_scheduler/task.h" |
| 18 #include "base/test/test_mock_time_task_runner.h" | 18 #include "base/test/test_mock_time_task_runner.h" |
| 19 #include "base/time/time.h" | 19 #include "base/time/time.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 22 |
| 23 namespace base { | 23 namespace base { |
| 24 namespace internal { | 24 namespace internal { |
| 25 namespace { | 25 namespace { |
| 26 | 26 |
| 27 constexpr TimeDelta kLongDelay = TimeDelta::FromHours(1); | 27 constexpr TimeDelta kLongDelay = TimeDelta::FromHours(1); |
| 28 | 28 |
| 29 class MockSchedulerWorkerPool : public SchedulerWorkerPool { | 29 class MockSchedulerWorkerPool : public SchedulerWorkerPool { |
|
fdoray
2017/02/08 17:59:01
I would test without a SchedulerWorkerPool now tha
robliao
2017/02/10 00:04:04
That sounds reasonable to me. This will be removed
| |
| 30 public: | 30 public: |
| 31 // SchedulerWorkerPool: | 31 // SchedulerWorkerPool: |
| 32 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( | 32 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( |
| 33 const TaskTraits& traits) override { | 33 const TaskTraits& traits) override { |
| 34 ADD_FAILURE() << "Call to unimplemented method."; | 34 ADD_FAILURE() << "Call to unimplemented method."; |
| 35 return nullptr; | 35 return nullptr; |
| 36 } | 36 } |
| 37 | 37 |
| 38 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( | 38 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( |
| 39 const TaskTraits& traits) override { | 39 const TaskTraits& traits) override { |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 64 SchedulerWorker* worker) override { | 64 SchedulerWorker* worker) override { |
| 65 PostTaskWithSequenceNowMock(task.get(), sequence.get(), worker); | 65 PostTaskWithSequenceNowMock(task.get(), sequence.get(), worker); |
| 66 } | 66 } |
| 67 | 67 |
| 68 MOCK_METHOD3(PostTaskWithSequenceNowMock, | 68 MOCK_METHOD3(PostTaskWithSequenceNowMock, |
| 69 void(const Task*, | 69 void(const Task*, |
| 70 const Sequence*, | 70 const Sequence*, |
| 71 const SchedulerWorker* worker)); | 71 const SchedulerWorker* worker)); |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 // Posts |task|. The task will be forwarded to |worker_pool| with |sequence| | |
| 75 // and |worker| when it becomes ripe for execution. |worker| is a | |
| 76 // SchedulerWorker owned by |worker_pool| or nullptr. | |
| 77 void PostTaskToWorkerPool(scoped_refptr<Sequence> sequence, | |
| 78 SchedulerWorker* worker, | |
| 79 SchedulerWorkerPool* worker_pool, | |
| 80 std::unique_ptr<Task> task) { | |
| 81 worker_pool->PostTaskWithSequenceNow(std::move(task), std::move(sequence), | |
| 82 worker); | |
| 83 } | |
| 84 | |
| 74 } // namespace | 85 } // namespace |
| 75 | 86 |
| 76 // Verify that a delayed task isn't forwarded to its SchedulerWorkerPool before | 87 // Verify that a delayed task isn't forwarded to its SchedulerWorkerPool before |
| 77 // it is ripe for execution. | 88 // it is ripe for execution. |
| 78 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskDoesNotRunTooEarly) { | 89 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskDoesNotRunTooEarly) { |
| 79 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner( | 90 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner( |
| 80 new TestMockTimeTaskRunner); | 91 new TestMockTimeTaskRunner); |
| 81 DelayedTaskManager manager(service_thread_task_runner); | 92 DelayedTaskManager manager(service_thread_task_runner); |
| 82 | 93 |
| 83 std::unique_ptr<Task> task( | 94 std::unique_ptr<Task> task( |
| 84 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay)); | 95 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay)); |
| 85 scoped_refptr<Sequence> sequence(new Sequence); | 96 scoped_refptr<Sequence> sequence(new Sequence); |
| 86 testing::StrictMock<MockSchedulerWorkerPool> worker_pool; | 97 testing::StrictMock<MockSchedulerWorkerPool> worker_pool; |
| 87 | 98 |
| 88 // Send |task| to the DelayedTaskManager. | 99 // Send |task| to the DelayedTaskManager. |
| 89 manager.AddDelayedTask(std::move(task), sequence, nullptr, &worker_pool); | 100 manager.AddDelayedTask( |
| 101 std::move(task), | |
| 102 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool))); | |
| 90 | 103 |
| 91 // Run tasks that are ripe for execution. Don't expect any call to the mock | 104 // Run tasks that are ripe for execution. Don't expect any call to the mock |
| 92 // method of |worker_pool|. | 105 // method of |worker_pool|. |
| 93 service_thread_task_runner->RunUntilIdle(); | 106 service_thread_task_runner->RunUntilIdle(); |
| 94 } | 107 } |
| 95 | 108 |
| 96 // Verify that a delayed task is forwarded to its SchedulerWorkerPool when it is | 109 // Verify that a delayed task is forwarded to its SchedulerWorkerPool when it is |
| 97 // ripe for execution. | 110 // ripe for execution. |
| 98 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskRunsAfterDelay) { | 111 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskRunsAfterDelay) { |
| 99 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner( | 112 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner( |
| 100 new TestMockTimeTaskRunner); | 113 new TestMockTimeTaskRunner); |
| 101 DelayedTaskManager manager(service_thread_task_runner); | 114 DelayedTaskManager manager(service_thread_task_runner); |
| 102 | 115 |
| 103 std::unique_ptr<Task> task( | 116 std::unique_ptr<Task> task( |
| 104 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay)); | 117 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay)); |
| 105 const Task* task_raw = task.get(); | 118 const Task* task_raw = task.get(); |
| 106 scoped_refptr<Sequence> sequence(new Sequence); | 119 scoped_refptr<Sequence> sequence(new Sequence); |
| 107 testing::StrictMock<MockSchedulerWorkerPool> worker_pool; | 120 testing::StrictMock<MockSchedulerWorkerPool> worker_pool; |
| 108 | 121 |
| 109 // Send |task| to the DelayedTaskManager. | 122 // Send |task| to the DelayedTaskManager. |
| 110 manager.AddDelayedTask(std::move(task), sequence, nullptr, &worker_pool); | 123 manager.AddDelayedTask( |
| 124 std::move(task), | |
| 125 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool))); | |
| 111 | 126 |
| 112 // Fast-forward time. Expect a call to the mock method of |worker_pool|. | 127 // Fast-forward time. Expect a call to the mock method of |worker_pool|. |
| 113 EXPECT_CALL(worker_pool, | 128 EXPECT_CALL(worker_pool, |
| 114 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr)); | 129 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr)); |
| 115 service_thread_task_runner->FastForwardBy(kLongDelay); | 130 service_thread_task_runner->FastForwardBy(kLongDelay); |
| 116 } | 131 } |
| 117 | 132 |
| 118 // Verify that multiple delayed task are forwarded to their SchedulerWorkerPool | 133 // Verify that multiple delayed task are forwarded to their SchedulerWorkerPool |
| 119 // when they are ripe for execution. | 134 // when they are ripe for execution. |
| 120 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTasksRunAfterDelay) { | 135 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTasksRunAfterDelay) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 131 | 146 |
| 132 std::unique_ptr<Task> task_b(new Task(FROM_HERE, Bind(&DoNothing), | 147 std::unique_ptr<Task> task_b(new Task(FROM_HERE, Bind(&DoNothing), |
| 133 TaskTraits(), TimeDelta::FromHours(2))); | 148 TaskTraits(), TimeDelta::FromHours(2))); |
| 134 const Task* task_b_raw = task_b.get(); | 149 const Task* task_b_raw = task_b.get(); |
| 135 | 150 |
| 136 std::unique_ptr<Task> task_c(new Task(FROM_HERE, Bind(&DoNothing), | 151 std::unique_ptr<Task> task_c(new Task(FROM_HERE, Bind(&DoNothing), |
| 137 TaskTraits(), TimeDelta::FromHours(1))); | 152 TaskTraits(), TimeDelta::FromHours(1))); |
| 138 const Task* task_c_raw = task_c.get(); | 153 const Task* task_c_raw = task_c.get(); |
| 139 | 154 |
| 140 // Send tasks to the DelayedTaskManager. | 155 // Send tasks to the DelayedTaskManager. |
| 141 manager.AddDelayedTask(std::move(task_a), sequence, nullptr, &worker_pool); | 156 manager.AddDelayedTask( |
| 142 manager.AddDelayedTask(std::move(task_b), sequence, nullptr, &worker_pool); | 157 std::move(task_a), |
| 143 manager.AddDelayedTask(std::move(task_c), sequence, nullptr, &worker_pool); | 158 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool))); |
| 159 manager.AddDelayedTask( | |
| 160 std::move(task_b), | |
| 161 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool))); | |
| 162 manager.AddDelayedTask( | |
| 163 std::move(task_c), | |
| 164 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool))); | |
| 144 | 165 |
| 145 // Run tasks that are ripe for execution on the service thread. Don't expect | 166 // Run tasks that are ripe for execution on the service thread. Don't expect |
| 146 // any call to the mock method of |worker_pool|. | 167 // any call to the mock method of |worker_pool|. |
| 147 service_thread_task_runner->RunUntilIdle(); | 168 service_thread_task_runner->RunUntilIdle(); |
| 148 | 169 |
| 149 // Fast-forward time. Expect |task_a_raw| and |task_c_raw| to be forwarded to | 170 // Fast-forward time. Expect |task_a_raw| and |task_c_raw| to be forwarded to |
| 150 // the worker pool. | 171 // the worker pool. |
| 151 EXPECT_CALL(worker_pool, | 172 EXPECT_CALL(worker_pool, |
| 152 PostTaskWithSequenceNowMock(task_a_raw, sequence.get(), nullptr)); | 173 PostTaskWithSequenceNowMock(task_a_raw, sequence.get(), nullptr)); |
| 153 EXPECT_CALL(worker_pool, | 174 EXPECT_CALL(worker_pool, |
| 154 PostTaskWithSequenceNowMock(task_c_raw, sequence.get(), nullptr)); | 175 PostTaskWithSequenceNowMock(task_c_raw, sequence.get(), nullptr)); |
| 155 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1)); | 176 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1)); |
| 156 testing::Mock::VerifyAndClear(&worker_pool); | 177 testing::Mock::VerifyAndClear(&worker_pool); |
| 157 | 178 |
| 158 // Fast-forward time. Expect |task_b_raw| to be forwarded to the worker pool. | 179 // Fast-forward time. Expect |task_b_raw| to be forwarded to the worker pool. |
| 159 EXPECT_CALL(worker_pool, | 180 EXPECT_CALL(worker_pool, |
| 160 PostTaskWithSequenceNowMock(task_b_raw, sequence.get(), nullptr)); | 181 PostTaskWithSequenceNowMock(task_b_raw, sequence.get(), nullptr)); |
| 161 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1)); | 182 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1)); |
| 162 testing::Mock::VerifyAndClear(&worker_pool); | 183 testing::Mock::VerifyAndClear(&worker_pool); |
| 163 } | 184 } |
| 164 | 185 |
| 165 } // namespace internal | 186 } // namespace internal |
| 166 } // namespace base | 187 } // namespace base |
| OLD | NEW |