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 |