| 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 // Whether the resource load has starting loading but yet to been cancelled. | 79 // Whether the resource load has starting loading but yet to been cancelled. |
| 80 bool loading_; | 80 bool loading_; |
| 81 | 81 |
| 82 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSource); | 82 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSource); |
| 83 }; | 83 }; |
| 84 | 84 |
| 85 static const int64 kFileSize = 5000000; | 85 static const int64 kFileSize = 5000000; |
| 86 static const int64 kFarReadPosition = 4000000; | 86 static const int64 kFarReadPosition = 4000000; |
| 87 static const int kDataSize = 1024; | 87 static const int kDataSize = 1024; |
| 88 | 88 |
| 89 static const char kHttpUrl[] = "http://localhost/foo.webm"; |
| 90 static const char kFileUrl[] = "file:///tmp/bar.webm"; |
| 91 |
| 89 class BufferedDataSourceTest : public testing::Test { | 92 class BufferedDataSourceTest : public testing::Test { |
| 90 public: | 93 public: |
| 91 BufferedDataSourceTest() | 94 BufferedDataSourceTest() |
| 92 : response_generator_(GURL("http://localhost/foo.webm"), kFileSize), | 95 : view_(WebView::create(NULL)) { |
| 93 view_(WebView::create(NULL)) { | |
| 94 view_->initializeMainFrame(&client_); | 96 view_->initializeMainFrame(&client_); |
| 95 | 97 |
| 96 data_source_ = new MockBufferedDataSource(&message_loop_, | 98 data_source_ = new MockBufferedDataSource(&message_loop_, |
| 97 view_->mainFrame()); | 99 view_->mainFrame()); |
| 98 data_source_->set_host(&host_); | 100 data_source_->set_host(&host_); |
| 99 } | 101 } |
| 100 | 102 |
| 101 virtual ~BufferedDataSourceTest() { | 103 virtual ~BufferedDataSourceTest() { |
| 102 view_->close(); | 104 view_->close(); |
| 103 } | 105 } |
| 104 | 106 |
| 105 void Initialize(media::PipelineStatus expected) { | 107 void Initialize(const char* url, media::PipelineStatus expected) { |
| 108 GURL gurl(url); |
| 109 response_generator_.reset(new TestResponseGenerator(gurl, kFileSize)); |
| 110 |
| 106 ExpectCreateResourceLoader(); | 111 ExpectCreateResourceLoader(); |
| 107 | 112 data_source_->Initialize(gurl, |
| 108 EXPECT_FALSE(data_source_->downloading()); | |
| 109 data_source_->Initialize(response_generator_.gurl(), | |
| 110 BufferedResourceLoader::kUnspecified, | 113 BufferedResourceLoader::kUnspecified, |
| 111 media::NewExpectedStatusCB(expected)); | 114 media::NewExpectedStatusCB(expected)); |
| 112 message_loop_.RunAllPending(); | 115 message_loop_.RunAllPending(); |
| 113 EXPECT_TRUE(data_source_->downloading()); | 116 |
| 117 bool is_http = gurl.SchemeIs(kHttpScheme) || gurl.SchemeIs(kHttpsScheme); |
| 118 EXPECT_EQ(data_source_->downloading(), is_http); |
| 114 } | 119 } |
| 115 | 120 |
| 116 // Helper to initialize tests with a valid 206 response. | 121 // Helper to initialize tests with a valid 206 response. |
| 117 void InitializeWith206Response() { | 122 void InitializeWith206Response() { |
| 118 Initialize(media::PIPELINE_OK); | 123 Initialize(kHttpUrl, media::PIPELINE_OK); |
| 119 | 124 |
| 120 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 125 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 121 Respond(response_generator_.Generate206(0)); | 126 Respond(response_generator_->Generate206(0)); |
| 127 } |
| 128 |
| 129 // Helper to initialize tests with a valid file:// response. |
| 130 void InitializeWithFileResponse() { |
| 131 Initialize(kFileUrl, media::PIPELINE_OK); |
| 132 |
| 133 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); |
| 134 EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize)); |
| 135 Respond(response_generator_->GenerateFileResponse(0)); |
| 122 } | 136 } |
| 123 | 137 |
| 124 // Stops any active loaders and shuts down the data source. | 138 // Stops any active loaders and shuts down the data source. |
| 125 // | 139 // |
| 126 // This typically happens when the page is closed and for our purposes is | 140 // This typically happens when the page is closed and for our purposes is |
| 127 // appropriate to do when tearing down a test. | 141 // appropriate to do when tearing down a test. |
| 128 void Stop() { | 142 void Stop() { |
| 129 if (data_source_->loading()) { | 143 if (data_source_->loading()) { |
| 130 loader()->didFail(url_loader(), response_generator_.GenerateError()); | 144 loader()->didFail(url_loader(), response_generator_->GenerateError()); |
| 131 message_loop_.RunAllPending(); | 145 message_loop_.RunAllPending(); |
| 132 } | 146 } |
| 133 | 147 |
| 134 data_source_->Stop(media::NewExpectedClosure()); | 148 data_source_->Stop(media::NewExpectedClosure()); |
| 135 message_loop_.RunAllPending(); | 149 message_loop_.RunAllPending(); |
| 136 } | 150 } |
| 137 | 151 |
| 138 void ExpectCreateResourceLoader() { | 152 void ExpectCreateResourceLoader() { |
| 139 EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) | 153 EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) |
| 140 .WillOnce(Invoke(data_source_.get(), | 154 .WillOnce(Invoke(data_source_.get(), |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 BufferedResourceLoader::DeferStrategy defer_strategy() { | 196 BufferedResourceLoader::DeferStrategy defer_strategy() { |
| 183 return loader()->defer_strategy_; | 197 return loader()->defer_strategy_; |
| 184 } | 198 } |
| 185 int data_source_bitrate() { return data_source_->bitrate_; } | 199 int data_source_bitrate() { return data_source_->bitrate_; } |
| 186 int data_source_playback_rate() { return data_source_->playback_rate_; } | 200 int data_source_playback_rate() { return data_source_->playback_rate_; } |
| 187 int loader_bitrate() { return loader()->bitrate_; } | 201 int loader_bitrate() { return loader()->bitrate_; } |
| 188 int loader_playback_rate() { return loader()->playback_rate_; } | 202 int loader_playback_rate() { return loader()->playback_rate_; } |
| 189 | 203 |
| 190 scoped_refptr<MockBufferedDataSource> data_source_; | 204 scoped_refptr<MockBufferedDataSource> data_source_; |
| 191 | 205 |
| 192 TestResponseGenerator response_generator_; | 206 scoped_ptr<TestResponseGenerator> response_generator_; |
| 193 MockWebFrameClient client_; | 207 MockWebFrameClient client_; |
| 194 WebView* view_; | 208 WebView* view_; |
| 195 | 209 |
| 196 StrictMock<media::MockDataSourceHost> host_; | 210 StrictMock<media::MockDataSourceHost> host_; |
| 197 MessageLoop message_loop_; | 211 MessageLoop message_loop_; |
| 198 | 212 |
| 199 private: | 213 private: |
| 200 // Used for calling BufferedDataSource::Read(). | 214 // Used for calling BufferedDataSource::Read(). |
| 201 uint8 buffer_[kDataSize]; | 215 uint8 buffer_[kDataSize]; |
| 202 | 216 |
| 203 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest); | 217 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest); |
| 204 }; | 218 }; |
| 205 | 219 |
| 206 TEST_F(BufferedDataSourceTest, Range_Supported) { | 220 TEST_F(BufferedDataSourceTest, Range_Supported) { |
| 207 Initialize(media::PIPELINE_OK); | 221 Initialize(kHttpUrl, media::PIPELINE_OK); |
| 208 | 222 |
| 209 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 223 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 210 Respond(response_generator_.Generate206(0)); | 224 Respond(response_generator_->Generate206(0)); |
| 211 | 225 |
| 212 EXPECT_TRUE(data_source_->loading()); | 226 EXPECT_TRUE(data_source_->loading()); |
| 213 EXPECT_FALSE(data_source_->IsStreaming()); | 227 EXPECT_FALSE(data_source_->IsStreaming()); |
| 214 Stop(); | 228 Stop(); |
| 215 } | 229 } |
| 216 | 230 |
| 217 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { | 231 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { |
| 218 Initialize(media::PIPELINE_OK); | 232 Initialize(kHttpUrl, media::PIPELINE_OK); |
| 219 | 233 |
| 220 Respond(response_generator_.Generate206( | 234 Respond(response_generator_->Generate206( |
| 221 0, TestResponseGenerator::kNoContentRangeInstanceSize)); | 235 0, TestResponseGenerator::kNoContentRangeInstanceSize)); |
| 222 | 236 |
| 223 EXPECT_TRUE(data_source_->loading()); | 237 EXPECT_TRUE(data_source_->loading()); |
| 224 EXPECT_TRUE(data_source_->IsStreaming()); | 238 EXPECT_TRUE(data_source_->IsStreaming()); |
| 225 Stop(); | 239 Stop(); |
| 226 } | 240 } |
| 227 | 241 |
| 228 TEST_F(BufferedDataSourceTest, Range_NotFound) { | 242 TEST_F(BufferedDataSourceTest, Range_NotFound) { |
| 229 Initialize(media::PIPELINE_ERROR_NETWORK); | 243 Initialize(kHttpUrl, media::PIPELINE_ERROR_NETWORK); |
| 230 Respond(response_generator_.Generate404()); | 244 Respond(response_generator_->Generate404()); |
| 231 | 245 |
| 232 EXPECT_FALSE(data_source_->loading()); | 246 EXPECT_FALSE(data_source_->loading()); |
| 233 Stop(); | 247 Stop(); |
| 234 } | 248 } |
| 235 | 249 |
| 236 TEST_F(BufferedDataSourceTest, Range_NotSupported) { | 250 TEST_F(BufferedDataSourceTest, Range_NotSupported) { |
| 237 Initialize(media::PIPELINE_OK); | 251 Initialize(kHttpUrl, media::PIPELINE_OK); |
| 238 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 252 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 239 Respond(response_generator_.Generate200()); | 253 Respond(response_generator_->Generate200()); |
| 240 | 254 |
| 241 EXPECT_TRUE(data_source_->loading()); | 255 EXPECT_TRUE(data_source_->loading()); |
| 242 EXPECT_TRUE(data_source_->IsStreaming()); | 256 EXPECT_TRUE(data_source_->IsStreaming()); |
| 243 Stop(); | 257 Stop(); |
| 244 } | 258 } |
| 245 | 259 |
| 246 // Special carve-out for Apache versions that choose to return a 200 for | 260 // Special carve-out for Apache versions that choose to return a 200 for |
| 247 // Range:0- ("because it's more efficient" than a 206) | 261 // Range:0- ("because it's more efficient" than a 206) |
| 248 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { | 262 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { |
| 249 Initialize(media::PIPELINE_OK); | 263 Initialize(kHttpUrl, media::PIPELINE_OK); |
| 250 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 264 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 251 WebURLResponse response = response_generator_.Generate200(); | 265 WebURLResponse response = response_generator_->Generate200(); |
| 252 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), | 266 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), |
| 253 WebString::fromUTF8("bytes")); | 267 WebString::fromUTF8("bytes")); |
| 254 Respond(response); | 268 Respond(response); |
| 255 | 269 |
| 256 EXPECT_TRUE(data_source_->loading()); | 270 EXPECT_TRUE(data_source_->loading()); |
| 257 EXPECT_FALSE(data_source_->IsStreaming()); | 271 EXPECT_FALSE(data_source_->IsStreaming()); |
| 258 Stop(); | 272 Stop(); |
| 259 } | 273 } |
| 260 | 274 |
| 261 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { | 275 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { |
| 262 Initialize(media::PIPELINE_ERROR_NETWORK); | 276 Initialize(kHttpUrl, media::PIPELINE_ERROR_NETWORK); |
| 263 Respond(response_generator_.Generate206( | 277 Respond(response_generator_->Generate206( |
| 264 0, TestResponseGenerator::kNoContentRange)); | 278 0, TestResponseGenerator::kNoContentRange)); |
| 265 | 279 |
| 266 EXPECT_FALSE(data_source_->loading()); | 280 EXPECT_FALSE(data_source_->loading()); |
| 267 Stop(); | 281 Stop(); |
| 268 } | 282 } |
| 269 | 283 |
| 270 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { | 284 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { |
| 271 Initialize(media::PIPELINE_OK); | 285 Initialize(kHttpUrl, media::PIPELINE_OK); |
| 272 | 286 |
| 273 // It'll manage without a Content-Length response. | 287 // It'll manage without a Content-Length response. |
| 274 EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length())); | 288 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
| 275 Respond(response_generator_.Generate206( | 289 Respond(response_generator_->Generate206( |
| 276 0, TestResponseGenerator::kNoContentLength)); | 290 0, TestResponseGenerator::kNoContentLength)); |
| 277 | 291 |
| 278 EXPECT_TRUE(data_source_->loading()); | 292 EXPECT_TRUE(data_source_->loading()); |
| 279 EXPECT_FALSE(data_source_->IsStreaming()); | 293 EXPECT_FALSE(data_source_->IsStreaming()); |
| 280 Stop(); | 294 Stop(); |
| 281 } | 295 } |
| 282 | 296 |
| 283 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { | 297 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { |
| 284 Initialize(media::PIPELINE_ERROR_NETWORK); | 298 Initialize(kHttpUrl, media::PIPELINE_ERROR_NETWORK); |
| 285 | 299 |
| 286 // Now it's done and will fail. | 300 // Now it's done and will fail. |
| 287 Respond(response_generator_.Generate206(1337)); | 301 Respond(response_generator_->Generate206(1337)); |
| 288 | 302 |
| 289 EXPECT_FALSE(data_source_->loading()); | 303 EXPECT_FALSE(data_source_->loading()); |
| 290 Stop(); | 304 Stop(); |
| 291 } | 305 } |
| 292 | 306 |
| 293 // Test the case where the initial response from the server indicates that | 307 // Test the case where the initial response from the server indicates that |
| 294 // Range requests are supported, but a later request prove otherwise. | 308 // Range requests are supported, but a later request prove otherwise. |
| 295 TEST_F(BufferedDataSourceTest, Range_ServerLied) { | 309 TEST_F(BufferedDataSourceTest, Range_ServerLied) { |
| 296 InitializeWith206Response(); | 310 InitializeWith206Response(); |
| 297 | 311 |
| 298 // Read causing a new request to be made -- we'll expect it to error. | 312 // Read causing a new request to be made -- we'll expect it to error. |
| 299 ExpectCreateResourceLoader(); | 313 ExpectCreateResourceLoader(); |
| 300 ReadAt(kFarReadPosition); | 314 ReadAt(kFarReadPosition); |
| 301 | 315 |
| 302 // Return a 200 in response to a range request. | 316 // Return a 200 in response to a range request. |
| 303 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 317 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 304 Respond(response_generator_.Generate200()); | 318 Respond(response_generator_->Generate200()); |
| 305 | 319 |
| 306 EXPECT_FALSE(data_source_->loading()); | 320 EXPECT_FALSE(data_source_->loading()); |
| 307 Stop(); | 321 Stop(); |
| 308 } | 322 } |
| 309 | 323 |
| 310 TEST_F(BufferedDataSourceTest, Range_AbortWhileReading) { | 324 TEST_F(BufferedDataSourceTest, Http_AbortWhileReading) { |
| 311 InitializeWith206Response(); | 325 InitializeWith206Response(); |
| 312 | 326 |
| 313 // Make sure there's a pending read -- we'll expect it to error. | 327 // Make sure there's a pending read -- we'll expect it to error. |
| 314 ReadAt(0); | 328 ReadAt(0); |
| 315 | 329 |
| 316 // Abort!!! | 330 // Abort!!! |
| 317 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 331 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 318 data_source_->Abort(); | 332 data_source_->Abort(); |
| 319 message_loop_.RunAllPending(); | 333 message_loop_.RunAllPending(); |
| 320 | 334 |
| 321 EXPECT_FALSE(data_source_->loading()); | 335 EXPECT_FALSE(data_source_->loading()); |
| 322 Stop(); | 336 Stop(); |
| 323 } | 337 } |
| 324 | 338 |
| 325 TEST_F(BufferedDataSourceTest, Range_TooManyRetries) { | 339 TEST_F(BufferedDataSourceTest, File_AbortWhileReading) { |
| 340 InitializeWithFileResponse(); |
| 341 |
| 342 // Make sure there's a pending read -- we'll expect it to error. |
| 343 ReadAt(0); |
| 344 |
| 345 // Abort!!! |
| 346 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 347 data_source_->Abort(); |
| 348 message_loop_.RunAllPending(); |
| 349 |
| 350 EXPECT_FALSE(data_source_->loading()); |
| 351 Stop(); |
| 352 } |
| 353 |
| 354 TEST_F(BufferedDataSourceTest, Http_Retry) { |
| 355 InitializeWith206Response(); |
| 356 |
| 357 // Read to advance our position. |
| 358 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 359 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); |
| 360 ReadAt(0); |
| 361 ReceiveData(kDataSize); |
| 362 |
| 363 // Issue a pending read but terminate the connection to force a retry. |
| 364 ReadAt(kDataSize); |
| 365 ExpectCreateResourceLoader(); |
| 366 FinishLoading(); |
| 367 Respond(response_generator_->Generate206(kDataSize)); |
| 368 |
| 369 // Complete the read. |
| 370 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 371 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1)); |
| 372 ReceiveData(kDataSize); |
| 373 |
| 374 EXPECT_TRUE(data_source_->loading()); |
| 375 Stop(); |
| 376 } |
| 377 |
| 378 TEST_F(BufferedDataSourceTest, File_Retry) { |
| 379 InitializeWithFileResponse(); |
| 380 |
| 381 // Read to advance our position. |
| 382 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 383 ReadAt(0); |
| 384 ReceiveData(kDataSize); |
| 385 |
| 386 // Issue a pending read but terminate the connection to force a retry. |
| 387 ReadAt(kDataSize); |
| 388 ExpectCreateResourceLoader(); |
| 389 FinishLoading(); |
| 390 Respond(response_generator_->GenerateFileResponse(kDataSize)); |
| 391 |
| 392 // Complete the read. |
| 393 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 394 ReceiveData(kDataSize); |
| 395 |
| 396 EXPECT_TRUE(data_source_->loading()); |
| 397 Stop(); |
| 398 } |
| 399 |
| 400 TEST_F(BufferedDataSourceTest, Http_TooManyRetries) { |
| 326 InitializeWith206Response(); | 401 InitializeWith206Response(); |
| 327 | 402 |
| 328 // Make sure there's a pending read -- we'll expect it to error. | 403 // Make sure there's a pending read -- we'll expect it to error. |
| 329 ReadAt(0); | 404 ReadAt(0); |
| 330 | 405 |
| 331 // It'll try three times. | 406 // It'll try three times. |
| 332 ExpectCreateResourceLoader(); | 407 ExpectCreateResourceLoader(); |
| 333 FinishLoading(); | 408 FinishLoading(); |
| 334 Respond(response_generator_.Generate206(0)); | 409 Respond(response_generator_->Generate206(0)); |
| 335 | 410 |
| 336 ExpectCreateResourceLoader(); | 411 ExpectCreateResourceLoader(); |
| 337 FinishLoading(); | 412 FinishLoading(); |
| 338 Respond(response_generator_.Generate206(0)); | 413 Respond(response_generator_->Generate206(0)); |
| 339 | 414 |
| 340 ExpectCreateResourceLoader(); | 415 ExpectCreateResourceLoader(); |
| 341 FinishLoading(); | 416 FinishLoading(); |
| 342 Respond(response_generator_.Generate206(0)); | 417 Respond(response_generator_->Generate206(0)); |
| 343 | 418 |
| 344 // It'll error after this. | 419 // It'll error after this. |
| 345 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 420 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 421 FinishLoading(); |
| 422 |
| 423 EXPECT_FALSE(data_source_->loading()); |
| 424 Stop(); |
| 425 } |
| 426 |
| 427 TEST_F(BufferedDataSourceTest, File_TooManyRetries) { |
| 428 InitializeWithFileResponse(); |
| 429 |
| 430 // Make sure there's a pending read -- we'll expect it to error. |
| 431 ReadAt(0); |
| 432 |
| 433 // It'll try three times. |
| 434 ExpectCreateResourceLoader(); |
| 435 FinishLoading(); |
| 436 Respond(response_generator_->GenerateFileResponse(0)); |
| 437 |
| 438 ExpectCreateResourceLoader(); |
| 439 FinishLoading(); |
| 440 Respond(response_generator_->GenerateFileResponse(0)); |
| 441 |
| 442 ExpectCreateResourceLoader(); |
| 443 FinishLoading(); |
| 444 Respond(response_generator_->GenerateFileResponse(0)); |
| 445 |
| 446 // It'll error after this. |
| 447 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 346 FinishLoading(); | 448 FinishLoading(); |
| 347 | 449 |
| 348 EXPECT_FALSE(data_source_->loading()); | 450 EXPECT_FALSE(data_source_->loading()); |
| 349 Stop(); | 451 Stop(); |
| 350 } | 452 } |
| 351 | 453 |
| 454 TEST_F(BufferedDataSourceTest, File_InstanceSizeUnknown) { |
| 455 Initialize(kFileUrl, media::PIPELINE_ERROR_NETWORK); |
| 456 EXPECT_FALSE(data_source_->downloading()); |
| 457 |
| 458 Respond(response_generator_->GenerateFileResponse(-1)); |
| 459 |
| 460 EXPECT_FALSE(data_source_->loading()); |
| 461 Stop(); |
| 462 } |
| 463 |
| 464 TEST_F(BufferedDataSourceTest, File_Successful) { |
| 465 InitializeWithFileResponse(); |
| 466 |
| 467 EXPECT_TRUE(data_source_->loading()); |
| 468 Stop(); |
| 469 } |
| 470 |
| 352 static void SetTrue(bool* value) { | 471 static void SetTrue(bool* value) { |
| 353 *value = true; | 472 *value = true; |
| 354 } | 473 } |
| 355 | 474 |
| 356 // This test makes sure that Stop() does not require a task to run on | 475 // This test makes sure that Stop() does not require a task to run on |
| 357 // |message_loop_| before it calls its callback. This prevents accidental | 476 // |message_loop_| before it calls its callback. This prevents accidental |
| 358 // introduction of a pipeline teardown deadlock. The pipeline owner blocks | 477 // introduction of a pipeline teardown deadlock. The pipeline owner blocks |
| 359 // the render message loop while waiting for Stop() to complete. Since this | 478 // the render message loop while waiting for Stop() to complete. Since this |
| 360 // object runs on the render message loop, Stop() will not complete if it | 479 // object runs on the render message loop, Stop() will not complete if it |
| 361 // requires a task to run on the the message loop that is being blocked. | 480 // requires a task to run on the the message loop that is being blocked. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 | 514 |
| 396 data_source_->SetBitrate(1234); | 515 data_source_->SetBitrate(1234); |
| 397 message_loop_.RunAllPending(); | 516 message_loop_.RunAllPending(); |
| 398 EXPECT_EQ(1234, data_source_bitrate()); | 517 EXPECT_EQ(1234, data_source_bitrate()); |
| 399 EXPECT_EQ(1234, loader_bitrate()); | 518 EXPECT_EQ(1234, loader_bitrate()); |
| 400 | 519 |
| 401 // Read so far ahead to cause the loader to get recreated. | 520 // Read so far ahead to cause the loader to get recreated. |
| 402 BufferedResourceLoader* old_loader = loader(); | 521 BufferedResourceLoader* old_loader = loader(); |
| 403 ExpectCreateResourceLoader(); | 522 ExpectCreateResourceLoader(); |
| 404 ReadAt(kFarReadPosition); | 523 ReadAt(kFarReadPosition); |
| 405 Respond(response_generator_.Generate206(kFarReadPosition)); | 524 Respond(response_generator_->Generate206(kFarReadPosition)); |
| 406 | 525 |
| 407 // Verify loader changed but still has same bitrate. | 526 // Verify loader changed but still has same bitrate. |
| 408 EXPECT_NE(old_loader, loader()); | 527 EXPECT_NE(old_loader, loader()); |
| 409 EXPECT_EQ(1234, loader_bitrate()); | 528 EXPECT_EQ(1234, loader_bitrate()); |
| 410 | 529 |
| 411 EXPECT_TRUE(data_source_->loading()); | 530 EXPECT_TRUE(data_source_->loading()); |
| 412 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 531 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 413 Stop(); | 532 Stop(); |
| 414 } | 533 } |
| 415 | 534 |
| 416 TEST_F(BufferedDataSourceTest, SetPlaybackRate) { | 535 TEST_F(BufferedDataSourceTest, SetPlaybackRate) { |
| 417 InitializeWith206Response(); | 536 InitializeWith206Response(); |
| 418 | 537 |
| 419 data_source_->SetPlaybackRate(2.0f); | 538 data_source_->SetPlaybackRate(2.0f); |
| 420 message_loop_.RunAllPending(); | 539 message_loop_.RunAllPending(); |
| 421 EXPECT_EQ(2.0f, data_source_playback_rate()); | 540 EXPECT_EQ(2.0f, data_source_playback_rate()); |
| 422 EXPECT_EQ(2.0f, loader_playback_rate()); | 541 EXPECT_EQ(2.0f, loader_playback_rate()); |
| 423 | 542 |
| 424 // Read so far ahead to cause the loader to get recreated. | 543 // Read so far ahead to cause the loader to get recreated. |
| 425 BufferedResourceLoader* old_loader = loader(); | 544 BufferedResourceLoader* old_loader = loader(); |
| 426 ExpectCreateResourceLoader(); | 545 ExpectCreateResourceLoader(); |
| 427 ReadAt(kFarReadPosition); | 546 ReadAt(kFarReadPosition); |
| 428 Respond(response_generator_.Generate206(kFarReadPosition)); | 547 Respond(response_generator_->Generate206(kFarReadPosition)); |
| 429 | 548 |
| 430 // Verify loader changed but still has same playback rate. | 549 // Verify loader changed but still has same playback rate. |
| 431 EXPECT_NE(old_loader, loader()); | 550 EXPECT_NE(old_loader, loader()); |
| 432 | 551 |
| 433 EXPECT_TRUE(data_source_->loading()); | 552 EXPECT_TRUE(data_source_->loading()); |
| 434 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | 553 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); |
| 435 Stop(); | 554 Stop(); |
| 436 } | 555 } |
| 437 | 556 |
| 438 TEST_F(BufferedDataSourceTest, Read) { | 557 TEST_F(BufferedDataSourceTest, Http_Read) { |
| 439 InitializeWith206Response(); | 558 InitializeWith206Response(); |
| 440 | 559 |
| 441 ReadAt(0); | 560 ReadAt(0); |
| 442 | 561 |
| 443 // Receive first half of the read. | 562 // Receive first half of the read. |
| 444 EXPECT_CALL(host_, AddBufferedByteRange(0, (kDataSize / 2) - 1)); | 563 EXPECT_CALL(host_, AddBufferedByteRange(0, (kDataSize / 2) - 1)); |
| 445 ReceiveData(kDataSize / 2); | 564 ReceiveData(kDataSize / 2); |
| 446 | 565 |
| 447 // Receive last half of the read. | 566 // Receive last half of the read. |
| 448 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 567 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 449 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | 568 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); |
| 450 ReceiveData(kDataSize / 2); | 569 ReceiveData(kDataSize / 2); |
| 451 | 570 |
| 452 EXPECT_TRUE(data_source_->downloading()); | 571 EXPECT_TRUE(data_source_->downloading()); |
| 453 Stop(); | 572 Stop(); |
| 454 } | 573 } |
| 455 | 574 |
| 575 TEST_F(BufferedDataSourceTest, File_Read) { |
| 576 InitializeWithFileResponse(); |
| 577 |
| 578 ReadAt(0); |
| 579 |
| 580 // Receive first half of the read but no buffering update. |
| 581 ReceiveData(kDataSize / 2); |
| 582 |
| 583 // Receive last half of the read but no buffering update. |
| 584 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
| 585 ReceiveData(kDataSize / 2); |
| 586 |
| 587 Stop(); |
| 588 } |
| 589 |
| 456 } // namespace webkit_media | 590 } // namespace webkit_media |
| OLD | NEW |