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

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: Header cleanup. 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 namespace {
rmcilroy 2015/01/21 12:18:26 Do you need the anonymous namespace? (You don't u
Sami 2015/01/21 14:31:16 Ah, thanks, this is all in an anonymous namespace
516 void AdvanceNow(int value,
rmcilroy 2015/01/21 12:18:26 nit - AdvanceNowTestTask
Sami 2015/01/21 14:31:16 Done.
517 std::vector<int>* out_result,
518 scoped_refptr<cc::TestNowSource> time_source,
519 base::TimeDelta delta) {
520 TestTask(value, out_result);
521 time_source->AdvanceNow(delta);
522 }
523 } // namespace
524
525 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
526 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
527 Initialize(1u);
528
529 manager_->SetWorkBatchSize(2);
530 manager_->SetTimeSourceForTesting(clock);
531
532 std::vector<int> run_order;
533 scoped_refptr<base::SingleThreadTaskRunner> runner =
534 manager_->TaskRunnerForQueue(0);
535
536 selector_->AppendQueueToService(0);
537 selector_->AppendQueueToService(0);
538 selector_->AppendQueueToService(0);
539
540 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
541 runner->PostTask(FROM_HERE,
542 base::Bind(&AdvanceNow, 2, &run_order, clock, delta));
543 runner->PostTask(FROM_HERE,
544 base::Bind(&AdvanceNow, 3, &run_order, clock, delta));
545
546 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
547 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
548 delay);
549
550 // At this point we have two posted tasks: one for DoWork and one of the
551 // delayed task. Only the first non-delayed task should get executed because
552 // the work batch is interrupted by the pending delayed task.
553 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
554 test_task_runner_->RunPendingTasks();
555 EXPECT_THAT(run_order, ElementsAre(2));
556
557 // Running all remaining tasks should execute both pending tasks.
558 test_task_runner_->RunUntilIdle();
559 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
560 }
561
483 } // namespace 562 } // namespace
484 } // namespace content 563 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698