Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: content/renderer/scheduler/task_queue_manager_unittest.cc

Issue 1008693004: Handle delayed tasks more natively in the scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix bug with AutomaticSelectorForTest and multiple queues Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/renderer/scheduler/task_queue_manager.h" 5 #include "content/renderer/scheduler/task_queue_manager.h"
6 6
7 #include "base/test/test_simple_task_runner.h"
8 #include "base/threading/thread.h" 7 #include "base/threading/thread.h"
8 #include "cc/test/ordered_simple_task_runner.h"
9 #include "cc/test/test_now_source.h" 9 #include "cc/test/test_now_source.h"
10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" 10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h"
11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" 11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h"
12 #include "content/renderer/scheduler/task_queue_selector.h" 12 #include "content/renderer/scheduler/task_queue_selector.h"
13 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 14
15 using testing::ElementsAre; 15 using testing::ElementsAre;
16 using testing::_; 16 using testing::_;
17 17
18 namespace content { 18 namespace content {
19 namespace { 19 namespace {
20 20
21 class SelectorForTest : public TaskQueueSelector { 21 class SelectorForTest : public TaskQueueSelector {
22 public: 22 public:
23 SelectorForTest() {} 23 ~SelectorForTest() override {}
24
25 virtual void AppendQueueToService(size_t queue_index) = 0;
26
27 virtual const std::vector<const base::TaskQueue*>& work_queues() = 0;
28
29 void AsValueInto(base::trace_event::TracedValue* state) const override {}
30 };
31
32 // Always selects queue 0.
33 class AutomaticSelectorForTest : public SelectorForTest {
34 public:
35 AutomaticSelectorForTest() {}
36 ~AutomaticSelectorForTest() override {}
24 37
25 void RegisterWorkQueues( 38 void RegisterWorkQueues(
26 const std::vector<const base::TaskQueue*>& work_queues) override { 39 const std::vector<const base::TaskQueue*>& work_queues) override {
40 work_queues_ = work_queues;
41 }
42
43 bool SelectWorkQueueToService(size_t* out_queue_index) override {
44 for (size_t i = 0; i < work_queues_.size(); i++) {
45 if (!work_queues_[i]->empty()) {
46 *out_queue_index = i;
47 return true;
48 }
49 }
50 return false;
51 }
52
53 void AppendQueueToService(size_t queue_index) override {
54 DCHECK(false) << "Not supported";
55 }
56
57 const std::vector<const base::TaskQueue*>& work_queues() override {
58 return work_queues_;
59 }
60
61 private:
62 std::vector<const base::TaskQueue*> work_queues_;
63
64 DISALLOW_COPY_AND_ASSIGN(AutomaticSelectorForTest);
65 };
66
67 class ExplicitSelectorForTest : public SelectorForTest {
68 public:
69 ExplicitSelectorForTest() {}
70 ~ExplicitSelectorForTest() override {}
71
72 void RegisterWorkQueues(
73 const std::vector<const base::TaskQueue*>& work_queues) override {
27 work_queues_ = work_queues; 74 work_queues_ = work_queues;
28 } 75 }
29 76
30 bool SelectWorkQueueToService(size_t* out_queue_index) override { 77 bool SelectWorkQueueToService(size_t* out_queue_index) override {
31 if (queues_to_service_.empty()) 78 if (queues_to_service_.empty())
32 return false; 79 return false;
33 *out_queue_index = queues_to_service_.front(); 80 *out_queue_index = queues_to_service_.front();
34 queues_to_service_.pop_front(); 81 queues_to_service_.pop_front();
35 return true; 82 return true;
36 } 83 }
37 84
38 void AppendQueueToService(size_t queue_index) { 85 void AppendQueueToService(size_t queue_index) override {
39 queues_to_service_.push_back(queue_index); 86 queues_to_service_.push_back(queue_index);
40 } 87 }
41 88
42 const std::vector<const base::TaskQueue*>& work_queues() { 89 const std::vector<const base::TaskQueue*>& work_queues() override {
43 return work_queues_; 90 return work_queues_;
44 } 91 }
45 92
46 void AsValueInto(base::trace_event::TracedValue* state) const override {
47 }
48
49 private: 93 private:
50 std::deque<size_t> queues_to_service_; 94 std::deque<size_t> queues_to_service_;
51 std::vector<const base::TaskQueue*> work_queues_; 95 std::vector<const base::TaskQueue*> work_queues_;
52 96
53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); 97 DISALLOW_COPY_AND_ASSIGN(ExplicitSelectorForTest);
54 }; 98 };
55 99
56 class TaskQueueManagerTest : public testing::Test { 100 class TaskQueueManagerTest : public testing::Test {
57 protected: 101 protected:
58 void Initialize(size_t num_queues) { 102 enum class SelectorType {
59 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); 103 Automatic,
60 selector_ = make_scoped_ptr(new SelectorForTest); 104 Explicit,
105 };
106
107 void Initialize(size_t num_queues, SelectorType type) {
108 now_src_ = cc::TestNowSource::Create(1000);
109 test_task_runner_ =
110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
111 selector_ = make_scoped_ptr(createSelectorForTest(type));
61 manager_ = make_scoped_ptr(new TaskQueueManager( 112 manager_ = make_scoped_ptr(new TaskQueueManager(
62 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), 113 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()),
63 selector_.get())); 114 selector_.get()));
115 manager_->SetTimeSourceForTesting(now_src_);
116
64 EXPECT_EQ(num_queues, selector_->work_queues().size()); 117 EXPECT_EQ(num_queues, selector_->work_queues().size());
65 } 118 }
66 119
67 void InitializeWithRealMessageLoop(size_t num_queues) { 120 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) {
68 message_loop_.reset(new base::MessageLoop()); 121 message_loop_.reset(new base::MessageLoop());
69 selector_ = make_scoped_ptr(new SelectorForTest); 122 selector_ = make_scoped_ptr(createSelectorForTest(type));
70 manager_ = make_scoped_ptr(new TaskQueueManager( 123 manager_ = make_scoped_ptr(new TaskQueueManager(
71 num_queues, 124 num_queues,
72 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), 125 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()),
73 selector_.get())); 126 selector_.get()));
74 EXPECT_EQ(num_queues, selector_->work_queues().size()); 127 EXPECT_EQ(num_queues, selector_->work_queues().size());
75 } 128 }
76 129
77 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; 130 SelectorForTest* createSelectorForTest(SelectorType type) {
131 switch (type) {
132 case SelectorType::Automatic:
133 return new AutomaticSelectorForTest();
134
135 case SelectorType::Explicit:
136 return new ExplicitSelectorForTest();
137 }
138
139 return nullptr;
140 }
141
142 scoped_refptr<cc::TestNowSource> now_src_;
143 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
78 scoped_ptr<SelectorForTest> selector_; 144 scoped_ptr<SelectorForTest> selector_;
79 scoped_ptr<TaskQueueManager> manager_; 145 scoped_ptr<TaskQueueManager> manager_;
80 scoped_ptr<base::MessageLoop> message_loop_; 146 scoped_ptr<base::MessageLoop> message_loop_;
81 }; 147 };
82 148
83 void PostFromNestedRunloop(base::MessageLoop* message_loop, 149 void PostFromNestedRunloop(base::MessageLoop* message_loop,
84 base::SingleThreadTaskRunner* runner, 150 base::SingleThreadTaskRunner* runner,
85 std::vector<std::pair<base::Closure, bool>>* tasks) { 151 std::vector<std::pair<base::Closure, bool>>* tasks) {
86 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); 152 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
87 for (std::pair<base::Closure, bool>& pair : *tasks) { 153 for (std::pair<base::Closure, bool>& pair : *tasks) {
88 if (pair.second) { 154 if (pair.second) {
89 runner->PostTask(FROM_HERE, pair.first); 155 runner->PostTask(FROM_HERE, pair.first);
90 } else { 156 } else {
91 runner->PostNonNestableTask(FROM_HERE, pair.first); 157 runner->PostNonNestableTask(FROM_HERE, pair.first);
92 } 158 }
93 } 159 }
94 message_loop->RunUntilIdle(); 160 message_loop->RunUntilIdle();
95 } 161 }
96 162
97 void TestTask(int value, std::vector<int>* out_result) { 163 void TestTask(int value, std::vector<int>* out_result) {
98 out_result->push_back(value); 164 out_result->push_back(value);
99 } 165 }
100 166
101 TEST_F(TaskQueueManagerTest, SingleQueuePosting) { 167 TEST_F(TaskQueueManagerTest, SingleQueuePosting) {
102 Initialize(1u); 168 Initialize(1u, SelectorType::Automatic);
103 169
104 std::vector<int> run_order; 170 std::vector<int> run_order;
105 scoped_refptr<base::SingleThreadTaskRunner> runner = 171 scoped_refptr<base::SingleThreadTaskRunner> runner =
106 manager_->TaskRunnerForQueue(0); 172 manager_->TaskRunnerForQueue(0);
107 173
108 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 174 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
109 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 175 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
110 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 176 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
111 177
112 selector_->AppendQueueToService(0);
113 selector_->AppendQueueToService(0);
114 selector_->AppendQueueToService(0);
115
116 test_task_runner_->RunUntilIdle(); 178 test_task_runner_->RunUntilIdle();
117 EXPECT_THAT(run_order, ElementsAre(1, 2, 3)); 179 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
118 } 180 }
119 181
120 TEST_F(TaskQueueManagerTest, MultiQueuePosting) { 182 TEST_F(TaskQueueManagerTest, MultiQueuePosting) {
121 Initialize(3u); 183 Initialize(3u, SelectorType::Explicit);
122 184
123 std::vector<int> run_order; 185 std::vector<int> run_order;
124 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = { 186 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
125 manager_->TaskRunnerForQueue(0), 187 manager_->TaskRunnerForQueue(0),
126 manager_->TaskRunnerForQueue(1), 188 manager_->TaskRunnerForQueue(1),
127 manager_->TaskRunnerForQueue(2)}; 189 manager_->TaskRunnerForQueue(2)};
128 190
129 selector_->AppendQueueToService(0); 191 selector_->AppendQueueToService(0);
130 selector_->AppendQueueToService(1); 192 selector_->AppendQueueToService(1);
131 selector_->AppendQueueToService(2); 193 selector_->AppendQueueToService(2);
132 selector_->AppendQueueToService(0); 194 selector_->AppendQueueToService(0);
133 selector_->AppendQueueToService(1); 195 selector_->AppendQueueToService(1);
134 selector_->AppendQueueToService(2); 196 selector_->AppendQueueToService(2);
135 197
136 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 198 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
137 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 199 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
138 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 200 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
139 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 201 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
140 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); 202 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
141 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order)); 203 runners[2]->PostTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order));
142 204
143 test_task_runner_->RunUntilIdle(); 205 test_task_runner_->RunUntilIdle();
144 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6)); 206 EXPECT_THAT(run_order, ElementsAre(1, 3, 5, 2, 4, 6));
145 } 207 }
146 208
209 void NopTask() {
210 }
211
212 TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) {
213 Initialize(3u, SelectorType::Explicit);
214
215 scoped_refptr<cc::TestNowSource> now_src = cc::TestNowSource::Create(1000);
216 manager_->SetTimeSourceForTesting(now_src);
217
218 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
219 manager_->TaskRunnerForQueue(0),
220 manager_->TaskRunnerForQueue(1),
221 manager_->TaskRunnerForQueue(2)};
222
223 selector_->AppendQueueToService(0);
224 selector_->AppendQueueToService(1);
225 selector_->AppendQueueToService(2);
226 selector_->AppendQueueToService(0);
227 selector_->AppendQueueToService(1);
228 selector_->AppendQueueToService(2);
229
230 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
231 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
232 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
233 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
234 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
235 runners[2]->PostTask(FROM_HERE, base::Bind(&NopTask));
236
237 test_task_runner_->RunUntilIdle();
238
239 EXPECT_EQ(0, now_src->NumNowCalls());
240 }
241
147 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) { 242 TEST_F(TaskQueueManagerTest, NonNestableTaskPosting) {
148 InitializeWithRealMessageLoop(1u); 243 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
149 244
150 std::vector<int> run_order; 245 std::vector<int> run_order;
151 scoped_refptr<base::SingleThreadTaskRunner> runner = 246 scoped_refptr<base::SingleThreadTaskRunner> runner =
152 manager_->TaskRunnerForQueue(0); 247 manager_->TaskRunnerForQueue(0);
153 248
154 selector_->AppendQueueToService(0);
155
156 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 249 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
157 250
158 message_loop_->RunUntilIdle(); 251 message_loop_->RunUntilIdle();
159 EXPECT_THAT(run_order, ElementsAre(1)); 252 EXPECT_THAT(run_order, ElementsAre(1));
160 } 253 }
161 254
162 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) { 255 TEST_F(TaskQueueManagerTest, NonNestableTaskExecutesInExpectedOrder) {
163 InitializeWithRealMessageLoop(1u); 256 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
164 257
165 std::vector<int> run_order; 258 std::vector<int> run_order;
166 scoped_refptr<base::SingleThreadTaskRunner> runner = 259 scoped_refptr<base::SingleThreadTaskRunner> runner =
167 manager_->TaskRunnerForQueue(0); 260 manager_->TaskRunnerForQueue(0);
168 261
169 selector_->AppendQueueToService(0);
170 selector_->AppendQueueToService(0);
171 selector_->AppendQueueToService(0);
172 selector_->AppendQueueToService(0);
173 selector_->AppendQueueToService(0);
174
175 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 262 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
176 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 263 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
177 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 264 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
178 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 265 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
179 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order)); 266 runner->PostNonNestableTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order));
180 267
181 message_loop_->RunUntilIdle(); 268 message_loop_->RunUntilIdle();
182 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5)); 269 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4, 5));
183 } 270 }
184 271
185 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) { 272 TEST_F(TaskQueueManagerTest, NonNestableTaskDoesntExecuteInNestedLoop) {
186 InitializeWithRealMessageLoop(1u); 273 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
187 274
188 std::vector<int> run_order; 275 std::vector<int> run_order;
189 scoped_refptr<base::SingleThreadTaskRunner> runner = 276 scoped_refptr<base::SingleThreadTaskRunner> runner =
190 manager_->TaskRunnerForQueue(0); 277 manager_->TaskRunnerForQueue(0);
191 278
192 selector_->AppendQueueToService(0);
193 selector_->AppendQueueToService(0);
194 selector_->AppendQueueToService(0);
195 selector_->AppendQueueToService(0);
196 selector_->AppendQueueToService(0);
197 selector_->AppendQueueToService(0);
198
199 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 279 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
200 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 280 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
201 281
202 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; 282 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
203 tasks_to_post_from_nested_loop.push_back( 283 tasks_to_post_from_nested_loop.push_back(
204 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); 284 std::make_pair(base::Bind(&TestTask, 3, &run_order), false));
205 tasks_to_post_from_nested_loop.push_back( 285 tasks_to_post_from_nested_loop.push_back(
206 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); 286 std::make_pair(base::Bind(&TestTask, 4, &run_order), true));
207 tasks_to_post_from_nested_loop.push_back( 287 tasks_to_post_from_nested_loop.push_back(
208 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); 288 std::make_pair(base::Bind(&TestTask, 5, &run_order), true));
209 289
210 runner->PostTask( 290 runner->PostTask(
211 FROM_HERE, 291 FROM_HERE,
212 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, 292 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
213 base::Unretained(&tasks_to_post_from_nested_loop))); 293 base::Unretained(&tasks_to_post_from_nested_loop)));
214 294
215 message_loop_->RunUntilIdle(); 295 message_loop_->RunUntilIdle();
216 // Note we expect task 3 to run last because it's non-nestable. 296 // Note we expect task 3 to run last because it's non-nestable.
217 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); 297 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3));
218 } 298 }
219 299
220 TEST_F(TaskQueueManagerTest, QueuePolling) { 300 TEST_F(TaskQueueManagerTest, QueuePolling) {
221 Initialize(1u); 301 Initialize(1u, SelectorType::Automatic);
222 302
223 std::vector<int> run_order; 303 std::vector<int> run_order;
224 scoped_refptr<base::SingleThreadTaskRunner> runner = 304 scoped_refptr<base::SingleThreadTaskRunner> runner =
225 manager_->TaskRunnerForQueue(0); 305 manager_->TaskRunnerForQueue(0);
226 306
227 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 307 EXPECT_TRUE(manager_->IsQueueEmpty(0));
228 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 308 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
229 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 309 EXPECT_FALSE(manager_->IsQueueEmpty(0));
230 310
231 selector_->AppendQueueToService(0);
232 test_task_runner_->RunUntilIdle(); 311 test_task_runner_->RunUntilIdle();
233 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 312 EXPECT_TRUE(manager_->IsQueueEmpty(0));
234 } 313 }
235 314
236 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { 315 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) {
237 Initialize(1u); 316 Initialize(1u, SelectorType::Automatic);
238 317
239 std::vector<int> run_order; 318 std::vector<int> run_order;
240 scoped_refptr<base::SingleThreadTaskRunner> runner = 319 scoped_refptr<base::SingleThreadTaskRunner> runner =
241 manager_->TaskRunnerForQueue(0); 320 manager_->TaskRunnerForQueue(0);
242 321
243 selector_->AppendQueueToService(0);
244
245 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 322 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
246 runner->PostDelayedTask( 323 runner->PostDelayedTask(
247 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 324 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
248 EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay()); 325 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
249 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 326 EXPECT_TRUE(manager_->IsQueueEmpty(0));
250 EXPECT_TRUE(run_order.empty()); 327 EXPECT_TRUE(run_order.empty());
251 328
252 // The task is inserted to the incoming queue only after the delay. 329 // The task doesn't run before the delay has completed.
253 test_task_runner_->RunPendingTasks(); 330 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
254 EXPECT_FALSE(manager_->IsQueueEmpty(0));
255 EXPECT_TRUE(run_order.empty()); 331 EXPECT_TRUE(run_order.empty());
256 332
257 // After the delay the task runs normally. 333 // After the delay has completed, the task runs normally.
258 selector_->AppendQueueToService(0); 334 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
259 test_task_runner_->RunUntilIdle();
260 EXPECT_THAT(run_order, ElementsAre(1)); 335 EXPECT_THAT(run_order, ElementsAre(1));
261 } 336 }
262 337
263 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) { 338 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_DecendingOrder) {
264 Initialize(1u); 339 Initialize(1u, SelectorType::Automatic);
265 340
266 std::vector<int> run_order; 341 std::vector<int> run_order;
267 scoped_refptr<base::SingleThreadTaskRunner> runner = 342 scoped_refptr<base::SingleThreadTaskRunner> runner =
268 manager_->TaskRunnerForQueue(0); 343 manager_->TaskRunnerForQueue(0);
269 344
270 selector_->AppendQueueToService(0); 345 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
346 base::TimeDelta::FromMilliseconds(10));
347
348 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
349 base::TimeDelta::FromMilliseconds(8));
350
351 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
352 base::TimeDelta::FromMilliseconds(5));
353
354 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
355 test_task_runner_->DelayToNextTaskTime());
356
357 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
358 EXPECT_THAT(run_order, ElementsAre(3));
359 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
360 test_task_runner_->DelayToNextTaskTime());
361
362 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
363 EXPECT_THAT(run_order, ElementsAre(3, 2));
364 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
365 test_task_runner_->DelayToNextTaskTime());
366
367 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
368 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
369 }
370
371 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks_AscendingOrder) {
372 Initialize(1u, SelectorType::Automatic);
373
374 std::vector<int> run_order;
375 scoped_refptr<base::SingleThreadTaskRunner> runner =
376 manager_->TaskRunnerForQueue(0);
377
378 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
379 base::TimeDelta::FromMilliseconds(1));
380
381 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
382 base::TimeDelta::FromMilliseconds(5));
383
384 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
385 base::TimeDelta::FromMilliseconds(10));
386
387 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1),
388 test_task_runner_->DelayToNextTaskTime());
389
390 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
391 EXPECT_THAT(run_order, ElementsAre(1));
392 EXPECT_EQ(base::TimeDelta::FromMilliseconds(4),
393 test_task_runner_->DelayToNextTaskTime());
394
395 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(4));
396 EXPECT_THAT(run_order, ElementsAre(1, 2));
397 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
398 test_task_runner_->DelayToNextTaskTime());
399
400 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
401 EXPECT_THAT(run_order, ElementsAre(1, 2, 3));
402 }
403
404 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesUnderlyingDelayedTasks) {
405 Initialize(1u, SelectorType::Automatic);
406
407 std::vector<int> run_order;
408 scoped_refptr<base::SingleThreadTaskRunner> runner =
409 manager_->TaskRunnerForQueue(0);
271 410
272 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 411 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
273 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 412 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
274 delay); 413 delay);
275 test_task_runner_->RunPendingTasks(); 414 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
415 delay);
416 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
417 delay);
276 418
277 // Reload the work queue so we see the next pending task. It should no longer 419 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
278 // be marked as delayed. 420 }
279 manager_->PumpQueue(0);
280 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
281 421
282 // Let the task run normally. 422 class TestObject {
283 selector_->AppendQueueToService(0); 423 public:
284 test_task_runner_->RunUntilIdle(); 424 ~TestObject() { destructor_count_++; }
285 EXPECT_THAT(run_order, ElementsAre(1)); 425
426 void Run() { FAIL() << "TestObject::Run should not be called"; }
427
428 static int destructor_count_;
429 };
430
431 int TestObject::destructor_count_ = 0;
432
433 TEST_F(TaskQueueManagerTest, PendingDelayedTasksRemovedOnShutdown) {
434 Initialize(1u, SelectorType::Automatic);
435
436 TestObject::destructor_count_ = 0;
437
438 scoped_refptr<base::SingleThreadTaskRunner> runner =
439 manager_->TaskRunnerForQueue(0);
440
441 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
442 runner->PostDelayedTask(
443 FROM_HERE, base::Bind(&TestObject::Run, base::Owned(new TestObject())),
444 delay);
445
446 manager_.reset();
447
448 EXPECT_EQ(1, TestObject::destructor_count_);
286 } 449 }
287 450
288 TEST_F(TaskQueueManagerTest, ManualPumping) { 451 TEST_F(TaskQueueManagerTest, ManualPumping) {
289 Initialize(1u); 452 Initialize(1u, SelectorType::Automatic);
290 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 453 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
291 454
292 std::vector<int> run_order; 455 std::vector<int> run_order;
293 scoped_refptr<base::SingleThreadTaskRunner> runner = 456 scoped_refptr<base::SingleThreadTaskRunner> runner =
294 manager_->TaskRunnerForQueue(0); 457 manager_->TaskRunnerForQueue(0);
295 458
296 // Posting a task when pumping is disabled doesn't result in work getting 459 // Posting a task when pumping is disabled doesn't result in work getting
297 // posted. 460 // posted.
298 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 461 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
299 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 462 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
300 463
301 // However polling still works. 464 // However polling still works.
302 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 465 EXPECT_FALSE(manager_->IsQueueEmpty(0));
303 466
304 // After pumping the task runs normally. 467 // After pumping the task runs normally.
305 manager_->PumpQueue(0); 468 manager_->PumpQueue(0);
306 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 469 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
307 selector_->AppendQueueToService(0);
308 test_task_runner_->RunUntilIdle(); 470 test_task_runner_->RunUntilIdle();
309 EXPECT_THAT(run_order, ElementsAre(1)); 471 EXPECT_THAT(run_order, ElementsAre(1));
310 } 472 }
311 473
312 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 474 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
313 Initialize(1u); 475 Initialize(1u, SelectorType::Automatic);
314 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 476 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
315 477
316 std::vector<int> run_order; 478 std::vector<int> run_order;
317 scoped_refptr<base::SingleThreadTaskRunner> runner = 479 scoped_refptr<base::SingleThreadTaskRunner> runner =
318 manager_->TaskRunnerForQueue(0); 480 manager_->TaskRunnerForQueue(0);
319 481
320 // Posting a task when pumping is disabled doesn't result in work getting 482 // Posting a task when pumping is disabled doesn't result in work getting
321 // posted. 483 // posted.
322 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 484 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
323 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 485 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
324 486
325 // When pumping is enabled the task runs normally. 487 // When pumping is enabled the task runs normally.
326 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); 488 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
327 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 489 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
328 selector_->AppendQueueToService(0);
329 test_task_runner_->RunUntilIdle(); 490 test_task_runner_->RunUntilIdle();
330 EXPECT_THAT(run_order, ElementsAre(1)); 491 EXPECT_THAT(run_order, ElementsAre(1));
331 } 492 }
332 493
333 TEST_F(TaskQueueManagerTest, DenyRunning) { 494 TEST_F(TaskQueueManagerTest, DenyRunning) {
334 Initialize(1u); 495 Initialize(1u, SelectorType::Explicit);
335 496
336 std::vector<int> run_order; 497 std::vector<int> run_order;
337 scoped_refptr<base::SingleThreadTaskRunner> runner = 498 scoped_refptr<base::SingleThreadTaskRunner> runner =
338 manager_->TaskRunnerForQueue(0); 499 manager_->TaskRunnerForQueue(0);
339 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 500 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
340 501
341 // Since we haven't appended a work queue to be selected, the task doesn't 502 // Since we haven't appended a work queue to be selected, the task doesn't
342 // run. 503 // run.
343 test_task_runner_->RunUntilIdle(); 504 test_task_runner_->RunUntilIdle();
344 EXPECT_TRUE(run_order.empty()); 505 EXPECT_TRUE(run_order.empty());
345 506
346 // Pumping the queue again with a selected work queue runs the task. 507 // Pumping the queue again with a selected work queue runs the task.
347 manager_->PumpQueue(0); 508 manager_->PumpQueue(0);
348 selector_->AppendQueueToService(0); 509 selector_->AppendQueueToService(0);
349 test_task_runner_->RunUntilIdle(); 510 test_task_runner_->RunUntilIdle();
350 EXPECT_THAT(run_order, ElementsAre(1)); 511 EXPECT_THAT(run_order, ElementsAre(1));
351 } 512 }
352 513
353 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { 514 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
354 Initialize(1u); 515 Initialize(1u, SelectorType::Automatic);
355 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 516 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
356 517
357 std::vector<int> run_order; 518 std::vector<int> run_order;
358 scoped_refptr<base::SingleThreadTaskRunner> runner = 519 scoped_refptr<base::SingleThreadTaskRunner> runner =
359 manager_->TaskRunnerForQueue(0); 520 manager_->TaskRunnerForQueue(0);
360 521
361 // Posting a delayed task when pumping will apply the delay, but won't cause 522 // Posting a delayed task when pumping will apply the delay, but won't cause
362 // work to executed afterwards. 523 // work to executed afterwards.
363 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
364 runner->PostDelayedTask( 525 runner->PostDelayedTask(
365 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 526 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
527
528 // After pumping but before the delay period has expired, task does not run.
529 manager_->PumpQueue(0);
530 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
531 EXPECT_TRUE(run_order.empty());
532
533 // Once the delay has expired, pumping causes the task to run.
534 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
535 manager_->PumpQueue(0);
536 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
537 test_task_runner_->RunPendingTasks();
538 EXPECT_THAT(run_order, ElementsAre(1));
539 }
540
541 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) {
542 Initialize(1u, SelectorType::Automatic);
543 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
544
545 std::vector<int> run_order;
546 scoped_refptr<base::SingleThreadTaskRunner> runner =
547 manager_->TaskRunnerForQueue(0);
548
549 // Posting a delayed task when pumping will apply the delay, but won't cause
550 // work to executed afterwards.
551 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1));
552 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10));
553 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20));
554 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
555 delay1);
556 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
557 delay2);
558 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
559 delay3);
560
561 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(15));
366 test_task_runner_->RunUntilIdle(); 562 test_task_runner_->RunUntilIdle();
367 EXPECT_TRUE(run_order.empty()); 563 EXPECT_TRUE(run_order.empty());
368 564
369 // After pumping the task runs normally. 565 // Once the delay has expired, pumping causes the task to run.
370 manager_->PumpQueue(0); 566 manager_->PumpQueue(0);
371 EXPECT_TRUE(test_task_runner_->HasPendingTask());
372 selector_->AppendQueueToService(0);
373 test_task_runner_->RunUntilIdle(); 567 test_task_runner_->RunUntilIdle();
374 EXPECT_THAT(run_order, ElementsAre(1)); 568 EXPECT_THAT(run_order, ElementsAre(1, 2));
569 }
570
571 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
572 Initialize(1u, SelectorType::Automatic);
573 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
574
575 std::vector<int> run_order;
576 scoped_refptr<base::SingleThreadTaskRunner> runner =
577 manager_->TaskRunnerForQueue(0);
578
579 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
580 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
581 delay);
582
583 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
584 EXPECT_TRUE(run_order.empty());
375 } 585 }
376 586
377 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 587 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
378 Initialize(1u); 588 Initialize(1u, SelectorType::Automatic);
379 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 589 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
380 590
381 std::vector<int> run_order; 591 std::vector<int> run_order;
382 scoped_refptr<base::SingleThreadTaskRunner> runner = 592 scoped_refptr<base::SingleThreadTaskRunner> runner =
383 manager_->TaskRunnerForQueue(0); 593 manager_->TaskRunnerForQueue(0);
384 594
385 // Posting two tasks and pumping twice should result in two tasks in the work 595 // Posting two tasks and pumping twice should result in two tasks in the work
386 // queue. 596 // queue.
387 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 597 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
388 manager_->PumpQueue(0); 598 manager_->PumpQueue(0);
389 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 599 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
390 manager_->PumpQueue(0); 600 manager_->PumpQueue(0);
391 601
392 EXPECT_EQ(2u, selector_->work_queues()[0]->size()); 602 EXPECT_EQ(2u, selector_->work_queues()[0]->size());
393 } 603 }
394 604
395 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, 605 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
396 int countdown, 606 int countdown,
397 std::vector<int>* out_result) { 607 std::vector<int>* out_result) {
398 out_result->push_back(countdown); 608 out_result->push_back(countdown);
399 if (--countdown) { 609 if (--countdown) {
400 runner->PostTask(FROM_HERE, 610 runner->PostTask(FROM_HERE,
401 Bind(&ReentrantTestTask, runner, countdown, out_result)); 611 Bind(&ReentrantTestTask, runner, countdown, out_result));
402 } 612 }
403 } 613 }
404 614
405 TEST_F(TaskQueueManagerTest, ReentrantPosting) { 615 TEST_F(TaskQueueManagerTest, ReentrantPosting) {
406 Initialize(1u); 616 Initialize(1u, SelectorType::Automatic);
407 617
408 std::vector<int> run_order; 618 std::vector<int> run_order;
409 scoped_refptr<base::SingleThreadTaskRunner> runner = 619 scoped_refptr<base::SingleThreadTaskRunner> runner =
410 manager_->TaskRunnerForQueue(0); 620 manager_->TaskRunnerForQueue(0);
411 621
412 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order)); 622 runner->PostTask(FROM_HERE, Bind(&ReentrantTestTask, runner, 3, &run_order));
413 623
414 selector_->AppendQueueToService(0);
415 selector_->AppendQueueToService(0);
416 selector_->AppendQueueToService(0);
417
418 test_task_runner_->RunUntilIdle(); 624 test_task_runner_->RunUntilIdle();
419 EXPECT_THAT(run_order, ElementsAre(3, 2, 1)); 625 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
420 } 626 }
421 627
422 TEST_F(TaskQueueManagerTest, NoTasksAfterShutdown) { 628 TEST_F(TaskQueueManagerTest, NoTasksAfterShutdown) {
423 Initialize(1u); 629 Initialize(1u, SelectorType::Automatic);
424 630
425 std::vector<int> run_order; 631 std::vector<int> run_order;
426 scoped_refptr<base::SingleThreadTaskRunner> runner = 632 scoped_refptr<base::SingleThreadTaskRunner> runner =
427 manager_->TaskRunnerForQueue(0); 633 manager_->TaskRunnerForQueue(0);
428 634
429 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 635 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
430 manager_.reset(); 636 manager_.reset();
431 selector_.reset(); 637 selector_.reset();
432 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 638 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
433 639
434 test_task_runner_->RunUntilIdle(); 640 test_task_runner_->RunUntilIdle();
435 EXPECT_TRUE(run_order.empty()); 641 EXPECT_TRUE(run_order.empty());
436 } 642 }
437 643
438 void PostTaskToRunner(scoped_refptr<base::SingleThreadTaskRunner> runner, 644 void PostTaskToRunner(scoped_refptr<base::SingleThreadTaskRunner> runner,
439 std::vector<int>* run_order) { 645 std::vector<int>* run_order) {
440 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, run_order)); 646 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, run_order));
441 } 647 }
442 648
443 TEST_F(TaskQueueManagerTest, PostFromThread) { 649 TEST_F(TaskQueueManagerTest, PostFromThread) {
444 InitializeWithRealMessageLoop(1u); 650 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
445 651
446 std::vector<int> run_order; 652 std::vector<int> run_order;
447 scoped_refptr<base::SingleThreadTaskRunner> runner = 653 scoped_refptr<base::SingleThreadTaskRunner> runner =
448 manager_->TaskRunnerForQueue(0); 654 manager_->TaskRunnerForQueue(0);
449 655
450 base::Thread thread("TestThread"); 656 base::Thread thread("TestThread");
451 thread.Start(); 657 thread.Start();
452 thread.message_loop()->PostTask( 658 thread.message_loop()->PostTask(
453 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); 659 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order));
454 thread.Stop(); 660 thread.Stop();
455 661
456 selector_->AppendQueueToService(0);
457 message_loop_->RunUntilIdle(); 662 message_loop_->RunUntilIdle();
458 EXPECT_THAT(run_order, ElementsAre(1)); 663 EXPECT_THAT(run_order, ElementsAre(1));
459 } 664 }
460 665
461 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, 666 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner,
462 int* run_count) { 667 int* run_count) {
463 (*run_count)++; 668 (*run_count)++;
464 runner->PostTask( 669 runner->PostTask(
465 FROM_HERE, 670 FROM_HERE,
466 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count)); 671 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count));
467 } 672 }
468 673
469 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { 674 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) {
470 Initialize(1u); 675 Initialize(1u, SelectorType::Automatic);
471 scoped_refptr<base::SingleThreadTaskRunner> runner = 676 scoped_refptr<base::SingleThreadTaskRunner> runner =
472 manager_->TaskRunnerForQueue(0); 677 manager_->TaskRunnerForQueue(0);
473 678
474 int run_count = 0; 679 int run_count = 0;
475 runner->PostTask(FROM_HERE, 680 runner->PostTask(FROM_HERE,
476 base::Bind(&RePostingTestTask, runner, &run_count)); 681 base::Bind(&RePostingTestTask, runner, &run_count));
477 682
478 selector_->AppendQueueToService(0);
479 selector_->AppendQueueToService(0);
480 selector_->AppendQueueToService(0);
481
482 test_task_runner_->RunPendingTasks(); 683 test_task_runner_->RunPendingTasks();
483 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there 684 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
484 // will be two tasks here. 685 // will be two tasks here.
485 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); 686 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
486 EXPECT_EQ(1, run_count); 687 EXPECT_EQ(1, run_count);
487 } 688 }
488 689
489 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { 690 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
490 InitializeWithRealMessageLoop(1u); 691 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
491
492 selector_->AppendQueueToService(0);
493 selector_->AppendQueueToService(0);
494 selector_->AppendQueueToService(0);
495 selector_->AppendQueueToService(0);
496 692
497 std::vector<int> run_order; 693 std::vector<int> run_order;
498 scoped_refptr<base::SingleThreadTaskRunner> runner = 694 scoped_refptr<base::SingleThreadTaskRunner> runner =
499 manager_->TaskRunnerForQueue(0); 695 manager_->TaskRunnerForQueue(0);
500 696
501 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; 697 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop;
502 tasks_to_post_from_nested_loop.push_back( 698 tasks_to_post_from_nested_loop.push_back(
503 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); 699 std::make_pair(base::Bind(&TestTask, 1, &run_order), true));
504 700
505 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); 701 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order));
506 runner->PostTask( 702 runner->PostTask(
507 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, 703 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
508 base::Unretained(&tasks_to_post_from_nested_loop))); 704 base::Unretained(&tasks_to_post_from_nested_loop)));
509 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 705 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
510 706
511 message_loop_->RunUntilIdle(); 707 message_loop_->RunUntilIdle();
512 708
513 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); 709 EXPECT_THAT(run_order, ElementsAre(0, 2, 1));
514 } 710 }
515 711
516 TEST_F(TaskQueueManagerTest, WorkBatching) { 712 TEST_F(TaskQueueManagerTest, WorkBatching) {
517 Initialize(1u); 713 Initialize(1u, SelectorType::Automatic);
518 714
519 manager_->SetWorkBatchSize(2); 715 manager_->SetWorkBatchSize(2);
520 716
521 std::vector<int> run_order; 717 std::vector<int> run_order;
522 scoped_refptr<base::SingleThreadTaskRunner> runner = 718 scoped_refptr<base::SingleThreadTaskRunner> runner =
523 manager_->TaskRunnerForQueue(0); 719 manager_->TaskRunnerForQueue(0);
524 720
525 selector_->AppendQueueToService(0);
526 selector_->AppendQueueToService(0);
527 selector_->AppendQueueToService(0);
528 selector_->AppendQueueToService(0);
529
530 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 721 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
531 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 722 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
532 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 723 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
533 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 724 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
534 725
535 // Running one task in the host message loop should cause two posted tasks to 726 // Running one task in the host message loop should cause two posted tasks to
536 // get executed. 727 // get executed.
537 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 728 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
538 test_task_runner_->RunPendingTasks(); 729 test_task_runner_->RunPendingTasks();
539 EXPECT_THAT(run_order, ElementsAre(1, 2)); 730 EXPECT_THAT(run_order, ElementsAre(1, 2));
540 731
541 // The second task runs the remaining two posted tasks. 732 // The second task runs the remaining two posted tasks.
542 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 733 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
543 test_task_runner_->RunPendingTasks(); 734 test_task_runner_->RunPendingTasks();
544 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); 735 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
545 } 736 }
546 737
547 void AdvanceNowTestTask(int value,
548 std::vector<int>* out_result,
549 scoped_refptr<cc::TestNowSource> time_source,
550 base::TimeDelta delta) {
551 TestTask(value, out_result);
552 time_source->AdvanceNow(delta);
553 }
554
555 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
556 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
557 Initialize(1u);
558
559 manager_->SetWorkBatchSize(2);
560 manager_->SetTimeSourceForTesting(clock);
561
562 std::vector<int> run_order;
563 scoped_refptr<base::SingleThreadTaskRunner> runner =
564 manager_->TaskRunnerForQueue(0);
565
566 selector_->AppendQueueToService(0);
567 selector_->AppendQueueToService(0);
568 selector_->AppendQueueToService(0);
569
570 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
571 runner->PostTask(
572 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
573 runner->PostTask(
574 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
575
576 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
577 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
578 delay);
579
580 // At this point we have two posted tasks: one for DoWork and one of the
581 // delayed task. Only the first non-delayed task should get executed because
582 // the work batch is interrupted by the pending delayed task.
583 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
584 test_task_runner_->RunPendingTasks();
585 EXPECT_THAT(run_order, ElementsAre(2));
586
587 // Running all remaining tasks should execute both pending tasks.
588 test_task_runner_->RunUntilIdle();
589 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
590 }
591
592 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { 738 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
593 Initialize(2u); 739 Initialize(2u, SelectorType::Explicit);
594 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 740 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
595 741
596 std::vector<int> run_order; 742 std::vector<int> run_order;
597 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 743 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
598 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 744 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
599 745
600 selector_->AppendQueueToService(1); 746 selector_->AppendQueueToService(1);
601 selector_->AppendQueueToService(0); 747 selector_->AppendQueueToService(0);
602 selector_->AppendQueueToService(0); 748 selector_->AppendQueueToService(0);
603 749
604 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 750 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
605 test_task_runner_->RunUntilIdle(); 751 test_task_runner_->RunUntilIdle();
606 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. 752 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM.
607 753
608 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 754 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
609 test_task_runner_->RunUntilIdle(); 755 test_task_runner_->RunUntilIdle();
610 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM. 756 EXPECT_TRUE(run_order.empty()); // Still shouldn't wake TQM.
611 757
612 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 758 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
613 test_task_runner_->RunUntilIdle(); 759 test_task_runner_->RunUntilIdle();
614 // Executing a task on an auto pumped queue should wake the TQM. 760 // Executing a task on an auto pumped queue should wake the TQM.
615 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); 761 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
616 } 762 }
617 763
618 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) { 764 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupWhenAlreadyAwake) {
619 Initialize(2u); 765 Initialize(2u, SelectorType::Explicit);
620 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 766 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
621 767
622 std::vector<int> run_order; 768 std::vector<int> run_order;
623 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 769 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
624 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 770 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
625 771
626 selector_->AppendQueueToService(1); 772 selector_->AppendQueueToService(1);
627 selector_->AppendQueueToService(0); 773 selector_->AppendQueueToService(0);
628 774
629 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 775 runners[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
630 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 776 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
631 test_task_runner_->RunUntilIdle(); 777 test_task_runner_->RunUntilIdle();
632 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake. 778 EXPECT_THAT(run_order, ElementsAre(2, 1)); // TQM was already awake.
633 } 779 }
634 780
635 TEST_F(TaskQueueManagerTest, 781 TEST_F(TaskQueueManagerTest,
636 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) { 782 AutoPumpAfterWakeupTriggeredByManuallyPumpedQueue) {
637 Initialize(2u); 783 Initialize(2u, SelectorType::Explicit);
638 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 784 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
639 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL); 785 manager_->SetPumpPolicy(1, TaskQueueManager::PumpPolicy::MANUAL);
640 786
641 std::vector<int> run_order; 787 std::vector<int> run_order;
642 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 788 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
643 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 789 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
644 790
645 selector_->AppendQueueToService(1); 791 selector_->AppendQueueToService(1);
646 selector_->AppendQueueToService(0); 792 selector_->AppendQueueToService(0);
647 793
(...skipping 11 matching lines...) Expand all
659 // Executing a task on an auto pumped queue should wake the TQM. 805 // Executing a task on an auto pumped queue should wake the TQM.
660 EXPECT_THAT(run_order, ElementsAre(2, 1)); 806 EXPECT_THAT(run_order, ElementsAre(2, 1));
661 } 807 }
662 808
663 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, 809 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
664 base::Closure task) { 810 base::Closure task) {
665 task_runner->PostTask(FROM_HERE, task); 811 task_runner->PostTask(FROM_HERE, task);
666 } 812 }
667 813
668 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) { 814 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromTask) {
669 Initialize(2u); 815 Initialize(2u, SelectorType::Explicit);
670 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 816 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
671 817
672 std::vector<int> run_order; 818 std::vector<int> run_order;
673 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 819 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
674 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 820 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
675 821
676 selector_->AppendQueueToService(1); 822 selector_->AppendQueueToService(1);
677 selector_->AppendQueueToService(1); 823 selector_->AppendQueueToService(1);
678 selector_->AppendQueueToService(0); 824 selector_->AppendQueueToService(0);
679 825
680 // Check that a task which posts a task to an auto pump after wakeup queue 826 // Check that a task which posts a task to an auto pump after wakeup queue
681 // doesn't cause the queue to wake up. 827 // doesn't cause the queue to wake up.
682 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); 828 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order);
683 runners[1]->PostTask( 829 runners[1]->PostTask(
684 FROM_HERE, 830 FROM_HERE,
685 base::Bind(&TestPostingTask, runners[0], after_wakeup_task)); 831 base::Bind(&TestPostingTask, runners[0], after_wakeup_task));
686 test_task_runner_->RunUntilIdle(); 832 test_task_runner_->RunUntilIdle();
687 EXPECT_TRUE(run_order.empty()); 833 EXPECT_TRUE(run_order.empty());
688 834
689 // Wake up the queue. 835 // Wake up the queue.
690 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 836 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
691 test_task_runner_->RunUntilIdle(); 837 test_task_runner_->RunUntilIdle();
692 EXPECT_THAT(run_order, ElementsAre(2, 1)); 838 EXPECT_THAT(run_order, ElementsAre(2, 1));
693 } 839 }
694 840
695 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { 841 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) {
696 Initialize(2u); 842 Initialize(2u, SelectorType::Explicit);
697 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 843 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
698 844
699 std::vector<int> run_order; 845 std::vector<int> run_order;
700 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 846 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
701 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 847 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
702 848
703 selector_->AppendQueueToService(1); 849 selector_->AppendQueueToService(1);
704 selector_->AppendQueueToService(1); 850 selector_->AppendQueueToService(1);
705 selector_->AppendQueueToService(1); 851 selector_->AppendQueueToService(1);
706 selector_->AppendQueueToService(0); 852 selector_->AppendQueueToService(0);
(...skipping 11 matching lines...) Expand all
718 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); 864 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2));
719 test_task_runner_->RunUntilIdle(); 865 test_task_runner_->RunUntilIdle();
720 EXPECT_TRUE(run_order.empty()); 866 EXPECT_TRUE(run_order.empty());
721 867
722 // Wake up the queue. 868 // Wake up the queue.
723 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 869 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
724 test_task_runner_->RunUntilIdle(); 870 test_task_runner_->RunUntilIdle();
725 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); 871 EXPECT_THAT(run_order, ElementsAre(3, 1, 2));
726 } 872 }
727 873
728 void NullTestTask() {
729 }
730
731 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { 874 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) {
732 Initialize(2u); 875 Initialize(2u, SelectorType::Explicit);
733 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 876 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
734 877
735 int run_count = 0; 878 int run_count = 0;
736 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 879 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
737 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 880 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
738 881
739 selector_->AppendQueueToService(1); 882 selector_->AppendQueueToService(1);
740 selector_->AppendQueueToService(0); 883 selector_->AppendQueueToService(0);
741 selector_->AppendQueueToService(0); 884 selector_->AppendQueueToService(0);
742 // Append extra service queue '0' entries to the selector otherwise test will 885 // Append extra service queue '0' entries to the selector otherwise test will
743 // finish even if the RePostingTestTask woke each other up. 886 // finish even if the RePostingTestTask woke each other up.
744 selector_->AppendQueueToService(0); 887 selector_->AppendQueueToService(0);
745 selector_->AppendQueueToService(0); 888 selector_->AppendQueueToService(0);
746 889
747 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup 890 // Check that if multiple tasks reposts themselves onto a pump-after-wakeup
748 // queue they don't wake each other and will eventually stop when no other 891 // queue they don't wake each other and will eventually stop when no other
749 // tasks execute. 892 // tasks execute.
750 runners[0]->PostTask(FROM_HERE, 893 runners[0]->PostTask(FROM_HERE,
751 base::Bind(&RePostingTestTask, runners[0], &run_count)); 894 base::Bind(&RePostingTestTask, runners[0], &run_count));
752 runners[0]->PostTask(FROM_HERE, 895 runners[0]->PostTask(FROM_HERE,
753 base::Bind(&RePostingTestTask, runners[0], &run_count)); 896 base::Bind(&RePostingTestTask, runners[0], &run_count));
754 runners[1]->PostTask(FROM_HERE, base::Bind(&NullTestTask)); 897 runners[1]->PostTask(FROM_HERE, base::Bind(&NopTask));
755 test_task_runner_->RunUntilIdle(); 898 test_task_runner_->RunUntilIdle();
756 // The reposting tasks posted to the after wakeup queue shouldn't have woken 899 // The reposting tasks posted to the after wakeup queue shouldn't have woken
757 // each other up. 900 // each other up.
758 EXPECT_EQ(2, run_count); 901 EXPECT_EQ(2, run_count);
759 } 902 }
760 903
761 class MockTaskObserver : public base::MessageLoop::TaskObserver { 904 class MockTaskObserver : public base::MessageLoop::TaskObserver {
762 public: 905 public:
763 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task)); 906 MOCK_METHOD1(DidProcessTask, void(const base::PendingTask& task));
764 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task)); 907 MOCK_METHOD1(WillProcessTask, void(const base::PendingTask& task));
765 }; 908 };
766 909
767 TEST_F(TaskQueueManagerTest, TaskObserverAdding) { 910 TEST_F(TaskQueueManagerTest, TaskObserverAdding) {
768 InitializeWithRealMessageLoop(1u); 911 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
769 MockTaskObserver observer; 912 MockTaskObserver observer;
770 913
771 manager_->SetWorkBatchSize(2); 914 manager_->SetWorkBatchSize(2);
772 manager_->AddTaskObserver(&observer); 915 manager_->AddTaskObserver(&observer);
773 916
774 std::vector<int> run_order; 917 std::vector<int> run_order;
775 scoped_refptr<base::SingleThreadTaskRunner> runner = 918 scoped_refptr<base::SingleThreadTaskRunner> runner =
776 manager_->TaskRunnerForQueue(0); 919 manager_->TaskRunnerForQueue(0);
777 920
778 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 921 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
779 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 922 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
780 923
781 selector_->AppendQueueToService(0);
782 selector_->AppendQueueToService(0);
783
784 // Two pairs of callbacks for the tasks above plus another one for the 924 // Two pairs of callbacks for the tasks above plus another one for the
785 // DoWork() posted by the task queue manager. 925 // DoWork() posted by the task queue manager.
786 EXPECT_CALL(observer, WillProcessTask(_)).Times(3); 926 EXPECT_CALL(observer, WillProcessTask(_)).Times(3);
787 EXPECT_CALL(observer, DidProcessTask(_)).Times(3); 927 EXPECT_CALL(observer, DidProcessTask(_)).Times(3);
788 message_loop_->RunUntilIdle(); 928 message_loop_->RunUntilIdle();
789 } 929 }
790 930
791 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) { 931 TEST_F(TaskQueueManagerTest, TaskObserverRemoving) {
792 InitializeWithRealMessageLoop(1u); 932 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
793 MockTaskObserver observer; 933 MockTaskObserver observer;
794 manager_->SetWorkBatchSize(2); 934 manager_->SetWorkBatchSize(2);
795 manager_->AddTaskObserver(&observer); 935 manager_->AddTaskObserver(&observer);
796 manager_->RemoveTaskObserver(&observer); 936 manager_->RemoveTaskObserver(&observer);
797 937
798 std::vector<int> run_order; 938 std::vector<int> run_order;
799 scoped_refptr<base::SingleThreadTaskRunner> runner = 939 scoped_refptr<base::SingleThreadTaskRunner> runner =
800 manager_->TaskRunnerForQueue(0); 940 manager_->TaskRunnerForQueue(0);
801 941
802 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 942 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
803 943
804 EXPECT_CALL(observer, WillProcessTask(_)).Times(0); 944 EXPECT_CALL(observer, WillProcessTask(_)).Times(0);
805 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); 945 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
806 946
807 selector_->AppendQueueToService(0);
808 message_loop_->RunUntilIdle(); 947 message_loop_->RunUntilIdle();
809 } 948 }
810 949
811 void RemoveObserverTask(TaskQueueManager* manager, 950 void RemoveObserverTask(TaskQueueManager* manager,
812 base::MessageLoop::TaskObserver* observer) { 951 base::MessageLoop::TaskObserver* observer) {
813 manager->RemoveTaskObserver(observer); 952 manager->RemoveTaskObserver(observer);
814 } 953 }
815 954
816 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) { 955 TEST_F(TaskQueueManagerTest, TaskObserverRemovingInsideTask) {
817 InitializeWithRealMessageLoop(1u); 956 InitializeWithRealMessageLoop(1u, SelectorType::Automatic);
818 MockTaskObserver observer; 957 MockTaskObserver observer;
819 manager_->SetWorkBatchSize(3); 958 manager_->SetWorkBatchSize(3);
820 manager_->AddTaskObserver(&observer); 959 manager_->AddTaskObserver(&observer);
821 960
822 scoped_refptr<base::SingleThreadTaskRunner> runner = 961 scoped_refptr<base::SingleThreadTaskRunner> runner =
823 manager_->TaskRunnerForQueue(0); 962 manager_->TaskRunnerForQueue(0);
824 runner->PostTask(FROM_HERE, 963 runner->PostTask(FROM_HERE,
825 base::Bind(&RemoveObserverTask, manager_.get(), &observer)); 964 base::Bind(&RemoveObserverTask, manager_.get(), &observer));
826 965
827 selector_->AppendQueueToService(0);
828
829 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); 966 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
830 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); 967 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
831 message_loop_->RunUntilIdle(); 968 message_loop_->RunUntilIdle();
832 } 969 }
833 970
834 TEST_F(TaskQueueManagerTest, ThreadCheckAfterTermination) { 971 TEST_F(TaskQueueManagerTest, ThreadCheckAfterTermination) {
835 Initialize(1); 972 Initialize(1u, SelectorType::Automatic);
836 scoped_refptr<base::SingleThreadTaskRunner> runner = 973 scoped_refptr<base::SingleThreadTaskRunner> runner =
837 manager_->TaskRunnerForQueue(0); 974 manager_->TaskRunnerForQueue(0);
838 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 975 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
839 manager_.reset(); 976 manager_.reset();
840 EXPECT_TRUE(runner->RunsTasksOnCurrentThread()); 977 EXPECT_TRUE(runner->RunsTasksOnCurrentThread());
841 } 978 }
842 979
843 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime) { 980 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime) {
844 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create()); 981 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
845 Initialize(2u); 982 Initialize(2u, SelectorType::Explicit);
846 manager_->SetTimeSourceForTesting(clock); 983 manager_->SetTimeSourceForTesting(clock);
847 984
848 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 985 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
849 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 986 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
850 987
851 // With no delayed tasks. 988 // With no delayed tasks.
852 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null()); 989 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null());
853 990
854 // With a non-delayed task. 991 // With a non-delayed task.
855 runners[0]->PostTask(FROM_HERE, base::Bind(&NullTestTask)); 992 runners[0]->PostTask(FROM_HERE, base::Bind(&NopTask));
856 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null()); 993 EXPECT_TRUE(manager_->NextPendingDelayedTaskRunTime().is_null());
857 994
858 // With a delayed task. 995 // With a delayed task.
859 base::TimeDelta expected_delay = base::TimeDelta::FromMilliseconds(50); 996 base::TimeDelta expected_delay = base::TimeDelta::FromMilliseconds(50);
860 runners[0]->PostDelayedTask( 997 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
861 FROM_HERE, base::Bind(&NullTestTask), expected_delay);
862 EXPECT_EQ(clock->Now() + expected_delay, 998 EXPECT_EQ(clock->Now() + expected_delay,
863 manager_->NextPendingDelayedTaskRunTime()); 999 manager_->NextPendingDelayedTaskRunTime());
864 1000
865 // With another delayed task in the same queue with a longer delay. 1001 // With another delayed task in the same queue with a longer delay.
866 runners[0]->PostDelayedTask( 1002 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask),
867 FROM_HERE, base::Bind(&NullTestTask), 1003 base::TimeDelta::FromMilliseconds(100));
868 base::TimeDelta::FromMilliseconds(100));
869 EXPECT_EQ(clock->Now() + expected_delay, 1004 EXPECT_EQ(clock->Now() + expected_delay,
870 manager_->NextPendingDelayedTaskRunTime()); 1005 manager_->NextPendingDelayedTaskRunTime());
871 1006
872 // With another delayed task in the same queue with a shorter delay. 1007 // With another delayed task in the same queue with a shorter delay.
873 expected_delay = base::TimeDelta::FromMilliseconds(20); 1008 expected_delay = base::TimeDelta::FromMilliseconds(20);
874 runners[0]->PostDelayedTask( 1009 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
875 FROM_HERE, base::Bind(&NullTestTask), expected_delay);
876 EXPECT_EQ(clock->Now() + expected_delay, 1010 EXPECT_EQ(clock->Now() + expected_delay,
877 manager_->NextPendingDelayedTaskRunTime()); 1011 manager_->NextPendingDelayedTaskRunTime());
878 1012
879 // With another delayed task in a different queue with a shorter delay. 1013 // With another delayed task in a different queue with a shorter delay.
880 expected_delay = base::TimeDelta::FromMilliseconds(10); 1014 expected_delay = base::TimeDelta::FromMilliseconds(10);
881 runners[1]->PostDelayedTask( 1015 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), expected_delay);
882 FROM_HERE, base::Bind(&NullTestTask), expected_delay);
883 EXPECT_EQ(clock->Now() + expected_delay, 1016 EXPECT_EQ(clock->Now() + expected_delay,
884 manager_->NextPendingDelayedTaskRunTime()); 1017 manager_->NextPendingDelayedTaskRunTime());
885 1018
886 // Test it updates as time progresses 1019 // Test it updates as time progresses
887 clock->AdvanceNow(expected_delay); 1020 clock->AdvanceNow(expected_delay);
888 EXPECT_EQ(clock->Now(), manager_->NextPendingDelayedTaskRunTime()); 1021 EXPECT_EQ(clock->Now(), manager_->NextPendingDelayedTaskRunTime());
889 } 1022 }
890 1023
1024 TEST_F(TaskQueueManagerTest, NextPendingDelayedTaskRunTime_MultipleQueues) {
1025 Initialize(3u, SelectorType::Automatic);
1026
1027 scoped_refptr<base::SingleThreadTaskRunner> runners[3] = {
1028 manager_->TaskRunnerForQueue(0),
1029 manager_->TaskRunnerForQueue(1),
1030 manager_->TaskRunnerForQueue(2)};
1031
1032 base::TimeDelta delay1 = base::TimeDelta::FromMilliseconds(50);
1033 base::TimeDelta delay2 = base::TimeDelta::FromMilliseconds(5);
1034 base::TimeDelta delay3 = base::TimeDelta::FromMilliseconds(10);
1035 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1);
1036 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2);
1037 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3);
1038
1039 EXPECT_EQ(now_src_->Now() + delay2,
1040 manager_->NextPendingDelayedTaskRunTime());
1041 }
1042
891 } // namespace 1043 } // namespace
892 } // namespace content 1044 } // namespace content
893 1045
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698