| 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 baa292801ead18bc84ee7169e3a53ff7443f9c30..98584c8a252f988ba3cade3520be8aeb2acc0d7f 100644
|
| --- a/content/browser/download/download_item_impl_unittest.cc
|
| +++ b/content/browser/download/download_item_impl_unittest.cc
|
| @@ -757,7 +757,7 @@ TEST_F(DownloadItemTest, Interrupted) {
|
|
|
| // Destination errors that occur before the intermediate rename shouldn't cause
|
| // the download to be marked as interrupted until after the intermediate rename.
|
| -TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename) {
|
| +TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Restart) {
|
| DownloadItemImpl* item = CreateDownloadItem();
|
| DownloadItemImplDelegate::DownloadTargetCallback callback;
|
| MockDownloadFile* download_file =
|
| @@ -787,6 +787,77 @@ TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename) {
|
| EXPECT_EQ(final_path, item->GetTargetFilePath());
|
| }
|
|
|
| +// As above. But if the download can be resumed by continuing, then the
|
| +// intermediate path should be retained when the download is interrupted after
|
| +// the intermediate rename succeeds.
|
| +TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + switches::kEnableDownloadResumption);
|
| + DownloadItemImpl* item = CreateDownloadItem();
|
| + DownloadItemImplDelegate::DownloadTargetCallback callback;
|
| + MockDownloadFile* download_file =
|
| + AddDownloadFileToDownloadItem(item, &callback);
|
| + item->DestinationObserverAsWeakPtr()->DestinationError(
|
| + DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED);
|
| + ASSERT_TRUE(item->IsInProgress());
|
| +
|
| + base::FilePath final_path(base::FilePath(kDummyPath).AppendASCII("foo.bar"));
|
| + base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x"));
|
| + base::FilePath new_intermediate_path(
|
| + final_path.InsertBeforeExtensionASCII("y"));
|
| + EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _))
|
| + .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE,
|
| + new_intermediate_path));
|
| + EXPECT_CALL(*download_file, FullPath())
|
| + .WillOnce(Return(base::FilePath(new_intermediate_path)));
|
| + EXPECT_CALL(*download_file, Detach());
|
| +
|
| + callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| + DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path);
|
| + RunAllPendingInMessageLoops();
|
| + // All the callbacks should have happened by now.
|
| + ::testing::Mock::VerifyAndClearExpectations(download_file);
|
| + mock_delegate()->VerifyAndClearExpectations();
|
| + EXPECT_TRUE(item->IsInterrupted());
|
| + EXPECT_EQ(new_intermediate_path, item->GetFullPath());
|
| + EXPECT_EQ(final_path, item->GetTargetFilePath());
|
| +}
|
| +
|
| +// As above. If the intermediate rename fails, then the interrupt reason should
|
| +// be set to the destination error and the intermediate path should be empty.
|
| +TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Failed) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + switches::kEnableDownloadResumption);
|
| + DownloadItemImpl* item = CreateDownloadItem();
|
| + DownloadItemImplDelegate::DownloadTargetCallback callback;
|
| + MockDownloadFile* download_file =
|
| + AddDownloadFileToDownloadItem(item, &callback);
|
| + item->DestinationObserverAsWeakPtr()->DestinationError(
|
| + DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED);
|
| + ASSERT_TRUE(item->IsInProgress());
|
| +
|
| + base::FilePath final_path(base::FilePath(kDummyPath).AppendASCII("foo.bar"));
|
| + base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x"));
|
| + base::FilePath new_intermediate_path(
|
| + final_path.InsertBeforeExtensionASCII("y"));
|
| + EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _))
|
| + .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED,
|
| + new_intermediate_path));
|
| + EXPECT_CALL(*download_file, Cancel())
|
| + .Times(1);
|
| +
|
| + callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
|
| + DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path);
|
| + RunAllPendingInMessageLoops();
|
| + // All the callbacks should have happened by now.
|
| + ::testing::Mock::VerifyAndClearExpectations(download_file);
|
| + mock_delegate()->VerifyAndClearExpectations();
|
| + EXPECT_TRUE(item->IsInterrupted());
|
| + EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason());
|
| + EXPECT_TRUE(item->GetFullPath().empty());
|
| + EXPECT_EQ(final_path, item->GetTargetFilePath());
|
| +}
|
| +
|
| TEST_F(DownloadItemTest, Canceled) {
|
| DownloadItemImpl* item = CreateDownloadItem();
|
| MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL);
|
|
|