| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/scheduler/base/work_queue_sets.h" | |
| 6 | |
| 7 #include <stddef.h> | |
| 8 | |
| 9 #include "base/memory/ptr_util.h" | |
| 10 #include "components/scheduler/base/work_queue.h" | |
| 11 #include "testing/gmock/include/gmock/gmock.h" | |
| 12 | |
| 13 namespace scheduler { | |
| 14 class TimeDomain; | |
| 15 | |
| 16 namespace internal { | |
| 17 | |
| 18 class WorkQueueSetsTest : public testing::Test { | |
| 19 public: | |
| 20 void SetUp() override { | |
| 21 work_queue_sets_.reset(new WorkQueueSets(kNumSets, "test")); | |
| 22 } | |
| 23 | |
| 24 void TearDown() override { | |
| 25 for (std::unique_ptr<WorkQueue>& work_queue : work_queues_) { | |
| 26 if (work_queue->work_queue_sets()) | |
| 27 work_queue_sets_->RemoveQueue(work_queue.get()); | |
| 28 } | |
| 29 } | |
| 30 | |
| 31 protected: | |
| 32 enum { | |
| 33 kNumSets = 5 // An arbitary choice. | |
| 34 }; | |
| 35 | |
| 36 WorkQueue* NewTaskQueue(const char* queue_name) { | |
| 37 WorkQueue* queue = new WorkQueue(nullptr, "test"); | |
| 38 work_queues_.push_back(base::WrapUnique(queue)); | |
| 39 work_queue_sets_->AddQueue(queue, TaskQueue::CONTROL_PRIORITY); | |
| 40 return queue; | |
| 41 } | |
| 42 | |
| 43 TaskQueueImpl::Task FakeTaskWithEnqueueOrder(int enqueue_order) { | |
| 44 TaskQueueImpl::Task fake_task(FROM_HERE, base::Closure(), base::TimeTicks(), | |
| 45 0, true); | |
| 46 fake_task.set_enqueue_order(enqueue_order); | |
| 47 return fake_task; | |
| 48 } | |
| 49 | |
| 50 std::vector<std::unique_ptr<WorkQueue>> work_queues_; | |
| 51 std::unique_ptr<WorkQueueSets> work_queue_sets_; | |
| 52 }; | |
| 53 | |
| 54 TEST_F(WorkQueueSetsTest, ChangeSetIndex) { | |
| 55 WorkQueue* work_queue = NewTaskQueue("queue"); | |
| 56 size_t set = TaskQueue::NORMAL_PRIORITY; | |
| 57 work_queue_sets_->ChangeSetIndex(work_queue, set); | |
| 58 | |
| 59 EXPECT_EQ(set, work_queue->work_queue_set_index()); | |
| 60 } | |
| 61 | |
| 62 TEST_F(WorkQueueSetsTest, GetOldestQueueInSet_QueueEmpty) { | |
| 63 WorkQueue* work_queue = NewTaskQueue("queue"); | |
| 64 size_t set = TaskQueue::NORMAL_PRIORITY; | |
| 65 work_queue_sets_->ChangeSetIndex(work_queue, set); | |
| 66 | |
| 67 WorkQueue* selected_work_queue; | |
| 68 EXPECT_FALSE( | |
| 69 work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 70 } | |
| 71 | |
| 72 TEST_F(WorkQueueSetsTest, OnPushQueue) { | |
| 73 WorkQueue* work_queue = NewTaskQueue("queue"); | |
| 74 size_t set = TaskQueue::NORMAL_PRIORITY; | |
| 75 work_queue_sets_->ChangeSetIndex(work_queue, set); | |
| 76 | |
| 77 WorkQueue* selected_work_queue; | |
| 78 EXPECT_FALSE( | |
| 79 work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 80 | |
| 81 work_queue->Push(FakeTaskWithEnqueueOrder(10)); | |
| 82 work_queue_sets_->OnPushQueue(work_queue); | |
| 83 | |
| 84 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 85 EXPECT_EQ(work_queue, selected_work_queue); | |
| 86 } | |
| 87 | |
| 88 TEST_F(WorkQueueSetsTest, GetOldestQueueInSet_SingleTaskInSet) { | |
| 89 WorkQueue* work_queue = NewTaskQueue("queue"); | |
| 90 work_queue->Push(FakeTaskWithEnqueueOrder(10)); | |
| 91 size_t set = 1; | |
| 92 work_queue_sets_->ChangeSetIndex(work_queue, set); | |
| 93 | |
| 94 WorkQueue* selected_work_queue; | |
| 95 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 96 EXPECT_EQ(work_queue, selected_work_queue); | |
| 97 } | |
| 98 | |
| 99 TEST_F(WorkQueueSetsTest, GetOldestQueueInSet_MultipleAgesInSet) { | |
| 100 WorkQueue* queue1 = NewTaskQueue("queue1"); | |
| 101 WorkQueue* queue2 = NewTaskQueue("queue2"); | |
| 102 WorkQueue* queue3 = NewTaskQueue("queue2"); | |
| 103 queue1->Push(FakeTaskWithEnqueueOrder(6)); | |
| 104 queue2->Push(FakeTaskWithEnqueueOrder(5)); | |
| 105 queue3->Push(FakeTaskWithEnqueueOrder(4)); | |
| 106 size_t set = 2; | |
| 107 work_queue_sets_->ChangeSetIndex(queue1, set); | |
| 108 work_queue_sets_->ChangeSetIndex(queue2, set); | |
| 109 work_queue_sets_->ChangeSetIndex(queue3, set); | |
| 110 | |
| 111 WorkQueue* selected_work_queue; | |
| 112 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 113 EXPECT_EQ(queue3, selected_work_queue); | |
| 114 } | |
| 115 | |
| 116 TEST_F(WorkQueueSetsTest, OnPopQueue) { | |
| 117 WorkQueue* queue1 = NewTaskQueue("queue1"); | |
| 118 WorkQueue* queue2 = NewTaskQueue("queue2"); | |
| 119 WorkQueue* queue3 = NewTaskQueue("queue3"); | |
| 120 queue1->Push(FakeTaskWithEnqueueOrder(6)); | |
| 121 queue2->Push(FakeTaskWithEnqueueOrder(3)); | |
| 122 queue2->Push(FakeTaskWithEnqueueOrder(1)); | |
| 123 queue3->Push(FakeTaskWithEnqueueOrder(4)); | |
| 124 size_t set = 3; | |
| 125 work_queue_sets_->ChangeSetIndex(queue1, set); | |
| 126 work_queue_sets_->ChangeSetIndex(queue2, set); | |
| 127 work_queue_sets_->ChangeSetIndex(queue3, set); | |
| 128 | |
| 129 WorkQueue* selected_work_queue; | |
| 130 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 131 EXPECT_EQ(queue2, selected_work_queue); | |
| 132 | |
| 133 queue2->PopTaskForTest(); | |
| 134 work_queue_sets_->OnPopQueue(queue2); | |
| 135 | |
| 136 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 137 EXPECT_EQ(queue2, selected_work_queue); | |
| 138 } | |
| 139 | |
| 140 TEST_F(WorkQueueSetsTest, OnPopQueue_QueueBecomesEmpty) { | |
| 141 WorkQueue* queue1 = NewTaskQueue("queue"); | |
| 142 WorkQueue* queue2 = NewTaskQueue("queue"); | |
| 143 WorkQueue* queue3 = NewTaskQueue("queue"); | |
| 144 queue1->Push(FakeTaskWithEnqueueOrder(6)); | |
| 145 queue2->Push(FakeTaskWithEnqueueOrder(5)); | |
| 146 queue3->Push(FakeTaskWithEnqueueOrder(4)); | |
| 147 size_t set = 4; | |
| 148 work_queue_sets_->ChangeSetIndex(queue1, set); | |
| 149 work_queue_sets_->ChangeSetIndex(queue2, set); | |
| 150 work_queue_sets_->ChangeSetIndex(queue3, set); | |
| 151 | |
| 152 WorkQueue* selected_work_queue; | |
| 153 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 154 EXPECT_EQ(queue3, selected_work_queue); | |
| 155 | |
| 156 queue3->PopTaskForTest(); | |
| 157 work_queue_sets_->OnPopQueue(queue3); | |
| 158 | |
| 159 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 160 EXPECT_EQ(queue2, selected_work_queue); | |
| 161 } | |
| 162 | |
| 163 TEST_F(WorkQueueSetsTest, | |
| 164 GetOldestQueueInSet_MultipleAgesInSetIntegerRollover) { | |
| 165 WorkQueue* queue1 = NewTaskQueue("queue1"); | |
| 166 WorkQueue* queue2 = NewTaskQueue("queue2"); | |
| 167 WorkQueue* queue3 = NewTaskQueue("queue3"); | |
| 168 queue1->Push(FakeTaskWithEnqueueOrder(0x7ffffff1)); | |
| 169 queue2->Push(FakeTaskWithEnqueueOrder(0x7ffffff0)); | |
| 170 queue3->Push(FakeTaskWithEnqueueOrder(-0x7ffffff1)); | |
| 171 size_t set = 1; | |
| 172 work_queue_sets_->ChangeSetIndex(queue1, set); | |
| 173 work_queue_sets_->ChangeSetIndex(queue2, set); | |
| 174 work_queue_sets_->ChangeSetIndex(queue3, set); | |
| 175 | |
| 176 WorkQueue* selected_work_queue; | |
| 177 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 178 EXPECT_EQ(queue2, selected_work_queue); | |
| 179 } | |
| 180 | |
| 181 TEST_F(WorkQueueSetsTest, GetOldestQueueInSet_MultipleAgesInSet_RemoveQueue) { | |
| 182 WorkQueue* queue1 = NewTaskQueue("queue1"); | |
| 183 WorkQueue* queue2 = NewTaskQueue("queue2"); | |
| 184 WorkQueue* queue3 = NewTaskQueue("queue3"); | |
| 185 queue1->Push(FakeTaskWithEnqueueOrder(6)); | |
| 186 queue2->Push(FakeTaskWithEnqueueOrder(5)); | |
| 187 queue3->Push(FakeTaskWithEnqueueOrder(4)); | |
| 188 size_t set = 1; | |
| 189 work_queue_sets_->ChangeSetIndex(queue1, set); | |
| 190 work_queue_sets_->ChangeSetIndex(queue2, set); | |
| 191 work_queue_sets_->ChangeSetIndex(queue3, set); | |
| 192 work_queue_sets_->RemoveQueue(queue3); | |
| 193 | |
| 194 WorkQueue* selected_work_queue; | |
| 195 EXPECT_TRUE(work_queue_sets_->GetOldestQueueInSet(set, &selected_work_queue)); | |
| 196 EXPECT_EQ(queue2, selected_work_queue); | |
| 197 } | |
| 198 | |
| 199 TEST_F(WorkQueueSetsTest, ChangeSetIndex_Complex) { | |
| 200 WorkQueue* queue1 = NewTaskQueue("queue1"); | |
| 201 WorkQueue* queue2 = NewTaskQueue("queue2"); | |
| 202 WorkQueue* queue3 = NewTaskQueue("queue3"); | |
| 203 WorkQueue* queue4 = NewTaskQueue("queue4"); | |
| 204 queue1->Push(FakeTaskWithEnqueueOrder(6)); | |
| 205 queue2->Push(FakeTaskWithEnqueueOrder(5)); | |
| 206 queue3->Push(FakeTaskWithEnqueueOrder(4)); | |
| 207 queue4->Push(FakeTaskWithEnqueueOrder(3)); | |
| 208 size_t set1 = 1; | |
| 209 size_t set2 = 2; | |
| 210 work_queue_sets_->ChangeSetIndex(queue1, set1); | |
| 211 work_queue_sets_->ChangeSetIndex(queue2, set1); | |
| 212 work_queue_sets_->ChangeSetIndex(queue3, set2); | |
| 213 work_queue_sets_->ChangeSetIndex(queue4, set2); | |
| 214 | |
| 215 WorkQueue* selected_work_queue; | |
| 216 EXPECT_TRUE( | |
| 217 work_queue_sets_->GetOldestQueueInSet(set1, &selected_work_queue)); | |
| 218 EXPECT_EQ(queue2, selected_work_queue); | |
| 219 | |
| 220 EXPECT_TRUE( | |
| 221 work_queue_sets_->GetOldestQueueInSet(set2, &selected_work_queue)); | |
| 222 EXPECT_EQ(queue4, selected_work_queue); | |
| 223 | |
| 224 work_queue_sets_->ChangeSetIndex(queue4, set1); | |
| 225 | |
| 226 EXPECT_TRUE( | |
| 227 work_queue_sets_->GetOldestQueueInSet(set1, &selected_work_queue)); | |
| 228 EXPECT_EQ(queue4, selected_work_queue); | |
| 229 | |
| 230 EXPECT_TRUE( | |
| 231 work_queue_sets_->GetOldestQueueInSet(set2, &selected_work_queue)); | |
| 232 EXPECT_EQ(queue3, selected_work_queue); | |
| 233 } | |
| 234 | |
| 235 TEST_F(WorkQueueSetsTest, IsSetEmpty_NoWork) { | |
| 236 size_t set = 2; | |
| 237 EXPECT_TRUE(work_queue_sets_->IsSetEmpty(set)); | |
| 238 | |
| 239 WorkQueue* work_queue = NewTaskQueue("queue"); | |
| 240 work_queue_sets_->ChangeSetIndex(work_queue, set); | |
| 241 EXPECT_TRUE(work_queue_sets_->IsSetEmpty(set)); | |
| 242 } | |
| 243 | |
| 244 TEST_F(WorkQueueSetsTest, IsSetEmpty_Work) { | |
| 245 size_t set = 2; | |
| 246 EXPECT_TRUE(work_queue_sets_->IsSetEmpty(set)); | |
| 247 | |
| 248 WorkQueue* work_queue = NewTaskQueue("queue"); | |
| 249 work_queue->Push(FakeTaskWithEnqueueOrder(1)); | |
| 250 work_queue_sets_->ChangeSetIndex(work_queue, set); | |
| 251 EXPECT_FALSE(work_queue_sets_->IsSetEmpty(set)); | |
| 252 | |
| 253 work_queue->PopTaskForTest(); | |
| 254 work_queue_sets_->OnPopQueue(work_queue); | |
| 255 EXPECT_TRUE(work_queue_sets_->IsSetEmpty(set)); | |
| 256 } | |
| 257 | |
| 258 } // namespace internal | |
| 259 } // namespace scheduler | |
| OLD | NEW |