Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <ctype.h> | 5 #include <ctype.h> |
| 6 #include <string> | 6 #include <string> |
|
Deprecated (see juliatuttle)
2015/12/16 20:28:24
This is no longer needed, since you're not storing
| |
| 7 #include <vector> | |
| 7 | 8 |
| 8 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/memory/scoped_vector.h" | |
| 12 #include "net/base/prioritized_dispatcher.h" | 12 #include "net/base/prioritized_dispatcher.h" |
| 13 #include "net/base/request_priority.h" | 13 #include "net/base/request_priority.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 namespace net { | 16 namespace net { |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // We rely on the priority enum values being sequential having starting at 0, | 20 // We rely on the priority enum values being sequential having starting at 0, |
| 21 // and increasing for higher priorities. | 21 // and increasing for higher priorities. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 bool running_; | 132 bool running_; |
| 133 | 133 |
| 134 std::string* log_; | 134 std::string* log_; |
| 135 }; | 135 }; |
| 136 | 136 |
| 137 protected: | 137 protected: |
| 138 void Prepare(const PrioritizedDispatcher::Limits& limits) { | 138 void Prepare(const PrioritizedDispatcher::Limits& limits) { |
| 139 dispatcher_.reset(new PrioritizedDispatcher(limits)); | 139 dispatcher_.reset(new PrioritizedDispatcher(limits)); |
| 140 } | 140 } |
| 141 | 141 |
| 142 TestJob* AddJob(char data, Priority priority) { | 142 scoped_ptr<TestJob> AddJob(char data, Priority priority) { |
| 143 TestJob* job = new TestJob(dispatcher_.get(), data, priority, &log_); | 143 scoped_ptr<TestJob> job( |
| 144 jobs_.push_back(job); | 144 make_scoped_ptr(new TestJob(dispatcher_.get(), data, priority, &log_))); |
|
Deprecated (see juliatuttle)
2015/12/16 20:28:24
You don't need make_scoped_ptr here; scoped_ptr ha
| |
| 145 job->Add(false); | 145 job->Add(false); |
| 146 return job; | 146 return job; |
| 147 } | 147 } |
| 148 | 148 |
| 149 TestJob* AddJobAtHead(char data, Priority priority) { | 149 scoped_ptr<TestJob> AddJobAtHead(char data, Priority priority) { |
| 150 TestJob* job = new TestJob(dispatcher_.get(), data, priority, &log_); | 150 scoped_ptr<TestJob> job( |
| 151 jobs_.push_back(job); | 151 make_scoped_ptr(new TestJob(dispatcher_.get(), data, priority, &log_))); |
|
Deprecated (see juliatuttle)
2015/12/16 20:28:24
Ditto.
| |
| 152 job->Add(true); | 152 job->Add(true); |
| 153 return job; | 153 return job; |
| 154 } | 154 } |
| 155 | 155 |
| 156 void Expect(const std::string& log) { | 156 void Expect(const std::string& log) { |
| 157 EXPECT_EQ(0u, dispatcher_->num_queued_jobs()); | 157 EXPECT_EQ(0u, dispatcher_->num_queued_jobs()); |
| 158 EXPECT_EQ(0u, dispatcher_->num_running_jobs()); | 158 EXPECT_EQ(0u, dispatcher_->num_running_jobs()); |
| 159 EXPECT_EQ(log, log_); | 159 EXPECT_EQ(log, log_); |
| 160 log_.clear(); | 160 log_.clear(); |
| 161 } | 161 } |
| 162 | 162 |
| 163 std::string log_; | 163 std::string log_; |
| 164 scoped_ptr<PrioritizedDispatcher> dispatcher_; | 164 scoped_ptr<PrioritizedDispatcher> dispatcher_; |
| 165 ScopedVector<TestJob> jobs_; | |
| 166 }; | 165 }; |
| 167 | 166 |
| 168 TEST_F(PrioritizedDispatcherTest, GetLimits) { | 167 TEST_F(PrioritizedDispatcherTest, GetLimits) { |
| 169 // Set non-trivial initial limits. | 168 // Set non-trivial initial limits. |
| 170 PrioritizedDispatcher::Limits original_limits(NUM_PRIORITIES, 5); | 169 PrioritizedDispatcher::Limits original_limits(NUM_PRIORITIES, 5); |
| 171 original_limits.reserved_slots[HIGHEST] = 1; | 170 original_limits.reserved_slots[HIGHEST] = 1; |
| 172 original_limits.reserved_slots[LOW] = 2; | 171 original_limits.reserved_slots[LOW] = 2; |
| 173 Prepare(original_limits); | 172 Prepare(original_limits); |
| 174 | 173 |
| 175 // Get current limits, make sure the original limits are returned. | 174 // Get current limits, make sure the original limits are returned. |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 197 EXPECT_EQ(new_limits.reserved_slots[priority], | 196 EXPECT_EQ(new_limits.reserved_slots[priority], |
| 198 retrieved_limits.reserved_slots[priority]); | 197 retrieved_limits.reserved_slots[priority]); |
| 199 } | 198 } |
| 200 } | 199 } |
| 201 | 200 |
| 202 TEST_F(PrioritizedDispatcherTest, AddAFIFO) { | 201 TEST_F(PrioritizedDispatcherTest, AddAFIFO) { |
| 203 // Allow only one running job. | 202 // Allow only one running job. |
| 204 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 203 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 205 Prepare(limits); | 204 Prepare(limits); |
| 206 | 205 |
| 207 TestJob* job_a = AddJob('a', IDLE); | 206 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 208 TestJob* job_b = AddJob('b', IDLE); | 207 scoped_ptr<TestJob> job_b = AddJob('b', IDLE); |
| 209 TestJob* job_c = AddJob('c', IDLE); | 208 scoped_ptr<TestJob> job_c = AddJob('c', IDLE); |
| 210 TestJob* job_d = AddJob('d', IDLE); | 209 scoped_ptr<TestJob> job_d = AddJob('d', IDLE); |
| 211 | 210 |
| 212 ASSERT_TRUE(job_a->running()); | 211 ASSERT_TRUE(job_a->running()); |
| 213 job_a->Finish(); | 212 job_a->Finish(); |
| 214 ASSERT_TRUE(job_b->running()); | 213 ASSERT_TRUE(job_b->running()); |
| 215 job_b->Finish(); | 214 job_b->Finish(); |
| 216 ASSERT_TRUE(job_c->running()); | 215 ASSERT_TRUE(job_c->running()); |
| 217 job_c->Finish(); | 216 job_c->Finish(); |
| 218 ASSERT_TRUE(job_d->running()); | 217 ASSERT_TRUE(job_d->running()); |
| 219 job_d->Finish(); | 218 job_d->Finish(); |
| 220 | 219 |
| 221 Expect("a.b.c.d."); | 220 Expect("a.b.c.d."); |
| 222 } | 221 } |
| 223 | 222 |
| 224 TEST_F(PrioritizedDispatcherTest, AddPriority) { | 223 TEST_F(PrioritizedDispatcherTest, AddPriority) { |
| 225 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 224 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 226 Prepare(limits); | 225 Prepare(limits); |
| 227 | 226 |
| 228 TestJob* job_a = AddJob('a', IDLE); | 227 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 229 TestJob* job_b = AddJob('b', MEDIUM); | 228 scoped_ptr<TestJob> job_b = AddJob('b', MEDIUM); |
| 230 TestJob* job_c = AddJob('c', HIGHEST); | 229 scoped_ptr<TestJob> job_c = AddJob('c', HIGHEST); |
| 231 TestJob* job_d = AddJob('d', HIGHEST); | 230 scoped_ptr<TestJob> job_d = AddJob('d', HIGHEST); |
| 232 TestJob* job_e = AddJob('e', MEDIUM); | 231 scoped_ptr<TestJob> job_e = AddJob('e', MEDIUM); |
| 233 | 232 |
| 234 ASSERT_TRUE(job_a->running()); | 233 ASSERT_TRUE(job_a->running()); |
| 235 job_a->Finish(); | 234 job_a->Finish(); |
| 236 ASSERT_TRUE(job_c->running()); | 235 ASSERT_TRUE(job_c->running()); |
| 237 job_c->Finish(); | 236 job_c->Finish(); |
| 238 ASSERT_TRUE(job_d->running()); | 237 ASSERT_TRUE(job_d->running()); |
| 239 job_d->Finish(); | 238 job_d->Finish(); |
| 240 ASSERT_TRUE(job_b->running()); | 239 ASSERT_TRUE(job_b->running()); |
| 241 job_b->Finish(); | 240 job_b->Finish(); |
| 242 ASSERT_TRUE(job_e->running()); | 241 ASSERT_TRUE(job_e->running()); |
| 243 job_e->Finish(); | 242 job_e->Finish(); |
| 244 | 243 |
| 245 Expect("a.c.d.b.e."); | 244 Expect("a.c.d.b.e."); |
| 246 } | 245 } |
| 247 | 246 |
| 248 TEST_F(PrioritizedDispatcherTest, AddAtHead) { | 247 TEST_F(PrioritizedDispatcherTest, AddAtHead) { |
| 249 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 248 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 250 Prepare(limits); | 249 Prepare(limits); |
| 251 | 250 |
| 252 TestJob* job_a = AddJob('a', MEDIUM); | 251 scoped_ptr<TestJob> job_a = AddJob('a', MEDIUM); |
| 253 TestJob* job_b = AddJobAtHead('b', MEDIUM); | 252 scoped_ptr<TestJob> job_b = AddJobAtHead('b', MEDIUM); |
| 254 TestJob* job_c = AddJobAtHead('c', HIGHEST); | 253 scoped_ptr<TestJob> job_c = AddJobAtHead('c', HIGHEST); |
| 255 TestJob* job_d = AddJobAtHead('d', HIGHEST); | 254 scoped_ptr<TestJob> job_d = AddJobAtHead('d', HIGHEST); |
| 256 TestJob* job_e = AddJobAtHead('e', MEDIUM); | 255 scoped_ptr<TestJob> job_e = AddJobAtHead('e', MEDIUM); |
| 257 TestJob* job_f = AddJob('f', MEDIUM); | 256 scoped_ptr<TestJob> job_f = AddJob('f', MEDIUM); |
| 258 | 257 |
| 259 ASSERT_TRUE(job_a->running()); | 258 ASSERT_TRUE(job_a->running()); |
| 260 job_a->Finish(); | 259 job_a->Finish(); |
| 261 ASSERT_TRUE(job_d->running()); | 260 ASSERT_TRUE(job_d->running()); |
| 262 job_d->Finish(); | 261 job_d->Finish(); |
| 263 ASSERT_TRUE(job_c->running()); | 262 ASSERT_TRUE(job_c->running()); |
| 264 job_c->Finish(); | 263 job_c->Finish(); |
| 265 ASSERT_TRUE(job_e->running()); | 264 ASSERT_TRUE(job_e->running()); |
| 266 job_e->Finish(); | 265 job_e->Finish(); |
| 267 ASSERT_TRUE(job_b->running()); | 266 ASSERT_TRUE(job_b->running()); |
| 268 job_b->Finish(); | 267 job_b->Finish(); |
| 269 ASSERT_TRUE(job_f->running()); | 268 ASSERT_TRUE(job_f->running()); |
| 270 job_f->Finish(); | 269 job_f->Finish(); |
| 271 | 270 |
| 272 Expect("a.d.c.e.b.f."); | 271 Expect("a.d.c.e.b.f."); |
| 273 } | 272 } |
| 274 | 273 |
| 275 TEST_F(PrioritizedDispatcherTest, EnforceLimits) { | 274 TEST_F(PrioritizedDispatcherTest, EnforceLimits) { |
| 276 // Reserve 2 for HIGHEST and 1 for LOW or higher. | 275 // Reserve 2 for HIGHEST and 1 for LOW or higher. |
| 277 // This leaves 2 for LOWEST or lower. | 276 // This leaves 2 for LOWEST or lower. |
| 278 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 5); | 277 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 5); |
| 279 limits.reserved_slots[HIGHEST] = 2; | 278 limits.reserved_slots[HIGHEST] = 2; |
| 280 limits.reserved_slots[LOW] = 1; | 279 limits.reserved_slots[LOW] = 1; |
| 281 Prepare(limits); | 280 Prepare(limits); |
| 282 | 281 |
| 283 TestJob* job_a = AddJob('a', IDLE); // Uses unreserved slot. | 282 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); // Uses unreserved slot. |
| 284 TestJob* job_b = AddJob('b', IDLE); // Uses unreserved slot. | 283 scoped_ptr<TestJob> job_b = AddJob('b', IDLE); // Uses unreserved slot. |
| 285 TestJob* job_c = AddJob('c', LOWEST); // Must wait. | 284 scoped_ptr<TestJob> job_c = AddJob('c', LOWEST); // Must wait. |
| 286 TestJob* job_d = AddJob('d', LOW); // Uses reserved slot. | 285 scoped_ptr<TestJob> job_d = AddJob('d', LOW); // Uses reserved slot. |
| 287 TestJob* job_e = AddJob('e', MEDIUM); // Must wait. | 286 scoped_ptr<TestJob> job_e = AddJob('e', MEDIUM); // Must wait. |
| 288 TestJob* job_f = AddJob('f', HIGHEST); // Uses reserved slot. | 287 scoped_ptr<TestJob> job_f = AddJob('f', HIGHEST); // Uses reserved slot. |
| 289 TestJob* job_g = AddJob('g', HIGHEST); // Uses reserved slot. | 288 scoped_ptr<TestJob> job_g = AddJob('g', HIGHEST); // Uses reserved slot. |
| 290 TestJob* job_h = AddJob('h', HIGHEST); // Must wait. | 289 scoped_ptr<TestJob> job_h = AddJob('h', HIGHEST); // Must wait. |
| 291 | 290 |
| 292 EXPECT_EQ(5u, dispatcher_->num_running_jobs()); | 291 EXPECT_EQ(5u, dispatcher_->num_running_jobs()); |
| 293 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); | 292 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); |
| 294 | 293 |
| 295 ASSERT_TRUE(job_a->running()); | 294 ASSERT_TRUE(job_a->running()); |
| 296 ASSERT_TRUE(job_b->running()); | 295 ASSERT_TRUE(job_b->running()); |
| 297 ASSERT_TRUE(job_d->running()); | 296 ASSERT_TRUE(job_d->running()); |
| 298 ASSERT_TRUE(job_f->running()); | 297 ASSERT_TRUE(job_f->running()); |
| 299 ASSERT_TRUE(job_g->running()); | 298 ASSERT_TRUE(job_g->running()); |
| 300 // a, b, d, f, g are running. Finish them in any order. | 299 // a, b, d, f, g are running. Finish them in any order. |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 313 | 312 |
| 314 Expect("abdfg.h...e..c.."); | 313 Expect("abdfg.h...e..c.."); |
| 315 } | 314 } |
| 316 | 315 |
| 317 TEST_F(PrioritizedDispatcherTest, ChangePriority) { | 316 TEST_F(PrioritizedDispatcherTest, ChangePriority) { |
| 318 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 2); | 317 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 2); |
| 319 // Reserve one slot only for HIGHEST priority requests. | 318 // Reserve one slot only for HIGHEST priority requests. |
| 320 limits.reserved_slots[HIGHEST] = 1; | 319 limits.reserved_slots[HIGHEST] = 1; |
| 321 Prepare(limits); | 320 Prepare(limits); |
| 322 | 321 |
| 323 TestJob* job_a = AddJob('a', IDLE); | 322 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 324 TestJob* job_b = AddJob('b', LOW); | 323 scoped_ptr<TestJob> job_b = AddJob('b', LOW); |
| 325 TestJob* job_c = AddJob('c', MEDIUM); | 324 scoped_ptr<TestJob> job_c = AddJob('c', MEDIUM); |
| 326 TestJob* job_d = AddJob('d', MEDIUM); | 325 scoped_ptr<TestJob> job_d = AddJob('d', MEDIUM); |
| 327 TestJob* job_e = AddJob('e', IDLE); | 326 scoped_ptr<TestJob> job_e = AddJob('e', IDLE); |
| 328 | 327 |
| 329 ASSERT_FALSE(job_b->running()); | 328 ASSERT_FALSE(job_b->running()); |
| 330 ASSERT_FALSE(job_c->running()); | 329 ASSERT_FALSE(job_c->running()); |
| 331 job_b->ChangePriority(MEDIUM); | 330 job_b->ChangePriority(MEDIUM); |
| 332 job_c->ChangePriority(LOW); | 331 job_c->ChangePriority(LOW); |
| 333 | 332 |
| 334 ASSERT_TRUE(job_a->running()); | 333 ASSERT_TRUE(job_a->running()); |
| 335 job_a->Finish(); | 334 job_a->Finish(); |
| 336 ASSERT_TRUE(job_d->running()); | 335 ASSERT_TRUE(job_d->running()); |
| 337 job_d->Finish(); | 336 job_d->Finish(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 348 ASSERT_TRUE(job_c->running()); | 347 ASSERT_TRUE(job_c->running()); |
| 349 job_c->Finish(); | 348 job_c->Finish(); |
| 350 | 349 |
| 351 Expect("a.d.be..c."); | 350 Expect("a.d.be..c."); |
| 352 } | 351 } |
| 353 | 352 |
| 354 TEST_F(PrioritizedDispatcherTest, Cancel) { | 353 TEST_F(PrioritizedDispatcherTest, Cancel) { |
| 355 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 354 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 356 Prepare(limits); | 355 Prepare(limits); |
| 357 | 356 |
| 358 TestJob* job_a = AddJob('a', IDLE); | 357 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 359 TestJob* job_b = AddJob('b', IDLE); | 358 scoped_ptr<TestJob> job_b = AddJob('b', IDLE); |
| 360 TestJob* job_c = AddJob('c', IDLE); | 359 scoped_ptr<TestJob> job_c = AddJob('c', IDLE); |
| 361 TestJob* job_d = AddJob('d', IDLE); | 360 scoped_ptr<TestJob> job_d = AddJob('d', IDLE); |
| 362 TestJob* job_e = AddJob('e', IDLE); | 361 scoped_ptr<TestJob> job_e = AddJob('e', IDLE); |
| 363 | 362 |
| 364 ASSERT_FALSE(job_b->running()); | 363 ASSERT_FALSE(job_b->running()); |
| 365 ASSERT_FALSE(job_d->running()); | 364 ASSERT_FALSE(job_d->running()); |
| 366 job_b->Cancel(); | 365 job_b->Cancel(); |
| 367 job_d->Cancel(); | 366 job_d->Cancel(); |
| 368 | 367 |
| 369 ASSERT_TRUE(job_a->running()); | 368 ASSERT_TRUE(job_a->running()); |
| 370 job_a->Finish(); | 369 job_a->Finish(); |
| 371 ASSERT_TRUE(job_c->running()); | 370 ASSERT_TRUE(job_c->running()); |
| 372 job_c->Finish(); | 371 job_c->Finish(); |
| 373 ASSERT_TRUE(job_e->running()); | 372 ASSERT_TRUE(job_e->running()); |
| 374 job_e->Finish(); | 373 job_e->Finish(); |
| 375 | 374 |
| 376 Expect("a.c.e."); | 375 Expect("a.c.e."); |
| 377 } | 376 } |
| 378 | 377 |
| 379 TEST_F(PrioritizedDispatcherTest, Evict) { | 378 TEST_F(PrioritizedDispatcherTest, Evict) { |
| 380 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 379 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 381 Prepare(limits); | 380 Prepare(limits); |
| 382 | 381 |
| 383 TestJob* job_a = AddJob('a', IDLE); | 382 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 384 TestJob* job_b = AddJob('b', LOW); | 383 scoped_ptr<TestJob> job_b = AddJob('b', LOW); |
| 385 TestJob* job_c = AddJob('c', HIGHEST); | 384 scoped_ptr<TestJob> job_c = AddJob('c', HIGHEST); |
| 386 TestJob* job_d = AddJob('d', LOW); | 385 scoped_ptr<TestJob> job_d = AddJob('d', LOW); |
| 387 TestJob* job_e = AddJob('e', HIGHEST); | 386 scoped_ptr<TestJob> job_e = AddJob('e', HIGHEST); |
| 388 | 387 |
| 389 EXPECT_EQ(job_b, dispatcher_->EvictOldestLowest()); | 388 EXPECT_EQ(job_b.get(), dispatcher_->EvictOldestLowest()); |
| 390 EXPECT_EQ(job_d, dispatcher_->EvictOldestLowest()); | 389 EXPECT_EQ(job_d.get(), dispatcher_->EvictOldestLowest()); |
| 391 | 390 |
| 392 ASSERT_TRUE(job_a->running()); | 391 ASSERT_TRUE(job_a->running()); |
| 393 job_a->Finish(); | 392 job_a->Finish(); |
| 394 ASSERT_TRUE(job_c->running()); | 393 ASSERT_TRUE(job_c->running()); |
| 395 job_c->Finish(); | 394 job_c->Finish(); |
| 396 ASSERT_TRUE(job_e->running()); | 395 ASSERT_TRUE(job_e->running()); |
| 397 job_e->Finish(); | 396 job_e->Finish(); |
| 398 | 397 |
| 399 Expect("a.c.e."); | 398 Expect("a.c.e."); |
| 400 } | 399 } |
| 401 | 400 |
| 402 TEST_F(PrioritizedDispatcherTest, EvictFromEmpty) { | 401 TEST_F(PrioritizedDispatcherTest, EvictFromEmpty) { |
| 403 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 402 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 404 Prepare(limits); | 403 Prepare(limits); |
| 405 EXPECT_TRUE(dispatcher_->EvictOldestLowest() == NULL); | 404 EXPECT_TRUE(dispatcher_->EvictOldestLowest() == NULL); |
| 406 } | 405 } |
| 407 | 406 |
| 408 TEST_F(PrioritizedDispatcherTest, AddWhileZeroLimits) { | 407 TEST_F(PrioritizedDispatcherTest, AddWhileZeroLimits) { |
| 409 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 2); | 408 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 2); |
| 410 Prepare(limits); | 409 Prepare(limits); |
| 411 | 410 |
| 412 dispatcher_->SetLimitsToZero(); | 411 dispatcher_->SetLimitsToZero(); |
| 413 TestJob* job_a = AddJob('a', LOW); | 412 scoped_ptr<TestJob> job_a = AddJob('a', LOW); |
| 414 TestJob* job_b = AddJob('b', MEDIUM); | 413 scoped_ptr<TestJob> job_b = AddJob('b', MEDIUM); |
| 415 TestJob* job_c = AddJobAtHead('c', MEDIUM); | 414 scoped_ptr<TestJob> job_c = AddJobAtHead('c', MEDIUM); |
| 416 | 415 |
| 417 EXPECT_EQ(0u, dispatcher_->num_running_jobs()); | 416 EXPECT_EQ(0u, dispatcher_->num_running_jobs()); |
| 418 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); | 417 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); |
| 419 | 418 |
| 420 dispatcher_->SetLimits(limits); | 419 dispatcher_->SetLimits(limits); |
| 421 EXPECT_EQ(2u, dispatcher_->num_running_jobs()); | 420 EXPECT_EQ(2u, dispatcher_->num_running_jobs()); |
| 422 EXPECT_EQ(1u, dispatcher_->num_queued_jobs()); | 421 EXPECT_EQ(1u, dispatcher_->num_queued_jobs()); |
| 423 | 422 |
| 424 ASSERT_TRUE(job_b->running()); | 423 ASSERT_TRUE(job_b->running()); |
| 425 job_b->Finish(); | 424 job_b->Finish(); |
| 426 | 425 |
| 427 ASSERT_TRUE(job_c->running()); | 426 ASSERT_TRUE(job_c->running()); |
| 428 job_c->Finish(); | 427 job_c->Finish(); |
| 429 | 428 |
| 430 ASSERT_TRUE(job_a->running()); | 429 ASSERT_TRUE(job_a->running()); |
| 431 job_a->Finish(); | 430 job_a->Finish(); |
| 432 | 431 |
| 433 Expect("cb.a.."); | 432 Expect("cb.a.."); |
| 434 } | 433 } |
| 435 | 434 |
| 436 TEST_F(PrioritizedDispatcherTest, ReduceLimitsWhileJobQueued) { | 435 TEST_F(PrioritizedDispatcherTest, ReduceLimitsWhileJobQueued) { |
| 437 PrioritizedDispatcher::Limits initial_limits(NUM_PRIORITIES, 2); | 436 PrioritizedDispatcher::Limits initial_limits(NUM_PRIORITIES, 2); |
| 438 Prepare(initial_limits); | 437 Prepare(initial_limits); |
| 439 | 438 |
| 440 TestJob* job_a = AddJob('a', MEDIUM); | 439 scoped_ptr<TestJob> job_a = AddJob('a', MEDIUM); |
| 441 TestJob* job_b = AddJob('b', MEDIUM); | 440 scoped_ptr<TestJob> job_b = AddJob('b', MEDIUM); |
| 442 TestJob* job_c = AddJob('c', MEDIUM); | 441 scoped_ptr<TestJob> job_c = AddJob('c', MEDIUM); |
| 443 TestJob* job_d = AddJob('d', MEDIUM); | 442 scoped_ptr<TestJob> job_d = AddJob('d', MEDIUM); |
| 444 TestJob* job_e = AddJob('e', MEDIUM); | 443 scoped_ptr<TestJob> job_e = AddJob('e', MEDIUM); |
| 445 | 444 |
| 446 EXPECT_EQ(2u, dispatcher_->num_running_jobs()); | 445 EXPECT_EQ(2u, dispatcher_->num_running_jobs()); |
| 447 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); | 446 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); |
| 448 | 447 |
| 449 // Reduce limits to just allow one job at a time. Running jobs should not | 448 // Reduce limits to just allow one job at a time. Running jobs should not |
| 450 // be affected. | 449 // be affected. |
| 451 dispatcher_->SetLimits(PrioritizedDispatcher::Limits(NUM_PRIORITIES, 1)); | 450 dispatcher_->SetLimits(PrioritizedDispatcher::Limits(NUM_PRIORITIES, 1)); |
| 452 | 451 |
| 453 EXPECT_EQ(2u, dispatcher_->num_running_jobs()); | 452 EXPECT_EQ(2u, dispatcher_->num_running_jobs()); |
| 454 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); | 453 EXPECT_EQ(3u, dispatcher_->num_queued_jobs()); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 474 ASSERT_TRUE(job_e->running()); | 473 ASSERT_TRUE(job_e->running()); |
| 475 job_e->Finish(); | 474 job_e->Finish(); |
| 476 | 475 |
| 477 Expect("ab..cd.e.."); | 476 Expect("ab..cd.e.."); |
| 478 } | 477 } |
| 479 | 478 |
| 480 TEST_F(PrioritizedDispatcherTest, ZeroLimitsThenCancel) { | 479 TEST_F(PrioritizedDispatcherTest, ZeroLimitsThenCancel) { |
| 481 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 480 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 482 Prepare(limits); | 481 Prepare(limits); |
| 483 | 482 |
| 484 TestJob* job_a = AddJob('a', IDLE); | 483 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 485 TestJob* job_b = AddJob('b', IDLE); | 484 scoped_ptr<TestJob> job_b = AddJob('b', IDLE); |
| 486 TestJob* job_c = AddJob('c', IDLE); | 485 scoped_ptr<TestJob> job_c = AddJob('c', IDLE); |
| 487 dispatcher_->SetLimitsToZero(); | 486 dispatcher_->SetLimitsToZero(); |
| 488 | 487 |
| 489 ASSERT_TRUE(job_a->running()); | 488 ASSERT_TRUE(job_a->running()); |
| 490 EXPECT_FALSE(job_b->running()); | 489 EXPECT_FALSE(job_b->running()); |
| 491 EXPECT_FALSE(job_c->running()); | 490 EXPECT_FALSE(job_c->running()); |
| 492 job_a->Finish(); | 491 job_a->Finish(); |
| 493 | 492 |
| 494 EXPECT_FALSE(job_b->running()); | 493 EXPECT_FALSE(job_b->running()); |
| 495 EXPECT_FALSE(job_c->running()); | 494 EXPECT_FALSE(job_c->running()); |
| 496 | 495 |
| 497 // Cancelling b shouldn't start job c. | 496 // Cancelling b shouldn't start job c. |
| 498 job_b->Cancel(); | 497 job_b->Cancel(); |
| 499 EXPECT_FALSE(job_c->running()); | 498 EXPECT_FALSE(job_c->running()); |
| 500 | 499 |
| 501 // Restoring the limits should start c. | 500 // Restoring the limits should start c. |
| 502 dispatcher_->SetLimits(limits); | 501 dispatcher_->SetLimits(limits); |
| 503 ASSERT_TRUE(job_c->running()); | 502 ASSERT_TRUE(job_c->running()); |
| 504 job_c->Finish(); | 503 job_c->Finish(); |
| 505 | 504 |
| 506 Expect("a.c."); | 505 Expect("a.c."); |
| 507 } | 506 } |
| 508 | 507 |
| 509 TEST_F(PrioritizedDispatcherTest, ZeroLimitsThenIncreasePriority) { | 508 TEST_F(PrioritizedDispatcherTest, ZeroLimitsThenIncreasePriority) { |
| 510 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 2); | 509 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 2); |
| 511 limits.reserved_slots[HIGHEST] = 1; | 510 limits.reserved_slots[HIGHEST] = 1; |
| 512 Prepare(limits); | 511 Prepare(limits); |
| 513 | 512 |
| 514 TestJob* job_a = AddJob('a', IDLE); | 513 scoped_ptr<TestJob> job_a = AddJob('a', IDLE); |
| 515 TestJob* job_b = AddJob('b', IDLE); | 514 scoped_ptr<TestJob> job_b = AddJob('b', IDLE); |
| 516 EXPECT_TRUE(job_a->running()); | 515 EXPECT_TRUE(job_a->running()); |
| 517 EXPECT_FALSE(job_b->running()); | 516 EXPECT_FALSE(job_b->running()); |
| 518 dispatcher_->SetLimitsToZero(); | 517 dispatcher_->SetLimitsToZero(); |
| 519 | 518 |
| 520 job_b->ChangePriority(HIGHEST); | 519 job_b->ChangePriority(HIGHEST); |
| 521 EXPECT_FALSE(job_b->running()); | 520 EXPECT_FALSE(job_b->running()); |
| 522 job_a->Finish(); | 521 job_a->Finish(); |
| 523 EXPECT_FALSE(job_b->running()); | 522 EXPECT_FALSE(job_b->running()); |
| 524 | 523 |
| 525 job_b->Cancel(); | 524 job_b->Cancel(); |
| 526 Expect("a."); | 525 Expect("a."); |
| 527 } | 526 } |
| 528 | 527 |
| 529 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG) | 528 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG) |
| 530 TEST_F(PrioritizedDispatcherTest, CancelNull) { | 529 TEST_F(PrioritizedDispatcherTest, CancelNull) { |
| 531 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 530 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 532 Prepare(limits); | 531 Prepare(limits); |
| 533 EXPECT_DEBUG_DEATH(dispatcher_->Cancel(PrioritizedDispatcher::Handle()), ""); | 532 EXPECT_DEBUG_DEATH(dispatcher_->Cancel(PrioritizedDispatcher::Handle()), ""); |
| 534 } | 533 } |
| 535 | 534 |
| 536 TEST_F(PrioritizedDispatcherTest, CancelMissing) { | 535 TEST_F(PrioritizedDispatcherTest, CancelMissing) { |
| 537 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 536 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 538 Prepare(limits); | 537 Prepare(limits); |
| 539 AddJob('a', IDLE); | 538 AddJob('a', IDLE); |
| 540 TestJob* job_b = AddJob('b', IDLE); | 539 scoped_ptr<TestJob> job_b = AddJob('b', IDLE); |
| 541 PrioritizedDispatcher::Handle handle = job_b->handle(); | 540 PrioritizedDispatcher::Handle handle = job_b->handle(); |
| 542 ASSERT_FALSE(handle.is_null()); | 541 ASSERT_FALSE(handle.is_null()); |
| 543 dispatcher_->Cancel(handle); | 542 dispatcher_->Cancel(handle); |
| 544 EXPECT_DEBUG_DEATH(dispatcher_->Cancel(handle), ""); | 543 EXPECT_DEBUG_DEATH(dispatcher_->Cancel(handle), ""); |
| 545 } | 544 } |
| 546 #endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) | 545 #endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) |
| 547 | 546 |
| 548 } // namespace | 547 } // namespace |
| 549 | 548 |
| 550 } // namespace net | 549 } // namespace net |
| OLD | NEW |