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 |