| Index: components/scheduler/child/task_queue_sets_unittest.cc
|
| diff --git a/components/scheduler/child/task_queue_sets_unittest.cc b/components/scheduler/child/task_queue_sets_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b338ea76fce86a94f52ed31f2bf5e24b719a020c
|
| --- /dev/null
|
| +++ b/components/scheduler/child/task_queue_sets_unittest.cc
|
| @@ -0,0 +1,239 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/scheduler/child/task_queue_sets.h"
|
| +
|
| +#include "components/scheduler/child/task_queue_impl.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +
|
| +namespace scheduler {
|
| +namespace internal {
|
| +
|
| +class TaskQueueSetsTest : public testing::Test {
|
| + public:
|
| + void SetUp() override { task_queue_sets_.reset(new TaskQueueSets(kNumSets)); }
|
| +
|
| + protected:
|
| + enum {
|
| + kNumSets = 5 // An arbitary choice.
|
| + };
|
| +
|
| + TaskQueueImpl* NewTaskQueue(const char* queue_name) {
|
| + scoped_refptr<internal::TaskQueueImpl> queue =
|
| + make_scoped_refptr(new internal::TaskQueueImpl(
|
| + nullptr, TaskQueue::Spec(queue_name), "test", "test"));
|
| + task_queues_.push_back(queue);
|
| + return queue.get();
|
| + }
|
| +
|
| + TaskQueueImpl::Task FakeTaskWithEnqueueOrder(int enqueue_order) {
|
| + TaskQueueImpl::Task fake_task(FROM_HERE, base::Closure(), 0, true);
|
| + fake_task.set_enqueue_order(enqueue_order);
|
| + return fake_task;
|
| + }
|
| +
|
| + std::vector<scoped_refptr<internal::TaskQueueImpl>> task_queues_;
|
| + scoped_ptr<TaskQueueSets> task_queue_sets_;
|
| +};
|
| +
|
| +TEST_F(TaskQueueSetsTest, AssignQueueToSet) {
|
| + internal::TaskQueueImpl* queue = NewTaskQueue("queue");
|
| + size_t set = TaskQueue::NORMAL_PRIORITY;
|
| + task_queue_sets_->AssignQueueToSet(queue, set);
|
| +
|
| + EXPECT_EQ(set, queue->get_task_queue_set_index());
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, GetOldestQueueInSet_QueueEmpty) {
|
| + internal::TaskQueueImpl* queue = NewTaskQueue("queue");
|
| + size_t set = TaskQueue::NORMAL_PRIORITY;
|
| + task_queue_sets_->AssignQueueToSet(queue, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_FALSE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, OnPushQueue) {
|
| + internal::TaskQueueImpl* queue = NewTaskQueue("queue");
|
| + size_t set = TaskQueue::NORMAL_PRIORITY;
|
| + task_queue_sets_->AssignQueueToSet(queue, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_FALSE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| +
|
| + queue->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(10));
|
| + task_queue_sets_->OnPushQueue(queue);
|
| +
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, GetOldestQueueInSet_SingleTaskInSet) {
|
| + internal::TaskQueueImpl* queue = NewTaskQueue("queue");
|
| + queue->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(10));
|
| + size_t set = 1;
|
| + task_queue_sets_->AssignQueueToSet(queue, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, GetOldestQueueInSet_MultipleAgesInSet) {
|
| + internal::TaskQueueImpl* queue1 = NewTaskQueue("queue1");
|
| + internal::TaskQueueImpl* queue2 = NewTaskQueue("queue2");
|
| + internal::TaskQueueImpl* queue3 = NewTaskQueue("queue2");
|
| + queue1->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(6));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(5));
|
| + queue3->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(4));
|
| + size_t set = 2;
|
| + task_queue_sets_->AssignQueueToSet(queue1, set);
|
| + task_queue_sets_->AssignQueueToSet(queue2, set);
|
| + task_queue_sets_->AssignQueueToSet(queue3, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue3, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, OnPopQueue) {
|
| + internal::TaskQueueImpl* queue1 = NewTaskQueue("queue1");
|
| + internal::TaskQueueImpl* queue2 = NewTaskQueue("queue2");
|
| + internal::TaskQueueImpl* queue3 = NewTaskQueue("queue3");
|
| + queue1->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(6));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(3));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(1));
|
| + queue3->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(4));
|
| + size_t set = 3;
|
| + task_queue_sets_->AssignQueueToSet(queue1, set);
|
| + task_queue_sets_->AssignQueueToSet(queue2, set);
|
| + task_queue_sets_->AssignQueueToSet(queue3, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue2, selected_queue);
|
| +
|
| + queue2->PopTaskFromWorkQueueForTest();
|
| + task_queue_sets_->OnPopQueue(queue2);
|
| +
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue2, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, OnPopQueue_QueueBecomesEmpty) {
|
| + internal::TaskQueueImpl* queue1 = NewTaskQueue("queue");
|
| + internal::TaskQueueImpl* queue2 = NewTaskQueue("queue");
|
| + internal::TaskQueueImpl* queue3 = NewTaskQueue("queue");
|
| + queue1->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(6));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(5));
|
| + queue3->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(4));
|
| + size_t set = 4;
|
| + task_queue_sets_->AssignQueueToSet(queue1, set);
|
| + task_queue_sets_->AssignQueueToSet(queue2, set);
|
| + task_queue_sets_->AssignQueueToSet(queue3, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue3, selected_queue);
|
| +
|
| + queue3->PopTaskFromWorkQueueForTest();
|
| + task_queue_sets_->OnPopQueue(queue3);
|
| +
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue2, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest,
|
| + GetOldestQueueInSet_MultipleAgesInSetIntegerRollover) {
|
| + internal::TaskQueueImpl* queue1 = NewTaskQueue("queue1");
|
| + internal::TaskQueueImpl* queue2 = NewTaskQueue("queue2");
|
| + internal::TaskQueueImpl* queue3 = NewTaskQueue("queue3");
|
| + queue1->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(0x7ffffff1));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(0x7ffffff0));
|
| + queue3->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(-0x7ffffff1));
|
| + size_t set = 0;
|
| + task_queue_sets_->AssignQueueToSet(queue1, set);
|
| + task_queue_sets_->AssignQueueToSet(queue2, set);
|
| + task_queue_sets_->AssignQueueToSet(queue3, set);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue2, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, GetOldestQueueInSet_MultipleAgesInSet_RemoveQueue) {
|
| + internal::TaskQueueImpl* queue1 = NewTaskQueue("queue1");
|
| + internal::TaskQueueImpl* queue2 = NewTaskQueue("queue2");
|
| + internal::TaskQueueImpl* queue3 = NewTaskQueue("queue3");
|
| + queue1->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(6));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(5));
|
| + queue3->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(4));
|
| + size_t set = 1;
|
| + task_queue_sets_->AssignQueueToSet(queue1, set);
|
| + task_queue_sets_->AssignQueueToSet(queue2, set);
|
| + task_queue_sets_->AssignQueueToSet(queue3, set);
|
| + task_queue_sets_->RemoveQueue(queue3);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set, &selected_queue));
|
| + EXPECT_EQ(queue2, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, AssignQueueToSet_Complex) {
|
| + internal::TaskQueueImpl* queue1 = NewTaskQueue("queue1");
|
| + internal::TaskQueueImpl* queue2 = NewTaskQueue("queue2");
|
| + internal::TaskQueueImpl* queue3 = NewTaskQueue("queue3");
|
| + internal::TaskQueueImpl* queue4 = NewTaskQueue("queue4");
|
| + queue1->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(6));
|
| + queue2->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(5));
|
| + queue3->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(4));
|
| + queue4->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(3));
|
| + size_t set1 = 1;
|
| + size_t set2 = 2;
|
| + task_queue_sets_->AssignQueueToSet(queue1, set1);
|
| + task_queue_sets_->AssignQueueToSet(queue2, set1);
|
| + task_queue_sets_->AssignQueueToSet(queue3, set2);
|
| + task_queue_sets_->AssignQueueToSet(queue4, set2);
|
| +
|
| + internal::TaskQueueImpl* selected_queue;
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set1, &selected_queue));
|
| + EXPECT_EQ(queue2, selected_queue);
|
| +
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set2, &selected_queue));
|
| + EXPECT_EQ(queue4, selected_queue);
|
| +
|
| + task_queue_sets_->AssignQueueToSet(queue4, set1);
|
| +
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set1, &selected_queue));
|
| + EXPECT_EQ(queue4, selected_queue);
|
| +
|
| + EXPECT_TRUE(task_queue_sets_->GetOldestQueueInSet(set2, &selected_queue));
|
| + EXPECT_EQ(queue3, selected_queue);
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, IsSetEmpty_NoWork) {
|
| + size_t set = 0;
|
| + EXPECT_TRUE(task_queue_sets_->IsSetEmpty(set));
|
| +
|
| + internal::TaskQueueImpl* queue = NewTaskQueue("queue");
|
| + task_queue_sets_->AssignQueueToSet(queue, set);
|
| + EXPECT_TRUE(task_queue_sets_->IsSetEmpty(set));
|
| +}
|
| +
|
| +TEST_F(TaskQueueSetsTest, IsSetEmpty_Work) {
|
| + size_t set = 0;
|
| + EXPECT_TRUE(task_queue_sets_->IsSetEmpty(set));
|
| +
|
| + internal::TaskQueueImpl* queue = NewTaskQueue("queue");
|
| + queue->PushTaskOntoWorkQueueForTest(FakeTaskWithEnqueueOrder(1));
|
| + task_queue_sets_->AssignQueueToSet(queue, set);
|
| + EXPECT_FALSE(task_queue_sets_->IsSetEmpty(set));
|
| +
|
| + queue->PopTaskFromWorkQueueForTest();
|
| + task_queue_sets_->OnPopQueue(queue);
|
| + EXPECT_TRUE(task_queue_sets_->IsSetEmpty(set));
|
| +}
|
| +
|
| +} // namespace internal
|
| +} // namespace scheduler
|
|
|