Chromium Code Reviews| Index: content/browser/download/download_item_impl_unittest.cc |
| diff --git a/content/browser/download/download_item_impl_unittest.cc b/content/browser/download/download_item_impl_unittest.cc |
| index 209a3c15bda3d3a79924c618337c4b8871bade69..4e482bd1db8cae669226acd705b49bcca51a5b1e 100644 |
| --- a/content/browser/download/download_item_impl_unittest.cc |
| +++ b/content/browser/download/download_item_impl_unittest.cc |
| @@ -203,21 +203,22 @@ class DownloadItemTest : public testing::Test { |
| // be torn down at the end of the test unless DestroyDownloadItem is |
| // called. |
| DownloadItemImpl* CreateDownloadItem() { |
| - // Normally, the download system takes ownership of info, and is |
| - // responsible for deleting it. In these unit tests, however, we |
| - // don't call the function that deletes it, so we do so ourselves. |
| - scoped_ptr<DownloadCreateInfo> info_; |
| + scoped_ptr<DownloadCreateInfo> info; |
| - info_.reset(new DownloadCreateInfo()); |
| + info.reset(new DownloadCreateInfo()); |
| + info->save_info = scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo()); |
| + info->save_info->prompt_for_save_location = false; |
| + info->url_chain.push_back(GURL()); |
| + info->etag = "SomethingToSatisfyResumption"; |
| + |
| + return CreateDownloadItemWithCreateInfo(info.Pass()); |
| + } |
| + |
| + DownloadItemImpl* CreateDownloadItemWithCreateInfo( |
| + scoped_ptr<DownloadCreateInfo> info) { |
| static uint32 next_id = DownloadItem::kInvalidId + 1; |
|
svaldez
2015/12/15 15:11:50
nit: Possibly move this out of the CreateDownload
asanka
2015/12/15 17:32:27
Done.
|
| - info_->save_info = scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo()); |
| - info_->save_info->prompt_for_save_location = false; |
| - info_->url_chain.push_back(GURL()); |
| - info_->etag = "SomethingToSatisfyResumption"; |
| - |
| - DownloadItemImpl* download = |
| - new DownloadItemImpl( |
| - &delegate_, next_id++, *(info_.get()), net::BoundNetLog()); |
| + DownloadItemImpl* download = new DownloadItemImpl( |
| + &delegate_, next_id++, *(info.get()), net::BoundNetLog()); |
| allocated_downloads_.insert(download); |
| return download; |
| } |
| @@ -404,7 +405,6 @@ TEST_F(DownloadItemTest, ContinueAfterInterrupted) { |
| TestBrowserContext test_browser_context; |
| DownloadItemImpl* item = CreateDownloadItem(); |
| TestDownloadItemObserver observer(item); |
| - DownloadItemImplDelegate::DownloadTargetCallback callback; |
| MockDownloadFile* download_file = |
| DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| @@ -437,7 +437,6 @@ TEST_F(DownloadItemTest, RestartAfterInterrupted) { |
| DownloadItemImpl* item = CreateDownloadItem(); |
| TestDownloadItemObserver observer(item); |
| - DownloadItemImplDelegate::DownloadTargetCallback callback; |
| MockDownloadFile* download_file = |
| DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| @@ -461,7 +460,6 @@ TEST_F(DownloadItemTest, UnresumableInterrupt) { |
| DownloadItemImpl* item = CreateDownloadItem(); |
| TestDownloadItemObserver observer(item); |
| - DownloadItemImplDelegate::DownloadTargetCallback callback; |
| MockDownloadFile* download_file = |
| DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| @@ -546,6 +544,50 @@ TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { |
| CleanupItem(item, mock_download_file, DownloadItem::INTERRUPTED); |
| } |
| +// Test that resumption uses the final URL in a URL chain when resuming. |
| +TEST_F(DownloadItemTest, ResumeUsingFinalURL) { |
| + base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| + switches::kEnableDownloadResumption); |
| + |
| + TestBrowserContext test_browser_context; |
| + scoped_ptr<DownloadCreateInfo> create_info(new DownloadCreateInfo); |
| + create_info->save_info = scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo()); |
| + create_info->save_info->prompt_for_save_location = false; |
| + create_info->etag = "SomethingToSatisfyResumption"; |
| + create_info->url_chain.push_back(GURL("http://example.com/a")); |
| + create_info->url_chain.push_back(GURL("http://example.com/b")); |
| + create_info->url_chain.push_back(GURL("http://example.com/c")); |
| + |
| + DownloadItemImpl* item = CreateDownloadItemWithCreateInfo(create_info.Pass()); |
| + TestDownloadItemObserver observer(item); |
| + MockDownloadFile* download_file = |
| + DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| + |
| + // Interrupt the download, using a continuable interrupt. |
| + EXPECT_CALL(*download_file, FullPath()).WillOnce(Return(base::FilePath())); |
| + EXPECT_CALL(*download_file, Detach()); |
| + EXPECT_CALL(*mock_delegate(), GetBrowserContext()) |
| + .WillRepeatedly(Return(&test_browser_context)); |
| + EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload( |
| + Property(&DownloadUrlParameters::url, |
| + GURL("http://example.com/c")), |
| + _)) |
| + .Times(1); |
| + item->DestinationObserverAsWeakPtr()->DestinationError( |
| + DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); |
| + ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| + ASSERT_EQ(1, observer.interrupt_count()); |
| + |
| + // Test expectations verify that ResumeInterruptedDownload() is called (by way |
| + // of MockResumeInterruptedDownload) after the download is interrupted. But |
| + // the mock doesn't follow through with the resumption. |
| + // ResumeInterruptedDownload() being called is sufficient for verifying that |
| + // the resumption was triggered. |
| + RunAllPendingInMessageLoops(); |
| + |
| + CleanupItem(item, download_file, DownloadItem::INTERRUPTED); |
| +} |
| + |
| TEST_F(DownloadItemTest, NotificationAfterRemove) { |
| DownloadItemImpl* item = CreateDownloadItem(); |
| MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL); |