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/callback.h" | 5 #include "base/callback.h" |
| 6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
| 7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/threading/thread.h" | 9 #include "base/threading/thread.h" |
| 10 #include "content/browser/byte_stream.h" | 10 #include "content/browser/byte_stream.h" |
| 11 #include "content/browser/download/download_create_info.h" | 11 #include "content/browser/download/download_create_info.h" |
| 12 #include "content/browser/download/download_file_factory.h" | 12 #include "content/browser/download/download_file_factory.h" |
| 13 #include "content/browser/download/download_item_impl.h" | 13 #include "content/browser/download/download_item_impl.h" |
| 14 #include "content/browser/download/download_item_impl_delegate.h" | 14 #include "content/browser/download/download_item_impl_delegate.h" |
| 15 #include "content/browser/download/download_request_handle.h" | 15 #include "content/browser/download/download_request_handle.h" |
| 16 #include "content/browser/download/mock_download_file.h" | 16 #include "content/browser/download/mock_download_file.h" |
| 17 #include "content/public/browser/download_destination_observer.h" | 17 #include "content/public/browser/download_destination_observer.h" |
| 18 #include "content/public/browser/download_interrupt_reasons.h" | 18 #include "content/public/browser/download_interrupt_reasons.h" |
| 19 #include "content/public/browser/download_url_parameters.h" | 19 #include "content/public/browser/download_url_parameters.h" |
| 20 #include "content/public/common/content_switches.h" | 20 #include "content/public/common/content_switches.h" |
| 21 #include "content/public/test/mock_download_item.h" | 21 #include "content/public/test/mock_download_item.h" |
| 22 #include "content/public/test/test_browser_context.h" | |
| 22 #include "content/public/test/test_browser_thread.h" | 23 #include "content/public/test/test_browser_thread.h" |
| 23 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 26 |
| 26 using ::testing::_; | 27 using ::testing::_; |
| 27 using ::testing::NiceMock; | 28 using ::testing::NiceMock; |
| 28 using ::testing::Property; | 29 using ::testing::Property; |
| 29 using ::testing::Return; | 30 using ::testing::Return; |
| 30 using ::testing::SaveArg; | 31 using ::testing::SaveArg; |
| 31 using ::testing::StrictMock; | 32 using ::testing::StrictMock; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 53 MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const base::FilePath&)); | 54 MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const base::FilePath&)); |
| 54 MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl*)); | 55 MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl*)); |
| 55 | 56 |
| 56 void ResumeInterruptedDownload( | 57 void ResumeInterruptedDownload( |
| 57 scoped_ptr<DownloadUrlParameters> params, uint32 id) override { | 58 scoped_ptr<DownloadUrlParameters> params, uint32 id) override { |
| 58 MockResumeInterruptedDownload(params.get(), id); | 59 MockResumeInterruptedDownload(params.get(), id); |
| 59 } | 60 } |
| 60 MOCK_METHOD2(MockResumeInterruptedDownload, | 61 MOCK_METHOD2(MockResumeInterruptedDownload, |
| 61 void(DownloadUrlParameters* params, uint32 id)); | 62 void(DownloadUrlParameters* params, uint32 id)); |
| 62 | 63 |
| 63 BrowserContext* GetBrowserContext() const override { return nullptr; } | 64 MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*()); |
| 64 MOCK_METHOD1(UpdatePersistence, void(DownloadItemImpl*)); | 65 MOCK_METHOD1(UpdatePersistence, void(DownloadItemImpl*)); |
| 65 MOCK_METHOD1(DownloadOpened, void(DownloadItemImpl*)); | 66 MOCK_METHOD1(DownloadOpened, void(DownloadItemImpl*)); |
| 66 MOCK_METHOD1(DownloadRemoved, void(DownloadItemImpl*)); | 67 MOCK_METHOD1(DownloadRemoved, void(DownloadItemImpl*)); |
| 67 MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItemImpl*)); | 68 MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItemImpl*)); |
| 68 | 69 |
| 69 void VerifyAndClearExpectations() { | 70 void VerifyAndClearExpectations() { |
| 70 ::testing::Mock::VerifyAndClearExpectations(this); | 71 ::testing::Mock::VerifyAndClearExpectations(this); |
| 71 SetDefaultExpectations(); | 72 SetDefaultExpectations(); |
| 72 } | 73 } |
| 73 | 74 |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 404 MockObserver observer(item); | 405 MockObserver observer(item); |
| 405 | 406 |
| 406 DestroyDownloadItem(item); | 407 DestroyDownloadItem(item); |
| 407 ASSERT_TRUE(observer.CheckDestroyed()); | 408 ASSERT_TRUE(observer.CheckDestroyed()); |
| 408 } | 409 } |
| 409 | 410 |
| 410 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { | 411 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { |
| 411 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 412 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 412 switches::kEnableDownloadResumption); | 413 switches::kEnableDownloadResumption); |
| 413 | 414 |
| 415 TestBrowserContext test_browser_context; | |
| 414 DownloadItemImpl* item = CreateDownloadItem(); | 416 DownloadItemImpl* item = CreateDownloadItem(); |
| 415 MockObserver observer(item); | 417 MockObserver observer(item); |
| 416 DownloadItemImplDelegate::DownloadTargetCallback callback; | 418 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 417 MockDownloadFile* download_file = | 419 MockDownloadFile* download_file = |
| 418 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 420 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 419 | 421 |
| 420 // Interrupt the download, using a continuable interrupt. | 422 // Interrupt the download, using a continuable interrupt. |
| 421 EXPECT_CALL(*download_file, FullPath()) | 423 EXPECT_CALL(*download_file, FullPath()) |
| 422 .WillOnce(Return(base::FilePath())); | 424 .WillOnce(Return(base::FilePath())); |
| 423 EXPECT_CALL(*download_file, Detach()); | 425 EXPECT_CALL(*download_file, Detach()); |
| 426 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) | |
| 427 .WillRepeatedly(Return(&test_browser_context)); | |
| 428 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(1); | |
| 424 item->DestinationObserverAsWeakPtr()->DestinationError( | 429 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 425 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); | 430 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); |
| 426 ASSERT_TRUE(observer.CheckUpdated()); | 431 ASSERT_TRUE(observer.CheckUpdated()); |
| 427 // Should attempt to auto-resume. Because we don't have a mock WebContents, | |
| 428 // ResumeInterruptedDownload() will abort early, with another interrupt, | |
| 429 // which will be ignored. | |
| 430 ASSERT_EQ(1, observer.GetInterruptCount()); | 432 ASSERT_EQ(1, observer.GetInterruptCount()); |
| 433 | |
| 434 // Test expectations verify that ResumeInterruptedDownload() is called when | |
| 435 // the download is interrupted. But the mock doesn't actually invoke | |
|
svaldez
2015/12/11 20:53:04
nit: Maybe clarify where we cancel the resume?
asanka
2015/12/11 21:23:40
Done.
| |
| 431 ASSERT_EQ(0, observer.GetResumeCount()); | 436 ASSERT_EQ(0, observer.GetResumeCount()); |
| 432 RunAllPendingInMessageLoops(); | 437 RunAllPendingInMessageLoops(); |
| 433 | 438 |
| 434 CleanupItem(item, download_file, DownloadItem::INTERRUPTED); | 439 CleanupItem(item, download_file, DownloadItem::INTERRUPTED); |
| 435 } | 440 } |
| 436 | 441 |
| 437 // Same as above, but with a non-continuable interrupt. | 442 // Same as above, but with a non-continuable interrupt. |
| 438 TEST_F(DownloadItemTest, RestartAfterInterrupted) { | 443 TEST_F(DownloadItemTest, RestartAfterInterrupted) { |
| 439 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 444 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 440 switches::kEnableDownloadResumption); | 445 switches::kEnableDownloadResumption); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 ASSERT_EQ(1, observer.GetInterruptCount()); | 491 ASSERT_EQ(1, observer.GetInterruptCount()); |
| 487 ASSERT_EQ(0, observer.GetResumeCount()); | 492 ASSERT_EQ(0, observer.GetResumeCount()); |
| 488 | 493 |
| 489 CleanupItem(item, download_file, DownloadItem::INTERRUPTED); | 494 CleanupItem(item, download_file, DownloadItem::INTERRUPTED); |
| 490 } | 495 } |
| 491 | 496 |
| 492 TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { | 497 TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { |
| 493 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 498 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 494 switches::kEnableDownloadResumption); | 499 switches::kEnableDownloadResumption); |
| 495 | 500 |
| 501 TestBrowserContext test_browser_context; | |
| 496 DownloadItemImpl* item = CreateDownloadItem(); | 502 DownloadItemImpl* item = CreateDownloadItem(); |
| 497 base::WeakPtr<DownloadDestinationObserver> as_observer( | 503 base::WeakPtr<DownloadDestinationObserver> as_observer( |
| 498 item->DestinationObserverAsWeakPtr()); | 504 item->DestinationObserverAsWeakPtr()); |
| 499 MockObserver observer(item); | 505 MockObserver observer(item); |
| 500 MockDownloadFile* mock_download_file(NULL); | 506 MockDownloadFile* mock_download_file(NULL); |
| 501 scoped_ptr<DownloadFile> download_file; | 507 scoped_ptr<DownloadFile> download_file; |
| 502 MockRequestHandle* mock_request_handle(NULL); | 508 MockRequestHandle* mock_request_handle(NULL); |
| 503 scoped_ptr<DownloadRequestHandleInterface> request_handle; | 509 scoped_ptr<DownloadRequestHandleInterface> request_handle; |
| 504 DownloadItemImplDelegate::DownloadTargetCallback callback; | 510 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 505 | 511 |
| 506 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) | 512 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) |
| 507 .WillRepeatedly(SaveArg<1>(&callback)); | 513 .WillRepeatedly(SaveArg<1>(&callback)); |
| 514 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) | |
| 515 .WillRepeatedly(Return(&test_browser_context)); | |
| 516 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)) | |
| 517 .Times(DownloadItemImpl::kMaxAutoResumeAttempts); | |
| 508 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { | 518 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { |
| 509 DVLOG(20) << "Loop iteration " << i; | 519 DVLOG(20) << "Loop iteration " << i; |
| 510 | 520 |
| 511 mock_download_file = new NiceMock<MockDownloadFile>; | 521 mock_download_file = new NiceMock<MockDownloadFile>; |
| 512 download_file.reset(mock_download_file); | 522 download_file.reset(mock_download_file); |
| 513 mock_request_handle = new NiceMock<MockRequestHandle>; | 523 mock_request_handle = new NiceMock<MockRequestHandle>; |
| 514 request_handle.reset(mock_request_handle); | 524 request_handle.reset(mock_request_handle); |
| 515 | 525 |
| 516 ON_CALL(*mock_download_file, FullPath()) | 526 ON_CALL(*mock_download_file, FullPath()) |
| 517 .WillByDefault(Return(base::FilePath())); | 527 .WillByDefault(Return(base::FilePath())); |
| 518 | 528 |
| 519 // It's too complicated to set up a WebContents instance that would cause | |
| 520 // the MockDownloadItemDelegate's ResumeInterruptedDownload() function | |
| 521 // to be callled, so we simply verify that GetWebContents() is called. | |
| 522 if (i < (DownloadItemImpl::kMaxAutoResumeAttempts - 1)) { | |
| 523 EXPECT_CALL(*mock_request_handle, GetWebContents()) | |
| 524 .WillRepeatedly(Return(static_cast<WebContents*>(NULL))); | |
| 525 } | |
| 526 | |
| 527 // Copied key parts of DoIntermediateRename & AddDownloadFileToDownloadItem | 529 // Copied key parts of DoIntermediateRename & AddDownloadFileToDownloadItem |
| 528 // to allow for holding onto the request handle. | 530 // to allow for holding onto the request handle. |
| 529 item->Start(download_file.Pass(), request_handle.Pass()); | 531 item->Start(download_file.Pass(), request_handle.Pass()); |
| 530 RunAllPendingInMessageLoops(); | 532 RunAllPendingInMessageLoops(); |
| 531 if (i == 0) { | 533 if (i == 0) { |
| 532 // Target determination is only done the first time through. | 534 // Target determination is only done the first time through. |
| 533 base::FilePath target_path(kDummyPath); | 535 base::FilePath target_path(kDummyPath); |
| 534 base::FilePath intermediate_path( | 536 base::FilePath intermediate_path( |
| 535 target_path.InsertBeforeExtensionASCII("x")); | 537 target_path.InsertBeforeExtensionASCII("x")); |
| 536 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _)) | 538 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _)) |
| (...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1292 base::Unretained(&returned_path))); | 1294 base::Unretained(&returned_path))); |
| 1293 RunAllPendingInMessageLoops(); | 1295 RunAllPendingInMessageLoops(); |
| 1294 EXPECT_TRUE(returned_path.empty()); | 1296 EXPECT_TRUE(returned_path.empty()); |
| 1295 } | 1297 } |
| 1296 | 1298 |
| 1297 TEST(MockDownloadItem, Compiles) { | 1299 TEST(MockDownloadItem, Compiles) { |
| 1298 MockDownloadItem mock_item; | 1300 MockDownloadItem mock_item; |
| 1299 } | 1301 } |
| 1300 | 1302 |
| 1301 } // namespace content | 1303 } // namespace content |
| OLD | NEW |