Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: webkit/media/buffered_resource_loader_unittest.cc

Issue 10692106: Split BufferedResourceLoader's network callback into separate loading state and progress callbacks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: trying again Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/media/buffered_resource_loader.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webkit/media/buffered_resource_loader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698