| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/format_macros.h" | 8 #include "base/format_macros.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "media/base/filters.h" | 10 #include "media/base/filters.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 void Initialize(const char* url, int first_position, int last_position) { | 72 void Initialize(const char* url, int first_position, int last_position) { |
| 73 gurl_ = GURL(url); | 73 gurl_ = GURL(url); |
| 74 first_position_ = first_position; | 74 first_position_ = first_position; |
| 75 last_position_ = last_position; | 75 last_position_ = last_position; |
| 76 | 76 |
| 77 loader_ = new BufferedResourceLoader(&bridge_factory_, gurl_, | 77 loader_ = new BufferedResourceLoader(&bridge_factory_, gurl_, |
| 78 first_position_, last_position_); | 78 first_position_, last_position_); |
| 79 EXPECT_EQ(gurl_.spec(), loader_->GetURLForDebugging().spec()); | 79 EXPECT_EQ(gurl_.spec(), loader_->GetURLForDebugging().spec()); |
| 80 } | 80 } |
| 81 | 81 |
| 82 void SetLoaderBuffer(size_t forward_capacity, size_t backward_capacity) { |
| 83 loader_->buffer_.reset( |
| 84 new media::SeekableBuffer(backward_capacity, forward_capacity)); |
| 85 } |
| 86 |
| 82 void Start() { | 87 void Start() { |
| 83 InSequence s; | 88 InSequence s; |
| 84 EXPECT_CALL(bridge_factory_, | 89 EXPECT_CALL(bridge_factory_, |
| 85 CreateBridge(gurl_, _, first_position_, last_position_)) | 90 CreateBridge(gurl_, _, first_position_, last_position_)) |
| 86 .WillOnce(Return(bridge_.get())); | 91 .WillOnce(Return(bridge_.get())); |
| 87 EXPECT_CALL(*bridge_, Start(loader_.get())); | 92 EXPECT_CALL(*bridge_, Start(loader_.get())); |
| 88 loader_->Start( | 93 loader_->Start( |
| 89 NewCallback(this, &BufferedResourceLoaderTest::StartCallback), | 94 NewCallback(this, &BufferedResourceLoaderTest::StartCallback), |
| 90 NewCallback(this, &BufferedResourceLoaderTest::NetworkCallback)); | 95 NewCallback(this, &BufferedResourceLoaderTest::NetworkCallback)); |
| 91 } | 96 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); | 138 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
| 134 loader_->Stop(); | 139 loader_->Stop(); |
| 135 } | 140 } |
| 136 | 141 |
| 137 void ReleaseBridge() { | 142 void ReleaseBridge() { |
| 138 ignore_result(bridge_.release()); | 143 ignore_result(bridge_.release()); |
| 139 } | 144 } |
| 140 | 145 |
| 141 // Helper method to write to |loader_| from |data_|. | 146 // Helper method to write to |loader_| from |data_|. |
| 142 void WriteLoader(int position, int size) { | 147 void WriteLoader(int position, int size) { |
| 143 EXPECT_CALL(*this, NetworkCallback()); | 148 EXPECT_CALL(*this, NetworkCallback()) |
| 149 .RetiresOnSaturation(); |
| 144 loader_->OnReceivedData(reinterpret_cast<char*>(data_ + position), size); | 150 loader_->OnReceivedData(reinterpret_cast<char*>(data_ + position), size); |
| 145 } | 151 } |
| 146 | 152 |
| 147 // Helper method to read from |loader_|. | 153 // Helper method to read from |loader_|. |
| 148 void ReadLoader(int64 position, int size, uint8* buffer) { | 154 void ReadLoader(int64 position, int size, uint8* buffer) { |
| 149 loader_->Read(position, size, buffer, | 155 loader_->Read(position, size, buffer, |
| 150 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); | 156 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); |
| 151 } | 157 } |
| 152 | 158 |
| 153 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. | 159 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. |
| 154 void VerifyBuffer(uint8* buffer, int pos, int size) { | 160 void VerifyBuffer(uint8* buffer, int pos, int size) { |
| 155 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); | 161 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); |
| 156 } | 162 } |
| 157 | 163 |
| 164 // Helper method to disallow deferring in |loader_|. |
| 165 void DisallowLoaderDefer() { |
| 166 if (loader_->deferred_) { |
| 167 EXPECT_CALL(*bridge_, SetDefersLoading(false)); |
| 168 EXPECT_CALL(*this, NetworkCallback()); |
| 169 } |
| 170 loader_->SetAllowDefer(false); |
| 171 } |
| 172 |
| 173 // Helper method to allow deferring in |loader_|. |
| 174 void AllowLoaderDefer() { |
| 175 loader_->SetAllowDefer(true); |
| 176 } |
| 177 |
| 158 MOCK_METHOD1(StartCallback, void(int error)); | 178 MOCK_METHOD1(StartCallback, void(int error)); |
| 159 MOCK_METHOD1(ReadCallback, void(int error)); | 179 MOCK_METHOD1(ReadCallback, void(int error)); |
| 160 MOCK_METHOD0(NetworkCallback, void()); | 180 MOCK_METHOD0(NetworkCallback, void()); |
| 161 | 181 |
| 162 protected: | 182 protected: |
| 163 GURL gurl_; | 183 GURL gurl_; |
| 164 int64 first_position_; | 184 int64 first_position_; |
| 165 int64 last_position_; | 185 int64 last_position_; |
| 166 | 186 |
| 167 scoped_refptr<BufferedResourceLoader> loader_; | 187 scoped_refptr<BufferedResourceLoader> loader_; |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 ReadLoader(10, 10, buffer); | 375 ReadLoader(10, 10, buffer); |
| 356 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); | 376 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); |
| 357 EXPECT_CALL(*this, NetworkCallback()); | 377 EXPECT_CALL(*this, NetworkCallback()); |
| 358 EXPECT_CALL(*bridge_, OnDestroy()) | 378 EXPECT_CALL(*bridge_, OnDestroy()) |
| 359 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); | 379 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); |
| 360 URLRequestStatus status; | 380 URLRequestStatus status; |
| 361 status.set_status(URLRequestStatus::FAILED); | 381 status.set_status(URLRequestStatus::FAILED); |
| 362 loader_->OnCompletedRequest(status, ""); | 382 loader_->OnCompletedRequest(status, ""); |
| 363 } | 383 } |
| 364 | 384 |
| 385 // Tests the logic of caching data to disk when media is paused. |
| 386 TEST_F(BufferedResourceLoaderTest, AllowDefer_NoDataReceived) { |
| 387 Initialize(kHttpUrl, 10, 99); |
| 388 SetLoaderBuffer(10, 20); |
| 389 Start(); |
| 390 PartialResponse(10, 99, 100); |
| 391 |
| 392 // Start in undeferred state, then disallow defer, then allow defer |
| 393 // without receiving data in between. |
| 394 DisallowLoaderDefer(); |
| 395 AllowLoaderDefer(); |
| 396 StopWhenLoad(); |
| 397 } |
| 398 |
| 399 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadSameWindow) { |
| 400 Initialize(kHttpUrl, 10, 99); |
| 401 SetLoaderBuffer(10, 20); |
| 402 Start(); |
| 403 PartialResponse(10, 99, 100); |
| 404 |
| 405 uint8 buffer[10]; |
| 406 |
| 407 // Start in undeferred state, disallow defer, receive data but don't shift |
| 408 // buffer window, then allow defer and read. |
| 409 DisallowLoaderDefer(); |
| 410 WriteLoader(10, 10); |
| 411 AllowLoaderDefer(); |
| 412 |
| 413 EXPECT_CALL(*this, ReadCallback(10)); |
| 414 ReadLoader(10, 10, buffer); |
| 415 VerifyBuffer(buffer, 10, 10); |
| 416 StopWhenLoad(); |
| 417 } |
| 418 |
| 419 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadPastWindow) { |
| 420 Initialize(kHttpUrl, 10, 99); |
| 421 SetLoaderBuffer(10, 20); |
| 422 Start(); |
| 423 PartialResponse(10, 99, 100); |
| 424 |
| 425 uint8 buffer[10]; |
| 426 |
| 427 // Not deferred, disallow defer, received data and shift buffer window, |
| 428 // allow defer, then read in area outside of buffer window. |
| 429 DisallowLoaderDefer(); |
| 430 WriteLoader(10, 10); |
| 431 WriteLoader(20, 50); |
| 432 AllowLoaderDefer(); |
| 433 |
| 434 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
| 435 ReadLoader(10, 10, buffer); |
| 436 StopWhenLoad(); |
| 437 } |
| 438 |
| 439 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredNoDataReceived) { |
| 440 Initialize(kHttpUrl, 10, 99); |
| 441 SetLoaderBuffer(10, 20); |
| 442 Start(); |
| 443 PartialResponse(10, 99, 100); |
| 444 |
| 445 uint8 buffer[10]; |
| 446 |
| 447 // Start in deferred state, then disallow defer, receive no data, and |
| 448 // allow defer and read. |
| 449 EXPECT_CALL(*bridge_, SetDefersLoading(true)); |
| 450 EXPECT_CALL(*this, NetworkCallback()); |
| 451 WriteLoader(10, 40); |
| 452 |
| 453 DisallowLoaderDefer(); |
| 454 AllowLoaderDefer(); |
| 455 |
| 456 EXPECT_CALL(*this, ReadCallback(10)); |
| 457 ReadLoader(20, 10, buffer); |
| 458 VerifyBuffer(buffer, 20, 10); |
| 459 StopWhenLoad(); |
| 460 } |
| 461 |
| 462 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadSameWindow) { |
| 463 Initialize(kHttpUrl, 10, 99); |
| 464 SetLoaderBuffer(10, 20); |
| 465 Start(); |
| 466 PartialResponse(10, 99, 100); |
| 467 |
| 468 uint8 buffer[10]; |
| 469 |
| 470 // Start in deferred state, disallow defer, receive data and shift buffer |
| 471 // window, allow defer, and read in a place that's still in the window. |
| 472 EXPECT_CALL(*bridge_, SetDefersLoading(true)); |
| 473 EXPECT_CALL(*this, NetworkCallback()); |
| 474 WriteLoader(10, 30); |
| 475 |
| 476 DisallowLoaderDefer(); |
| 477 WriteLoader(40, 5); |
| 478 AllowLoaderDefer(); |
| 479 |
| 480 EXPECT_CALL(*this, ReadCallback(10)); |
| 481 ReadLoader(20, 10, buffer); |
| 482 VerifyBuffer(buffer, 20, 10); |
| 483 StopWhenLoad(); |
| 484 } |
| 485 |
| 486 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadPastWindow) { |
| 487 Initialize(kHttpUrl, 10, 99); |
| 488 SetLoaderBuffer(10, 20); |
| 489 Start(); |
| 490 PartialResponse(10, 99, 100); |
| 491 |
| 492 uint8 buffer[10]; |
| 493 |
| 494 // Start in deferred state, disallow defer, receive data and shift buffer |
| 495 // window, allow defer, and read outside of the buffer window. |
| 496 EXPECT_CALL(*bridge_, SetDefersLoading(true)); |
| 497 EXPECT_CALL(*this, NetworkCallback()); |
| 498 WriteLoader(10, 40); |
| 499 |
| 500 DisallowLoaderDefer(); |
| 501 WriteLoader(50, 20); |
| 502 WriteLoader(70, 40); |
| 503 AllowLoaderDefer(); |
| 504 |
| 505 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
| 506 ReadLoader(20, 5, buffer); |
| 507 StopWhenLoad(); |
| 508 } |
| 509 |
| 365 // TODO(hclam): add unit test for defer loading. | 510 // TODO(hclam): add unit test for defer loading. |
| 366 | 511 |
| 367 class MockBufferedResourceLoader : public BufferedResourceLoader { | 512 class MockBufferedResourceLoader : public BufferedResourceLoader { |
| 368 public: | 513 public: |
| 369 MockBufferedResourceLoader() : BufferedResourceLoader() { | 514 MockBufferedResourceLoader() : BufferedResourceLoader() { |
| 370 } | 515 } |
| 371 | 516 |
| 372 MOCK_METHOD2(Start, void(net::CompletionCallback* read_callback, | 517 MOCK_METHOD2(Start, void(net::CompletionCallback* read_callback, |
| 373 NetworkEventCallback* network_callback)); | 518 NetworkEventCallback* network_callback)); |
| 374 MOCK_METHOD0(Stop, void()); | 519 MOCK_METHOD0(Stop, void()); |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 StopDataSource(); | 925 StopDataSource(); |
| 781 } | 926 } |
| 782 | 927 |
| 783 TEST_F(BufferedDataSourceTest, FileHasLoadedState) { | 928 TEST_F(BufferedDataSourceTest, FileHasLoadedState) { |
| 784 InitializeDataSource(kFileUrl, net::OK, true, 1024, LOADED); | 929 InitializeDataSource(kFileUrl, net::OK, true, 1024, LOADED); |
| 785 ReadDataSourceTimesOut(20, 10); | 930 ReadDataSourceTimesOut(20, 10); |
| 786 StopDataSource(); | 931 StopDataSource(); |
| 787 } | 932 } |
| 788 | 933 |
| 789 } // namespace webkit_glue | 934 } // namespace webkit_glue |
| OLD | NEW |