| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "base/stringprintf.h" | 11 #include "base/stringprintf.h" |
| 12 #include "media/base/media_log.h" | 12 #include "media/base/media_log.h" |
| 13 #include "media/base/seekable_buffer.h" | 13 #include "media/base/seekable_buffer.h" |
| 14 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
| 15 #include "net/http/http_request_headers.h" | 15 #include "net/http/http_request_headers.h" |
| 16 #include "net/http/http_util.h" | 16 #include "net/http/http_util.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
| 20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLError.
h" | 20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLError.
h" |
| 21 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques
t.h" | 21 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques
t.h" |
| 22 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLRespon
se.h" | 22 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLRespon
se.h" |
| 23 #include "webkit/media/buffered_resource_loader.h" | 23 #include "webkit/media/buffered_resource_loader.h" |
| 24 #include "webkit/mocks/mock_webframeclient.h" | 24 #include "webkit/mocks/mock_webframeclient.h" |
| 25 #include "webkit/mocks/mock_weburlloader.h" | 25 #include "webkit/mocks/mock_weburlloader.h" |
| 26 | 26 |
| 27 using ::testing::_; |
| 27 using ::testing::InSequence; | 28 using ::testing::InSequence; |
| 28 using ::testing::Return; | 29 using ::testing::Return; |
| 29 using ::testing::Truly; | 30 using ::testing::Truly; |
| 30 using ::testing::NiceMock; | 31 using ::testing::NiceMock; |
| 31 | 32 |
| 32 using WebKit::WebString; | 33 using WebKit::WebString; |
| 33 using WebKit::WebURLError; | 34 using WebKit::WebURLError; |
| 34 using WebKit::WebURLResponse; | 35 using WebKit::WebURLResponse; |
| 35 using WebKit::WebView; | 36 using WebKit::WebView; |
| 36 | 37 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 void SetLoaderBuffer(int forward_capacity, int backward_capacity) { | 98 void SetLoaderBuffer(int forward_capacity, int backward_capacity) { |
| 98 loader_->buffer_.set_forward_capacity(forward_capacity); | 99 loader_->buffer_.set_forward_capacity(forward_capacity); |
| 99 loader_->buffer_.set_backward_capacity(backward_capacity); | 100 loader_->buffer_.set_backward_capacity(backward_capacity); |
| 100 loader_->buffer_.Clear(); | 101 loader_->buffer_.Clear(); |
| 101 } | 102 } |
| 102 | 103 |
| 103 void Start() { | 104 void Start() { |
| 104 InSequence s; | 105 InSequence s; |
| 105 EXPECT_CALL(*url_loader_, loadAsynchronously(Truly(CorrectAcceptEncoding), | 106 EXPECT_CALL(*url_loader_, loadAsynchronously(Truly(CorrectAcceptEncoding), |
| 106 loader_.get())); | 107 loader_.get())); |
| 108 |
| 109 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 107 loader_->Start( | 110 loader_->Start( |
| 108 base::Bind(&BufferedResourceLoaderTest::StartCallback, | 111 base::Bind(&BufferedResourceLoaderTest::StartCallback, |
| 109 base::Unretained(this)), | 112 base::Unretained(this)), |
| 110 base::Bind(&BufferedResourceLoaderTest::NetworkCallback, | 113 base::Bind(&BufferedResourceLoaderTest::LoadingCallback, |
| 114 base::Unretained(this)), |
| 115 base::Bind(&BufferedResourceLoaderTest::ProgressCallback, |
| 111 base::Unretained(this)), | 116 base::Unretained(this)), |
| 112 view_->mainFrame()); | 117 view_->mainFrame()); |
| 113 } | 118 } |
| 114 | 119 |
| 115 void FullResponse(int64 instance_size) { | 120 void FullResponse(int64 instance_size) { |
| 116 FullResponse(instance_size, BufferedResourceLoader::kOk); | 121 FullResponse(instance_size, BufferedResourceLoader::kOk); |
| 117 } | 122 } |
| 118 | 123 |
| 119 void FullResponse(int64 instance_size, | 124 void FullResponse(int64 instance_size, |
| 120 BufferedResourceLoader::Status status) { | 125 BufferedResourceLoader::Status status) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 | 201 |
| 197 void StopWhenLoad() { | 202 void StopWhenLoad() { |
| 198 InSequence s; | 203 InSequence s; |
| 199 EXPECT_CALL(*url_loader_, cancel()); | 204 EXPECT_CALL(*url_loader_, cancel()); |
| 200 loader_->Stop(); | 205 loader_->Stop(); |
| 201 loader_.reset(); | 206 loader_.reset(); |
| 202 } | 207 } |
| 203 | 208 |
| 204 // Helper method to write to |loader_| from |data_|. | 209 // Helper method to write to |loader_| from |data_|. |
| 205 void WriteLoader(int position, int size) { | 210 void WriteLoader(int position, int size) { |
| 206 EXPECT_CALL(*this, NetworkCallback()) | 211 EXPECT_CALL(*this, ProgressCallback(position + size - 1)); |
| 207 .RetiresOnSaturation(); | |
| 208 loader_->didReceiveData(url_loader_, | 212 loader_->didReceiveData(url_loader_, |
| 209 reinterpret_cast<char*>(data_ + position), | 213 reinterpret_cast<char*>(data_ + position), |
| 210 size, | 214 size, |
| 211 size); | 215 size); |
| 212 } | 216 } |
| 213 | 217 |
| 214 void WriteData(int size) { | 218 void WriteData(int size) { |
| 215 EXPECT_CALL(*this, NetworkCallback()) | 219 EXPECT_CALL(*this, ProgressCallback(_)); |
| 216 .RetiresOnSaturation(); | |
| 217 | 220 |
| 218 scoped_array<char> data(new char[size]); | 221 scoped_array<char> data(new char[size]); |
| 219 loader_->didReceiveData(url_loader_, data.get(), size, size); | 222 loader_->didReceiveData(url_loader_, data.get(), size, size); |
| 220 } | 223 } |
| 221 | 224 |
| 222 void WriteUntilThreshold() { | 225 void WriteUntilThreshold() { |
| 223 int buffered = loader_->buffer_.forward_bytes(); | 226 int buffered = loader_->buffer_.forward_bytes(); |
| 224 int capacity = loader_->buffer_.forward_capacity(); | 227 int capacity = loader_->buffer_.forward_capacity(); |
| 225 CHECK_LT(buffered, capacity); | 228 CHECK_LT(buffered, capacity); |
| 226 | 229 |
| 227 EXPECT_CALL(*this, NetworkCallback()); | 230 EXPECT_CALL(*this, LoadingCallback( |
| 231 BufferedResourceLoader::kLoadingDeferred)); |
| 228 WriteData(capacity - buffered); | 232 WriteData(capacity - buffered); |
| 229 ConfirmLoaderDeferredState(true); | |
| 230 } | 233 } |
| 231 | 234 |
| 232 // Helper method to read from |loader_|. | 235 // Helper method to read from |loader_|. |
| 233 void ReadLoader(int64 position, int size, uint8* buffer) { | 236 void ReadLoader(int64 position, int size, uint8* buffer) { |
| 234 loader_->Read(position, size, buffer, | 237 loader_->Read(position, size, buffer, |
| 235 base::Bind(&BufferedResourceLoaderTest::ReadCallback, | 238 base::Bind(&BufferedResourceLoaderTest::ReadCallback, |
| 236 base::Unretained(this))); | 239 base::Unretained(this))); |
| 237 } | 240 } |
| 238 | 241 |
| 239 // Verifies that data in buffer[0...size] is equal to data_[pos...pos+size]. | 242 // Verifies that data in buffer[0...size] is equal to data_[pos...pos+size]. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 261 | 264 |
| 262 void ConfirmLoaderBufferBackwardCapacity(int expected_backward_capacity) { | 265 void ConfirmLoaderBufferBackwardCapacity(int expected_backward_capacity) { |
| 263 EXPECT_EQ(loader_->buffer_.backward_capacity(), | 266 EXPECT_EQ(loader_->buffer_.backward_capacity(), |
| 264 expected_backward_capacity); | 267 expected_backward_capacity); |
| 265 } | 268 } |
| 266 | 269 |
| 267 void ConfirmLoaderBufferForwardCapacity(int expected_forward_capacity) { | 270 void ConfirmLoaderBufferForwardCapacity(int expected_forward_capacity) { |
| 268 EXPECT_EQ(loader_->buffer_.forward_capacity(), expected_forward_capacity); | 271 EXPECT_EQ(loader_->buffer_.forward_capacity(), expected_forward_capacity); |
| 269 } | 272 } |
| 270 | 273 |
| 271 void ConfirmLoaderDeferredState(bool expectedVal) { | |
| 272 EXPECT_EQ(loader_->active_loader_->deferred(), expectedVal); | |
| 273 } | |
| 274 | |
| 275 // Makes sure the |loader_| buffer window is in a reasonable range. | 274 // Makes sure the |loader_| buffer window is in a reasonable range. |
| 276 void CheckBufferWindowBounds() { | 275 void CheckBufferWindowBounds() { |
| 277 // Corresponds to value defined in buffered_resource_loader.cc. | 276 // Corresponds to value defined in buffered_resource_loader.cc. |
| 278 static const int kMinBufferCapacity = 2 * 1024 * 1024; | 277 static const int kMinBufferCapacity = 2 * 1024 * 1024; |
| 279 EXPECT_GE(loader_->buffer_.forward_capacity(), kMinBufferCapacity); | 278 EXPECT_GE(loader_->buffer_.forward_capacity(), kMinBufferCapacity); |
| 280 EXPECT_GE(loader_->buffer_.backward_capacity(), kMinBufferCapacity); | 279 EXPECT_GE(loader_->buffer_.backward_capacity(), kMinBufferCapacity); |
| 281 | 280 |
| 282 // Corresponds to value defined in buffered_resource_loader.cc. | 281 // Corresponds to value defined in buffered_resource_loader.cc. |
| 283 static const int kMaxBufferCapacity = 20 * 1024 * 1024; | 282 static const int kMaxBufferCapacity = 20 * 1024 * 1024; |
| 284 EXPECT_LE(loader_->buffer_.forward_capacity(), kMaxBufferCapacity); | 283 EXPECT_LE(loader_->buffer_.forward_capacity(), kMaxBufferCapacity); |
| 285 EXPECT_LE(loader_->buffer_.backward_capacity(), kMaxBufferCapacity); | 284 EXPECT_LE(loader_->buffer_.backward_capacity(), kMaxBufferCapacity); |
| 286 } | 285 } |
| 287 | 286 |
| 288 MOCK_METHOD1(StartCallback, void(BufferedResourceLoader::Status)); | 287 MOCK_METHOD1(StartCallback, void(BufferedResourceLoader::Status)); |
| 289 MOCK_METHOD2(ReadCallback, void(BufferedResourceLoader::Status, int)); | 288 MOCK_METHOD2(ReadCallback, void(BufferedResourceLoader::Status, int)); |
| 290 MOCK_METHOD0(NetworkCallback, void()); | 289 MOCK_METHOD1(LoadingCallback, void(BufferedResourceLoader::LoadingState)); |
| 290 MOCK_METHOD1(ProgressCallback, void(int64)); |
| 291 | 291 |
| 292 // Accessors for private variables on |loader_|. | 292 // Accessors for private variables on |loader_|. |
| 293 int forward_bytes() { return loader_->buffer_.forward_bytes(); } | 293 int forward_bytes() { return loader_->buffer_.forward_bytes(); } |
| 294 int forward_capacity() { return loader_->buffer_.forward_capacity(); } | 294 int forward_capacity() { return loader_->buffer_.forward_capacity(); } |
| 295 | 295 |
| 296 protected: | 296 protected: |
| 297 GURL gurl_; | 297 GURL gurl_; |
| 298 int64 first_position_; | 298 int64 first_position_; |
| 299 int64 last_position_; | 299 int64 last_position_; |
| 300 | 300 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 // Read backward within buffer. | 422 // Read backward within buffer. |
| 423 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); | 423 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); |
| 424 ReadLoader(10, 10, buffer); | 424 ReadLoader(10, 10, buffer); |
| 425 VerifyBuffer(buffer, 10, 10); | 425 VerifyBuffer(buffer, 10, 10); |
| 426 | 426 |
| 427 // Read backward outside buffer. | 427 // Read backward outside buffer. |
| 428 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); | 428 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); |
| 429 ReadLoader(9, 10, buffer); | 429 ReadLoader(9, 10, buffer); |
| 430 | 430 |
| 431 // Response has completed. | 431 // Response has completed. |
| 432 EXPECT_CALL(*this, NetworkCallback()); | 432 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingFinished)); |
| 433 loader_->didFinishLoading(url_loader_, 0); | 433 loader_->didFinishLoading(url_loader_, 0); |
| 434 | 434 |
| 435 // Try to read 10 from position 25 will just return with 5 bytes. | 435 // Try to read 10 from position 25 will just return with 5 bytes. |
| 436 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 5)); | 436 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 5)); |
| 437 ReadLoader(25, 10, buffer); | 437 ReadLoader(25, 10, buffer); |
| 438 VerifyBuffer(buffer, 25, 5); | 438 VerifyBuffer(buffer, 25, 5); |
| 439 | 439 |
| 440 // Try to read outside buffered range after request has completed. | 440 // Try to read outside buffered range after request has completed. |
| 441 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); | 441 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); |
| 442 ReadLoader(5, 10, buffer); | 442 ReadLoader(5, 10, buffer); |
| 443 | 443 |
| 444 // Try to read beyond the instance size. | 444 // Try to read beyond the instance size. |
| 445 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 0)); | 445 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 0)); |
| 446 ReadLoader(30, 10, buffer); | 446 ReadLoader(30, 10, buffer); |
| 447 } | 447 } |
| 448 | 448 |
| 449 // Tests the logic of expanding the data buffer for large reads. | 449 // Tests the logic of expanding the data buffer for large reads. |
| 450 TEST_F(BufferedResourceLoaderTest, ReadExtendBuffer) { | 450 TEST_F(BufferedResourceLoaderTest, ReadExtendBuffer) { |
| 451 Initialize(kHttpUrl, 10, 0x014FFFFFF); | 451 Initialize(kHttpUrl, 10, 0x014FFFFFF); |
| 452 SetLoaderBuffer(10, 20); | 452 SetLoaderBuffer(10, 20); |
| 453 Start(); | 453 Start(); |
| 454 PartialResponse(10, 0x014FFFFFF, 0x015000000); | 454 PartialResponse(10, 0x014FFFFFF, 0x015000000); |
| 455 | 455 |
| 456 // Don't test for network callbacks (covered by *Strategy tests). | |
| 457 EXPECT_CALL(*this, NetworkCallback()) | |
| 458 .WillRepeatedly(Return()); | |
| 459 | |
| 460 uint8 buffer[20]; | 456 uint8 buffer[20]; |
| 461 InSequence s; | 457 InSequence s; |
| 462 | 458 |
| 463 // Write more than forward capacity and read it back. Ensure forward capacity | 459 // Write more than forward capacity and read it back. Ensure forward capacity |
| 464 // gets reset. | 460 // gets reset after reading. |
| 461 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingDeferred)); |
| 465 WriteLoader(10, 20); | 462 WriteLoader(10, 20); |
| 463 |
| 466 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 20)); | 464 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 20)); |
| 465 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 467 ReadLoader(10, 20, buffer); | 466 ReadLoader(10, 20, buffer); |
| 468 | 467 |
| 469 VerifyBuffer(buffer, 10, 20); | 468 VerifyBuffer(buffer, 10, 20); |
| 470 ConfirmLoaderBufferForwardCapacity(10); | 469 ConfirmLoaderBufferForwardCapacity(10); |
| 471 | 470 |
| 472 // Make and outstanding read request larger than forward capacity. Ensure | 471 // Make and outstanding read request larger than forward capacity. Ensure |
| 473 // forward capacity gets extended. | 472 // forward capacity gets extended. |
| 474 ReadLoader(30, 20, buffer); | 473 ReadLoader(30, 20, buffer); |
| 475 | |
| 476 ConfirmLoaderBufferForwardCapacity(20); | 474 ConfirmLoaderBufferForwardCapacity(20); |
| 477 | 475 |
| 478 // Fulfill outstanding request. Ensure forward capacity gets reset. | 476 // Fulfill outstanding request. Ensure forward capacity gets reset. |
| 479 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 20)); | 477 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 20)); |
| 480 WriteLoader(30, 20); | 478 WriteLoader(30, 20); |
| 481 | 479 |
| 482 VerifyBuffer(buffer, 30, 20); | 480 VerifyBuffer(buffer, 30, 20); |
| 483 ConfirmLoaderBufferForwardCapacity(10); | 481 ConfirmLoaderBufferForwardCapacity(10); |
| 484 | 482 |
| 485 // Try to read further ahead than kForwardWaitThreshold allows. Ensure | 483 // Try to read further ahead than kForwardWaitThreshold allows. Ensure |
| (...skipping 30 matching lines...) Expand all Loading... |
| 516 ReadLoader(10, 10, buffer); | 514 ReadLoader(10, 10, buffer); |
| 517 | 515 |
| 518 // Writing to loader will fulfill the read request. | 516 // Writing to loader will fulfill the read request. |
| 519 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); | 517 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); |
| 520 WriteLoader(10, 20); | 518 WriteLoader(10, 20); |
| 521 VerifyBuffer(buffer, 10, 10); | 519 VerifyBuffer(buffer, 10, 10); |
| 522 | 520 |
| 523 // The following call cannot be fulfilled now. | 521 // The following call cannot be fulfilled now. |
| 524 ReadLoader(25, 10, buffer); | 522 ReadLoader(25, 10, buffer); |
| 525 | 523 |
| 526 EXPECT_CALL(*this, NetworkCallback()); | 524 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingFinished)); |
| 527 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 5)); | 525 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 5)); |
| 528 loader_->didFinishLoading(url_loader_, 0); | 526 loader_->didFinishLoading(url_loader_, 0); |
| 529 } | 527 } |
| 530 | 528 |
| 531 TEST_F(BufferedResourceLoaderTest, RequestFailedWhenRead) { | 529 TEST_F(BufferedResourceLoaderTest, RequestFailedWhenRead) { |
| 532 Initialize(kHttpUrl, 10, 29); | 530 Initialize(kHttpUrl, 10, 29); |
| 533 Start(); | 531 Start(); |
| 534 PartialResponse(10, 29, 30); | 532 PartialResponse(10, 29, 30); |
| 535 | 533 |
| 536 uint8 buffer[10]; | 534 uint8 buffer[10]; |
| 537 InSequence s; | 535 InSequence s; |
| 538 | 536 |
| 539 // We should convert any error we receive to BufferedResourceLoader::kFailed. | 537 // We should convert any error we receive to BufferedResourceLoader::kFailed. |
| 540 ReadLoader(10, 10, buffer); | 538 ReadLoader(10, 10, buffer); |
| 541 EXPECT_CALL(*this, NetworkCallback()); | 539 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingFailed)); |
| 542 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kFailed, 0)); | 540 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kFailed, 0)); |
| 543 WebURLError error; | 541 WebURLError error; |
| 544 error.reason = net::ERR_TIMED_OUT; | 542 error.reason = net::ERR_TIMED_OUT; |
| 545 error.isCancellation = false; | 543 error.isCancellation = false; |
| 546 loader_->didFail(url_loader_, error); | 544 loader_->didFail(url_loader_, error); |
| 547 } | 545 } |
| 548 | 546 |
| 549 TEST_F(BufferedResourceLoaderTest, RequestFailedWithNoPendingReads) { | 547 TEST_F(BufferedResourceLoaderTest, RequestFailedWithNoPendingReads) { |
| 550 Initialize(kHttpUrl, 10, 29); | 548 Initialize(kHttpUrl, 10, 29); |
| 551 Start(); | 549 Start(); |
| 552 PartialResponse(10, 29, 30); | 550 PartialResponse(10, 29, 30); |
| 553 | 551 |
| 554 uint8 buffer[10]; | 552 uint8 buffer[10]; |
| 555 InSequence s; | 553 InSequence s; |
| 556 | 554 |
| 557 // Write enough data so that a read would technically complete had the request | 555 // Write enough data so that a read would technically complete had the request |
| 558 // not failed. | 556 // not failed. |
| 559 WriteLoader(10, 20); | 557 WriteLoader(10, 20); |
| 560 | 558 |
| 561 // Fail without a pending read. | 559 // Fail without a pending read. |
| 562 WebURLError error; | 560 WebURLError error; |
| 563 error.reason = net::ERR_TIMED_OUT; | 561 error.reason = net::ERR_TIMED_OUT; |
| 564 error.isCancellation = false; | 562 error.isCancellation = false; |
| 565 EXPECT_CALL(*this, NetworkCallback()); | 563 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingFailed)); |
| 566 loader_->didFail(url_loader_, error); | 564 loader_->didFail(url_loader_, error); |
| 567 | 565 |
| 568 // Now we should immediately fail any read even if we have data buffered. | 566 // Now we should immediately fail any read even if we have data buffered. |
| 569 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kFailed, 0)); | 567 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kFailed, 0)); |
| 570 ReadLoader(10, 10, buffer); | 568 ReadLoader(10, 10, buffer); |
| 571 } | 569 } |
| 572 | 570 |
| 573 TEST_F(BufferedResourceLoaderTest, RequestCancelledWhenRead) { | 571 TEST_F(BufferedResourceLoaderTest, RequestCancelledWhenRead) { |
| 574 Initialize(kHttpUrl, 10, 29); | 572 Initialize(kHttpUrl, 10, 29); |
| 575 Start(); | 573 Start(); |
| 576 PartialResponse(10, 29, 30); | 574 PartialResponse(10, 29, 30); |
| 577 | 575 |
| 578 uint8 buffer[10]; | 576 uint8 buffer[10]; |
| 579 InSequence s; | 577 InSequence s; |
| 580 | 578 |
| 581 // We should convert any error we receive to BufferedResourceLoader::kFailed. | 579 // We should convert any error we receive to BufferedResourceLoader::kFailed. |
| 582 ReadLoader(10, 10, buffer); | 580 ReadLoader(10, 10, buffer); |
| 583 EXPECT_CALL(*this, NetworkCallback()); | 581 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingFailed)); |
| 584 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kFailed, 0)); | 582 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kFailed, 0)); |
| 585 WebURLError error; | 583 WebURLError error; |
| 586 error.reason = 0; | 584 error.reason = 0; |
| 587 error.isCancellation = true; | 585 error.isCancellation = true; |
| 588 loader_->didFail(url_loader_, error); | 586 loader_->didFail(url_loader_, error); |
| 589 } | 587 } |
| 590 | 588 |
| 591 // Tests the data buffering logic of NeverDefer strategy. | 589 // Tests the data buffering logic of NeverDefer strategy. |
| 592 TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) { | 590 TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) { |
| 593 Initialize(kHttpUrl, 10, 99); | 591 Initialize(kHttpUrl, 10, 99); |
| 594 SetLoaderBuffer(10, 20); | 592 SetLoaderBuffer(10, 20); |
| 595 loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer); | 593 loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer); |
| 596 Start(); | 594 Start(); |
| 597 PartialResponse(10, 99, 100); | 595 PartialResponse(10, 99, 100); |
| 598 | 596 |
| 599 uint8 buffer[10]; | 597 uint8 buffer[10]; |
| 600 | 598 |
| 601 // Read past the buffer size; should not defer regardless. | 599 // Read past the buffer size; should not defer regardless. |
| 602 WriteLoader(10, 10); | 600 WriteLoader(10, 10); |
| 603 WriteLoader(20, 50); | 601 WriteLoader(20, 50); |
| 604 ConfirmLoaderDeferredState(false); | |
| 605 | 602 |
| 606 // Should move past window. | 603 // Should move past window. |
| 607 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); | 604 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); |
| 608 ReadLoader(10, 10, buffer); | 605 ReadLoader(10, 10, buffer); |
| 609 | 606 |
| 610 StopWhenLoad(); | 607 StopWhenLoad(); |
| 611 } | 608 } |
| 612 | 609 |
| 613 // Tests the data buffering logic of ReadThenDefer strategy. | 610 // Tests the data buffering logic of ReadThenDefer strategy. |
| 614 TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) { | 611 TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) { |
| 615 Initialize(kHttpUrl, 10, 99); | 612 Initialize(kHttpUrl, 10, 99); |
| 616 SetLoaderBuffer(10, 20); | 613 SetLoaderBuffer(10, 20); |
| 617 loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer); | 614 loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer); |
| 618 Start(); | 615 Start(); |
| 619 PartialResponse(10, 99, 100); | 616 PartialResponse(10, 99, 100); |
| 620 | 617 |
| 621 uint8 buffer[10]; | 618 uint8 buffer[10]; |
| 622 | 619 |
| 623 // Make an outstanding read request. | 620 // Make an outstanding read request. |
| 624 ReadLoader(10, 10, buffer); | 621 ReadLoader(10, 10, buffer); |
| 625 | 622 |
| 626 // Receive almost enough data to cover, shouldn't defer. | 623 // Receive almost enough data to cover, shouldn't defer. |
| 627 WriteLoader(10, 9); | 624 WriteLoader(10, 9); |
| 628 ConfirmLoaderDeferredState(false); | |
| 629 | 625 |
| 630 // As soon as we have received enough data to fulfill the read, defer. | 626 // As soon as we have received enough data to fulfill the read, defer. |
| 631 EXPECT_CALL(*this, NetworkCallback()); | 627 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingDeferred)); |
| 632 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); | 628 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); |
| 633 WriteLoader(19, 1); | 629 WriteLoader(19, 1); |
| 634 | 630 |
| 635 ConfirmLoaderDeferredState(true); | |
| 636 VerifyBuffer(buffer, 10, 10); | 631 VerifyBuffer(buffer, 10, 10); |
| 637 | 632 |
| 638 // Read again which should disable deferring since there should be nothing | 633 // Read again which should disable deferring since there should be nothing |
| 639 // left in our internal buffer. | 634 // left in our internal buffer. |
| 640 EXPECT_CALL(*this, NetworkCallback()); | 635 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 641 ReadLoader(20, 10, buffer); | 636 ReadLoader(20, 10, buffer); |
| 642 | 637 |
| 643 ConfirmLoaderDeferredState(false); | |
| 644 | |
| 645 // Over-fulfill requested bytes, then deferring should be enabled again. | 638 // Over-fulfill requested bytes, then deferring should be enabled again. |
| 646 EXPECT_CALL(*this, NetworkCallback()); | 639 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingDeferred)); |
| 647 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); | 640 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); |
| 648 WriteLoader(20, 40); | 641 WriteLoader(20, 40); |
| 649 | 642 |
| 650 ConfirmLoaderDeferredState(true); | |
| 651 VerifyBuffer(buffer, 20, 10); | 643 VerifyBuffer(buffer, 20, 10); |
| 652 | 644 |
| 653 // Read far ahead, which should disable deferring. In this case we still have | 645 // Read far ahead, which should disable deferring. In this case we still have |
| 654 // bytes in our internal buffer. | 646 // bytes in our internal buffer. |
| 655 EXPECT_CALL(*this, NetworkCallback()); | 647 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 656 ReadLoader(80, 10, buffer); | 648 ReadLoader(80, 10, buffer); |
| 657 | 649 |
| 658 ConfirmLoaderDeferredState(false); | |
| 659 | |
| 660 // Fulfill requested bytes, then deferring should be enabled again. | 650 // Fulfill requested bytes, then deferring should be enabled again. |
| 661 EXPECT_CALL(*this, NetworkCallback()); | 651 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingDeferred)); |
| 662 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); | 652 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); |
| 663 WriteLoader(60, 40); | 653 WriteLoader(60, 40); |
| 664 | 654 |
| 665 ConfirmLoaderDeferredState(true); | |
| 666 VerifyBuffer(buffer, 80, 10); | 655 VerifyBuffer(buffer, 80, 10); |
| 667 | 656 |
| 668 StopWhenLoad(); | 657 StopWhenLoad(); |
| 669 } | 658 } |
| 670 | 659 |
| 671 // Tests the data buffering logic of ThresholdDefer strategy. | 660 // Tests the data buffering logic of ThresholdDefer strategy. |
| 672 TEST_F(BufferedResourceLoaderTest, ThresholdDeferStrategy) { | 661 TEST_F(BufferedResourceLoaderTest, ThresholdDeferStrategy) { |
| 673 Initialize(kHttpUrl, 10, 99); | 662 Initialize(kHttpUrl, 10, 99); |
| 674 SetLoaderBuffer(10, 20); | 663 SetLoaderBuffer(10, 20); |
| 675 Start(); | 664 Start(); |
| 676 PartialResponse(10, 99, 100); | 665 PartialResponse(10, 99, 100); |
| 677 | 666 |
| 678 uint8 buffer[10]; | 667 uint8 buffer[10]; |
| 679 InSequence s; | 668 InSequence s; |
| 680 | 669 |
| 681 // Initial expectation: we're not deferring. | |
| 682 ConfirmLoaderDeferredState(false); | |
| 683 | |
| 684 // Write half of threshold: keep not deferring. | 670 // Write half of threshold: keep not deferring. |
| 685 WriteData(5); | 671 WriteData(5); |
| 686 ConfirmLoaderDeferredState(false); | |
| 687 | 672 |
| 688 // Write rest of space until threshold: start deferring. | 673 // Write rest of space until threshold: start deferring. |
| 689 EXPECT_CALL(*this, NetworkCallback()); | 674 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingDeferred)); |
| 690 WriteData(5); | 675 WriteData(5); |
| 691 ConfirmLoaderDeferredState(true); | |
| 692 | 676 |
| 693 // Read a little from the buffer: keep deferring. | 677 // Read a little from the buffer: keep deferring. |
| 694 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 1)); | 678 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 1)); |
| 695 ReadLoader(10, 1, buffer); | 679 ReadLoader(10, 1, buffer); |
| 696 ConfirmLoaderDeferredState(true); | |
| 697 | 680 |
| 698 // Read a little more and go under threshold: stop deferring. | 681 // Read a little more and go under threshold: stop deferring. |
| 699 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 4)); | 682 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 4)); |
| 700 EXPECT_CALL(*this, NetworkCallback()); | 683 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 701 ReadLoader(12, 4, buffer); | 684 ReadLoader(12, 4, buffer); |
| 702 ConfirmLoaderDeferredState(false); | |
| 703 | 685 |
| 704 // Write rest of space until threshold: start deferring. | 686 // Write rest of space until threshold: start deferring. |
| 705 EXPECT_CALL(*this, NetworkCallback()); | 687 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoadingDeferred)); |
| 706 WriteData(6); | 688 WriteData(6); |
| 707 ConfirmLoaderDeferredState(true); | |
| 708 | 689 |
| 709 // Read a little from the buffer: keep deferring. | 690 // Read a little from the buffer: keep deferring. |
| 710 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 1)); | 691 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 1)); |
| 711 ReadLoader(16, 1, buffer); | 692 ReadLoader(16, 1, buffer); |
| 712 ConfirmLoaderDeferredState(true); | |
| 713 | 693 |
| 714 StopWhenLoad(); | 694 StopWhenLoad(); |
| 715 } | 695 } |
| 716 | 696 |
| 717 TEST_F(BufferedResourceLoaderTest, Tricky_ReadForwardsPastBuffered) { | 697 TEST_F(BufferedResourceLoaderTest, Tricky_ReadForwardsPastBuffered) { |
| 718 Initialize(kHttpUrl, 10, 99); | 698 Initialize(kHttpUrl, 10, 99); |
| 719 SetLoaderBuffer(10, 10); | 699 SetLoaderBuffer(10, 10); |
| 720 Start(); | 700 Start(); |
| 721 PartialResponse(10, 99, 100); | 701 PartialResponse(10, 99, 100); |
| 722 | 702 |
| 723 uint8 buffer[256]; | 703 uint8 buffer[256]; |
| 724 InSequence s; | 704 InSequence s; |
| 725 | 705 |
| 726 // PRECONDITION | 706 // PRECONDITION |
| 727 WriteUntilThreshold(); | 707 WriteUntilThreshold(); |
| 728 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 1)); | 708 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 1)); |
| 729 ReadLoader(10, 1, buffer); | 709 ReadLoader(10, 1, buffer); |
| 730 ConfirmBufferState(1, 10, 9, 10); | 710 ConfirmBufferState(1, 10, 9, 10); |
| 731 ConfirmLoaderOffsets(11, 0, 0); | 711 ConfirmLoaderOffsets(11, 0, 0); |
| 732 ConfirmLoaderDeferredState(true); | |
| 733 | 712 |
| 734 // *** TRICKY BUSINESS, PT. I *** | 713 // *** TRICKY BUSINESS, PT. I *** |
| 735 // Read past buffered: stop deferring. | 714 // Read past buffered: stop deferring. |
| 736 // | 715 // |
| 737 // In order for the read to complete we must: | 716 // In order for the read to complete we must: |
| 738 // 1) Stop deferring to receive more data. | 717 // 1) Stop deferring to receive more data. |
| 739 // | 718 // |
| 740 // BEFORE | 719 // BEFORE |
| 741 // offset=11 [xxxxxxxxx_] | 720 // offset=11 [xxxxxxxxx_] |
| 742 // ^ ^^^ requested 4 bytes @ offset 20 | 721 // ^ ^^^ requested 4 bytes @ offset 20 |
| 743 // AFTER | 722 // AFTER |
| 744 // offset=24 [__________] | 723 // offset=24 [__________] |
| 745 // | 724 // |
| 746 EXPECT_CALL(*this, NetworkCallback()); | 725 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 747 ReadLoader(20, 4, buffer); | 726 ReadLoader(20, 4, buffer); |
| 748 ConfirmLoaderDeferredState(false); | |
| 749 | 727 |
| 750 // Write a little, make sure we didn't start deferring. | 728 // Write a little, make sure we didn't start deferring. |
| 751 WriteData(2); | 729 WriteData(2); |
| 752 ConfirmLoaderDeferredState(false); | |
| 753 | 730 |
| 754 // Write the rest, read should complete. | 731 // Write the rest, read should complete. |
| 755 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 4)); | 732 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 4)); |
| 756 WriteData(2); | 733 WriteData(2); |
| 757 ConfirmLoaderDeferredState(false); | |
| 758 | 734 |
| 759 // POSTCONDITION | 735 // POSTCONDITION |
| 760 ConfirmBufferState(4, 10, 0, 10); | 736 ConfirmBufferState(4, 10, 0, 10); |
| 761 ConfirmLoaderOffsets(24, 0, 0); | 737 ConfirmLoaderOffsets(24, 0, 0); |
| 762 ConfirmLoaderDeferredState(false); | |
| 763 | 738 |
| 764 StopWhenLoad(); | 739 StopWhenLoad(); |
| 765 } | 740 } |
| 766 | 741 |
| 767 TEST_F(BufferedResourceLoaderTest, Tricky_ReadBackwardsPastBuffered) { | 742 TEST_F(BufferedResourceLoaderTest, Tricky_ReadBackwardsPastBuffered) { |
| 768 Initialize(kHttpUrl, 10, 99); | 743 Initialize(kHttpUrl, 10, 99); |
| 769 SetLoaderBuffer(10, 10); | 744 SetLoaderBuffer(10, 10); |
| 770 Start(); | 745 Start(); |
| 771 PartialResponse(10, 99, 100); | 746 PartialResponse(10, 99, 100); |
| 772 | 747 |
| 773 uint8 buffer[256]; | 748 uint8 buffer[256]; |
| 774 InSequence s; | 749 InSequence s; |
| 775 | 750 |
| 776 // PRECONDITION | 751 // PRECONDITION |
| 777 WriteUntilThreshold(); | 752 WriteUntilThreshold(); |
| 778 ConfirmBufferState(0, 10, 10, 10); | 753 ConfirmBufferState(0, 10, 10, 10); |
| 779 ConfirmLoaderOffsets(10, 0, 0); | 754 ConfirmLoaderOffsets(10, 0, 0); |
| 780 ConfirmLoaderDeferredState(true); | |
| 781 | 755 |
| 782 // *** TRICKY BUSINESS, PT. II *** | 756 // *** TRICKY BUSINESS, PT. II *** |
| 783 // Read backwards a little too much: cache miss. | 757 // Read backwards a little too much: cache miss. |
| 784 // | 758 // |
| 785 // BEFORE | 759 // BEFORE |
| 786 // offset=10 [__________|xxxxxxxxxx] | 760 // offset=10 [__________|xxxxxxxxxx] |
| 787 // ^ ^^^ requested 10 bytes @ offset 9 | 761 // ^ ^^^ requested 10 bytes @ offset 9 |
| 788 // AFTER | 762 // AFTER |
| 789 // offset=10 [__________|xxxxxxxxxx] !!! cache miss !!! | 763 // offset=10 [__________|xxxxxxxxxx] !!! cache miss !!! |
| 790 // | 764 // |
| 791 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); | 765 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); |
| 792 ReadLoader(9, 4, buffer); | 766 ReadLoader(9, 4, buffer); |
| 793 | 767 |
| 794 // POSTCONDITION | 768 // POSTCONDITION |
| 795 ConfirmBufferState(0, 10, 10, 10); | 769 ConfirmBufferState(0, 10, 10, 10); |
| 796 ConfirmLoaderOffsets(10, 0, 0); | 770 ConfirmLoaderOffsets(10, 0, 0); |
| 797 ConfirmLoaderDeferredState(true); | |
| 798 | 771 |
| 799 StopWhenLoad(); | 772 StopWhenLoad(); |
| 800 } | 773 } |
| 801 | 774 |
| 802 TEST_F(BufferedResourceLoaderTest, Tricky_SmallReadWithinThreshold) { | 775 TEST_F(BufferedResourceLoaderTest, Tricky_SmallReadWithinThreshold) { |
| 803 Initialize(kHttpUrl, 10, 99); | 776 Initialize(kHttpUrl, 10, 99); |
| 804 SetLoaderBuffer(10, 10); | 777 SetLoaderBuffer(10, 10); |
| 805 Start(); | 778 Start(); |
| 806 PartialResponse(10, 99, 100); | 779 PartialResponse(10, 99, 100); |
| 807 | 780 |
| 808 uint8 buffer[256]; | 781 uint8 buffer[256]; |
| 809 InSequence s; | 782 InSequence s; |
| 810 | 783 |
| 811 // PRECONDITION | 784 // PRECONDITION |
| 812 WriteUntilThreshold(); | 785 WriteUntilThreshold(); |
| 813 ConfirmBufferState(0, 10, 10, 10); | 786 ConfirmBufferState(0, 10, 10, 10); |
| 814 ConfirmLoaderOffsets(10, 0, 0); | 787 ConfirmLoaderOffsets(10, 0, 0); |
| 815 ConfirmLoaderDeferredState(true); | |
| 816 | 788 |
| 817 // *** TRICKY BUSINESS, PT. III *** | 789 // *** TRICKY BUSINESS, PT. III *** |
| 818 // Read past forward capacity but within threshold: stop deferring. | 790 // Read past forward capacity but within threshold: stop deferring. |
| 819 // | 791 // |
| 820 // In order for the read to complete we must: | 792 // In order for the read to complete we must: |
| 821 // 1) Adjust offset forward to create capacity. | 793 // 1) Adjust offset forward to create capacity. |
| 822 // 2) Stop deferring to receive more data. | 794 // 2) Stop deferring to receive more data. |
| 823 // | 795 // |
| 824 // BEFORE | 796 // BEFORE |
| 825 // offset=10 [xxxxxxxxxx] | 797 // offset=10 [xxxxxxxxxx] |
| 826 // ^^^^ requested 4 bytes @ offset 24 | 798 // ^^^^ requested 4 bytes @ offset 24 |
| 827 // ADJUSTED OFFSET | 799 // ADJUSTED OFFSET |
| 828 // offset=20 [__________] | 800 // offset=20 [__________] |
| 829 // ^^^^ requested 4 bytes @ offset 24 | 801 // ^^^^ requested 4 bytes @ offset 24 |
| 830 // AFTER | 802 // AFTER |
| 831 // offset=28 [__________] | 803 // offset=28 [__________] |
| 832 // | 804 // |
| 833 EXPECT_CALL(*this, NetworkCallback()); | 805 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 834 ReadLoader(24, 4, buffer); | 806 ReadLoader(24, 4, buffer); |
| 835 ConfirmLoaderOffsets(20, 4, 8); | 807 ConfirmLoaderOffsets(20, 4, 8); |
| 836 ConfirmLoaderDeferredState(false); | |
| 837 | 808 |
| 838 // Write a little, make sure we didn't start deferring. | 809 // Write a little, make sure we didn't start deferring. |
| 839 WriteData(4); | 810 WriteData(4); |
| 840 ConfirmLoaderDeferredState(false); | |
| 841 | 811 |
| 842 // Write the rest, read should complete. | 812 // Write the rest, read should complete. |
| 843 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 4)); | 813 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 4)); |
| 844 WriteData(4); | 814 WriteData(4); |
| 845 ConfirmLoaderDeferredState(false); | |
| 846 | 815 |
| 847 // POSTCONDITION | 816 // POSTCONDITION |
| 848 ConfirmBufferState(8, 10, 0, 10); | 817 ConfirmBufferState(8, 10, 0, 10); |
| 849 ConfirmLoaderOffsets(28, 0, 0); | 818 ConfirmLoaderOffsets(28, 0, 0); |
| 850 ConfirmLoaderDeferredState(false); | |
| 851 | 819 |
| 852 StopWhenLoad(); | 820 StopWhenLoad(); |
| 853 } | 821 } |
| 854 | 822 |
| 855 TEST_F(BufferedResourceLoaderTest, Tricky_LargeReadWithinThreshold) { | 823 TEST_F(BufferedResourceLoaderTest, Tricky_LargeReadWithinThreshold) { |
| 856 Initialize(kHttpUrl, 10, 99); | 824 Initialize(kHttpUrl, 10, 99); |
| 857 SetLoaderBuffer(10, 10); | 825 SetLoaderBuffer(10, 10); |
| 858 Start(); | 826 Start(); |
| 859 PartialResponse(10, 99, 100); | 827 PartialResponse(10, 99, 100); |
| 860 | 828 |
| 861 uint8 buffer[256]; | 829 uint8 buffer[256]; |
| 862 InSequence s; | 830 InSequence s; |
| 863 | 831 |
| 864 // PRECONDITION | 832 // PRECONDITION |
| 865 WriteUntilThreshold(); | 833 WriteUntilThreshold(); |
| 866 ConfirmBufferState(0, 10, 10, 10); | 834 ConfirmBufferState(0, 10, 10, 10); |
| 867 ConfirmLoaderOffsets(10, 0, 0); | 835 ConfirmLoaderOffsets(10, 0, 0); |
| 868 ConfirmLoaderDeferredState(true); | |
| 869 | 836 |
| 870 // *** TRICKY BUSINESS, PT. IV *** | 837 // *** TRICKY BUSINESS, PT. IV *** |
| 871 // Read a large amount past forward capacity but within | 838 // Read a large amount past forward capacity but within |
| 872 // threshold: stop deferring. | 839 // threshold: stop deferring. |
| 873 // | 840 // |
| 874 // In order for the read to complete we must: | 841 // In order for the read to complete we must: |
| 875 // 1) Adjust offset forward to create capacity. | 842 // 1) Adjust offset forward to create capacity. |
| 876 // 2) Expand capacity to make sure we don't defer as data arrives. | 843 // 2) Expand capacity to make sure we don't defer as data arrives. |
| 877 // 3) Stop deferring to receive more data. | 844 // 3) Stop deferring to receive more data. |
| 878 // | 845 // |
| 879 // BEFORE | 846 // BEFORE |
| 880 // offset=10 [xxxxxxxxxx] | 847 // offset=10 [xxxxxxxxxx] |
| 881 // ^^^^^^^^^^^^ requested 12 bytes @ offset 24 | 848 // ^^^^^^^^^^^^ requested 12 bytes @ offset 24 |
| 882 // ADJUSTED OFFSET | 849 // ADJUSTED OFFSET |
| 883 // offset=20 [__________] | 850 // offset=20 [__________] |
| 884 // ^^^^^^ ^^^^^^ requested 12 bytes @ offset 24 | 851 // ^^^^^^ ^^^^^^ requested 12 bytes @ offset 24 |
| 885 // ADJUSTED CAPACITY | 852 // ADJUSTED CAPACITY |
| 886 // offset=20 [________________] | 853 // offset=20 [________________] |
| 887 // ^^^^^^^^^^^^ requested 12 bytes @ offset 24 | 854 // ^^^^^^^^^^^^ requested 12 bytes @ offset 24 |
| 888 // AFTER | 855 // AFTER |
| 889 // offset=36 [__________] | 856 // offset=36 [__________] |
| 890 // | 857 // |
| 891 EXPECT_CALL(*this, NetworkCallback()); | 858 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 892 ReadLoader(24, 12, buffer); | 859 ReadLoader(24, 12, buffer); |
| 893 ConfirmLoaderOffsets(20, 4, 16); | 860 ConfirmLoaderOffsets(20, 4, 16); |
| 894 ConfirmBufferState(10, 10, 0, 16); | 861 ConfirmBufferState(10, 10, 0, 16); |
| 895 ConfirmLoaderDeferredState(false); | |
| 896 | 862 |
| 897 // Write a little, make sure we didn't start deferring. | 863 // Write a little, make sure we didn't start deferring. |
| 898 WriteData(10); | 864 WriteData(10); |
| 899 ConfirmLoaderDeferredState(false); | |
| 900 | 865 |
| 901 // Write the rest, read should complete and capacity should go back to normal. | 866 // Write the rest, read should complete and capacity should go back to normal. |
| 902 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 12)); | 867 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 12)); |
| 903 WriteData(6); | 868 WriteData(6); |
| 904 ConfirmLoaderBufferForwardCapacity(10); | 869 ConfirmLoaderBufferForwardCapacity(10); |
| 905 ConfirmLoaderDeferredState(false); | |
| 906 | 870 |
| 907 // POSTCONDITION | 871 // POSTCONDITION |
| 908 ConfirmBufferState(6, 10, 0, 10); | 872 ConfirmBufferState(6, 10, 0, 10); |
| 909 ConfirmLoaderOffsets(36, 0, 0); | 873 ConfirmLoaderOffsets(36, 0, 0); |
| 910 ConfirmLoaderDeferredState(false); | |
| 911 | 874 |
| 912 StopWhenLoad(); | 875 StopWhenLoad(); |
| 913 } | 876 } |
| 914 | 877 |
| 915 TEST_F(BufferedResourceLoaderTest, Tricky_LargeReadBackwards) { | 878 TEST_F(BufferedResourceLoaderTest, Tricky_LargeReadBackwards) { |
| 916 Initialize(kHttpUrl, 10, 99); | 879 Initialize(kHttpUrl, 10, 99); |
| 917 SetLoaderBuffer(10, 10); | 880 SetLoaderBuffer(10, 10); |
| 918 Start(); | 881 Start(); |
| 919 PartialResponse(10, 99, 100); | 882 PartialResponse(10, 99, 100); |
| 920 | 883 |
| 921 uint8 buffer[256]; | 884 uint8 buffer[256]; |
| 922 InSequence s; | 885 InSequence s; |
| 923 | 886 |
| 924 // PRECONDITION | 887 // PRECONDITION |
| 925 WriteUntilThreshold(); | 888 WriteUntilThreshold(); |
| 926 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); | 889 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 10)); |
| 927 EXPECT_CALL(*this, NetworkCallback()); | 890 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 928 ReadLoader(10, 10, buffer); | 891 ReadLoader(10, 10, buffer); |
| 929 WriteUntilThreshold(); | 892 WriteUntilThreshold(); |
| 930 ConfirmBufferState(10, 10, 10, 10); | 893 ConfirmBufferState(10, 10, 10, 10); |
| 931 ConfirmLoaderOffsets(20, 0, 0); | 894 ConfirmLoaderOffsets(20, 0, 0); |
| 932 ConfirmLoaderDeferredState(true); | |
| 933 | 895 |
| 934 // *** TRICKY BUSINESS, PT. V *** | 896 // *** TRICKY BUSINESS, PT. V *** |
| 935 // Read a large amount that involves backwards data: stop deferring. | 897 // Read a large amount that involves backwards data: stop deferring. |
| 936 // | 898 // |
| 937 // In order for the read to complete we must: | 899 // In order for the read to complete we must: |
| 938 // 1) Adjust offset *backwards* to create capacity. | 900 // 1) Adjust offset *backwards* to create capacity. |
| 939 // 2) Expand capacity to make sure we don't defer as data arrives. | 901 // 2) Expand capacity to make sure we don't defer as data arrives. |
| 940 // 3) Stop deferring to receive more data. | 902 // 3) Stop deferring to receive more data. |
| 941 // | 903 // |
| 942 // BEFORE | 904 // BEFORE |
| 943 // offset=20 [xxxxxxxxxx|xxxxxxxxxx] | 905 // offset=20 [xxxxxxxxxx|xxxxxxxxxx] |
| 944 // ^^^^ ^^^^^^^^^^ ^^^^ requested 18 bytes @ offset 16 | 906 // ^^^^ ^^^^^^^^^^ ^^^^ requested 18 bytes @ offset 16 |
| 945 // ADJUSTED OFFSET | 907 // ADJUSTED OFFSET |
| 946 // offset=16 [____xxxxxx|xxxxxxxxxx]xxxx | 908 // offset=16 [____xxxxxx|xxxxxxxxxx]xxxx |
| 947 // ^^^^^^^^^^ ^^^^^^^^ requested 18 bytes @ offset 16 | 909 // ^^^^^^^^^^ ^^^^^^^^ requested 18 bytes @ offset 16 |
| 948 // ADJUSTED CAPACITY | 910 // ADJUSTED CAPACITY |
| 949 // offset=16 [____xxxxxx|xxxxxxxxxxxxxx____] | 911 // offset=16 [____xxxxxx|xxxxxxxxxxxxxx____] |
| 950 // ^^^^^^^^^^^^^^^^^^ requested 18 bytes @ offset 16 | 912 // ^^^^^^^^^^^^^^^^^^ requested 18 bytes @ offset 16 |
| 951 // AFTER | 913 // AFTER |
| 952 // offset=34 [xxxxxxxxxx|__________] | 914 // offset=34 [xxxxxxxxxx|__________] |
| 953 // | 915 // |
| 954 EXPECT_CALL(*this, NetworkCallback()); | 916 EXPECT_CALL(*this, LoadingCallback(BufferedResourceLoader::kLoading)); |
| 955 ReadLoader(16, 18, buffer); | 917 ReadLoader(16, 18, buffer); |
| 956 ConfirmLoaderOffsets(16, 0, 18); | 918 ConfirmLoaderOffsets(16, 0, 18); |
| 957 ConfirmBufferState(6, 10, 14, 18); | 919 ConfirmBufferState(6, 10, 14, 18); |
| 958 ConfirmLoaderDeferredState(false); | |
| 959 | 920 |
| 960 // Write a little, make sure we didn't start deferring. | 921 // Write a little, make sure we didn't start deferring. |
| 961 WriteData(2); | 922 WriteData(2); |
| 962 ConfirmLoaderDeferredState(false); | |
| 963 | 923 |
| 964 // Write the rest, read should complete and capacity should go back to normal. | 924 // Write the rest, read should complete and capacity should go back to normal. |
| 965 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 18)); | 925 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kOk, 18)); |
| 966 WriteData(2); | 926 WriteData(2); |
| 967 ConfirmLoaderBufferForwardCapacity(10); | 927 ConfirmLoaderBufferForwardCapacity(10); |
| 968 ConfirmLoaderDeferredState(false); | |
| 969 | 928 |
| 970 // POSTCONDITION | 929 // POSTCONDITION |
| 971 ConfirmBufferState(4, 10, 0, 10); | 930 ConfirmBufferState(4, 10, 0, 10); |
| 972 ConfirmLoaderOffsets(34, 0, 0); | 931 ConfirmLoaderOffsets(34, 0, 0); |
| 973 ConfirmLoaderDeferredState(false); | |
| 974 | 932 |
| 975 StopWhenLoad(); | 933 StopWhenLoad(); |
| 976 } | 934 } |
| 977 | 935 |
| 978 TEST_F(BufferedResourceLoaderTest, Tricky_ReadPastThreshold) { | 936 TEST_F(BufferedResourceLoaderTest, Tricky_ReadPastThreshold) { |
| 979 const int kSize = 5 * 1024 * 1024; | 937 const int kSize = 5 * 1024 * 1024; |
| 980 const int kThreshold = 2 * 1024 * 1024; | 938 const int kThreshold = 2 * 1024 * 1024; |
| 981 | 939 |
| 982 Initialize(kHttpUrl, 10, kSize); | 940 Initialize(kHttpUrl, 10, kSize); |
| 983 SetLoaderBuffer(10, 10); | 941 SetLoaderBuffer(10, 10); |
| 984 Start(); | 942 Start(); |
| 985 PartialResponse(10, kSize - 1, kSize); | 943 PartialResponse(10, kSize - 1, kSize); |
| 986 | 944 |
| 987 uint8 buffer[256]; | 945 uint8 buffer[256]; |
| 988 InSequence s; | 946 InSequence s; |
| 989 | 947 |
| 990 // PRECONDITION | 948 // PRECONDITION |
| 991 WriteUntilThreshold(); | 949 WriteUntilThreshold(); |
| 992 ConfirmBufferState(0, 10, 10, 10); | 950 ConfirmBufferState(0, 10, 10, 10); |
| 993 ConfirmLoaderOffsets(10, 0, 0); | 951 ConfirmLoaderOffsets(10, 0, 0); |
| 994 ConfirmLoaderDeferredState(true); | |
| 995 | 952 |
| 996 // *** TRICKY BUSINESS, PT. VI *** | 953 // *** TRICKY BUSINESS, PT. VI *** |
| 997 // Read past the forward wait threshold: cache miss. | 954 // Read past the forward wait threshold: cache miss. |
| 998 // | 955 // |
| 999 // BEFORE | 956 // BEFORE |
| 1000 // offset=10 [xxxxxxxxxx] ... | 957 // offset=10 [xxxxxxxxxx] ... |
| 1001 // ^^^^ requested 10 bytes @ threshold | 958 // ^^^^ requested 10 bytes @ threshold |
| 1002 // AFTER | 959 // AFTER |
| 1003 // offset=10 [xxxxxxxxxx] !!! cache miss !!! | 960 // offset=10 [xxxxxxxxxx] !!! cache miss !!! |
| 1004 // | 961 // |
| 1005 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); | 962 EXPECT_CALL(*this, ReadCallback(BufferedResourceLoader::kCacheMiss, 0)); |
| 1006 ReadLoader(kThreshold + 20, 10, buffer); | 963 ReadLoader(kThreshold + 20, 10, buffer); |
| 1007 | 964 |
| 1008 // POSTCONDITION | 965 // POSTCONDITION |
| 1009 ConfirmBufferState(0, 10, 10, 10); | 966 ConfirmBufferState(0, 10, 10, 10); |
| 1010 ConfirmLoaderOffsets(10, 0, 0); | 967 ConfirmLoaderOffsets(10, 0, 0); |
| 1011 ConfirmLoaderDeferredState(true); | |
| 1012 | 968 |
| 1013 StopWhenLoad(); | 969 StopWhenLoad(); |
| 1014 } | 970 } |
| 1015 | 971 |
| 1016 TEST_F(BufferedResourceLoaderTest, HasSingleOrigin) { | 972 TEST_F(BufferedResourceLoaderTest, HasSingleOrigin) { |
| 1017 // Make sure no redirect case works as expected. | 973 // Make sure no redirect case works as expected. |
| 1018 Initialize(kHttpUrl, -1, -1); | 974 Initialize(kHttpUrl, -1, -1); |
| 1019 Start(); | 975 Start(); |
| 1020 FullResponse(1024); | 976 FullResponse(1024); |
| 1021 EXPECT_TRUE(loader_->HasSingleOrigin()); | 977 EXPECT_TRUE(loader_->HasSingleOrigin()); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1179 ExpectContentRangeFailure("bytes 20-10/400"); | 1135 ExpectContentRangeFailure("bytes 20-10/400"); |
| 1180 | 1136 |
| 1181 ExpectContentRangeSuccess("bytes 0-499/500", 0, 499, 500); | 1137 ExpectContentRangeSuccess("bytes 0-499/500", 0, 499, 500); |
| 1182 ExpectContentRangeSuccess("bytes 0-0/500", 0, 0, 500); | 1138 ExpectContentRangeSuccess("bytes 0-0/500", 0, 0, 500); |
| 1183 ExpectContentRangeSuccess("bytes 10-11/50", 10, 11, 50); | 1139 ExpectContentRangeSuccess("bytes 10-11/50", 10, 11, 50); |
| 1184 ExpectContentRangeSuccess("bytes 10-11/*", 10, 11, | 1140 ExpectContentRangeSuccess("bytes 10-11/*", 10, 11, |
| 1185 kPositionNotSpecified); | 1141 kPositionNotSpecified); |
| 1186 } | 1142 } |
| 1187 | 1143 |
| 1188 } // namespace webkit_media | 1144 } // namespace webkit_media |
| OLD | NEW |