| OLD | NEW |
| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/message_loop.h" | 6 #include "base/message_loop.h" |
| 7 #include "media/base/media_log.h" | 7 #include "media/base/media_log.h" |
| 8 #include "media/base/mock_callback.h" | 8 #include "media/base/mock_callback.h" |
| 9 #include "media/base/mock_data_source_host.h" | 9 #include "media/base/mock_data_source_host.h" |
| 10 #include "media/base/mock_filters.h" | 10 #include "media/base/mock_filters.h" |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 data_source_->Initialize(response_generator_.gurl(), | 99 data_source_->Initialize(response_generator_.gurl(), |
| 100 media::NewExpectedStatusCB(expected)); | 100 media::NewExpectedStatusCB(expected)); |
| 101 message_loop_.RunAllPending(); | 101 message_loop_.RunAllPending(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 // Helper to initialize tests with a valid 206 response. | 104 // Helper to initialize tests with a valid 206 response. |
| 105 void InitializeWith206Response() { | 105 void InitializeWith206Response() { |
| 106 Initialize(media::PIPELINE_OK); | 106 Initialize(media::PIPELINE_OK); |
| 107 | 107 |
| 108 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 108 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); |
| 109 EXPECT_CALL(host_, SetBufferedBytes(0)); | |
| 110 Respond(response_generator_.Generate206(0)); | 109 Respond(response_generator_.Generate206(0)); |
| 111 } | 110 } |
| 112 | 111 |
| 113 // Stops any active loaders and shuts down the data source. | 112 // Stops any active loaders and shuts down the data source. |
| 114 // | 113 // |
| 115 // This typically happens when the page is closed and for our purposes is | 114 // This typically happens when the page is closed and for our purposes is |
| 116 // appropriate to do when tearing down a test. | 115 // appropriate to do when tearing down a test. |
| 117 void Stop() { | 116 void Stop() { |
| 118 if (data_source_->loading()) { | 117 if (data_source_->loading()) { |
| 119 loader()->didFail(url_loader(), response_generator_.GenerateError()); | 118 loader()->didFail(url_loader(), response_generator_.GenerateError()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 // Used for calling BufferedResourceLoader::didReceiveData(). | 189 // Used for calling BufferedResourceLoader::didReceiveData(). |
| 191 char data_[kDataSize]; | 190 char data_[kDataSize]; |
| 192 | 191 |
| 193 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest); | 192 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest); |
| 194 }; | 193 }; |
| 195 | 194 |
| 196 TEST_F(BufferedDataSourceTest, Range_Supported) { | 195 TEST_F(BufferedDataSourceTest, Range_Supported) { |
| 197 Initialize(media::PIPELINE_OK); | 196 Initialize(media::PIPELINE_OK); |
| 198 | 197 |
| 199 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 198 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); |
| 200 EXPECT_CALL(host_, SetBufferedBytes(0)); | |
| 201 Respond(response_generator_.Generate206(0)); | 199 Respond(response_generator_.Generate206(0)); |
| 202 | 200 |
| 203 EXPECT_TRUE(data_source_->loading()); | 201 EXPECT_TRUE(data_source_->loading()); |
| 204 EXPECT_FALSE(data_source_->IsStreaming()); | 202 EXPECT_FALSE(data_source_->IsStreaming()); |
| 205 Stop(); | 203 Stop(); |
| 206 } | 204 } |
| 207 | 205 |
| 208 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { | 206 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { |
| 209 Initialize(media::PIPELINE_OK); | 207 Initialize(media::PIPELINE_OK); |
| 210 | 208 |
| 211 EXPECT_CALL(host_, SetBufferedBytes(0)); | |
| 212 Respond(response_generator_.Generate206( | 209 Respond(response_generator_.Generate206( |
| 213 0, TestResponseGenerator::kNoContentRangeInstanceSize)); | 210 0, TestResponseGenerator::kNoContentRangeInstanceSize)); |
| 214 | 211 |
| 215 EXPECT_TRUE(data_source_->loading()); | 212 EXPECT_TRUE(data_source_->loading()); |
| 216 EXPECT_TRUE(data_source_->IsStreaming()); | 213 EXPECT_TRUE(data_source_->IsStreaming()); |
| 217 Stop(); | 214 Stop(); |
| 218 } | 215 } |
| 219 | 216 |
| 220 TEST_F(BufferedDataSourceTest, Range_NotFound) { | 217 TEST_F(BufferedDataSourceTest, Range_NotFound) { |
| 221 Initialize(media::PIPELINE_ERROR_NETWORK); | 218 Initialize(media::PIPELINE_ERROR_NETWORK); |
| 222 Respond(response_generator_.Generate404()); | 219 Respond(response_generator_.Generate404()); |
| 223 | 220 |
| 224 EXPECT_FALSE(data_source_->loading()); | 221 EXPECT_FALSE(data_source_->loading()); |
| 225 Stop(); | 222 Stop(); |
| 226 } | 223 } |
| 227 | 224 |
| 228 TEST_F(BufferedDataSourceTest, Range_NotSupported) { | 225 TEST_F(BufferedDataSourceTest, Range_NotSupported) { |
| 229 Initialize(media::PIPELINE_OK); | 226 Initialize(media::PIPELINE_OK); |
| 230 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 227 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); |
| 231 EXPECT_CALL(host_, SetBufferedBytes(0)); | |
| 232 Respond(response_generator_.Generate200()); | 228 Respond(response_generator_.Generate200()); |
| 233 | 229 |
| 234 EXPECT_TRUE(data_source_->loading()); | 230 EXPECT_TRUE(data_source_->loading()); |
| 235 EXPECT_TRUE(data_source_->IsStreaming()); | 231 EXPECT_TRUE(data_source_->IsStreaming()); |
| 236 Stop(); | 232 Stop(); |
| 237 } | 233 } |
| 238 | 234 |
| 239 // Special carve-out for Apache versions that choose to return a 200 for | 235 // Special carve-out for Apache versions that choose to return a 200 for |
| 240 // Range:0- ("because it's more efficient" than a 206) | 236 // Range:0- ("because it's more efficient" than a 206) |
| 241 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { | 237 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { |
| 242 Initialize(media::PIPELINE_OK); | 238 Initialize(media::PIPELINE_OK); |
| 243 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 239 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); |
| 244 EXPECT_CALL(host_, SetBufferedBytes(0)); | |
| 245 WebURLResponse response = response_generator_.Generate200(); | 240 WebURLResponse response = response_generator_.Generate200(); |
| 246 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), | 241 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), |
| 247 WebString::fromUTF8("bytes")); | 242 WebString::fromUTF8("bytes")); |
| 248 Respond(response); | 243 Respond(response); |
| 249 | 244 |
| 250 EXPECT_TRUE(data_source_->loading()); | 245 EXPECT_TRUE(data_source_->loading()); |
| 251 EXPECT_FALSE(data_source_->IsStreaming()); | 246 EXPECT_FALSE(data_source_->IsStreaming()); |
| 252 Stop(); | 247 Stop(); |
| 253 } | 248 } |
| 254 | 249 |
| 255 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { | 250 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { |
| 256 Initialize(media::PIPELINE_ERROR_NETWORK); | 251 Initialize(media::PIPELINE_ERROR_NETWORK); |
| 257 Respond(response_generator_.Generate206( | 252 Respond(response_generator_.Generate206( |
| 258 0, TestResponseGenerator::kNoContentRange)); | 253 0, TestResponseGenerator::kNoContentRange)); |
| 259 | 254 |
| 260 EXPECT_FALSE(data_source_->loading()); | 255 EXPECT_FALSE(data_source_->loading()); |
| 261 Stop(); | 256 Stop(); |
| 262 } | 257 } |
| 263 | 258 |
| 264 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { | 259 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { |
| 265 Initialize(media::PIPELINE_OK); | 260 Initialize(media::PIPELINE_OK); |
| 266 | 261 |
| 267 // It'll manage without a Content-Length response. | 262 // It'll manage without a Content-Length response. |
| 268 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 263 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); |
| 269 EXPECT_CALL(host_, SetBufferedBytes(0)); | |
| 270 Respond(response_generator_.Generate206( | 264 Respond(response_generator_.Generate206( |
| 271 0, TestResponseGenerator::kNoContentLength)); | 265 0, TestResponseGenerator::kNoContentLength)); |
| 272 | 266 |
| 273 EXPECT_TRUE(data_source_->loading()); | 267 EXPECT_TRUE(data_source_->loading()); |
| 274 EXPECT_FALSE(data_source_->IsStreaming()); | 268 EXPECT_FALSE(data_source_->IsStreaming()); |
| 275 Stop(); | 269 Stop(); |
| 276 } | 270 } |
| 277 | 271 |
| 278 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { | 272 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { |
| 279 Initialize(media::PIPELINE_ERROR_NETWORK); | 273 Initialize(media::PIPELINE_ERROR_NETWORK); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 // Read so far ahead to cause the loader to get recreated. | 390 // Read so far ahead to cause the loader to get recreated. |
| 397 BufferedResourceLoader* old_loader = loader(); | 391 BufferedResourceLoader* old_loader = loader(); |
| 398 ExpectCreateResourceLoader(); | 392 ExpectCreateResourceLoader(); |
| 399 ReadAt(kFarReadPosition); | 393 ReadAt(kFarReadPosition); |
| 400 Respond(response_generator_.Generate206(kFarReadPosition)); | 394 Respond(response_generator_.Generate206(kFarReadPosition)); |
| 401 | 395 |
| 402 // Verify loader changed but still has same bitrate. | 396 // Verify loader changed but still has same bitrate. |
| 403 EXPECT_NE(old_loader, loader()); | 397 EXPECT_NE(old_loader, loader()); |
| 404 EXPECT_EQ(1234, loader_bitrate()); | 398 EXPECT_EQ(1234, loader_bitrate()); |
| 405 | 399 |
| 406 // During teardown we'll also report our final network status. | |
| 407 EXPECT_CALL(host_, SetBufferedBytes(4000000)); | |
| 408 | |
| 409 EXPECT_TRUE(data_source_->loading()); | 400 EXPECT_TRUE(data_source_->loading()); |
| 410 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 401 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 411 Stop(); | 402 Stop(); |
| 412 } | 403 } |
| 413 | 404 |
| 414 TEST_F(BufferedDataSourceTest, SetPlaybackRate) { | 405 TEST_F(BufferedDataSourceTest, SetPlaybackRate) { |
| 415 InitializeWith206Response(); | 406 InitializeWith206Response(); |
| 416 | 407 |
| 417 data_source_->SetPlaybackRate(2.0f); | 408 data_source_->SetPlaybackRate(2.0f); |
| 418 message_loop_.RunAllPending(); | 409 message_loop_.RunAllPending(); |
| 419 EXPECT_EQ(2.0f, data_source_playback_rate()); | 410 EXPECT_EQ(2.0f, data_source_playback_rate()); |
| 420 EXPECT_EQ(2.0f, loader_playback_rate()); | 411 EXPECT_EQ(2.0f, loader_playback_rate()); |
| 421 | 412 |
| 422 // Read so far ahead to cause the loader to get recreated. | 413 // Read so far ahead to cause the loader to get recreated. |
| 423 BufferedResourceLoader* old_loader = loader(); | 414 BufferedResourceLoader* old_loader = loader(); |
| 424 ExpectCreateResourceLoader(); | 415 ExpectCreateResourceLoader(); |
| 425 ReadAt(kFarReadPosition); | 416 ReadAt(kFarReadPosition); |
| 426 Respond(response_generator_.Generate206(kFarReadPosition)); | 417 Respond(response_generator_.Generate206(kFarReadPosition)); |
| 427 | 418 |
| 428 // Verify loader changed but still has same playback rate. | 419 // Verify loader changed but still has same playback rate. |
| 429 EXPECT_NE(old_loader, loader()); | 420 EXPECT_NE(old_loader, loader()); |
| 430 | 421 |
| 431 // During teardown we'll also report our final network status. | |
| 432 EXPECT_CALL(host_, SetBufferedBytes(4000000)); | |
| 433 | |
| 434 EXPECT_TRUE(data_source_->loading()); | 422 EXPECT_TRUE(data_source_->loading()); |
| 435 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 423 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 436 Stop(); | 424 Stop(); |
| 437 } | 425 } |
| 438 | 426 |
| 439 TEST_F(BufferedDataSourceTest, Read) { | 427 TEST_F(BufferedDataSourceTest, Read) { |
| 440 InitializeWith206Response(); | 428 InitializeWith206Response(); |
| 441 | 429 |
| 442 ReadAt(0); | 430 ReadAt(0); |
| 443 | 431 |
| 444 // When the read completes we'll update our network status. | 432 // When the read completes we'll update our network status. |
| 445 EXPECT_CALL(host_, SetBufferedBytes(kDataSize)); | 433 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); |
| 446 EXPECT_CALL(host_, SetNetworkActivity(true)); | 434 EXPECT_CALL(host_, SetNetworkActivity(true)); |
| 447 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 435 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 448 FinishRead(); | 436 FinishRead(); |
| 449 | 437 |
| 450 // During teardown we'll also report our final network status. | 438 // During teardown we'll also report our final network status. |
| 451 EXPECT_CALL(host_, SetNetworkActivity(false)); | 439 EXPECT_CALL(host_, SetNetworkActivity(false)); |
| 452 EXPECT_CALL(host_, SetBufferedBytes(kDataSize)); | 440 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); |
| 453 | 441 |
| 454 EXPECT_TRUE(data_source_->loading()); | 442 EXPECT_TRUE(data_source_->loading()); |
| 455 Stop(); | 443 Stop(); |
| 456 } | 444 } |
| 457 | 445 |
| 458 } // namespace webkit_media | 446 } // namespace webkit_media |
| OLD | NEW |