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

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

Issue 8294025: Merge 105121 - Numerous fixes to audio/video buffered resource loading. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/874/src/
Patch Set: '' Created 9 years, 2 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/glue/media/buffered_resource_loader.cc ('k') | webkit/glue/media/simple_data_source.h » ('j') | 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 #include <string> 6 #include <string>
7 7
8 #include "base/format_macros.h" 8 #include "base/format_macros.h"
9 #include "base/stringprintf.h" 9 #include "base/stringprintf.h"
10 #include "media/base/media_log.h" 10 #include "media/base/media_log.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/http/http_request_headers.h" 12 #include "net/http/http_request_headers.h"
13 #include "net/http/http_util.h" 13 #include "net/http/http_util.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLError.h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLError.h"
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h" 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
20 #include "webkit/glue/media/buffered_resource_loader.h" 20 #include "webkit/glue/media/buffered_resource_loader.h"
21 #include "webkit/mocks/mock_webframeclient.h" 21 #include "webkit/mocks/mock_webframeclient.h"
22 #include "webkit/mocks/mock_weburlloader.h" 22 #include "webkit/mocks/mock_weburlloader.h"
23 23
24 using ::testing::_;
25 using ::testing::Assign;
26 using ::testing::AtLeast;
27 using ::testing::DeleteArg;
28 using ::testing::DoAll;
29 using ::testing::InSequence; 24 using ::testing::InSequence;
30 using ::testing::Invoke;
31 using ::testing::InvokeWithoutArgs;
32 using ::testing::NotNull;
33 using ::testing::Return; 25 using ::testing::Return;
34 using ::testing::ReturnRef;
35 using ::testing::SetArgumentPointee;
36 using ::testing::StrictMock;
37 using ::testing::Truly; 26 using ::testing::Truly;
38 using ::testing::NiceMock; 27 using ::testing::NiceMock;
39 using ::testing::WithArgs;
40 28
41 using WebKit::WebString; 29 using WebKit::WebString;
42 using WebKit::WebURLError; 30 using WebKit::WebURLError;
43 using WebKit::WebURLResponse; 31 using WebKit::WebURLResponse;
44 using WebKit::WebView; 32 using WebKit::WebView;
45 33
46 namespace webkit_glue { 34 namespace webkit_glue {
47 35
48 static const char* kHttpUrl = "http://test"; 36 static const char* kHttpUrl = "http://test";
49 static const char kHttpRedirectToSameDomainUrl1[] = "http://test/ing"; 37 static const char kHttpRedirectToSameDomainUrl1[] = "http://test/ing";
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 virtual ~BufferedResourceLoaderTest() { 80 virtual ~BufferedResourceLoaderTest() {
93 view_->close(); 81 view_->close();
94 } 82 }
95 83
96 void Initialize(const char* url, int first_position, int last_position) { 84 void Initialize(const char* url, int first_position, int last_position) {
97 gurl_ = GURL(url); 85 gurl_ = GURL(url);
98 first_position_ = first_position; 86 first_position_ = first_position;
99 last_position_ = last_position; 87 last_position_ = last_position;
100 88
101 url_loader_ = new NiceMock<MockWebURLLoader>(); 89 url_loader_ = new NiceMock<MockWebURLLoader>();
102 loader_ = new BufferedResourceLoader(gurl_, 90 loader_ = new BufferedResourceLoader(
103 first_position_, last_position_, 91 gurl_, first_position_, last_position_,
104 new media::MediaLog()); 92 BufferedResourceLoader::kThresholdDefer, 0, 0,
93 new media::MediaLog());
105 loader_->SetURLLoaderForTest(url_loader_); 94 loader_->SetURLLoaderForTest(url_loader_);
106 } 95 }
107 96
108 void SetLoaderBuffer(size_t forward_capacity, size_t backward_capacity) { 97 void SetLoaderBuffer(size_t forward_capacity, size_t backward_capacity) {
109 loader_->buffer_.reset( 98 loader_->buffer_.reset(
110 new media::SeekableBuffer(backward_capacity, forward_capacity)); 99 new media::SeekableBuffer(backward_capacity, forward_capacity));
111 } 100 }
112 101
113 void Start() { 102 void Start() {
114 InSequence s; 103 InSequence s;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 void ReadLoader(int64 position, int size, uint8* buffer) { 216 void ReadLoader(int64 position, int size, uint8* buffer) {
228 loader_->Read(position, size, buffer, 217 loader_->Read(position, size, buffer,
229 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); 218 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback));
230 } 219 }
231 220
232 // Verifies that data in buffer[0...size] is equal to data_[pos...pos+size]. 221 // Verifies that data in buffer[0...size] is equal to data_[pos...pos+size].
233 void VerifyBuffer(uint8* buffer, int pos, int size) { 222 void VerifyBuffer(uint8* buffer, int pos, int size) {
234 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); 223 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size));
235 } 224 }
236 225
226 void ConfirmLoaderBufferBackwardCapacity(size_t expected_backward_capacity) {
227 EXPECT_EQ(loader_->buffer_->backward_capacity(),
228 expected_backward_capacity);
229 }
230
237 void ConfirmLoaderBufferForwardCapacity(size_t expected_forward_capacity) { 231 void ConfirmLoaderBufferForwardCapacity(size_t expected_forward_capacity) {
238 EXPECT_EQ(loader_->buffer_->forward_capacity(), expected_forward_capacity); 232 EXPECT_EQ(loader_->buffer_->forward_capacity(), expected_forward_capacity);
239 } 233 }
240 234
241 void ConfirmLoaderDeferredState(bool expectedVal) { 235 void ConfirmLoaderDeferredState(bool expectedVal) {
242 EXPECT_EQ(loader_->deferred_, expectedVal); 236 EXPECT_EQ(loader_->deferred_, expectedVal);
243 } 237 }
244 238
239 // Makes sure the |loader_| buffer window is in a reasonable range.
240 void CheckBufferWindowBounds() {
241 // Corresponds to value defined in buffered_resource_loader.cc.
242 static const size_t kMinBufferCapacity = 2 * 1024 * 1024;
243 EXPECT_GE(loader_->buffer_->forward_capacity(), kMinBufferCapacity);
244 EXPECT_GE(loader_->buffer_->backward_capacity(), kMinBufferCapacity);
245
246 // Corresponds to value defined in buffered_resource_loader.cc.
247 static const size_t kMaxBufferCapacity = 20 * 1024 * 1024;
248 EXPECT_LE(loader_->buffer_->forward_capacity(), kMaxBufferCapacity);
249 EXPECT_LE(loader_->buffer_->backward_capacity(), kMaxBufferCapacity);
250 }
251
245 MOCK_METHOD1(StartCallback, void(int error)); 252 MOCK_METHOD1(StartCallback, void(int error));
246 MOCK_METHOD1(ReadCallback, void(int error)); 253 MOCK_METHOD1(ReadCallback, void(int error));
247 MOCK_METHOD0(NetworkCallback, void()); 254 MOCK_METHOD0(NetworkCallback, void());
248 255
249 protected: 256 protected:
250 GURL gurl_; 257 GURL gurl_;
251 int64 first_position_; 258 int64 first_position_;
252 int64 last_position_; 259 int64 last_position_;
253 260
254 scoped_refptr<BufferedResourceLoader> loader_; 261 scoped_refptr<BufferedResourceLoader> loader_;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 ReadLoader(30, 10, buffer); 405 ReadLoader(30, 10, buffer);
399 } 406 }
400 407
401 // Tests the logic of expanding the data buffer for large reads. 408 // Tests the logic of expanding the data buffer for large reads.
402 TEST_F(BufferedResourceLoaderTest, ReadExtendBuffer) { 409 TEST_F(BufferedResourceLoaderTest, ReadExtendBuffer) {
403 Initialize(kHttpUrl, 10, 0x014FFFFFF); 410 Initialize(kHttpUrl, 10, 0x014FFFFFF);
404 SetLoaderBuffer(10, 20); 411 SetLoaderBuffer(10, 20);
405 Start(); 412 Start();
406 PartialResponse(10, 0x014FFFFFF, 0x01500000); 413 PartialResponse(10, 0x014FFFFFF, 0x01500000);
407 414
415 // Don't test for network callbacks (covered by *Strategy tests).
416 EXPECT_CALL(*this, NetworkCallback())
417 .WillRepeatedly(Return());
418
408 uint8 buffer[20]; 419 uint8 buffer[20];
409 InSequence s; 420 InSequence s;
410 421
411 // Write more than forward capacity and read it back. Ensure forward capacity 422 // Write more than forward capacity and read it back. Ensure forward capacity
412 // gets reset. 423 // gets reset.
413 EXPECT_CALL(*this, NetworkCallback());
414 WriteLoader(10, 20); 424 WriteLoader(10, 20);
415 EXPECT_CALL(*this, ReadCallback(20)); 425 EXPECT_CALL(*this, ReadCallback(20));
416 ReadLoader(10, 20, buffer); 426 ReadLoader(10, 20, buffer);
417 427
418 VerifyBuffer(buffer, 10, 20); 428 VerifyBuffer(buffer, 10, 20);
419 ConfirmLoaderBufferForwardCapacity(10); 429 ConfirmLoaderBufferForwardCapacity(10);
420 430
421 // Make and outstanding read request larger than forward capacity. Ensure 431 // Make and outstanding read request larger than forward capacity. Ensure
422 // forward capacity gets extended. 432 // forward capacity gets extended.
423 EXPECT_CALL(*this, NetworkCallback());
424 ReadLoader(30, 20, buffer); 433 ReadLoader(30, 20, buffer);
425 434
426 ConfirmLoaderBufferForwardCapacity(20); 435 ConfirmLoaderBufferForwardCapacity(20);
427 436
428 // Fulfill outstanding request. Ensure forward capacity gets reset. 437 // Fulfill outstanding request. Ensure forward capacity gets reset.
429 EXPECT_CALL(*this, ReadCallback(20)); 438 EXPECT_CALL(*this, ReadCallback(20));
430 EXPECT_CALL(*this, NetworkCallback());
431 WriteLoader(30, 20); 439 WriteLoader(30, 20);
432 440
433 VerifyBuffer(buffer, 30, 20); 441 VerifyBuffer(buffer, 30, 20);
434 ConfirmLoaderBufferForwardCapacity(10); 442 ConfirmLoaderBufferForwardCapacity(10);
435 443
436 // Try to read further ahead than kForwardWaitThreshold allows. Ensure 444 // Try to read further ahead than kForwardWaitThreshold allows. Ensure
437 // forward capacity is not changed. 445 // forward capacity is not changed.
438 EXPECT_CALL(*this, NetworkCallback());
439 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); 446 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS));
440 ReadLoader(0x00300000, 1, buffer); 447 ReadLoader(0x00300000, 1, buffer);
441 448
442 ConfirmLoaderBufferForwardCapacity(10); 449 ConfirmLoaderBufferForwardCapacity(10);
443 450
444 // Try to read more than maximum forward capacity. Ensure forward capacity is 451 // Try to read more than maximum forward capacity. Ensure forward capacity is
445 // not changed. 452 // not changed.
446 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); 453 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED));
447 ReadLoader(30, 0x01400001, buffer); 454 ReadLoader(30, 0x01400001, buffer);
448 455
449 ConfirmLoaderBufferForwardCapacity(10); 456 ConfirmLoaderBufferForwardCapacity(10);
450 457
451 StopWhenLoad(); 458 StopWhenLoad();
452 } 459 }
453 460
454 TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) { 461 TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) {
455 Initialize(kHttpUrl, 10, 0x00FFFFFF); 462 Initialize(kHttpUrl, 10, 0x00FFFFFF);
456 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer);
457 Start(); 463 Start();
458 PartialResponse(10, 0x00FFFFFF, 0x01000000); 464 PartialResponse(10, 0x00FFFFFF, 0x01000000);
459 465
460 uint8 buffer[10]; 466 uint8 buffer[10];
461 InSequence s; 467 InSequence s;
462 468
463 // Read very far ahead will get a cache miss. 469 // Read very far ahead will get a cache miss.
464 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); 470 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS));
465 ReadLoader(0x00FFFFFF, 1, buffer); 471 ReadLoader(0x00FFFFFF, 1, buffer);
466 472
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 653
648 // Test redirect to the same domain and then to a different domain. 654 // Test redirect to the same domain and then to a different domain.
649 Initialize(kHttpUrl, -1, -1); 655 Initialize(kHttpUrl, -1, -1);
650 Start(); 656 Start();
651 Redirect(kHttpRedirectToSameDomainUrl1); 657 Redirect(kHttpRedirectToSameDomainUrl1);
652 Redirect(kHttpRedirectToDifferentDomainUrl1); 658 Redirect(kHttpRedirectToDifferentDomainUrl1);
653 EXPECT_FALSE(loader_->HasSingleOrigin()); 659 EXPECT_FALSE(loader_->HasSingleOrigin());
654 StopWhenLoad(); 660 StopWhenLoad();
655 } 661 }
656 662
657 // TODO(hclam): add unit test for defer loading. 663 TEST_F(BufferedResourceLoaderTest, BufferWindow_Default) {
664 Initialize(kHttpUrl, -1, -1);
665 Start();
666
667 // Test ensures that default construction of a BufferedResourceLoader has sane
668 // values.
669 //
670 // Please do not change these values in order to make a test pass! Instead,
671 // start a conversation on what the default buffer window capacities should
672 // be.
673 ConfirmLoaderBufferBackwardCapacity(2 * 1024 * 1024);
674 ConfirmLoaderBufferForwardCapacity(2 * 1024 * 1024);
675
676 StopWhenLoad();
677 }
678
679 TEST_F(BufferedResourceLoaderTest, BufferWindow_Bitrate_Unknown) {
680 Initialize(kHttpUrl, -1, -1);
681 Start();
682 loader_->SetBitrate(0);
683 CheckBufferWindowBounds();
684 StopWhenLoad();
685 }
686
687 TEST_F(BufferedResourceLoaderTest, BufferWindow_Bitrate_BelowLowerBound) {
688 Initialize(kHttpUrl, -1, -1);
689 Start();
690 loader_->SetBitrate(1024 * 8); // 1 Kbps.
691 CheckBufferWindowBounds();
692 StopWhenLoad();
693 }
694
695 TEST_F(BufferedResourceLoaderTest, BufferWindow_Bitrate_WithinBounds) {
696 Initialize(kHttpUrl, -1, -1);
697 Start();
698 loader_->SetBitrate(2 * 1024 * 1024 * 8); // 2 Mbps.
699 CheckBufferWindowBounds();
700 StopWhenLoad();
701 }
702
703 TEST_F(BufferedResourceLoaderTest, BufferWindow_Bitrate_AboveUpperBound) {
704 Initialize(kHttpUrl, -1, -1);
705 Start();
706 loader_->SetBitrate(100 * 1024 * 1024 * 8); // 100 Mbps.
707 CheckBufferWindowBounds();
708 StopWhenLoad();
709 }
710
711 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_Negative) {
712 Initialize(kHttpUrl, -1, -1);
713 Start();
714 loader_->SetPlaybackRate(-10);
715 CheckBufferWindowBounds();
716 StopWhenLoad();
717 }
718
719 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_Zero) {
720 Initialize(kHttpUrl, -1, -1);
721 Start();
722 loader_->SetPlaybackRate(0);
723 CheckBufferWindowBounds();
724 StopWhenLoad();
725 }
726
727 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_BelowLowerBound) {
728 Initialize(kHttpUrl, -1, -1);
729 Start();
730 loader_->SetPlaybackRate(0.1f);
731 CheckBufferWindowBounds();
732 StopWhenLoad();
733 }
734
735 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_WithinBounds) {
736 Initialize(kHttpUrl, -1, -1);
737 Start();
738 loader_->SetPlaybackRate(10);
739 CheckBufferWindowBounds();
740 StopWhenLoad();
741 }
742
743 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_AboveUpperBound) {
744 Initialize(kHttpUrl, -1, -1);
745 Start();
746 loader_->SetPlaybackRate(100);
747 CheckBufferWindowBounds();
748 StopWhenLoad();
749 }
658 750
659 } // namespace webkit_glue 751 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/media/buffered_resource_loader.cc ('k') | webkit/glue/media/simple_data_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698