OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/http/http_util.h" | 10 #include "net/http/http_util.h" |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 void ReadLoader(int64 position, int size, uint8* buffer) { | 169 void ReadLoader(int64 position, int size, uint8* buffer) { |
170 loader_->Read(position, size, buffer, | 170 loader_->Read(position, size, buffer, |
171 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); | 171 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); |
172 } | 172 } |
173 | 173 |
174 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. | 174 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. |
175 void VerifyBuffer(uint8* buffer, int pos, int size) { | 175 void VerifyBuffer(uint8* buffer, int pos, int size) { |
176 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); | 176 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); |
177 } | 177 } |
178 | 178 |
179 // Helper method to disallow deferring in |loader_|. | 179 void ConfirmLoaderDeferredState(bool expectedVal) { |
180 void DisallowLoaderDefer() { | 180 EXPECT_EQ(loader_->deferred_, expectedVal); |
181 if (loader_->deferred_) { | |
182 EXPECT_CALL(*url_loader_, setDefersLoading(false)); | |
183 EXPECT_CALL(*this, NetworkCallback()); | |
184 } | |
185 loader_->SetAllowDefer(false); | |
186 } | |
187 | |
188 // Helper method to allow deferring in |loader_|. | |
189 void AllowLoaderDefer() { | |
190 loader_->SetAllowDefer(true); | |
191 } | 181 } |
192 | 182 |
193 MOCK_METHOD1(StartCallback, void(int error)); | 183 MOCK_METHOD1(StartCallback, void(int error)); |
194 MOCK_METHOD1(ReadCallback, void(int error)); | 184 MOCK_METHOD1(ReadCallback, void(int error)); |
195 MOCK_METHOD0(NetworkCallback, void()); | 185 MOCK_METHOD0(NetworkCallback, void()); |
196 | 186 |
197 protected: | 187 protected: |
198 GURL gurl_; | 188 GURL gurl_; |
199 int64 first_position_; | 189 int64 first_position_; |
200 int64 last_position_; | 190 int64 last_position_; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 WebString::fromUTF8(base::StringPrintf("bytes " | 258 WebString::fromUTF8(base::StringPrintf("bytes " |
269 "%d-%d/%d", 1, 10, 1024))); | 259 "%d-%d/%d", 1, 10, 1024))); |
270 response.setExpectedContentLength(10); | 260 response.setExpectedContentLength(10); |
271 response.setHTTPStatusCode(kHttpPartialContent); | 261 response.setHTTPStatusCode(kHttpPartialContent); |
272 loader_->didReceiveResponse(url_loader_, response); | 262 loader_->didReceiveResponse(url_loader_, response); |
273 } | 263 } |
274 | 264 |
275 // Tests the logic of sliding window for data buffering and reading. | 265 // Tests the logic of sliding window for data buffering and reading. |
276 TEST_F(BufferedResourceLoaderTest, BufferAndRead) { | 266 TEST_F(BufferedResourceLoaderTest, BufferAndRead) { |
277 Initialize(kHttpUrl, 10, 29); | 267 Initialize(kHttpUrl, 10, 29); |
| 268 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
278 Start(); | 269 Start(); |
279 PartialResponse(10, 29, 30); | 270 PartialResponse(10, 29, 30); |
280 | 271 |
281 uint8 buffer[10]; | 272 uint8 buffer[10]; |
282 InSequence s; | 273 InSequence s; |
283 | 274 |
284 // Writes 10 bytes and read them back. | 275 // Writes 10 bytes and read them back. |
285 WriteLoader(10, 10); | 276 WriteLoader(10, 10); |
286 EXPECT_CALL(*this, ReadCallback(10)); | 277 EXPECT_CALL(*this, ReadCallback(10)); |
287 ReadLoader(10, 10, buffer); | 278 ReadLoader(10, 10, buffer); |
(...skipping 30 matching lines...) Expand all Loading... |
318 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | 309 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
319 ReadLoader(5, 10, buffer); | 310 ReadLoader(5, 10, buffer); |
320 | 311 |
321 // Try to read beyond the instance size. | 312 // Try to read beyond the instance size. |
322 EXPECT_CALL(*this, ReadCallback(0)); | 313 EXPECT_CALL(*this, ReadCallback(0)); |
323 ReadLoader(30, 10, buffer); | 314 ReadLoader(30, 10, buffer); |
324 } | 315 } |
325 | 316 |
326 TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) { | 317 TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) { |
327 Initialize(kHttpUrl, 10, 0x00FFFFFF); | 318 Initialize(kHttpUrl, 10, 0x00FFFFFF); |
| 319 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
328 Start(); | 320 Start(); |
329 PartialResponse(10, 0x00FFFFFF, 0x01000000); | 321 PartialResponse(10, 0x00FFFFFF, 0x01000000); |
330 | 322 |
331 uint8 buffer[10]; | 323 uint8 buffer[10]; |
332 InSequence s; | 324 InSequence s; |
333 | 325 |
334 // Read very far aheard will get a cache miss. | 326 // Read very far aheard will get a cache miss. |
335 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | 327 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
336 ReadLoader(0x00FFFFFF, 1, buffer); | 328 ReadLoader(0x00FFFFFF, 1, buffer); |
337 | 329 |
(...skipping 23 matching lines...) Expand all Loading... |
361 InSequence s; | 353 InSequence s; |
362 | 354 |
363 ReadLoader(10, 10, buffer); | 355 ReadLoader(10, 10, buffer); |
364 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); | 356 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); |
365 EXPECT_CALL(*this, NetworkCallback()); | 357 EXPECT_CALL(*this, NetworkCallback()); |
366 WebURLError error; | 358 WebURLError error; |
367 error.reason = net::ERR_FAILED; | 359 error.reason = net::ERR_FAILED; |
368 loader_->didFail(url_loader_, error); | 360 loader_->didFail(url_loader_, error); |
369 } | 361 } |
370 | 362 |
371 // Tests the logic of caching data to disk when media is paused. | 363 // Tests the data buffering logic of NeverDefer strategy. |
372 TEST_F(BufferedResourceLoaderTest, AllowDefer_NoDataReceived) { | 364 TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) { |
373 Initialize(kHttpUrl, 10, 99); | 365 Initialize(kHttpUrl, 10, 99); |
374 SetLoaderBuffer(10, 20); | 366 SetLoaderBuffer(10, 20); |
375 Start(); | 367 loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer); |
376 PartialResponse(10, 99, 100); | |
377 | |
378 // Start in undeferred state, then disallow defer, then allow defer | |
379 // without receiving data in between. | |
380 DisallowLoaderDefer(); | |
381 AllowLoaderDefer(); | |
382 StopWhenLoad(); | |
383 } | |
384 | |
385 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadSameWindow) { | |
386 Initialize(kHttpUrl, 10, 99); | |
387 SetLoaderBuffer(10, 20); | |
388 Start(); | 368 Start(); |
389 PartialResponse(10, 99, 100); | 369 PartialResponse(10, 99, 100); |
390 | 370 |
391 uint8 buffer[10]; | 371 uint8 buffer[10]; |
392 | 372 |
393 // Start in undeferred state, disallow defer, receive data but don't shift | 373 // Read past the buffer size; should not defer regardless. |
394 // buffer window, then allow defer and read. | |
395 DisallowLoaderDefer(); | |
396 WriteLoader(10, 10); | 374 WriteLoader(10, 10); |
397 AllowLoaderDefer(); | 375 WriteLoader(20, 50); |
| 376 ConfirmLoaderDeferredState(false); |
398 | 377 |
399 EXPECT_CALL(*this, ReadCallback(10)); | 378 // Should move past window. |
| 379 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
400 ReadLoader(10, 10, buffer); | 380 ReadLoader(10, 10, buffer); |
401 VerifyBuffer(buffer, 10, 10); | 381 |
402 StopWhenLoad(); | 382 StopWhenLoad(); |
403 } | 383 } |
404 | 384 |
405 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadPastWindow) { | 385 // Tests the data buffering logic of ReadThenDefer strategy. |
| 386 TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) { |
406 Initialize(kHttpUrl, 10, 99); | 387 Initialize(kHttpUrl, 10, 99); |
407 SetLoaderBuffer(10, 20); | 388 SetLoaderBuffer(10, 20); |
| 389 loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer); |
408 Start(); | 390 Start(); |
409 PartialResponse(10, 99, 100); | 391 PartialResponse(10, 99, 100); |
410 | 392 |
411 uint8 buffer[10]; | 393 uint8 buffer[10]; |
412 | 394 |
413 // Not deferred, disallow defer, received data and shift buffer window, | 395 // Make an outstanding read request. |
414 // allow defer, then read in area outside of buffer window. | 396 // We should disable deferring after the read request, so expect |
415 DisallowLoaderDefer(); | 397 // a network event. |
416 WriteLoader(10, 10); | 398 EXPECT_CALL(*this, NetworkCallback()); |
417 WriteLoader(20, 50); | 399 ReadLoader(10, 10, buffer); |
418 AllowLoaderDefer(); | |
419 | 400 |
420 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | 401 // Receive almost enough data to cover, shouldn't defer. |
421 ReadLoader(10, 10, buffer); | 402 WriteLoader(10, 9); |
| 403 ConfirmLoaderDeferredState(false); |
| 404 |
| 405 // As soon as we have received enough data to fulfill the read, defer. |
| 406 EXPECT_CALL(*this, NetworkCallback()); |
| 407 EXPECT_CALL(*this, ReadCallback(10)); |
| 408 WriteLoader(19, 1); |
| 409 |
| 410 ConfirmLoaderDeferredState(true); |
| 411 VerifyBuffer(buffer, 10, 10); |
| 412 |
422 StopWhenLoad(); | 413 StopWhenLoad(); |
423 } | 414 } |
424 | 415 |
425 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredNoDataReceived) { | 416 // Tests the data buffering logic of ThresholdDefer strategy. |
| 417 TEST_F(BufferedResourceLoaderTest, ThresholdDeferStrategy) { |
426 Initialize(kHttpUrl, 10, 99); | 418 Initialize(kHttpUrl, 10, 99); |
427 SetLoaderBuffer(10, 20); | 419 SetLoaderBuffer(10, 20); |
| 420 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
428 Start(); | 421 Start(); |
429 PartialResponse(10, 99, 100); | 422 PartialResponse(10, 99, 100); |
430 | 423 |
431 uint8 buffer[10]; | 424 uint8 buffer[10]; |
432 | 425 |
433 // Start in deferred state, then disallow defer, receive no data, and | 426 WriteLoader(10, 5); |
434 // allow defer and read. | 427 // Haven't reached threshold, don't defer. |
435 EXPECT_CALL(*url_loader_, setDefersLoading(true)); | 428 ConfirmLoaderDeferredState(false); |
| 429 |
| 430 // We're at the threshold now, let's defer. |
436 EXPECT_CALL(*this, NetworkCallback()); | 431 EXPECT_CALL(*this, NetworkCallback()); |
437 WriteLoader(10, 40); | 432 WriteLoader(15, 5); |
| 433 ConfirmLoaderDeferredState(true); |
438 | 434 |
439 DisallowLoaderDefer(); | 435 // Now we've read over half of the buffer, disable deferring. |
440 AllowLoaderDefer(); | 436 EXPECT_CALL(*this, ReadCallback(6)); |
| 437 EXPECT_CALL(*this, NetworkCallback()); |
| 438 ReadLoader(10, 6, buffer); |
441 | 439 |
442 EXPECT_CALL(*this, ReadCallback(10)); | 440 ConfirmLoaderDeferredState(false); |
443 ReadLoader(20, 10, buffer); | 441 VerifyBuffer(buffer, 10, 6); |
444 VerifyBuffer(buffer, 20, 10); | 442 |
445 StopWhenLoad(); | 443 StopWhenLoad(); |
446 } | 444 } |
447 | 445 |
448 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadSameWindow) { | |
449 Initialize(kHttpUrl, 10, 99); | |
450 SetLoaderBuffer(10, 20); | |
451 Start(); | |
452 PartialResponse(10, 99, 100); | |
453 | |
454 uint8 buffer[10]; | |
455 | |
456 // Start in deferred state, disallow defer, receive data and shift buffer | |
457 // window, allow defer, and read in a place that's still in the window. | |
458 EXPECT_CALL(*url_loader_, setDefersLoading(true)); | |
459 EXPECT_CALL(*this, NetworkCallback()); | |
460 WriteLoader(10, 30); | |
461 | |
462 DisallowLoaderDefer(); | |
463 WriteLoader(40, 5); | |
464 AllowLoaderDefer(); | |
465 | |
466 EXPECT_CALL(*this, ReadCallback(10)); | |
467 ReadLoader(20, 10, buffer); | |
468 VerifyBuffer(buffer, 20, 10); | |
469 StopWhenLoad(); | |
470 } | |
471 | |
472 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadPastWindow) { | |
473 Initialize(kHttpUrl, 10, 99); | |
474 SetLoaderBuffer(10, 20); | |
475 Start(); | |
476 PartialResponse(10, 99, 100); | |
477 | |
478 uint8 buffer[10]; | |
479 | |
480 // Start in deferred state, disallow defer, receive data and shift buffer | |
481 // window, allow defer, and read outside of the buffer window. | |
482 EXPECT_CALL(*url_loader_, setDefersLoading(true)); | |
483 EXPECT_CALL(*this, NetworkCallback()); | |
484 WriteLoader(10, 40); | |
485 | |
486 DisallowLoaderDefer(); | |
487 WriteLoader(50, 20); | |
488 WriteLoader(70, 40); | |
489 AllowLoaderDefer(); | |
490 | |
491 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | |
492 ReadLoader(20, 5, buffer); | |
493 StopWhenLoad(); | |
494 } | |
495 | |
496 // NOTE: This test will need to be reworked a little once | 446 // NOTE: This test will need to be reworked a little once |
497 // http://code.google.com/p/chromium/issues/detail?id=72578 | 447 // http://code.google.com/p/chromium/issues/detail?id=72578 |
498 // is fixed. | 448 // is fixed. |
499 TEST_F(BufferedResourceLoaderTest, HasSingleOrigin) { | 449 TEST_F(BufferedResourceLoaderTest, HasSingleOrigin) { |
500 // Make sure no redirect case works as expected. | 450 // Make sure no redirect case works as expected. |
501 Initialize(kHttpUrl, -1, -1); | 451 Initialize(kHttpUrl, -1, -1); |
502 Start(); | 452 Start(); |
503 FullResponse(1024); | 453 FullResponse(1024); |
504 EXPECT_TRUE(loader_->HasSingleOrigin()); | 454 EXPECT_TRUE(loader_->HasSingleOrigin()); |
505 StopWhenLoad(); | 455 StopWhenLoad(); |
(...skipping 27 matching lines...) Expand all Loading... |
533 Start(); | 483 Start(); |
534 Redirect(kHttpRedirectToSameDomainUrl1); | 484 Redirect(kHttpRedirectToSameDomainUrl1); |
535 Redirect(kHttpRedirectToDifferentDomainUrl1); | 485 Redirect(kHttpRedirectToDifferentDomainUrl1); |
536 EXPECT_FALSE(loader_->HasSingleOrigin()); | 486 EXPECT_FALSE(loader_->HasSingleOrigin()); |
537 StopWhenLoad(); | 487 StopWhenLoad(); |
538 } | 488 } |
539 | 489 |
540 // TODO(hclam): add unit test for defer loading. | 490 // TODO(hclam): add unit test for defer loading. |
541 | 491 |
542 } // namespace webkit_glue | 492 } // namespace webkit_glue |
OLD | NEW |