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

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

Issue 985813002: Experimental: Remove chromium shared timers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More tests 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/task_queue_selector.h" 10 #include "content/renderer/scheduler/task_queue_selector.h"
11 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
12 12
13 using testing::ElementsAre; 13 using testing::ElementsAre;
14 using testing::_; 14 using testing::_;
15 15
16 namespace content { 16 namespace content {
17 namespace { 17 namespace {
18 18
19 class SelectorForTest : public TaskQueueSelector { 19 class SelectorForTest : public TaskQueueSelector {
20 public: 20 public:
21 SelectorForTest() {} 21 SelectorForTest() {}
22 22
23 void RegisterWorkQueues( 23 void RegisterWorkQueues(
24 const std::vector<const base::TaskQueue*>& work_queues) override { 24 const std::vector<const base::TaskQueue*>& work_queues) override {
25 work_queues_ = work_queues; 25 work_queues_ = work_queues;
26 } 26 }
27 27
28 bool SelectWorkQueueToService(size_t* out_queue_index) override { 28 bool SelectWorkQueueToService(size_t* out_queue_index) override {
29 if (queues_to_service_.empty()) 29 if (queues_to_service_.empty())
30 return false; 30 return false;
31 *out_queue_index = queues_to_service_.front(); 31 *out_queue_index = queues_to_service_.front();
32 queues_to_service_.pop_front(); 32 queues_to_service_.pop_front();
33 return true; 33 return true;
34 } 34 }
35 35
36 void RegisterTaskQueueObserver(TaskQueueSelectorObserver*) override {}
37
36 void AppendQueueToService(size_t queue_index) { 38 void AppendQueueToService(size_t queue_index) {
37 queues_to_service_.push_back(queue_index); 39 queues_to_service_.push_back(queue_index);
38 } 40 }
39 41
40 const std::vector<const base::TaskQueue*>& work_queues() { 42 const std::vector<const base::TaskQueue*>& work_queues() {
41 return work_queues_; 43 return work_queues_;
42 } 44 }
43 45
44 void AsValueInto(base::trace_event::TracedValue* state) const override { 46 void AsValueInto(base::trace_event::TracedValue* state) const override {
45 } 47 }
46 48
47 private: 49 private:
48 std::deque<size_t> queues_to_service_; 50 std::deque<size_t> queues_to_service_;
49 std::vector<const base::TaskQueue*> work_queues_; 51 std::vector<const base::TaskQueue*> work_queues_;
50 52
51 DISALLOW_COPY_AND_ASSIGN(SelectorForTest); 53 DISALLOW_COPY_AND_ASSIGN(SelectorForTest);
52 }; 54 };
53 55
54 class TaskQueueManagerTest : public testing::Test { 56 class TaskQueueManagerTest : public testing::Test {
55 protected: 57 protected:
56 void Initialize(size_t num_queues) { 58 void Initialize(size_t num_queues) {
57 test_task_runner_ = make_scoped_refptr(new base::TestSimpleTaskRunner()); 59 now_src_ = cc::TestNowSource::Create(0);
60 test_task_runner_ =
61 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false));
58 selector_ = make_scoped_ptr(new SelectorForTest); 62 selector_ = make_scoped_ptr(new SelectorForTest);
59 manager_ = make_scoped_ptr( 63 manager_ = make_scoped_ptr(
60 new TaskQueueManager(num_queues, test_task_runner_, selector_.get())); 64 new TaskQueueManager(num_queues, test_task_runner_, selector_.get()));
65 manager_->SetTimeSourceForTesting(now_src_);
66
61 EXPECT_EQ(num_queues, selector_->work_queues().size()); 67 EXPECT_EQ(num_queues, selector_->work_queues().size());
62 } 68 }
63 69
64 void InitializeWithRealMessageLoop(size_t num_queues) { 70 void InitializeWithRealMessageLoop(size_t num_queues) {
65 message_loop_.reset(new base::MessageLoop()); 71 message_loop_.reset(new base::MessageLoop());
66 selector_ = make_scoped_ptr(new SelectorForTest); 72 selector_ = make_scoped_ptr(new SelectorForTest);
67 manager_ = make_scoped_ptr(new TaskQueueManager( 73 manager_ = make_scoped_ptr(new TaskQueueManager(
68 num_queues, message_loop_->task_runner(), selector_.get())); 74 num_queues, message_loop_->task_runner(), selector_.get()));
69 EXPECT_EQ(num_queues, selector_->work_queues().size()); 75 EXPECT_EQ(num_queues, selector_->work_queues().size());
70 } 76 }
71 77
72 scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; 78 scoped_refptr<cc::TestNowSource> now_src_;
79 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_;
73 scoped_ptr<SelectorForTest> selector_; 80 scoped_ptr<SelectorForTest> selector_;
74 scoped_ptr<TaskQueueManager> manager_; 81 scoped_ptr<TaskQueueManager> manager_;
75 scoped_ptr<base::MessageLoop> message_loop_; 82 scoped_ptr<base::MessageLoop> message_loop_;
76 }; 83 };
77 84
78 void PostFromNestedRunloop(base::MessageLoop* message_loop, 85 void PostFromNestedRunloop(base::MessageLoop* message_loop,
79 base::SingleThreadTaskRunner* runner, 86 base::SingleThreadTaskRunner* runner,
80 std::vector<std::pair<base::Closure, bool>>* tasks) { 87 std::vector<std::pair<base::Closure, bool>>* tasks) {
81 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop); 88 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop);
82 for (std::pair<base::Closure, bool>& pair : *tasks) { 89 for (std::pair<base::Closure, bool>& pair : *tasks) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 240
234 std::vector<int> run_order; 241 std::vector<int> run_order;
235 scoped_refptr<base::SingleThreadTaskRunner> runner = 242 scoped_refptr<base::SingleThreadTaskRunner> runner =
236 manager_->TaskRunnerForQueue(0); 243 manager_->TaskRunnerForQueue(0);
237 244
238 selector_->AppendQueueToService(0); 245 selector_->AppendQueueToService(0);
239 246
240 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 247 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
241 runner->PostDelayedTask( 248 runner->PostDelayedTask(
242 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 249 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
243 EXPECT_EQ(delay, test_task_runner_->NextPendingTaskDelay()); 250 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime());
244 EXPECT_TRUE(manager_->IsQueueEmpty(0)); 251 EXPECT_TRUE(manager_->IsQueueEmpty(0));
245 EXPECT_TRUE(run_order.empty()); 252 EXPECT_TRUE(run_order.empty());
246 253
247 // The task is inserted to the incoming queue only after the delay. 254 // The task doesn't run before the delay has completed.
248 test_task_runner_->RunPendingTasks(); 255 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9));
249 EXPECT_FALSE(manager_->IsQueueEmpty(0));
250 EXPECT_TRUE(run_order.empty()); 256 EXPECT_TRUE(run_order.empty());
251 257
252 // After the delay the task runs normally. 258 // After the delay has completed, the task runs normally.
253 selector_->AppendQueueToService(0); 259 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1));
254 test_task_runner_->RunUntilIdle();
255 EXPECT_THAT(run_order, ElementsAre(1)); 260 EXPECT_THAT(run_order, ElementsAre(1));
256 } 261 }
257 262
258 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) { 263 TEST_F(TaskQueueManagerTest, DelayedTaskPosting_MultipleTasks) {
259 Initialize(1u); 264 Initialize(1u);
260 265
261 std::vector<int> run_order; 266 std::vector<int> run_order;
262 scoped_refptr<base::SingleThreadTaskRunner> runner = 267 scoped_refptr<base::SingleThreadTaskRunner> runner =
263 manager_->TaskRunnerForQueue(0); 268 manager_->TaskRunnerForQueue(0);
264 269
265 selector_->AppendQueueToService(0); 270 selector_->AppendQueueToService(0);
271 selector_->AppendQueueToService(0);
272 selector_->AppendQueueToService(0);
273
274 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
275 base::TimeDelta::FromMilliseconds(10));
276
277 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
278 base::TimeDelta::FromMilliseconds(8));
279
280 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
281 base::TimeDelta::FromMilliseconds(5));
282
283 EXPECT_EQ(base::TimeDelta::FromMilliseconds(5),
284 test_task_runner_->DelayToNextTaskTime());
285
286 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
287 EXPECT_THAT(run_order, ElementsAre(3));
288 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3),
289 test_task_runner_->DelayToNextTaskTime());
290
291 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(3));
292 EXPECT_THAT(run_order, ElementsAre(3, 2));
293 EXPECT_EQ(base::TimeDelta::FromMilliseconds(2),
294 test_task_runner_->DelayToNextTaskTime());
295
296 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(2));
297 EXPECT_THAT(run_order, ElementsAre(3, 2, 1));
298 }
299
300 TEST_F(TaskQueueManagerTest, PostDelayedTask_SharesChromiumTimers) {
301 Initialize(1u);
302
303 std::vector<int> run_order;
304 scoped_refptr<base::SingleThreadTaskRunner> runner =
305 manager_->TaskRunnerForQueue(0);
266 306
267 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 307 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
268 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), 308 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
269 delay); 309 delay);
270 test_task_runner_->RunPendingTasks(); 310 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order),
311 delay);
312 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order),
313 delay);
271 314
272 // Reload the work queue so we see the next pending task. It should no longer 315 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
273 // be marked as delayed.
274 manager_->PumpQueue(0);
275 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
276
277 // Let the task run normally.
278 selector_->AppendQueueToService(0);
279 test_task_runner_->RunUntilIdle();
280 EXPECT_THAT(run_order, ElementsAre(1));
281 } 316 }
282 317
283 TEST_F(TaskQueueManagerTest, ManualPumping) { 318 TEST_F(TaskQueueManagerTest, ManualPumping) {
284 Initialize(1u); 319 Initialize(1u);
285 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 320 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
286 321
287 std::vector<int> run_order; 322 std::vector<int> run_order;
288 scoped_refptr<base::SingleThreadTaskRunner> runner = 323 scoped_refptr<base::SingleThreadTaskRunner> runner =
289 manager_->TaskRunnerForQueue(0); 324 manager_->TaskRunnerForQueue(0);
290 325
291 // Posting a task when pumping is disabled doesn't result in work getting 326 // Posting a task when pumping is disabled doesn't result in work getting
292 // posted. 327 // posted.
293 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 328 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
294 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 329 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
295 330
296 // However polling still works. 331 // However polling still works.
297 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 332 EXPECT_FALSE(manager_->IsQueueEmpty(0));
298 333
299 // After pumping the task runs normally. 334 // After pumping the task runs normally.
300 manager_->PumpQueue(0); 335 manager_->PumpQueue(0);
301 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 336 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
302 selector_->AppendQueueToService(0); 337 selector_->AppendQueueToService(0);
303 test_task_runner_->RunUntilIdle(); 338 test_task_runner_->RunUntilIdle();
304 EXPECT_THAT(run_order, ElementsAre(1)); 339 EXPECT_THAT(run_order, ElementsAre(1));
305 } 340 }
306 341
307 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { 342 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) {
308 Initialize(1u); 343 Initialize(1u);
309 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 344 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
310 345
311 std::vector<int> run_order; 346 std::vector<int> run_order;
312 scoped_refptr<base::SingleThreadTaskRunner> runner = 347 scoped_refptr<base::SingleThreadTaskRunner> runner =
313 manager_->TaskRunnerForQueue(0); 348 manager_->TaskRunnerForQueue(0);
314 349
315 // Posting a task when pumping is disabled doesn't result in work getting 350 // Posting a task when pumping is disabled doesn't result in work getting
316 // posted. 351 // posted.
317 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 352 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
318 EXPECT_FALSE(test_task_runner_->HasPendingTask()); 353 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
319 354
320 // When pumping is enabled the task runs normally. 355 // When pumping is enabled the task runs normally.
321 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO); 356 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AUTO);
322 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 357 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
323 selector_->AppendQueueToService(0); 358 selector_->AppendQueueToService(0);
324 test_task_runner_->RunUntilIdle(); 359 test_task_runner_->RunUntilIdle();
325 EXPECT_THAT(run_order, ElementsAre(1)); 360 EXPECT_THAT(run_order, ElementsAre(1));
326 } 361 }
327 362
328 TEST_F(TaskQueueManagerTest, DenyRunning) { 363 TEST_F(TaskQueueManagerTest, DenyRunning) {
329 Initialize(1u); 364 Initialize(1u);
330 365
331 std::vector<int> run_order; 366 std::vector<int> run_order;
332 scoped_refptr<base::SingleThreadTaskRunner> runner = 367 scoped_refptr<base::SingleThreadTaskRunner> runner =
(...skipping 12 matching lines...) Expand all
345 EXPECT_THAT(run_order, ElementsAre(1)); 380 EXPECT_THAT(run_order, ElementsAre(1));
346 } 381 }
347 382
348 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) { 383 TEST_F(TaskQueueManagerTest, ManualPumpingWithDelayedTask) {
349 Initialize(1u); 384 Initialize(1u);
350 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 385 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
351 386
352 std::vector<int> run_order; 387 std::vector<int> run_order;
353 scoped_refptr<base::SingleThreadTaskRunner> runner = 388 scoped_refptr<base::SingleThreadTaskRunner> runner =
354 manager_->TaskRunnerForQueue(0); 389 manager_->TaskRunnerForQueue(0);
390 selector_->AppendQueueToService(0);
355 391
356 // Posting a delayed task when pumping will apply the delay, but won't cause 392 // Posting a delayed task when pumping will apply the delay, but won't cause
357 // work to executed afterwards. 393 // work to executed afterwards.
358 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); 394 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
359 runner->PostDelayedTask( 395 runner->PostDelayedTask(
360 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); 396 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay);
361 test_task_runner_->RunUntilIdle(); 397
398 // After pumping but before the delay period has expired, task does not run.
399 manager_->PumpQueue(0);
400 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5));
362 EXPECT_TRUE(run_order.empty()); 401 EXPECT_TRUE(run_order.empty());
363 402
364 // After pumping the task runs normally. 403 // Once the delay has expired, pumping causes the task to run.
404 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5));
365 manager_->PumpQueue(0); 405 manager_->PumpQueue(0);
366 EXPECT_TRUE(test_task_runner_->HasPendingTask()); 406 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
407 test_task_runner_->RunPendingTasks();
408 EXPECT_THAT(run_order, ElementsAre(1));
409 }
410
411 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) {
412 Initialize(1u);
413 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
414
415 std::vector<int> run_order;
416 scoped_refptr<base::SingleThreadTaskRunner> runner =
417 manager_->TaskRunnerForQueue(0);
367 selector_->AppendQueueToService(0); 418 selector_->AppendQueueToService(0);
368 test_task_runner_->RunUntilIdle(); 419
369 EXPECT_THAT(run_order, ElementsAre(1)); 420 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
421 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
422 delay);
423
424 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10));
425 EXPECT_TRUE(run_order.empty());
370 } 426 }
371 427
372 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { 428 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) {
373 Initialize(1u); 429 Initialize(1u);
374 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); 430 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL);
375 431
376 std::vector<int> run_order; 432 std::vector<int> run_order;
377 scoped_refptr<base::SingleThreadTaskRunner> runner = 433 scoped_refptr<base::SingleThreadTaskRunner> runner =
378 manager_->TaskRunnerForQueue(0); 434 manager_->TaskRunnerForQueue(0);
379 435
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 runner->PostTask(FROM_HERE, 526 runner->PostTask(FROM_HERE,
471 base::Bind(&RePostingTestTask, runner, &run_count)); 527 base::Bind(&RePostingTestTask, runner, &run_count));
472 528
473 selector_->AppendQueueToService(0); 529 selector_->AppendQueueToService(0);
474 selector_->AppendQueueToService(0); 530 selector_->AppendQueueToService(0);
475 selector_->AppendQueueToService(0); 531 selector_->AppendQueueToService(0);
476 532
477 test_task_runner_->RunPendingTasks(); 533 test_task_runner_->RunPendingTasks();
478 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there 534 // NOTE without the executing_task_ check in MaybePostDoWorkOnMainRunner there
479 // will be two tasks here. 535 // will be two tasks here.
480 EXPECT_EQ(1u, test_task_runner_->GetPendingTasks().size()); 536 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks());
481 EXPECT_EQ(1, run_count); 537 EXPECT_EQ(1, run_count);
482 } 538 }
483 539
484 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { 540 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) {
485 InitializeWithRealMessageLoop(1u); 541 InitializeWithRealMessageLoop(1u);
486 542
487 selector_->AppendQueueToService(0); 543 selector_->AppendQueueToService(0);
488 selector_->AppendQueueToService(0); 544 selector_->AppendQueueToService(0);
489 selector_->AppendQueueToService(0); 545 selector_->AppendQueueToService(0);
490 selector_->AppendQueueToService(0); 546 selector_->AppendQueueToService(0);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 selector_->AppendQueueToService(0); 578 selector_->AppendQueueToService(0);
523 selector_->AppendQueueToService(0); 579 selector_->AppendQueueToService(0);
524 580
525 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); 581 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
526 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 582 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
527 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); 583 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
528 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order)); 584 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
529 585
530 // Running one task in the host message loop should cause two posted tasks to 586 // Running one task in the host message loop should cause two posted tasks to
531 // get executed. 587 // get executed.
532 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 588 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
533 test_task_runner_->RunPendingTasks(); 589 test_task_runner_->RunPendingTasks();
534 EXPECT_THAT(run_order, ElementsAre(1, 2)); 590 EXPECT_THAT(run_order, ElementsAre(1, 2));
535 591
536 // The second task runs the remaining two posted tasks. 592 // The second task runs the remaining two posted tasks.
537 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u); 593 EXPECT_EQ(test_task_runner_->NumPendingTasks(), 1u);
538 test_task_runner_->RunPendingTasks(); 594 test_task_runner_->RunPendingTasks();
539 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); 595 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
540 } 596 }
541 597
542 void AdvanceNowTestTask(int value,
543 std::vector<int>* out_result,
544 scoped_refptr<cc::TestNowSource> time_source,
545 base::TimeDelta delta) {
546 TestTask(value, out_result);
547 time_source->AdvanceNow(delta);
548 }
549
550 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
551 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
552 Initialize(1u);
553
554 manager_->SetWorkBatchSize(2);
555 manager_->SetTimeSourceForTesting(clock);
556
557 std::vector<int> run_order;
558 scoped_refptr<base::SingleThreadTaskRunner> runner =
559 manager_->TaskRunnerForQueue(0);
560
561 selector_->AppendQueueToService(0);
562 selector_->AppendQueueToService(0);
563 selector_->AppendQueueToService(0);
564
565 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
566 runner->PostTask(
567 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
568 runner->PostTask(
569 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
570
571 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
572 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
573 delay);
574
575 // At this point we have two posted tasks: one for DoWork and one of the
576 // delayed task. Only the first non-delayed task should get executed because
577 // the work batch is interrupted by the pending delayed task.
578 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
579 test_task_runner_->RunPendingTasks();
580 EXPECT_THAT(run_order, ElementsAre(2));
581
582 // Running all remaining tasks should execute both pending tasks.
583 test_task_runner_->RunUntilIdle();
584 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
585 }
586
587 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) { 598 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeup) {
588 Initialize(2u); 599 Initialize(2u);
589 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); 600 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP);
590 601
591 std::vector<int> run_order; 602 std::vector<int> run_order;
592 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { 603 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = {
593 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; 604 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)};
594 605
595 selector_->AppendQueueToService(1); 606 selector_->AppendQueueToService(1);
596 selector_->AppendQueueToService(0); 607 selector_->AppendQueueToService(0);
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 runner->PostTask(FROM_HERE, 830 runner->PostTask(FROM_HERE,
820 base::Bind(&RemoveObserverTask, manager_.get(), &observer)); 831 base::Bind(&RemoveObserverTask, manager_.get(), &observer));
821 832
822 selector_->AppendQueueToService(0); 833 selector_->AppendQueueToService(0);
823 834
824 EXPECT_CALL(observer, WillProcessTask(_)).Times(1); 835 EXPECT_CALL(observer, WillProcessTask(_)).Times(1);
825 EXPECT_CALL(observer, DidProcessTask(_)).Times(0); 836 EXPECT_CALL(observer, DidProcessTask(_)).Times(0);
826 message_loop_->RunUntilIdle(); 837 message_loop_->RunUntilIdle();
827 } 838 }
828 839
840 TEST_F(TaskQueueManagerTest, OnTaskQueueEnabled) {
841 Initialize(1u);
842 EXPECT_FALSE(test_task_runner_->HasPendingTasks());
843
844 // Make sure OnTaskQueueEnabled posts a DoWork if none are scheduled.
845 manager_->OnTaskQueueEnabled();
846 EXPECT_TRUE(test_task_runner_->HasPendingTasks());
847 }
848
829 } // namespace 849 } // namespace
830 } // namespace content 850 } // namespace content
831 851
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | content/renderer/scheduler/task_queue_selector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698