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 39baad3518dfd0837c2e8ff4a95c3ea184986f9f..89493b12c65e8313f767728585b892f74d019065 100644 |
--- a/components/scheduler/base/task_queue_manager_unittest.cc |
+++ b/components/scheduler/base/task_queue_manager_unittest.cc |
@@ -23,7 +23,8 @@ |
#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/test_always_fail_time_source.h" |
+#include "components/scheduler/base/test_count_uses_time_source.h" |
+#include "components/scheduler/base/test_task_time_tracker.h" |
#include "components/scheduler/base/test_time_source.h" |
#include "components/scheduler/base/virtual_time_domain.h" |
#include "components/scheduler/base/work_queue.h" |
@@ -59,6 +60,7 @@ class MessageLoopTaskRunner : public TaskQueueManagerDelegateForTest { |
class TaskQueueManagerTest : public testing::Test { |
public: |
+ TaskQueueManagerTest() {} |
void DeleteTaskQueueManager() { manager_.reset(); } |
protected: |
@@ -69,9 +71,11 @@ class TaskQueueManagerTest : public testing::Test { |
main_task_runner_ = TaskQueueManagerDelegateForTest::Create( |
test_task_runner_.get(), |
base::WrapUnique(new TestTimeSource(now_src_.get()))); |
- manager_ = base::WrapUnique( |
- new TaskQueueManager(main_task_runner_, "test.scheduler", |
- "test.scheduler", "test.scheduler.debug")); |
+ |
+ manager_ = base::WrapUnique(new TaskQueueManager( |
+ main_task_runner_, "test.scheduler", "test.scheduler", |
+ "test.scheduler.debug")); |
+ manager_->SetTaskTimeTracker(&test_task_time_tracker_); |
for (size_t i = 0; i < num_queues; i++) |
runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); |
@@ -87,10 +91,13 @@ class TaskQueueManagerTest : public testing::Test { |
void InitializeWithRealMessageLoop(size_t num_queues) { |
now_src_.reset(new base::SimpleTestTickClock()); |
message_loop_.reset(new base::MessageLoop()); |
+ // A null clock triggers some assertions. |
+ now_src_->Advance(base::TimeDelta::FromMicroseconds(1000)); |
manager_ = base::WrapUnique(new TaskQueueManager( |
MessageLoopTaskRunner::Create( |
base::WrapUnique(new TestTimeSource(now_src_.get()))), |
"test.scheduler", "test.scheduler", "test.scheduler.debug")); |
+ manager_->SetTaskTimeTracker(&test_task_time_tracker_); |
for (size_t i = 0; i < num_queues; i++) |
runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); |
@@ -102,6 +109,7 @@ class TaskQueueManagerTest : public testing::Test { |
scoped_refptr<cc::OrderedSimpleTaskRunner> test_task_runner_; |
std::unique_ptr<TaskQueueManager> manager_; |
std::vector<scoped_refptr<internal::TaskQueueImpl>> runners_; |
+ TestTaskTimeTracker test_task_time_tracker_; |
}; |
void PostFromNestedRunloop(base::MessageLoop* message_loop, |
@@ -120,12 +128,20 @@ void PostFromNestedRunloop(base::MessageLoop* message_loop, |
void NopTask() {} |
-TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) { |
+TEST_F(TaskQueueManagerTest, |
+ NowCalledMinimumNumberOfTimesToComputeTaskDurations) { |
message_loop_.reset(new base::MessageLoop()); |
+ // This memory is managed by the TaskQueueManager, but we need to hold a |
+ // pointer to this object to read out how many times Now was called. |
+ TestCountUsesTimeSource* test_count_uses_time_source = |
+ new TestCountUsesTimeSource(); |
+ |
manager_ = base::WrapUnique(new TaskQueueManager( |
MessageLoopTaskRunner::Create( |
- base::WrapUnique(new TestAlwaysFailTimeSource())), |
+ base::WrapUnique(test_count_uses_time_source)), |
"test.scheduler", "test.scheduler", "test.scheduler.debug")); |
+ manager_->SetWorkBatchSize(6); |
+ manager_->SetTaskTimeTracker(&test_task_time_tracker_); |
for (size_t i = 0; i < 3; i++) |
runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); |
@@ -138,6 +154,44 @@ TEST_F(TaskQueueManagerTest, NowNotCalledWhenThereAreNoDelayedTasks) { |
runners_[2]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
message_loop_->RunUntilIdle(); |
+ // We need to call Now for the beginning of the first task, and then the end |
+ // of every task after. We reuse the end time of one task for the start time |
+ // of the next task. In this case, there were 6 tasks, so we expect 7 calls to |
+ // Now. |
+ EXPECT_EQ(7, test_count_uses_time_source->now_calls_count()); |
+} |
+ |
+TEST_F(TaskQueueManagerTest, |
+ NowNotCalledForNestedTasks) { |
+ message_loop_.reset(new base::MessageLoop()); |
+ // This memory is managed by the TaskQueueManager, but we need to hold a |
+ // pointer to this object to read out how many times Now was called. |
+ TestCountUsesTimeSource* test_count_uses_time_source = |
+ new TestCountUsesTimeSource(); |
+ |
+ manager_ = base::WrapUnique(new TaskQueueManager( |
+ MessageLoopTaskRunner::Create( |
+ base::WrapUnique(test_count_uses_time_source)), |
+ "test.scheduler", "test.scheduler", "test.scheduler.debug")); |
+ manager_->SetTaskTimeTracker(&test_task_time_tracker_); |
+ |
+ runners_.push_back(manager_->NewTaskQueue(TaskQueue::Spec("test_queue"))); |
+ |
+ std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
+ for (int i = 0; i <= 6; ++i) { |
+ tasks_to_post_from_nested_loop.push_back( |
+ std::make_pair(base::Bind(&NopTask), true)); |
+ } |
+ |
+ runners_[0]->PostTask( |
+ FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
+ base::RetainedRef(runners_[0]), |
+ base::Unretained(&tasks_to_post_from_nested_loop))); |
+ |
+ message_loop_->RunUntilIdle(); |
+ // We need to call Now twice, to measure the start and end of the outermost |
+ // task. We shouldn't call it for any of the nested tasks. |
+ EXPECT_EQ(2, test_count_uses_time_source->now_calls_count()); |
} |
void NullTask() {} |