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

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: add bug #s 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
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
OLDNEW
« webkit/media/buffered_resource_loader.h ('K') | « webkit/media/buffered_resource_loader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698