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

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

Issue 845543004: Run task queue manager work in batches (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments. Created 5 years, 11 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" 7 #include "base/test/test_simple_task_runner.h"
8 #include "base/threading/thread.h" 8 #include "base/threading/thread.h"
9 #include "cc/test/test_now_source.h"
9 #include "content/renderer/scheduler/task_queue_selector.h" 10 #include "content/renderer/scheduler/task_queue_selector.h"
10 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
11 12
12 using testing::ElementsAre; 13 using testing::ElementsAre;
13 14
14 namespace content { 15 namespace content {
15 namespace { 16 namespace {
16 17
17 class SelectorForTest : public TaskQueueSelector { 18 class SelectorForTest : public TaskQueueSelector {
18 public: 19 public:
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 runner->PostTask( 474 runner->PostTask(
474 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, 475 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
475 base::Unretained(&tasks_to_post_from_nested_loop))); 476 base::Unretained(&tasks_to_post_from_nested_loop)));
476 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 477 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
477 478
478 message_loop_->RunUntilIdle(); 479 message_loop_->RunUntilIdle();
479 480
480 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); 481 EXPECT_THAT(run_order, ElementsAre(0, 2, 1));
481 } 482 }
482 483
484 TEST_F(TaskQueueManagerTest, WorkBatching) {
485 Initialize(1u);
486
487 manager_->SetWorkBatchSize(2);
488
489 std::vector<int> run_order;
490 scoped_refptr<base::SingleThreadTaskRunner> runner =
491 manager_->TaskRunnerForQueue(0);
492
493 selector_->AppendQueueToService(0);
494 selector_->AppendQueueToService(0);
495 selector_->AppendQueueToService(0);
496 selector_->AppendQueueToService(0);
497
498 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
499 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
500 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
501 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
502
503 // Running one task in the host message loop should cause two posted tasks to
504 // get executed.
505 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u);
506 test_task_runner_->RunPendingTasks();
507 EXPECT_THAT(run_order, ElementsAre(1, 2));
508
509 // The second task runs the remaining two posted tasks.
510 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u);
511 test_task_runner_->RunPendingTasks();
512 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
513 }
514
515 void AdvanceNowTestTask(int value,
516 std::vector<int>* out_result,
517 scoped_refptr<cc::TestNowSource> time_source,
518 base::TimeDelta delta) {
519 TestTask(value, out_result);
520 time_source->AdvanceNow(delta);
521 }
522
523 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
524 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
525 Initialize(1u);
526
527 manager_->SetWorkBatchSize(2);
528 manager_->SetTimeSourceForTesting(clock);
529
530 std::vector<int> run_order;
531 scoped_refptr<base::SingleThreadTaskRunner> runner =
532 manager_->TaskRunnerForQueue(0);
533
534 selector_->AppendQueueToService(0);
535 selector_->AppendQueueToService(0);
536 selector_->AppendQueueToService(0);
537
538 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
539 runner->PostTask(
540 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
541 runner->PostTask(
542 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
543
544 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
545 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
546 delay);
547
548 // At this point we have two posted tasks: one for DoWork and one of the
549 // delayed task. Only the first non-delayed task should get executed because
550 // the work batch is interrupted by the pending delayed task.
551 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
552 test_task_runner_->RunPendingTasks();
553 EXPECT_THAT(run_order, ElementsAre(2));
554
555 // Running all remaining tasks should execute both pending tasks.
556 test_task_runner_->RunUntilIdle();
557 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
558 }
559
483 } // namespace 560 } // namespace
484 } // namespace content 561 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698