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

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: DCHECK tweak. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | tools/ubsan/blacklist.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/scheduler/task_queue_manager.h" 5 #include "content/renderer/scheduler/task_queue_manager.h"
6 6
7 #include "base/test/test_simple_task_runner.h" 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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 test_task_runner_->RunPendingTasks(); 250 test_task_runner_->RunPendingTasks();
250 EXPECT_FALSE(manager_->IsQueueEmpty(0)); 251 EXPECT_FALSE(manager_->IsQueueEmpty(0));
251 EXPECT_TRUE(run_order.empty()); 252 EXPECT_TRUE(run_order.empty());
252 253
253 // After the delay the task runs normally. 254 // After the delay the task runs normally.
254 selector_->AppendQueueToService(0); 255 selector_->AppendQueueToService(0);
255 test_task_runner_->RunUntilIdle(); 256 test_task_runner_->RunUntilIdle();
256 EXPECT_THAT(run_order, ElementsAre(1)); 257 EXPECT_THAT(run_order, ElementsAre(1));
257 } 258 }
258 259
260 TEST_F(TaskQueueManagerTest, DelayedTaskDoesNotStayDelayed) {
261 Initialize(1u);
262
263 std::vector<int> run_order;
264 scoped_refptr<base::SingleThreadTaskRunner> runner =
265 manager_->TaskRunnerForQueue(0);
266
267 selector_->AppendQueueToService(0);
268
269 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10));
270 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
271 delay);
272 test_task_runner_->RunPendingTasks();
273
274 // Reload the work queue so we see the next pending task. It should no longer
275 // be marked as delayed.
276 manager_->PumpQueue(0);
277 EXPECT_TRUE(selector_->work_queues()[0]->front().delayed_run_time.is_null());
278
279 // Let the task run normally.
280 selector_->AppendQueueToService(0);
281 test_task_runner_->RunUntilIdle();
282 EXPECT_THAT(run_order, ElementsAre(1));
283 }
284
259 TEST_F(TaskQueueManagerTest, ManualPumping) { 285 TEST_F(TaskQueueManagerTest, ManualPumping) {
260 Initialize(1u); 286 Initialize(1u);
261 manager_->SetAutoPump(0, false); 287 manager_->SetAutoPump(0, false);
262 288
263 std::vector<int> run_order; 289 std::vector<int> run_order;
264 scoped_refptr<base::SingleThreadTaskRunner> runner = 290 scoped_refptr<base::SingleThreadTaskRunner> runner =
265 manager_->TaskRunnerForQueue(0); 291 manager_->TaskRunnerForQueue(0);
266 292
267 // Posting a task when pumping is disabled doesn't result in work getting 293 // Posting a task when pumping is disabled doesn't result in work getting
268 // posted. 294 // posted.
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 runner->PostTask( 499 runner->PostTask(
474 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, 500 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner,
475 base::Unretained(&tasks_to_post_from_nested_loop))); 501 base::Unretained(&tasks_to_post_from_nested_loop)));
476 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); 502 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
477 503
478 message_loop_->RunUntilIdle(); 504 message_loop_->RunUntilIdle();
479 505
480 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); 506 EXPECT_THAT(run_order, ElementsAre(0, 2, 1));
481 } 507 }
482 508
509 TEST_F(TaskQueueManagerTest, WorkBatching) {
510 Initialize(1u);
511
512 manager_->SetWorkBatchSize(2);
513
514 std::vector<int> run_order;
515 scoped_refptr<base::SingleThreadTaskRunner> runner =
516 manager_->TaskRunnerForQueue(0);
517
518 selector_->AppendQueueToService(0);
519 selector_->AppendQueueToService(0);
520 selector_->AppendQueueToService(0);
521 selector_->AppendQueueToService(0);
522
523 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order));
524 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order));
525 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order));
526 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order));
527
528 // Running one task in the host message loop should cause two posted tasks to
529 // get executed.
530 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u);
531 test_task_runner_->RunPendingTasks();
532 EXPECT_THAT(run_order, ElementsAre(1, 2));
533
534 // The second task runs the remaining two posted tasks.
535 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 1u);
536 test_task_runner_->RunPendingTasks();
537 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4));
538 }
539
540 void AdvanceNowTestTask(int value,
541 std::vector<int>* out_result,
542 scoped_refptr<cc::TestNowSource> time_source,
543 base::TimeDelta delta) {
544 TestTask(value, out_result);
545 time_source->AdvanceNow(delta);
546 }
547
548 TEST_F(TaskQueueManagerTest, InterruptWorkBatchForDelayedTask) {
549 scoped_refptr<cc::TestNowSource> clock(cc::TestNowSource::Create());
550 Initialize(1u);
551
552 manager_->SetWorkBatchSize(2);
553 manager_->SetTimeSourceForTesting(clock);
554
555 std::vector<int> run_order;
556 scoped_refptr<base::SingleThreadTaskRunner> runner =
557 manager_->TaskRunnerForQueue(0);
558
559 selector_->AppendQueueToService(0);
560 selector_->AppendQueueToService(0);
561 selector_->AppendQueueToService(0);
562
563 base::TimeDelta delta(base::TimeDelta::FromMilliseconds(10));
564 runner->PostTask(
565 FROM_HERE, base::Bind(&AdvanceNowTestTask, 2, &run_order, clock, delta));
566 runner->PostTask(
567 FROM_HERE, base::Bind(&AdvanceNowTestTask, 3, &run_order, clock, delta));
568
569 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(5));
570 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order),
571 delay);
572
573 // At this point we have two posted tasks: one for DoWork and one of the
574 // delayed task. Only the first non-delayed task should get executed because
575 // the work batch is interrupted by the pending delayed task.
576 EXPECT_EQ(test_task_runner_->GetPendingTasks().size(), 2u);
577 test_task_runner_->RunPendingTasks();
578 EXPECT_THAT(run_order, ElementsAre(2));
579
580 // Running all remaining tasks should execute both pending tasks.
581 test_task_runner_->RunUntilIdle();
582 EXPECT_THAT(run_order, ElementsAre(2, 3, 1));
583 }
584
483 } // namespace 585 } // namespace
484 } // namespace content 586 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.cc ('k') | tools/ubsan/blacklist.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698