summaryrefslogtreecommitdiff
path: root/chromium/media/blink/multibuffer_data_source_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/blink/multibuffer_data_source_unittest.cc')
-rw-r--r--chromium/media/blink/multibuffer_data_source_unittest.cc86
1 files changed, 76 insertions, 10 deletions
diff --git a/chromium/media/blink/multibuffer_data_source_unittest.cc b/chromium/media/blink/multibuffer_data_source_unittest.cc
index 0a93d97d957..b2ea71c3862 100644
--- a/chromium/media/blink/multibuffer_data_source_unittest.cc
+++ b/chromium/media/blink/multibuffer_data_source_unittest.cc
@@ -54,11 +54,19 @@ class TestMultiBufferDataProvider : public ResourceMultiBufferDataProvider {
~TestMultiBufferDataProvider() override {
CHECK_EQ(static_cast<size_t>(1), test_data_providers.erase(this));
}
+ void SetLoadingToFalse() {
+ // Check that we have not been destroyed first.
+ if (test_data_providers.find(this) != test_data_providers.end()) {
+ loading_ = false;
+ }
+ }
void Start() override {
// Create a mock active loader.
// Keep track of active loading state via loadAsynchronously() and cancel().
NiceMock<MockWebURLLoader>* url_loader = new NiceMock<MockWebURLLoader>();
- ON_CALL(*url_loader, cancel()).WillByDefault(Assign(&loading_, false));
+ ON_CALL(*url_loader, cancel())
+ .WillByDefault(
+ Invoke(this, &TestMultiBufferDataProvider::SetLoadingToFalse));
loading_ = true;
active_loader_.reset(
new ActiveLoader(scoped_ptr<WebURLLoader>(url_loader)));
@@ -177,13 +185,14 @@ class MockMultibufferDataSource : public MultibufferDataSource {
public:
MockMultibufferDataSource(
const GURL& url,
+ UrlData::CORSMode cors_mode,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
linked_ptr<UrlIndex> url_index,
WebLocalFrame* frame,
BufferedDataSourceHost* host)
: MultibufferDataSource(
url,
- UrlData::CORS_UNSPECIFIED,
+ cors_mode,
task_runner,
url_index,
frame,
@@ -231,10 +240,12 @@ class MultibufferDataSourceTest : public testing::Test {
MOCK_METHOD1(OnInitialize, void(bool));
- void Initialize(const char* url, bool expected) {
+ void InitializeWithCORS(const char* url,
+ bool expected,
+ UrlData::CORSMode cors_mode) {
GURL gurl(url);
data_source_.reset(new MockMultibufferDataSource(
- gurl, message_loop_.task_runner(), url_index_,
+ gurl, cors_mode, message_loop_.task_runner(), url_index_,
view_->mainFrame()->toWebLocalFrame(), &host_));
data_source_->SetPreload(preload_);
@@ -248,6 +259,10 @@ class MultibufferDataSourceTest : public testing::Test {
EXPECT_EQ(data_source_->downloading(), false);
}
+ void Initialize(const char* url, bool expected) {
+ InitializeWithCORS(url, expected, UrlData::CORS_UNSPECIFIED);
+ }
+
// Helper to initialize tests with a valid 200 response.
void InitializeWith200Response() {
Initialize(kHttpUrl, true);
@@ -371,7 +386,11 @@ class MultibufferDataSourceTest : public testing::Test {
EXPECT_CALL(host_, SetTotalBytes(kFileSize));
EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
EXPECT_CALL(*this, ReadCallback(kDataSize));
- EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
+ // Stop() will also cause the readback to be called with kReadError, but
+ // we want to make sure it was called before Stop().
+ bool failed_ = false;
+ EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError))
+ .WillOnce(Assign(&failed_, true));
Respond(response1);
ReceiveData(kDataSize);
@@ -382,6 +401,7 @@ class MultibufferDataSourceTest : public testing::Test {
Restart();
ReadAt(kDataSize);
Respond(response2);
+ EXPECT_TRUE(failed_);
Stop();
}
@@ -772,6 +792,20 @@ TEST_F(MultibufferDataSourceTest,
ExecuteMixedResponseFailureTest(response1, response2);
}
+TEST_F(MultibufferDataSourceTest,
+ Http_MixedResponse_ServiceWorkerProxiedAndDifferentOriginResponseCORS) {
+ InitializeWithCORS(kHttpUrl, true, UrlData::CORS_ANONYMOUS);
+ WebURLResponse response1 =
+ response_generator_->GeneratePartial206(0, kDataSize - 1);
+ response1.setWasFetchedViaServiceWorker(true);
+ response1.setOriginalURLViaServiceWorker(GURL(kHttpDifferentOriginUrl));
+ WebURLResponse response2 =
+ response_generator_->GeneratePartial206(kDataSize, kDataSize * 2 - 1);
+ // The origin URL of response1 and response2 are different, but a CORS check
+ // has been passed for each request, so expect success.
+ ExecuteMixedResponseSuccessTest(response1, response2);
+}
+
TEST_F(MultibufferDataSourceTest, File_Retry) {
InitializeWithFileResponse();
@@ -939,8 +973,10 @@ TEST_F(MultibufferDataSourceTest, Http_Read) {
ReadAt(kDataSize, kDataSize);
EXPECT_CALL(*this, ReadCallback(kDataSize));
- EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
+ EXPECT_CALL(host_,
+ AddBufferedByteRange(kDataSize, kDataSize + kDataSize / 2));
ReceiveData(kDataSize / 2);
+ EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
ReceiveData(kDataSize / 2);
EXPECT_TRUE(data_source_->downloading());
@@ -955,16 +991,18 @@ TEST_F(MultibufferDataSourceTest, Http_ShareData) {
ReadAt(kDataSize, kDataSize);
EXPECT_CALL(*this, ReadCallback(kDataSize));
- EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
+ EXPECT_CALL(host_,
+ AddBufferedByteRange(kDataSize, kDataSize + kDataSize / 2));
ReceiveData(kDataSize / 2);
+ EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
ReceiveData(kDataSize / 2);
EXPECT_TRUE(data_source_->downloading());
StrictMock<MockBufferedDataSourceHost> host2;
MockMultibufferDataSource source2(
- GURL(kHttpUrl), message_loop_.task_runner(), url_index_,
- view_->mainFrame()->toWebLocalFrame(), &host2);
+ GURL(kHttpUrl), UrlData::CORS_UNSPECIFIED, message_loop_.task_runner(),
+ url_index_, view_->mainFrame()->toWebLocalFrame(), &host2);
source2.SetPreload(preload_);
EXPECT_CALL(*this, OnInitialize(true));
@@ -1257,7 +1295,7 @@ TEST_F(MultibufferDataSourceTest,
TEST_F(MultibufferDataSourceTest, SeekPastEOF) {
GURL gurl(kHttpUrl);
data_source_.reset(new MockMultibufferDataSource(
- gurl, message_loop_.task_runner(), url_index_,
+ gurl, UrlData::CORS_UNSPECIFIED, message_loop_.task_runner(), url_index_,
view_->mainFrame()->toWebLocalFrame(), &host_));
data_source_->SetPreload(preload_);
@@ -1279,6 +1317,7 @@ TEST_F(MultibufferDataSourceTest, SeekPastEOF) {
EXPECT_CALL(*this, ReadCallback(kDataSize));
ReadAt(0);
+ EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, kDataSize + 1));
ReceiveData(1);
EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 3));
FinishLoading();
@@ -1339,4 +1378,31 @@ TEST_F(MultibufferDataSourceTest, Http_NotStreamingAfterRedirect) {
Stop();
}
+TEST_F(MultibufferDataSourceTest, LengthKnownAtEOF) {
+ Initialize(kHttpUrl, true);
+ // Server responds without content-length.
+ WebURLResponse response = response_generator_->Generate200();
+ response.clearHTTPHeaderField(WebString::fromUTF8("Content-Length"));
+ response.setExpectedContentLength(kPositionNotSpecified);
+ Respond(response);
+ EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize));
+ ReceiveData(kDataSize);
+ int64_t len;
+ EXPECT_FALSE(data_source_->GetSize(&len));
+ EXPECT_TRUE(data_source_->IsStreaming());
+ EXPECT_CALL(*this, ReadCallback(kDataSize));
+ ReadAt(0);
+
+ ReadAt(kDataSize);
+ EXPECT_CALL(host_, SetTotalBytes(kDataSize));
+ EXPECT_CALL(*this, ReadCallback(0));
+ EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2));
+ FinishLoading();
+
+ // Done loading, now we should know the length.
+ EXPECT_TRUE(data_source_->GetSize(&len));
+ EXPECT_EQ(kDataSize, len);
+ Stop();
+}
+
} // namespace media