| Index: webkit/media/buffered_data_source_unittest.cc
|
| diff --git a/webkit/media/buffered_data_source_unittest.cc b/webkit/media/buffered_data_source_unittest.cc
|
| index af2a6f71ecef568822017f6d9bdf0f8064b8716b..66059be0026ebddb1c22f46c0340020278fe3087 100644
|
| --- a/webkit/media/buffered_data_source_unittest.cc
|
| +++ b/webkit/media/buffered_data_source_unittest.cc
|
| @@ -86,11 +86,13 @@ static const int64 kFileSize = 5000000;
|
| static const int64 kFarReadPosition = 4000000;
|
| static const int kDataSize = 1024;
|
|
|
| +static const char kHttpUrl[] = "http://localhost/foo.webm";
|
| +static const char kFileUrl[] = "file:///tmp/bar.webm";
|
| +
|
| class BufferedDataSourceTest : public testing::Test {
|
| public:
|
| BufferedDataSourceTest()
|
| - : response_generator_(GURL("http://localhost/foo.webm"), kFileSize),
|
| - view_(WebView::create(NULL)) {
|
| + : view_(WebView::create(NULL)) {
|
| view_->initializeMainFrame(&client_);
|
|
|
| data_source_ = new MockBufferedDataSource(&message_loop_,
|
| @@ -102,23 +104,35 @@ class BufferedDataSourceTest : public testing::Test {
|
| view_->close();
|
| }
|
|
|
| - void Initialize(media::PipelineStatus expected) {
|
| - ExpectCreateResourceLoader();
|
| + void Initialize(const char* url, media::PipelineStatus expected) {
|
| + GURL gurl(url);
|
| + response_generator_.reset(new TestResponseGenerator(gurl, kFileSize));
|
|
|
| - EXPECT_FALSE(data_source_->downloading());
|
| - data_source_->Initialize(response_generator_.gurl(),
|
| + ExpectCreateResourceLoader();
|
| + data_source_->Initialize(gurl,
|
| BufferedResourceLoader::kUnspecified,
|
| media::NewExpectedStatusCB(expected));
|
| message_loop_.RunAllPending();
|
| - EXPECT_TRUE(data_source_->downloading());
|
| +
|
| + bool is_http = gurl.SchemeIs(kHttpScheme) || gurl.SchemeIs(kHttpsScheme);
|
| + EXPECT_EQ(data_source_->downloading(), is_http);
|
| }
|
|
|
| // Helper to initialize tests with a valid 206 response.
|
| void InitializeWith206Response() {
|
| - Initialize(media::PIPELINE_OK);
|
| + Initialize(kHttpUrl, media::PIPELINE_OK);
|
| +
|
| + EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
|
| + Respond(response_generator_->Generate206(0));
|
| + }
|
|
|
| - EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
|
| - Respond(response_generator_.Generate206(0));
|
| + // Helper to initialize tests with a valid file:// response.
|
| + void InitializeWithFileResponse() {
|
| + Initialize(kFileUrl, media::PIPELINE_OK);
|
| +
|
| + EXPECT_CALL(host_, SetTotalBytes(kFileSize));
|
| + EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize));
|
| + Respond(response_generator_->GenerateFileResponse(0));
|
| }
|
|
|
| // Stops any active loaders and shuts down the data source.
|
| @@ -127,7 +141,7 @@ class BufferedDataSourceTest : public testing::Test {
|
| // appropriate to do when tearing down a test.
|
| void Stop() {
|
| if (data_source_->loading()) {
|
| - loader()->didFail(url_loader(), response_generator_.GenerateError());
|
| + loader()->didFail(url_loader(), response_generator_->GenerateError());
|
| message_loop_.RunAllPending();
|
| }
|
|
|
| @@ -189,7 +203,7 @@ class BufferedDataSourceTest : public testing::Test {
|
|
|
| scoped_refptr<MockBufferedDataSource> data_source_;
|
|
|
| - TestResponseGenerator response_generator_;
|
| + scoped_ptr<TestResponseGenerator> response_generator_;
|
| MockWebFrameClient client_;
|
| WebView* view_;
|
|
|
| @@ -204,10 +218,10 @@ class BufferedDataSourceTest : public testing::Test {
|
| };
|
|
|
| TEST_F(BufferedDataSourceTest, Range_Supported) {
|
| - Initialize(media::PIPELINE_OK);
|
| + Initialize(kHttpUrl, media::PIPELINE_OK);
|
|
|
| - EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
|
| - Respond(response_generator_.Generate206(0));
|
| + EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
|
| + Respond(response_generator_->Generate206(0));
|
|
|
| EXPECT_TRUE(data_source_->loading());
|
| EXPECT_FALSE(data_source_->IsStreaming());
|
| @@ -215,9 +229,9 @@ TEST_F(BufferedDataSourceTest, Range_Supported) {
|
| }
|
|
|
| TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) {
|
| - Initialize(media::PIPELINE_OK);
|
| + Initialize(kHttpUrl, media::PIPELINE_OK);
|
|
|
| - Respond(response_generator_.Generate206(
|
| + Respond(response_generator_->Generate206(
|
| 0, TestResponseGenerator::kNoContentRangeInstanceSize));
|
|
|
| EXPECT_TRUE(data_source_->loading());
|
| @@ -226,17 +240,17 @@ TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) {
|
| }
|
|
|
| TEST_F(BufferedDataSourceTest, Range_NotFound) {
|
| - Initialize(media::PIPELINE_ERROR_NETWORK);
|
| - Respond(response_generator_.Generate404());
|
| + Initialize(kHttpUrl, media::PIPELINE_ERROR_NETWORK);
|
| + Respond(response_generator_->Generate404());
|
|
|
| EXPECT_FALSE(data_source_->loading());
|
| Stop();
|
| }
|
|
|
| TEST_F(BufferedDataSourceTest, Range_NotSupported) {
|
| - Initialize(media::PIPELINE_OK);
|
| - EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
|
| - Respond(response_generator_.Generate200());
|
| + Initialize(kHttpUrl, media::PIPELINE_OK);
|
| + EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
|
| + Respond(response_generator_->Generate200());
|
|
|
| EXPECT_TRUE(data_source_->loading());
|
| EXPECT_TRUE(data_source_->IsStreaming());
|
| @@ -246,9 +260,9 @@ TEST_F(BufferedDataSourceTest, Range_NotSupported) {
|
| // Special carve-out for Apache versions that choose to return a 200 for
|
| // Range:0- ("because it's more efficient" than a 206)
|
| TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) {
|
| - Initialize(media::PIPELINE_OK);
|
| - EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
|
| - WebURLResponse response = response_generator_.Generate200();
|
| + Initialize(kHttpUrl, media::PIPELINE_OK);
|
| + EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
|
| + WebURLResponse response = response_generator_->Generate200();
|
| response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"),
|
| WebString::fromUTF8("bytes"));
|
| Respond(response);
|
| @@ -259,8 +273,8 @@ TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) {
|
| }
|
|
|
| TEST_F(BufferedDataSourceTest, Range_MissingContentRange) {
|
| - Initialize(media::PIPELINE_ERROR_NETWORK);
|
| - Respond(response_generator_.Generate206(
|
| + Initialize(kHttpUrl, media::PIPELINE_ERROR_NETWORK);
|
| + Respond(response_generator_->Generate206(
|
| 0, TestResponseGenerator::kNoContentRange));
|
|
|
| EXPECT_FALSE(data_source_->loading());
|
| @@ -268,11 +282,11 @@ TEST_F(BufferedDataSourceTest, Range_MissingContentRange) {
|
| }
|
|
|
| TEST_F(BufferedDataSourceTest, Range_MissingContentLength) {
|
| - Initialize(media::PIPELINE_OK);
|
| + Initialize(kHttpUrl, media::PIPELINE_OK);
|
|
|
| // It'll manage without a Content-Length response.
|
| - EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
|
| - Respond(response_generator_.Generate206(
|
| + EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length()));
|
| + Respond(response_generator_->Generate206(
|
| 0, TestResponseGenerator::kNoContentLength));
|
|
|
| EXPECT_TRUE(data_source_->loading());
|
| @@ -281,10 +295,10 @@ TEST_F(BufferedDataSourceTest, Range_MissingContentLength) {
|
| }
|
|
|
| TEST_F(BufferedDataSourceTest, Range_WrongContentRange) {
|
| - Initialize(media::PIPELINE_ERROR_NETWORK);
|
| + Initialize(kHttpUrl, media::PIPELINE_ERROR_NETWORK);
|
|
|
| // Now it's done and will fail.
|
| - Respond(response_generator_.Generate206(1337));
|
| + Respond(response_generator_->Generate206(1337));
|
|
|
| EXPECT_FALSE(data_source_->loading());
|
| Stop();
|
| @@ -301,13 +315,13 @@ TEST_F(BufferedDataSourceTest, Range_ServerLied) {
|
|
|
| // Return a 200 in response to a range request.
|
| EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
|
| - Respond(response_generator_.Generate200());
|
| + Respond(response_generator_->Generate200());
|
|
|
| EXPECT_FALSE(data_source_->loading());
|
| Stop();
|
| }
|
|
|
| -TEST_F(BufferedDataSourceTest, Range_AbortWhileReading) {
|
| +TEST_F(BufferedDataSourceTest, Http_AbortWhileReading) {
|
| InitializeWith206Response();
|
|
|
| // Make sure there's a pending read -- we'll expect it to error.
|
| @@ -322,7 +336,68 @@ TEST_F(BufferedDataSourceTest, Range_AbortWhileReading) {
|
| Stop();
|
| }
|
|
|
| -TEST_F(BufferedDataSourceTest, Range_TooManyRetries) {
|
| +TEST_F(BufferedDataSourceTest, File_AbortWhileReading) {
|
| + InitializeWithFileResponse();
|
| +
|
| + // Make sure there's a pending read -- we'll expect it to error.
|
| + ReadAt(0);
|
| +
|
| + // Abort!!!
|
| + EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
|
| + data_source_->Abort();
|
| + message_loop_.RunAllPending();
|
| +
|
| + EXPECT_FALSE(data_source_->loading());
|
| + Stop();
|
| +}
|
| +
|
| +TEST_F(BufferedDataSourceTest, Http_Retry) {
|
| + InitializeWith206Response();
|
| +
|
| + // Read to advance our position.
|
| + EXPECT_CALL(*this, ReadCallback(kDataSize));
|
| + EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1));
|
| + ReadAt(0);
|
| + ReceiveData(kDataSize);
|
| +
|
| + // Issue a pending read but terminate the connection to force a retry.
|
| + ReadAt(kDataSize);
|
| + ExpectCreateResourceLoader();
|
| + FinishLoading();
|
| + Respond(response_generator_->Generate206(kDataSize));
|
| +
|
| + // Complete the read.
|
| + EXPECT_CALL(*this, ReadCallback(kDataSize));
|
| + EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1));
|
| + ReceiveData(kDataSize);
|
| +
|
| + EXPECT_TRUE(data_source_->loading());
|
| + Stop();
|
| +}
|
| +
|
| +TEST_F(BufferedDataSourceTest, File_Retry) {
|
| + InitializeWithFileResponse();
|
| +
|
| + // Read to advance our position.
|
| + EXPECT_CALL(*this, ReadCallback(kDataSize));
|
| + ReadAt(0);
|
| + ReceiveData(kDataSize);
|
| +
|
| + // Issue a pending read but terminate the connection to force a retry.
|
| + ReadAt(kDataSize);
|
| + ExpectCreateResourceLoader();
|
| + FinishLoading();
|
| + Respond(response_generator_->GenerateFileResponse(kDataSize));
|
| +
|
| + // Complete the read.
|
| + EXPECT_CALL(*this, ReadCallback(kDataSize));
|
| + ReceiveData(kDataSize);
|
| +
|
| + EXPECT_TRUE(data_source_->loading());
|
| + Stop();
|
| +}
|
| +
|
| +TEST_F(BufferedDataSourceTest, Http_TooManyRetries) {
|
| InitializeWith206Response();
|
|
|
| // Make sure there's a pending read -- we'll expect it to error.
|
| @@ -331,15 +406,42 @@ TEST_F(BufferedDataSourceTest, Range_TooManyRetries) {
|
| // It'll try three times.
|
| ExpectCreateResourceLoader();
|
| FinishLoading();
|
| - Respond(response_generator_.Generate206(0));
|
| + Respond(response_generator_->Generate206(0));
|
| +
|
| + ExpectCreateResourceLoader();
|
| + FinishLoading();
|
| + Respond(response_generator_->Generate206(0));
|
| +
|
| + ExpectCreateResourceLoader();
|
| + FinishLoading();
|
| + Respond(response_generator_->Generate206(0));
|
| +
|
| + // It'll error after this.
|
| + EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
|
| + FinishLoading();
|
| +
|
| + EXPECT_FALSE(data_source_->loading());
|
| + Stop();
|
| +}
|
| +
|
| +TEST_F(BufferedDataSourceTest, File_TooManyRetries) {
|
| + InitializeWithFileResponse();
|
| +
|
| + // Make sure there's a pending read -- we'll expect it to error.
|
| + ReadAt(0);
|
| +
|
| + // It'll try three times.
|
| + ExpectCreateResourceLoader();
|
| + FinishLoading();
|
| + Respond(response_generator_->GenerateFileResponse(0));
|
|
|
| ExpectCreateResourceLoader();
|
| FinishLoading();
|
| - Respond(response_generator_.Generate206(0));
|
| + Respond(response_generator_->GenerateFileResponse(0));
|
|
|
| ExpectCreateResourceLoader();
|
| FinishLoading();
|
| - Respond(response_generator_.Generate206(0));
|
| + Respond(response_generator_->GenerateFileResponse(0));
|
|
|
| // It'll error after this.
|
| EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
|
| @@ -349,6 +451,23 @@ TEST_F(BufferedDataSourceTest, Range_TooManyRetries) {
|
| Stop();
|
| }
|
|
|
| +TEST_F(BufferedDataSourceTest, File_InstanceSizeUnknown) {
|
| + Initialize(kFileUrl, media::PIPELINE_ERROR_NETWORK);
|
| + EXPECT_FALSE(data_source_->downloading());
|
| +
|
| + Respond(response_generator_->GenerateFileResponse(-1));
|
| +
|
| + EXPECT_FALSE(data_source_->loading());
|
| + Stop();
|
| +}
|
| +
|
| +TEST_F(BufferedDataSourceTest, File_Successful) {
|
| + InitializeWithFileResponse();
|
| +
|
| + EXPECT_TRUE(data_source_->loading());
|
| + Stop();
|
| +}
|
| +
|
| static void SetTrue(bool* value) {
|
| *value = true;
|
| }
|
| @@ -402,7 +521,7 @@ TEST_F(BufferedDataSourceTest, SetBitrate) {
|
| BufferedResourceLoader* old_loader = loader();
|
| ExpectCreateResourceLoader();
|
| ReadAt(kFarReadPosition);
|
| - Respond(response_generator_.Generate206(kFarReadPosition));
|
| + Respond(response_generator_->Generate206(kFarReadPosition));
|
|
|
| // Verify loader changed but still has same bitrate.
|
| EXPECT_NE(old_loader, loader());
|
| @@ -425,7 +544,7 @@ TEST_F(BufferedDataSourceTest, SetPlaybackRate) {
|
| BufferedResourceLoader* old_loader = loader();
|
| ExpectCreateResourceLoader();
|
| ReadAt(kFarReadPosition);
|
| - Respond(response_generator_.Generate206(kFarReadPosition));
|
| + Respond(response_generator_->Generate206(kFarReadPosition));
|
|
|
| // Verify loader changed but still has same playback rate.
|
| EXPECT_NE(old_loader, loader());
|
| @@ -435,7 +554,7 @@ TEST_F(BufferedDataSourceTest, SetPlaybackRate) {
|
| Stop();
|
| }
|
|
|
| -TEST_F(BufferedDataSourceTest, Read) {
|
| +TEST_F(BufferedDataSourceTest, Http_Read) {
|
| InitializeWith206Response();
|
|
|
| ReadAt(0);
|
| @@ -453,4 +572,19 @@ TEST_F(BufferedDataSourceTest, Read) {
|
| Stop();
|
| }
|
|
|
| +TEST_F(BufferedDataSourceTest, File_Read) {
|
| + InitializeWithFileResponse();
|
| +
|
| + ReadAt(0);
|
| +
|
| + // Receive first half of the read but no buffering update.
|
| + ReceiveData(kDataSize / 2);
|
| +
|
| + // Receive last half of the read but no buffering update.
|
| + EXPECT_CALL(*this, ReadCallback(kDataSize));
|
| + ReceiveData(kDataSize / 2);
|
| +
|
| + Stop();
|
| +}
|
| +
|
| } // namespace webkit_media
|
|
|