Index: components/scheduler/base/task_queue_manager_unittest.cc |
diff --git a/components/scheduler/base/task_queue_manager_unittest.cc b/components/scheduler/base/task_queue_manager_unittest.cc |
index 1c46c695d1c03522c589df2842443584079ec69c..92e3e931ab6d4025f402aa52335f72cb1301fb17 100644 |
--- a/components/scheduler/base/task_queue_manager_unittest.cc |
+++ b/components/scheduler/base/task_queue_manager_unittest.cc |
@@ -10,12 +10,14 @@ |
#include "base/test/simple_test_tick_clock.h" |
#include "base/threading/thread.h" |
#include "cc/test/ordered_simple_task_runner.h" |
+#include "components/scheduler/base/real_time_domain.h" |
#include "components/scheduler/base/task_queue_impl.h" |
#include "components/scheduler/base/task_queue_manager_delegate_for_test.h" |
#include "components/scheduler/base/task_queue_selector.h" |
#include "components/scheduler/base/task_queue_sets.h" |
#include "components/scheduler/base/test_always_fail_time_source.h" |
#include "components/scheduler/base/test_time_source.h" |
+#include "components/scheduler/base/virtual_time_domain.h" |
#include "testing/gmock/include/gmock/gmock.h" |
using testing::ElementsAre; |
@@ -71,6 +73,7 @@ class TaskQueueManagerTest : public testing::Test { |
} |
void InitializeWithRealMessageLoop(size_t num_queues) { |
+ now_src_.reset(new base::SimpleTestTickClock()); |
message_loop_.reset(new base::MessageLoop()); |
manager_ = make_scoped_ptr(new TaskQueueManager( |
MessageLoopTaskRunner::Create( |
@@ -1376,4 +1379,96 @@ TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) { |
EXPECT_THAT(log, ElementsAre(false, false, true)); |
} |
+TEST_F(TaskQueueManagerTest, TimeDomainsAreIndependant) { |
+ Initialize(2u); |
+ |
+ base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
+ scoped_refptr<VirtualTimeDomain> domain_a(new VirtualTimeDomain(start_time)); |
+ scoped_refptr<VirtualTimeDomain> domain_b(new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(domain_a); |
+ manager_->RegisterTimeDomain(domain_b); |
+ runners_[0]->SetTimeDomain(domain_a); |
+ runners_[1]->SetTimeDomain(domain_b); |
+ |
+ std::vector<int> run_order; |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
+ base::TimeDelta::FromMilliseconds(10)); |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
+ base::TimeDelta::FromMilliseconds(20)); |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
+ base::TimeDelta::FromMilliseconds(30)); |
+ |
+ runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order), |
+ base::TimeDelta::FromMilliseconds(10)); |
+ runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 5, &run_order), |
+ base::TimeDelta::FromMilliseconds(20)); |
+ runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 6, &run_order), |
+ base::TimeDelta::FromMilliseconds(30)); |
+ |
+ domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
+ |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(4, 5, 6)); |
+ |
+ domain_a->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
+ |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(4, 5, 6, 1, 2, 3)); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, TimeDomainMigration) { |
+ Initialize(1u); |
+ |
+ base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
+ scoped_refptr<VirtualTimeDomain> domain_a(new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(domain_a); |
+ runners_[0]->SetTimeDomain(domain_a); |
+ |
+ std::vector<int> run_order; |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
+ base::TimeDelta::FromMilliseconds(10)); |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
+ base::TimeDelta::FromMilliseconds(20)); |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
+ base::TimeDelta::FromMilliseconds(30)); |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 4, &run_order), |
+ base::TimeDelta::FromMilliseconds(40)); |
+ |
+ domain_a->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(20)); |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(1, 2)); |
+ |
+ scoped_refptr<VirtualTimeDomain> domain_b(new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(domain_b); |
+ runners_[0]->SetTimeDomain(domain_b); |
+ |
+ domain_b->AdvanceTo(start_time + base::TimeDelta::FromMilliseconds(50)); |
+ |
+ test_task_runner_->RunUntilIdle(); |
+ EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, |
+ NextPendingDelayedTaskRunTime_IgnoresNonDefaultTimeDomains) { |
+ Initialize(2u); |
+ |
+ base::TimeTicks start_time = manager_->delegate()->NowTicks(); |
+ scoped_refptr<VirtualTimeDomain> virtual_time_domain( |
+ new VirtualTimeDomain(start_time)); |
+ manager_->RegisterTimeDomain(virtual_time_domain); |
+ runners_[0]->SetTimeDomain(virtual_time_domain); |
+ |
+ runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), |
+ base::TimeDelta::FromMilliseconds(10)); |
+ runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), |
+ base::TimeDelta::FromMilliseconds(100)); |
+ |
+ EXPECT_EQ(start_time + base::TimeDelta::FromMilliseconds(100), |
+ manager_->NextPendingDelayedTaskRunTime()); |
+ |
+ runners_[0]->SetTimeDomain(manager_->real_time_domain()); |
+ EXPECT_EQ(start_time + base::TimeDelta::FromMilliseconds(10), |
+ manager_->NextPendingDelayedTaskRunTime()); |
+} |
+ |
} // namespace scheduler |