OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
13 #include "media/base/media_log.h" | 13 #include "media/base/media_log.h" |
14 #include "media/base/mock_filters.h" | 14 #include "media/base/mock_filters.h" |
15 #include "media/base/test_helpers.h" | 15 #include "media/base/test_helpers.h" |
16 #include "media/blink/buffered_data_source_host_impl.h" | 16 #include "media/blink/buffered_data_source_host_impl.h" |
17 #include "media/blink/mock_weburlloader.h" | 17 #include "media/blink/mock_webassociatedurlloader.h" |
18 #include "media/blink/multibuffer_data_source.h" | 18 #include "media/blink/multibuffer_data_source.h" |
19 #include "media/blink/multibuffer_reader.h" | 19 #include "media/blink/multibuffer_reader.h" |
20 #include "media/blink/resource_multibuffer_data_provider.h" | 20 #include "media/blink/resource_multibuffer_data_provider.h" |
21 #include "media/blink/test_response_generator.h" | 21 #include "media/blink/test_response_generator.h" |
22 #include "third_party/WebKit/public/platform/WebURLResponse.h" | 22 #include "third_party/WebKit/public/platform/WebURLResponse.h" |
23 #include "third_party/WebKit/public/web/WebFrameClient.h" | 23 #include "third_party/WebKit/public/web/WebFrameClient.h" |
24 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 24 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
25 #include "third_party/WebKit/public/web/WebView.h" | 25 #include "third_party/WebKit/public/web/WebView.h" |
26 | 26 |
27 using ::testing::_; | 27 using ::testing::_; |
28 using ::testing::Assign; | 28 using ::testing::Assign; |
29 using ::testing::DoAll; | 29 using ::testing::DoAll; |
30 using ::testing::Invoke; | 30 using ::testing::Invoke; |
31 using ::testing::InvokeWithoutArgs; | 31 using ::testing::InvokeWithoutArgs; |
32 using ::testing::InSequence; | 32 using ::testing::InSequence; |
33 using ::testing::NiceMock; | 33 using ::testing::NiceMock; |
34 using ::testing::StrictMock; | 34 using ::testing::StrictMock; |
35 | 35 |
| 36 using blink::WebAssociatedURLLoader; |
36 using blink::WebLocalFrame; | 37 using blink::WebLocalFrame; |
37 using blink::WebString; | 38 using blink::WebString; |
38 using blink::WebURLLoader; | |
39 using blink::WebURLResponse; | 39 using blink::WebURLResponse; |
40 using blink::WebView; | 40 using blink::WebView; |
41 | 41 |
42 namespace media { | 42 namespace media { |
43 | 43 |
44 class TestResourceMultiBuffer; | 44 class TestResourceMultiBuffer; |
45 class TestMultiBufferDataProvider; | 45 class TestMultiBufferDataProvider; |
46 | 46 |
47 std::set<TestMultiBufferDataProvider*> test_data_providers; | 47 std::set<TestMultiBufferDataProvider*> test_data_providers; |
48 | 48 |
49 class TestMultiBufferDataProvider : public ResourceMultiBufferDataProvider { | 49 class TestMultiBufferDataProvider : public ResourceMultiBufferDataProvider { |
50 public: | 50 public: |
51 TestMultiBufferDataProvider(UrlData* url_data, MultiBuffer::BlockId pos) | 51 TestMultiBufferDataProvider(UrlData* url_data, MultiBuffer::BlockId pos) |
52 : ResourceMultiBufferDataProvider(url_data, pos), loading_(false) { | 52 : ResourceMultiBufferDataProvider(url_data, pos), loading_(false) { |
53 CHECK(test_data_providers.insert(this).second); | 53 CHECK(test_data_providers.insert(this).second); |
54 } | 54 } |
55 ~TestMultiBufferDataProvider() override { | 55 ~TestMultiBufferDataProvider() override { |
56 CHECK_EQ(static_cast<size_t>(1), test_data_providers.erase(this)); | 56 CHECK_EQ(static_cast<size_t>(1), test_data_providers.erase(this)); |
57 } | 57 } |
58 void Start() override { | 58 void Start() override { |
59 // Create a mock active loader. | 59 // Create a mock active loader. |
60 // Keep track of active loading state via loadAsynchronously() and cancel(). | 60 // Keep track of active loading state via loadAsynchronously() and cancel(). |
61 NiceMock<MockWebURLLoader>* url_loader = new NiceMock<MockWebURLLoader>(); | 61 NiceMock<MockWebAssociatedURLLoader>* url_loader = |
| 62 new NiceMock<MockWebAssociatedURLLoader>(); |
62 ON_CALL(*url_loader, cancel()) | 63 ON_CALL(*url_loader, cancel()) |
63 .WillByDefault(Invoke([this]() { | 64 .WillByDefault(Invoke([this]() { |
64 // Check that we have not been destroyed first. | 65 // Check that we have not been destroyed first. |
65 if (test_data_providers.find(this) != test_data_providers.end()) { | 66 if (test_data_providers.find(this) != test_data_providers.end()) { |
66 this->loading_ = false; | 67 this->loading_ = false; |
67 } | 68 } |
68 })); | 69 })); |
69 loading_ = true; | 70 loading_ = true; |
70 active_loader_.reset( | 71 active_loader_.reset( |
71 new ActiveLoader(std::unique_ptr<WebURLLoader>(url_loader))); | 72 new ActiveLoader(std::unique_ptr<WebAssociatedURLLoader>(url_loader))); |
72 if (!on_start_.is_null()) { | 73 if (!on_start_.is_null()) { |
73 on_start_.Run(); | 74 on_start_.Run(); |
74 } | 75 } |
75 } | 76 } |
76 | 77 |
77 bool loading() const { return loading_; } | 78 bool loading() const { return loading_; } |
78 void RunOnStart(base::Closure cb) { on_start_ = cb; } | 79 void RunOnStart(base::Closure cb) { on_start_ = cb; } |
79 | 80 |
80 private: | 81 private: |
81 bool loading_; | 82 bool loading_; |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 293 |
293 ReceiveData(kDataSize); | 294 ReceiveData(kDataSize); |
294 } | 295 } |
295 | 296 |
296 // Stops any active loaders and shuts down the data source. | 297 // Stops any active loaders and shuts down the data source. |
297 // | 298 // |
298 // This typically happens when the page is closed and for our purposes is | 299 // This typically happens when the page is closed and for our purposes is |
299 // appropriate to do when tearing down a test. | 300 // appropriate to do when tearing down a test. |
300 void Stop() { | 301 void Stop() { |
301 if (loading()) { | 302 if (loading()) { |
302 data_provider()->didFail(url_loader(), | 303 data_provider()->didFail(response_generator_->GenerateError()); |
303 response_generator_->GenerateError()); | |
304 base::RunLoop().RunUntilIdle(); | 304 base::RunLoop().RunUntilIdle(); |
305 } | 305 } |
306 | 306 |
307 data_source_->Stop(); | 307 data_source_->Stop(); |
308 base::RunLoop().RunUntilIdle(); | 308 base::RunLoop().RunUntilIdle(); |
309 } | 309 } |
310 | 310 |
311 void Respond(const WebURLResponse& response) { | 311 void Respond(const WebURLResponse& response) { |
312 EXPECT_TRUE(url_loader()); | 312 EXPECT_TRUE(url_loader()); |
313 if (!active_loader()) | 313 if (!active_loader()) |
314 return; | 314 return; |
315 data_provider()->didReceiveResponse(url_loader(), response); | 315 data_provider()->didReceiveResponse(response); |
316 base::RunLoop().RunUntilIdle(); | 316 base::RunLoop().RunUntilIdle(); |
317 } | 317 } |
318 | 318 |
319 void ReceiveDataLow(int size) { | 319 void ReceiveDataLow(int size) { |
320 EXPECT_TRUE(url_loader()); | 320 EXPECT_TRUE(url_loader()); |
321 if (!url_loader()) | 321 if (!url_loader()) |
322 return; | 322 return; |
323 std::unique_ptr<char[]> data(new char[size]); | 323 std::unique_ptr<char[]> data(new char[size]); |
324 memset(data.get(), 0xA5, size); // Arbitrary non-zero value. | 324 memset(data.get(), 0xA5, size); // Arbitrary non-zero value. |
325 | 325 |
326 data_provider()->didReceiveData(url_loader(), data.get(), size, size, size); | 326 data_provider()->didReceiveData(data.get(), size); |
327 } | 327 } |
328 | 328 |
329 void ReceiveData(int size) { | 329 void ReceiveData(int size) { |
330 ReceiveDataLow(size); | 330 ReceiveDataLow(size); |
331 base::RunLoop().RunUntilIdle(); | 331 base::RunLoop().RunUntilIdle(); |
332 } | 332 } |
333 | 333 |
334 void FinishLoading() { | 334 void FinishLoading() { |
335 EXPECT_TRUE(url_loader()); | 335 EXPECT_TRUE(url_loader()); |
336 if (!url_loader()) | 336 if (!url_loader()) |
337 return; | 337 return; |
338 data_provider()->didFinishLoading(url_loader(), 0, -1); | 338 data_provider()->didFinishLoading(0); |
339 base::RunLoop().RunUntilIdle(); | 339 base::RunLoop().RunUntilIdle(); |
340 } | 340 } |
341 | 341 |
342 void FailLoading() { | 342 void FailLoading() { |
343 data_provider()->didFail(url_loader(), | 343 data_provider()->didFail(response_generator_->GenerateError()); |
344 response_generator_->GenerateError()); | |
345 base::RunLoop().RunUntilIdle(); | 344 base::RunLoop().RunUntilIdle(); |
346 } | 345 } |
347 | 346 |
348 void Restart() { | 347 void Restart() { |
349 EXPECT_TRUE(data_provider()); | 348 EXPECT_TRUE(data_provider()); |
350 EXPECT_FALSE(active_loader_allownull()); | 349 EXPECT_FALSE(active_loader_allownull()); |
351 if (!data_provider()) | 350 if (!data_provider()) |
352 return; | 351 return; |
353 data_provider()->Start(); | 352 data_provider()->Start(); |
354 } | 353 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 return nullptr; | 437 return nullptr; |
439 return data_provider()->active_loader_.get(); | 438 return data_provider()->active_loader_.get(); |
440 } | 439 } |
441 ActiveLoader* active_loader_allownull() { | 440 ActiveLoader* active_loader_allownull() { |
442 TestMultiBufferDataProvider* data_provider = | 441 TestMultiBufferDataProvider* data_provider = |
443 multibuffer()->GetProvider_allownull(); | 442 multibuffer()->GetProvider_allownull(); |
444 if (!data_provider) | 443 if (!data_provider) |
445 return nullptr; | 444 return nullptr; |
446 return data_provider->active_loader_.get(); | 445 return data_provider->active_loader_.get(); |
447 } | 446 } |
448 WebURLLoader* url_loader() { | 447 WebAssociatedURLLoader* url_loader() { |
449 EXPECT_TRUE(active_loader()); | 448 EXPECT_TRUE(active_loader()); |
450 if (!active_loader()) | 449 if (!active_loader()) |
451 return nullptr; | 450 return nullptr; |
452 return active_loader()->loader_.get(); | 451 return active_loader()->loader_.get(); |
453 } | 452 } |
454 | 453 |
455 bool loading() { return multibuffer()->loading(); } | 454 bool loading() { return multibuffer()->loading(); } |
456 | 455 |
457 MultibufferDataSource::Preload preload() { return data_source_->preload_; } | 456 MultibufferDataSource::Preload preload() { return data_source_->preload_; } |
458 void set_preload(MultibufferDataSource::Preload preload) { | 457 void set_preload(MultibufferDataSource::Preload preload) { |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 | 664 |
666 // Read to advance our position. | 665 // Read to advance our position. |
667 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 666 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
668 ReadAt(0); | 667 ReadAt(0); |
669 | 668 |
670 // Issue a pending read but trigger an error to force a retry. | 669 // Issue a pending read but trigger an error to force a retry. |
671 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 670 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
672 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); | 671 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
673 ReadAt(kDataSize); | 672 ReadAt(kDataSize); |
674 base::RunLoop run_loop; | 673 base::RunLoop run_loop; |
675 data_provider()->didFail(url_loader(), response_generator_->GenerateError()); | 674 data_provider()->didFail(response_generator_->GenerateError()); |
676 data_provider()->RunOnStart(run_loop.QuitClosure()); | 675 data_provider()->RunOnStart(run_loop.QuitClosure()); |
677 run_loop.Run(); | 676 run_loop.Run(); |
678 Respond(response_generator_->Generate206(kDataSize)); | 677 Respond(response_generator_->Generate206(kDataSize)); |
679 ReceiveData(kDataSize); | 678 ReceiveData(kDataSize); |
680 FinishLoading(); | 679 FinishLoading(); |
681 EXPECT_FALSE(loading()); | 680 EXPECT_FALSE(loading()); |
682 Stop(); | 681 Stop(); |
683 } | 682 } |
684 | 683 |
685 // Make sure that we prefetch across partial responses. (crbug.com/516589) | 684 // Make sure that we prefetch across partial responses. (crbug.com/516589) |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 | 1371 |
1373 // Read to advance our position. | 1372 // Read to advance our position. |
1374 EXPECT_CALL(*this, ReadCallback(kDataSize)); | 1373 EXPECT_CALL(*this, ReadCallback(kDataSize)); |
1375 ReadAt(0); | 1374 ReadAt(0); |
1376 | 1375 |
1377 // Issue a pending read but trigger an error to force a retry. | 1376 // Issue a pending read but trigger an error to force a retry. |
1378 EXPECT_CALL(*this, ReadCallback(kDataSize - 10)); | 1377 EXPECT_CALL(*this, ReadCallback(kDataSize - 10)); |
1379 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); | 1378 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2)); |
1380 ReadAt(kDataSize + 10, kDataSize - 10); | 1379 ReadAt(kDataSize + 10, kDataSize - 10); |
1381 base::RunLoop run_loop; | 1380 base::RunLoop run_loop; |
1382 data_provider()->didFail(url_loader(), response_generator_->GenerateError()); | 1381 data_provider()->didFail(response_generator_->GenerateError()); |
1383 data_provider()->RunOnStart(run_loop.QuitClosure()); | 1382 data_provider()->RunOnStart(run_loop.QuitClosure()); |
1384 run_loop.Run(); | 1383 run_loop.Run(); |
1385 | 1384 |
1386 // Server responds with a redirect. | 1385 // Server responds with a redirect. |
1387 blink::WebURLRequest request((GURL(kHttpDifferentPathUrl))); | 1386 blink::WebURLRequest request((GURL(kHttpDifferentPathUrl))); |
1388 blink::WebURLResponse response((GURL(kHttpUrl))); | 1387 blink::WebURLResponse response((GURL(kHttpUrl))); |
1389 response.setHTTPStatusCode(307); | 1388 response.setHTTPStatusCode(307); |
1390 data_provider()->willFollowRedirect(url_loader(), request, response); | 1389 data_provider()->willFollowRedirect(request, response); |
1391 Respond(response_generator_->Generate206(kDataSize)); | 1390 Respond(response_generator_->Generate206(kDataSize)); |
1392 ReceiveData(kDataSize); | 1391 ReceiveData(kDataSize); |
1393 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 3)); | 1392 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 3)); |
1394 FinishLoading(); | 1393 FinishLoading(); |
1395 EXPECT_FALSE(loading()); | 1394 EXPECT_FALSE(loading()); |
1396 Stop(); | 1395 Stop(); |
1397 } | 1396 } |
1398 | 1397 |
1399 TEST_F(MultibufferDataSourceTest, Http_NotStreamingAfterRedirect) { | 1398 TEST_F(MultibufferDataSourceTest, Http_NotStreamingAfterRedirect) { |
1400 Initialize(kHttpUrl, true); | 1399 Initialize(kHttpUrl, true); |
1401 | 1400 |
1402 // Server responds with a redirect. | 1401 // Server responds with a redirect. |
1403 blink::WebURLRequest request((GURL(kHttpDifferentPathUrl))); | 1402 blink::WebURLRequest request((GURL(kHttpDifferentPathUrl))); |
1404 blink::WebURLResponse response((GURL(kHttpUrl))); | 1403 blink::WebURLResponse response((GURL(kHttpUrl))); |
1405 response.setHTTPStatusCode(307); | 1404 response.setHTTPStatusCode(307); |
1406 data_provider()->willFollowRedirect(url_loader(), request, response); | 1405 data_provider()->willFollowRedirect(request, response); |
1407 | 1406 |
1408 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | 1407 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); |
1409 Respond(response_generator_->Generate206(0)); | 1408 Respond(response_generator_->Generate206(0)); |
1410 | 1409 |
1411 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); | 1410 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
1412 ReceiveData(kDataSize); | 1411 ReceiveData(kDataSize); |
1413 | 1412 |
1414 EXPECT_FALSE(data_source_->IsStreaming()); | 1413 EXPECT_FALSE(data_source_->IsStreaming()); |
1415 | 1414 |
1416 FinishLoading(); | 1415 FinishLoading(); |
1417 EXPECT_FALSE(loading()); | 1416 EXPECT_FALSE(loading()); |
1418 Stop(); | 1417 Stop(); |
1419 } | 1418 } |
1420 | 1419 |
1421 TEST_F(MultibufferDataSourceTest, Http_RangeNotSatisfiableAfterRedirect) { | 1420 TEST_F(MultibufferDataSourceTest, Http_RangeNotSatisfiableAfterRedirect) { |
1422 Initialize(kHttpUrl, true); | 1421 Initialize(kHttpUrl, true); |
1423 | 1422 |
1424 // Server responds with a redirect. | 1423 // Server responds with a redirect. |
1425 blink::WebURLRequest request((GURL(kHttpDifferentPathUrl))); | 1424 blink::WebURLRequest request((GURL(kHttpDifferentPathUrl))); |
1426 blink::WebURLResponse response((GURL(kHttpUrl))); | 1425 blink::WebURLResponse response((GURL(kHttpUrl))); |
1427 response.setHTTPStatusCode(307); | 1426 response.setHTTPStatusCode(307); |
1428 data_provider()->willFollowRedirect(url_loader(), request, response); | 1427 data_provider()->willFollowRedirect(request, response); |
1429 | 1428 |
1430 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); | 1429 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
1431 Respond(response_generator_->GenerateResponse(416)); | 1430 Respond(response_generator_->GenerateResponse(416)); |
1432 Stop(); | 1431 Stop(); |
1433 } | 1432 } |
1434 | 1433 |
1435 TEST_F(MultibufferDataSourceTest, LengthKnownAtEOF) { | 1434 TEST_F(MultibufferDataSourceTest, LengthKnownAtEOF) { |
1436 Initialize(kHttpUrl, true); | 1435 Initialize(kHttpUrl, true); |
1437 // Server responds without content-length. | 1436 // Server responds without content-length. |
1438 WebURLResponse response = response_generator_->Generate200(); | 1437 WebURLResponse response = response_generator_->Generate200(); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 const std::string etag("\"arglebargle glop-glyf?\""); | 1518 const std::string etag("\"arglebargle glop-glyf?\""); |
1520 response.setHTTPHeaderField(WebString::fromUTF8("Etag"), | 1519 response.setHTTPHeaderField(WebString::fromUTF8("Etag"), |
1521 WebString::fromUTF8(etag)); | 1520 WebString::fromUTF8(etag)); |
1522 Respond(response); | 1521 Respond(response); |
1523 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); | 1522 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize)); |
1524 ReceiveData(kDataSize); | 1523 ReceiveData(kDataSize); |
1525 | 1524 |
1526 EXPECT_EQ(url_data()->etag(), etag); | 1525 EXPECT_EQ(url_data()->etag(), etag); |
1527 } | 1526 } |
1528 } // namespace media | 1527 } // namespace media |
OLD | NEW |