OLD | NEW |
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 "components/scheduler/base/task_queue_manager.h" | 5 #include "components/scheduler/base/task_queue_manager.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 | 209 |
210 message_loop_->RunUntilIdle(); | 210 message_loop_->RunUntilIdle(); |
211 // Note we expect task 3 to run last because it's non-nestable. | 211 // Note we expect task 3 to run last because it's non-nestable. |
212 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); | 212 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); |
213 } | 213 } |
214 | 214 |
215 TEST_F(TaskQueueManagerTest, QueuePolling) { | 215 TEST_F(TaskQueueManagerTest, QueuePolling) { |
216 Initialize(1u); | 216 Initialize(1u); |
217 | 217 |
218 std::vector<int> run_order; | 218 std::vector<int> run_order; |
219 EXPECT_FALSE(runners_[0]->HasPendingImmediateTask()); | 219 EXPECT_TRUE(runners_[0]->IsQueueEmpty()); |
220 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 220 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
221 EXPECT_TRUE(runners_[0]->HasPendingImmediateTask()); | 221 EXPECT_FALSE(runners_[0]->IsQueueEmpty()); |
222 | 222 |
223 test_task_runner_->RunUntilIdle(); | 223 test_task_runner_->RunUntilIdle(); |
224 EXPECT_FALSE(runners_[0]->HasPendingImmediateTask()); | 224 EXPECT_TRUE(runners_[0]->IsQueueEmpty()); |
225 } | 225 } |
226 | 226 |
227 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { | 227 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { |
228 Initialize(1u); | 228 Initialize(1u); |
229 | 229 |
230 std::vector<int> run_order; | 230 std::vector<int> run_order; |
231 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 231 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
232 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 232 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
233 delay); | 233 delay); |
234 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); | 234 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); |
235 EXPECT_EQ(TaskQueue::QueueState::NO_IMMEDIATE_WORK, | 235 EXPECT_TRUE(runners_[0]->IsQueueEmpty()); |
236 runners_[0]->GetQueueState()); | |
237 EXPECT_TRUE(run_order.empty()); | 236 EXPECT_TRUE(run_order.empty()); |
238 | 237 |
239 // The task doesn't run before the delay has completed. | 238 // The task doesn't run before the delay has completed. |
240 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9)); | 239 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9)); |
241 EXPECT_TRUE(run_order.empty()); | 240 EXPECT_TRUE(run_order.empty()); |
242 | 241 |
243 // After the delay has completed, the task runs normally. | 242 // After the delay has completed, the task runs normally. |
244 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); | 243 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); |
245 EXPECT_THAT(run_order, ElementsAre(1)); | 244 EXPECT_THAT(run_order, ElementsAre(1)); |
246 EXPECT_EQ(TaskQueue::QueueState::EMPTY, runners_[0]->GetQueueState()); | |
247 } | 245 } |
248 | 246 |
249 bool MessageLoopTaskCounter(size_t* count) { | 247 bool MessageLoopTaskCounter(size_t* count) { |
250 *count = *count + 1; | 248 *count = *count + 1; |
251 return true; | 249 return true; |
252 } | 250 } |
253 | 251 |
254 TEST_F(TaskQueueManagerTest, DelayedTaskExecutedInOneMessageLoopTask) { | 252 TEST_F(TaskQueueManagerTest, DelayedTaskExecutedInOneMessageLoopTask) { |
255 Initialize(1u); | 253 Initialize(1u); |
256 | 254 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 Initialize(1u); | 368 Initialize(1u); |
371 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 369 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
372 | 370 |
373 std::vector<int> run_order; | 371 std::vector<int> run_order; |
374 // Posting a task when pumping is disabled doesn't result in work getting | 372 // Posting a task when pumping is disabled doesn't result in work getting |
375 // posted. | 373 // posted. |
376 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 374 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
377 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); | 375 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); |
378 | 376 |
379 // However polling still works. | 377 // However polling still works. |
380 EXPECT_TRUE(runners_[0]->HasPendingImmediateTask()); | 378 EXPECT_FALSE(runners_[0]->IsQueueEmpty()); |
381 | 379 |
382 // After pumping the task runs normally. | 380 // After pumping the task runs normally. |
383 runners_[0]->PumpQueue(); | 381 runners_[0]->PumpQueue(); |
384 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); | 382 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
385 test_task_runner_->RunUntilIdle(); | 383 test_task_runner_->RunUntilIdle(); |
386 EXPECT_THAT(run_order, ElementsAre(1)); | 384 EXPECT_THAT(run_order, ElementsAre(1)); |
387 } | 385 } |
388 | 386 |
389 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { | 387 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { |
390 Initialize(1u); | 388 Initialize(1u); |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 test_task_runner_->RunUntilIdle(); | 996 test_task_runner_->RunUntilIdle(); |
999 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit()); | 997 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit()); |
1000 | 998 |
1001 queue0->PostTask(FROM_HERE, base::Bind(&NopTask)); | 999 queue0->PostTask(FROM_HERE, base::Bind(&NopTask)); |
1002 queue1->PostTask(FROM_HERE, base::Bind(&NopTask)); | 1000 queue1->PostTask(FROM_HERE, base::Bind(&NopTask)); |
1003 test_task_runner_->RunUntilIdle(); | 1001 test_task_runner_->RunUntilIdle(); |
1004 EXPECT_FALSE(manager_->GetAndClearSystemIsQuiescentBit()); | 1002 EXPECT_FALSE(manager_->GetAndClearSystemIsQuiescentBit()); |
1005 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit()); | 1003 EXPECT_TRUE(manager_->GetAndClearSystemIsQuiescentBit()); |
1006 } | 1004 } |
1007 | 1005 |
1008 TEST_F(TaskQueueManagerTest, HasPendingImmediateTask) { | 1006 TEST_F(TaskQueueManagerTest, IsQueueEmpty) { |
1009 Initialize(2u); | 1007 Initialize(2u); |
1010 internal::TaskQueueImpl* queue0 = runners_[0].get(); | 1008 internal::TaskQueueImpl* queue0 = runners_[0].get(); |
1011 internal::TaskQueueImpl* queue1 = runners_[1].get(); | 1009 internal::TaskQueueImpl* queue1 = runners_[1].get(); |
1012 queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO); | 1010 queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO); |
1013 queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 1011 queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
1014 | 1012 |
1015 EXPECT_FALSE(queue0->HasPendingImmediateTask()); | 1013 EXPECT_TRUE(queue0->IsQueueEmpty()); |
1016 EXPECT_FALSE(queue1->HasPendingImmediateTask()); | 1014 EXPECT_TRUE(queue1->IsQueueEmpty()); |
1017 | 1015 |
1018 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); | 1016 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); |
1019 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); | 1017 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); |
1020 EXPECT_TRUE(queue0->HasPendingImmediateTask()); | 1018 EXPECT_FALSE(queue0->IsQueueEmpty()); |
1021 EXPECT_TRUE(queue1->HasPendingImmediateTask()); | 1019 EXPECT_FALSE(queue1->IsQueueEmpty()); |
1022 | 1020 |
1023 test_task_runner_->RunUntilIdle(); | 1021 test_task_runner_->RunUntilIdle(); |
1024 EXPECT_FALSE(queue0->HasPendingImmediateTask()); | 1022 EXPECT_TRUE(queue0->IsQueueEmpty()); |
1025 EXPECT_TRUE(queue1->HasPendingImmediateTask()); | 1023 EXPECT_FALSE(queue1->IsQueueEmpty()); |
1026 | 1024 |
1027 queue1->PumpQueue(); | 1025 queue1->PumpQueue(); |
1028 EXPECT_FALSE(queue0->HasPendingImmediateTask()); | 1026 EXPECT_TRUE(queue0->IsQueueEmpty()); |
1029 EXPECT_TRUE(queue1->HasPendingImmediateTask()); | 1027 EXPECT_FALSE(queue1->IsQueueEmpty()); |
1030 | 1028 |
1031 test_task_runner_->RunUntilIdle(); | 1029 test_task_runner_->RunUntilIdle(); |
1032 EXPECT_FALSE(queue0->HasPendingImmediateTask()); | 1030 EXPECT_TRUE(queue0->IsQueueEmpty()); |
1033 EXPECT_FALSE(queue1->HasPendingImmediateTask()); | 1031 EXPECT_TRUE(queue1->IsQueueEmpty()); |
1034 } | 1032 } |
1035 | 1033 |
1036 TEST_F(TaskQueueManagerTest, GetQueueState) { | 1034 TEST_F(TaskQueueManagerTest, GetQueueState) { |
1037 Initialize(2u); | 1035 Initialize(2u); |
1038 internal::TaskQueueImpl* queue0 = runners_[0].get(); | 1036 internal::TaskQueueImpl* queue0 = runners_[0].get(); |
1039 internal::TaskQueueImpl* queue1 = runners_[1].get(); | 1037 internal::TaskQueueImpl* queue1 = runners_[1].get(); |
1040 queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO); | 1038 queue0->SetPumpPolicy(TaskQueue::PumpPolicy::AUTO); |
1041 queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 1039 queue1->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
1042 | 1040 |
1043 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue0->GetQueueState()); | 1041 EXPECT_EQ(TaskQueue::QueueState::EMPTY, queue0->GetQueueState()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 delay1); | 1095 delay1); |
1098 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), | 1096 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
1099 delay2); | 1097 delay2); |
1100 | 1098 |
1101 now_src_->Advance(delay1 * 2); | 1099 now_src_->Advance(delay1 * 2); |
1102 test_task_runner_->RunUntilIdle(); | 1100 test_task_runner_->RunUntilIdle(); |
1103 | 1101 |
1104 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 1102 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
1105 } | 1103 } |
1106 | 1104 |
| 1105 TEST_F(TaskQueueManagerTest, DelayedTaskWithAbsoluteRunTime) { |
| 1106 Initialize(1u); |
| 1107 |
| 1108 // One task in the past, two with the exact same run time and one in the |
| 1109 // future. |
| 1110 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
| 1111 base::TimeTicks runTime1 = now_src_->NowTicks() - delay; |
| 1112 base::TimeTicks runTime2 = now_src_->NowTicks(); |
| 1113 base::TimeTicks runTime3 = now_src_->NowTicks(); |
| 1114 base::TimeTicks runTime4 = now_src_->NowTicks() + delay; |
| 1115 |
| 1116 std::vector<int> run_order; |
| 1117 runners_[0]->PostDelayedTaskAt( |
| 1118 FROM_HERE, base::Bind(&TestTask, 1, &run_order), runTime1); |
| 1119 runners_[0]->PostDelayedTaskAt( |
| 1120 FROM_HERE, base::Bind(&TestTask, 2, &run_order), runTime2); |
| 1121 runners_[0]->PostDelayedTaskAt( |
| 1122 FROM_HERE, base::Bind(&TestTask, 3, &run_order), runTime3); |
| 1123 runners_[0]->PostDelayedTaskAt( |
| 1124 FROM_HERE, base::Bind(&TestTask, 4, &run_order), runTime4); |
| 1125 |
| 1126 now_src_->Advance(2 * delay); |
| 1127 test_task_runner_->RunUntilIdle(); |
| 1128 |
| 1129 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); |
| 1130 } |
| 1131 |
1107 void CheckIsNested(bool* is_nested) { | 1132 void CheckIsNested(bool* is_nested) { |
1108 *is_nested = base::MessageLoop::current()->IsNested(); | 1133 *is_nested = base::MessageLoop::current()->IsNested(); |
1109 } | 1134 } |
1110 | 1135 |
1111 void PostAndQuitFromNestedRunloop(base::RunLoop* run_loop, | 1136 void PostAndQuitFromNestedRunloop(base::RunLoop* run_loop, |
1112 base::SingleThreadTaskRunner* runner, | 1137 base::SingleThreadTaskRunner* runner, |
1113 bool* was_nested) { | 1138 bool* was_nested) { |
1114 base::MessageLoop::ScopedNestableTaskAllower allow( | 1139 base::MessageLoop::ScopedNestableTaskAllower allow( |
1115 base::MessageLoop::current()); | 1140 base::MessageLoop::current()); |
1116 runner->PostTask(FROM_HERE, run_loop->QuitClosure()); | 1141 runner->PostTask(FROM_HERE, run_loop->QuitClosure()); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 | 1316 |
1292 scoped_refptr<internal::TaskQueueImpl> task_queue = | 1317 scoped_refptr<internal::TaskQueueImpl> task_queue = |
1293 manager_->NewTaskQueue(TaskQueue::Spec("test_queue")); | 1318 manager_->NewTaskQueue(TaskQueue::Spec("test_queue")); |
1294 | 1319 |
1295 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); | 1320 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); |
1296 task_queue->UnregisterTaskQueue(); | 1321 task_queue->UnregisterTaskQueue(); |
1297 | 1322 |
1298 manager_->SetObserver(nullptr); | 1323 manager_->SetObserver(nullptr); |
1299 } | 1324 } |
1300 | 1325 |
| 1326 TEST_F(TaskQueueManagerTest, ScheduleDelayedWorkIsNotReEntrant) { |
| 1327 Initialize(1u); |
| 1328 |
| 1329 // Post two tasks into the past. The second one used to trigger a deadlock |
| 1330 // because it tried to re-entrantly wake the first task in the same queue. |
| 1331 runners_[0]->PostDelayedTaskAt( |
| 1332 FROM_HERE, base::Bind(&NullTask), |
| 1333 base::TimeTicks() + base::TimeDelta::FromMicroseconds(100)); |
| 1334 runners_[0]->PostDelayedTaskAt( |
| 1335 FROM_HERE, base::Bind(&NullTask), |
| 1336 base::TimeTicks() + base::TimeDelta::FromMicroseconds(200)); |
| 1337 test_task_runner_->RunUntilIdle(); |
| 1338 } |
| 1339 |
1301 void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) { | 1340 void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) { |
1302 log->push_back(tq->HasOneRef()); | 1341 log->push_back(tq->HasOneRef()); |
1303 } | 1342 } |
1304 | 1343 |
1305 TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) { | 1344 TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) { |
1306 InitializeWithRealMessageLoop(1u); | 1345 InitializeWithRealMessageLoop(1u); |
1307 | 1346 |
1308 // We retain a reference to the task queue even when the manager has deleted | 1347 // We retain a reference to the task queue even when the manager has deleted |
1309 // its reference. | 1348 // its reference. |
1310 scoped_refptr<internal::TaskQueueImpl> task_queue = | 1349 scoped_refptr<internal::TaskQueueImpl> task_queue = |
(...skipping 30 matching lines...) Expand all Loading... |
1341 base::Unretained(task_queue.get()))); | 1380 base::Unretained(task_queue.get()))); |
1342 message_loop_->RunUntilIdle(); | 1381 message_loop_->RunUntilIdle(); |
1343 | 1382 |
1344 EXPECT_THAT(log, ElementsAre(false, false, true)); | 1383 EXPECT_THAT(log, ElementsAre(false, false, true)); |
1345 } | 1384 } |
1346 | 1385 |
1347 TEST_F(TaskQueueManagerTest, TimeDomainsAreIndependant) { | 1386 TEST_F(TaskQueueManagerTest, TimeDomainsAreIndependant) { |
1348 Initialize(2u); | 1387 Initialize(2u); |
1349 | 1388 |
1350 base::TimeTicks start_time = manager_->delegate()->NowTicks(); | 1389 base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
1351 scoped_ptr<VirtualTimeDomain> domain_a( | 1390 scoped_refptr<VirtualTimeDomain> domain_a(new VirtualTimeDomain(start_time)); |
1352 new VirtualTimeDomain(nullptr, start_time)); | 1391 scoped_refptr<VirtualTimeDomain> domain_b(new VirtualTimeDomain(start_time)); |
1353 scoped_ptr<VirtualTimeDomain> domain_b( | 1392 manager_->RegisterTimeDomain(domain_a); |
1354 new VirtualTimeDomain(nullptr, start_time)); | 1393 manager_->RegisterTimeDomain(domain_b); |
1355 manager_->RegisterTimeDomain(domain_a.get()); | 1394 runners_[0]->SetTimeDomain(domain_a); |
1356 manager_->RegisterTimeDomain(domain_b.get()); | 1395 runners_[1]->SetTimeDomain(domain_b); |
1357 runners_[0]->SetTimeDomain(domain_a.get()); | |
1358 runners_[1]->SetTimeDomain(domain_b.get()); | |
1359 | 1396 |
1360 std::vector<int> run_order; | 1397 std::vector<int> run_order; |
1361 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 1398 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
1362 base::TimeDelta::FromMilliseconds(10)); | 1399 base::TimeDelta::FromMilliseconds(10)); |
1363 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), | 1400 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
1364 base::TimeDelta::FromMilliseconds(20)); | 1401 base::TimeDelta::FromMilliseconds(20)); |
1365 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), | 1402 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
1366 base::TimeDelta::FromMilliseconds(30)); | 1403 base::TimeDelta::FromMilliseconds(30)); |
1367 | 1404 |
1368 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order), | 1405 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order), |
1369 base::TimeDelta::FromMilliseconds(10)); | 1406 base::TimeDelta::FromMilliseconds(10)); |
1370 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order), | 1407 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order), |
1371 base::TimeDelta::FromMilliseconds(20)); | 1408 base::TimeDelta::FromMilliseconds(20)); |
1372 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order), | 1409 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order), |
1373 base::TimeDelta::FromMilliseconds(30)); | 1410 base::TimeDelta::FromMilliseconds(30)); |
1374 | 1411 |
1375 domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); | 1412 domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
1376 | 1413 |
1377 test_task_runner_->RunUntilIdle(); | 1414 test_task_runner_->RunUntilIdle(); |
1378 EXPECT_THAT(run_order, ElementsAre(4, 5, 6)); | 1415 EXPECT_THAT(run_order, ElementsAre(4, 5, 6)); |
1379 | 1416 |
1380 domain_a->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); | 1417 domain_a->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
1381 | 1418 |
1382 test_task_runner_->RunUntilIdle(); | 1419 test_task_runner_->RunUntilIdle(); |
1383 EXPECT_THAT(run_order, ElementsAre(4, 5, 6, 1, 2, 3)); | 1420 EXPECT_THAT(run_order, ElementsAre(4, 5, 6, 1, 2, 3)); |
1384 | 1421 |
1385 manager_->UnregisterTimeDomain(domain_a.get()); | 1422 manager_->UnregisterTimeDomain(domain_a); |
1386 manager_->UnregisterTimeDomain(domain_b.get()); | 1423 manager_->UnregisterTimeDomain(domain_b); |
1387 } | 1424 } |
1388 | 1425 |
1389 TEST_F(TaskQueueManagerTest, TimeDomainMigration) { | 1426 TEST_F(TaskQueueManagerTest, TimeDomainMigration) { |
1390 Initialize(1u); | 1427 Initialize(1u); |
1391 | 1428 |
1392 base::TimeTicks start_time = manager_->delegate()->NowTicks(); | 1429 base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
1393 scoped_ptr<VirtualTimeDomain> domain_a( | 1430 scoped_refptr<VirtualTimeDomain> domain_a(new VirtualTimeDomain(start_time)); |
1394 new VirtualTimeDomain(nullptr, start_time)); | 1431 manager_->RegisterTimeDomain(domain_a); |
1395 manager_->RegisterTimeDomain(domain_a.get()); | 1432 runners_[0]->SetTimeDomain(domain_a); |
1396 runners_[0]->SetTimeDomain(domain_a.get()); | |
1397 | 1433 |
1398 std::vector<int> run_order; | 1434 std::vector<int> run_order; |
1399 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 1435 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
1400 base::TimeDelta::FromMilliseconds(10)); | 1436 base::TimeDelta::FromMilliseconds(10)); |
1401 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), | 1437 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
1402 base::TimeDelta::FromMilliseconds(20)); | 1438 base::TimeDelta::FromMilliseconds(20)); |
1403 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), | 1439 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
1404 base::TimeDelta::FromMilliseconds(30)); | 1440 base::TimeDelta::FromMilliseconds(30)); |
1405 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order), | 1441 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order), |
1406 base::TimeDelta::FromMilliseconds(40)); | 1442 base::TimeDelta::FromMilliseconds(40)); |
1407 | 1443 |
1408 domain_a->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(20)); | 1444 domain_a->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(20)); |
1409 test_task_runner_->RunUntilIdle(); | 1445 test_task_runner_->RunUntilIdle(); |
1410 EXPECT_THAT(run_order, ElementsAre(1, 2)); | 1446 EXPECT_THAT(run_order, ElementsAre(1, 2)); |
1411 | 1447 |
1412 scoped_ptr<VirtualTimeDomain> domain_b( | 1448 scoped_refptr<VirtualTimeDomain> domain_b(new VirtualTimeDomain(start_time)); |
1413 new VirtualTimeDomain(nullptr, start_time)); | 1449 manager_->RegisterTimeDomain(domain_b); |
1414 manager_->RegisterTimeDomain(domain_b.get()); | 1450 runners_[0]->SetTimeDomain(domain_b); |
1415 runners_[0]->SetTimeDomain(domain_b.get()); | |
1416 | 1451 |
1417 domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); | 1452 domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
1418 | 1453 |
1419 test_task_runner_->RunUntilIdle(); | 1454 test_task_runner_->RunUntilIdle(); |
1420 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); | 1455 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); |
1421 | 1456 |
1422 manager_->UnregisterTimeDomain(domain_a.get()); | 1457 manager_->UnregisterTimeDomain(domain_a); |
1423 manager_->UnregisterTimeDomain(domain_b.get()); | 1458 manager_->UnregisterTimeDomain(domain_b); |
1424 } | 1459 } |
1425 | 1460 |
1426 namespace { | 1461 namespace { |
1427 void ChromiumRunloopInspectionTask( | 1462 void ChromiumRunloopInspectionTask( |
1428 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner) { | 1463 scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner) { |
1429 EXPECT_EQ(1u, test_task_runner->NumPendingTasks()); | 1464 EXPECT_EQ(1u, test_task_runner->NumPendingTasks()); |
1430 } | 1465 } |
1431 } // namespace | 1466 } // namespace |
1432 | 1467 |
1433 TEST_F(TaskQueueManagerTest, NumberOfPendingTasksOnChromiumRunLoop) { | 1468 TEST_F(TaskQueueManagerTest, NumberOfPendingTasksOnChromiumRunLoop) { |
1434 Initialize(1u); | 1469 Initialize(1u); |
1435 | 1470 |
1436 // NOTE because tasks posted to the chromiumrun loop are not cancellable, we | 1471 // NOTE because tasks posted to the chromiumrun loop are not cancellable, we |
1437 // will end up with a lot more tasks posted if the delayed tasks were posted | 1472 // will end up with a lot more tasks posted if the delayed tasks were posted |
1438 // in the reverse order. | 1473 // in the reverse order. |
1439 // TODO(alexclarke): Consider talking to the message pump directly. | 1474 // TODO(alexclarke): Consider talking to the message pump directly. |
1440 test_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1475 test_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
1441 for (int i = 1; i < 100; i++) { | 1476 for (int i = 1; i < 100; i++) { |
1442 runners_[0]->PostDelayedTask( | 1477 runners_[0]->PostDelayedTask( |
1443 FROM_HERE, | 1478 FROM_HERE, |
1444 base::Bind(&ChromiumRunloopInspectionTask, test_task_runner_), | 1479 base::Bind(&ChromiumRunloopInspectionTask, test_task_runner_), |
1445 base::TimeDelta::FromMilliseconds(i)); | 1480 base::TimeDelta::FromMilliseconds(i)); |
1446 } | 1481 } |
1447 test_task_runner_->RunUntilIdle(); | 1482 test_task_runner_->RunUntilIdle(); |
1448 } | 1483 } |
1449 | 1484 |
1450 } // namespace scheduler | 1485 } // namespace scheduler |
OLD | NEW |