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

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

Powered by Google App Engine
This is Rietveld 408576698