Chromium Code Reviews| 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..d6afce9918afcfb11d4542845dec4c1e6dd96af4 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,33 @@ class BufferedDataSourceTest : public testing::Test { |
| view_->close(); |
| } |
| - void Initialize(media::PipelineStatus expected) { |
| - ExpectCreateResourceLoader(); |
| + void Initialize(const char* url, media::PipelineStatus expected) { |
| + response_generator_.reset(new TestResponseGenerator(GURL(url), kFileSize)); |
| - EXPECT_FALSE(data_source_->downloading()); |
| - data_source_->Initialize(response_generator_.gurl(), |
| + ExpectCreateResourceLoader(); |
| + data_source_->Initialize(response_generator_->gurl(), |
| BufferedResourceLoader::kUnspecified, |
| media::NewExpectedStatusCB(expected)); |
| message_loop_.RunAllPending(); |
| - EXPECT_TRUE(data_source_->downloading()); |
| } |
| - // Helper to initialize tests with a valid 206 response. |
| + // Helper to initialize tests with a valid HTTP 206 response. |
|
Ami GONE FROM CHROMIUM
2012/07/11 00:51:54
no such thing as a non-HTTP 206, so change doesn't
scherkus (not reviewing)
2012/07/11 01:10:56
Done.
|
| void InitializeWith206Response() { |
| - Initialize(media::PIPELINE_OK); |
| + Initialize(kHttpUrl, media::PIPELINE_OK); |
| + EXPECT_TRUE(data_source_->downloading()); |
|
Ami GONE FROM CHROMIUM
2012/07/11 00:51:54
could move this back to Initialize as EXPECT_EQ(da
scherkus (not reviewing)
2012/07/11 01:10:56
I'll do it but duplicating the SchemeIs() code her
|
| - 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_FALSE(data_source_->downloading()); |
| + |
| + 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 +139,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 +201,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 +216,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 +227,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 +238,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 +258,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 +271,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 +280,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 +293,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 +313,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 +334,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 +404,15 @@ 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)); |
| + Respond(response_generator_->Generate206(0)); |
| ExpectCreateResourceLoader(); |
| FinishLoading(); |
| - Respond(response_generator_.Generate206(0)); |
| + Respond(response_generator_->Generate206(0)); |
| // It'll error after this. |
| EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| @@ -349,6 +422,50 @@ TEST_F(BufferedDataSourceTest, Range_TooManyRetries) { |
| 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_->GenerateFileResponse(0)); |
| + |
| + ExpectCreateResourceLoader(); |
| + FinishLoading(); |
| + Respond(response_generator_->GenerateFileResponse(0)); |
| + |
| + // It'll error after this. |
| + EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| + FinishLoading(); |
| + |
| + EXPECT_FALSE(data_source_->loading()); |
| + 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 +519,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 +542,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 +552,7 @@ TEST_F(BufferedDataSourceTest, SetPlaybackRate) { |
| Stop(); |
| } |
| -TEST_F(BufferedDataSourceTest, Read) { |
| +TEST_F(BufferedDataSourceTest, Http_Read) { |
| InitializeWith206Response(); |
| ReadAt(0); |
| @@ -453,4 +570,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 |