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