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