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 0ac8b83da3b1a33832824edd9013ee6cd53b1850..e16e03803567d3ddec44608d201afa7a68eb8145 100644 |
--- a/content/browser/download/download_item_impl_unittest.cc |
+++ b/content/browser/download/download_item_impl_unittest.cc |
@@ -301,7 +301,7 @@ class DownloadItemTest : public testing::Test { |
if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) { |
mock_download_file = new StrictMock<MockDownloadFile>; |
download_file.reset(mock_download_file); |
- EXPECT_CALL(*mock_download_file, Initialize(_)) |
+ EXPECT_CALL(*mock_download_file, Initialize(_, _)) |
.WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE)); |
EXPECT_CALL(*mock_download_file, FullPath()) |
.WillRepeatedly(ReturnRefOfCopy(base::FilePath())); |
@@ -593,7 +593,7 @@ TEST_F(DownloadItemTest, NotificationAfterTogglePause) { |
std::unique_ptr<DownloadRequestHandleInterface> request_handle( |
new NiceMock<MockRequestHandle>); |
- EXPECT_CALL(*mock_download_file, Initialize(_)); |
+ EXPECT_CALL(*mock_download_file, Initialize(_, _)); |
EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _)); |
item->Start(std::move(download_file), std::move(request_handle), |
*create_info()); |
@@ -891,7 +891,7 @@ TEST_F(DownloadItemTest, FailedResumptionDoesntUpdateOriginState) { |
} |
// If the download resumption request succeeds, the origin state should be |
-// updated |
+// updated. |
TEST_F(DownloadItemTest, SucceededResumptionUpdatesOriginState) { |
const char kContentDisposition[] = "attachment; filename=foo"; |
const char kFirstETag[] = "ABC"; |
@@ -941,6 +941,45 @@ TEST_F(DownloadItemTest, SucceededResumptionUpdatesOriginState) { |
CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
} |
+// Ensure when strong validators changed on resumption, the received |
+// slices should be cleared. |
+TEST_F(DownloadItemTest, ClearReceivedSliceIfEtagChanged) { |
+ const char kFirstETag[] = "ABC"; |
+ const char kSecondETag[] = "123"; |
+ const DownloadItem::ReceivedSlices kReceivedSlice = { |
+ DownloadItem::ReceivedSlice(0, 10)}; |
+ create_info()->etag = kFirstETag; |
+ |
+ DownloadItemImpl* item = CreateDownloadItem(); |
+ MockDownloadFile* download_file = |
+ DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
+ |
+ EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)); |
+ EXPECT_CALL(*download_file, Detach()); |
+ |
+ item->DestinationObserverAsWeakPtr()->DestinationUpdate(10, 100, |
+ kReceivedSlice); |
+ EXPECT_EQ(kReceivedSlice, item->GetReceivedSlices()); |
+ EXPECT_EQ(10, item->GetReceivedBytes()); |
+ |
+ item->DestinationObserverAsWeakPtr()->DestinationError( |
+ DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 0, |
+ std::unique_ptr<crypto::SecureHash>()); |
+ EXPECT_EQ(kReceivedSlice, item->GetReceivedSlices()); |
+ |
+ RunAllPendingInMessageLoops(); |
+ |
+ // Change the strong validator and resume the download, the received slices |
+ // should be cleared. |
+ create_info()->etag = kSecondETag; |
+ DownloadTargetCallback target_callback; |
+ download_file = CallDownloadItemStart(item, &target_callback); |
+ EXPECT_TRUE(item->GetReceivedSlices().empty()); |
+ EXPECT_EQ(0, item->GetReceivedBytes()); |
+ |
+ CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
+} |
+ |
// Test that resumption uses the final URL in a URL chain when resuming. |
TEST_F(DownloadItemTest, ResumeUsesFinalURL) { |
create_info()->save_info->prompt_for_save_location = false; |
@@ -1007,7 +1046,7 @@ TEST_F(DownloadItemTest, Start) { |
MockDownloadFile* mock_download_file(new MockDownloadFile); |
std::unique_ptr<DownloadFile> download_file(mock_download_file); |
DownloadItemImpl* item = CreateDownloadItem(); |
- EXPECT_CALL(*mock_download_file, Initialize(_)); |
+ EXPECT_CALL(*mock_download_file, Initialize(_, _)); |
std::unique_ptr<DownloadRequestHandleInterface> request_handle( |
new NiceMock<MockRequestHandle>); |
EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)); |
@@ -1028,7 +1067,7 @@ TEST_F(DownloadItemTest, InitDownloadFileFails) { |
EXPECT_CALL(*file, Cancel()); |
EXPECT_CALL(*request_handle, CancelRequest()); |
- EXPECT_CALL(*file, Initialize(_)) |
+ EXPECT_CALL(*file, Initialize(_, _)) |
.WillOnce(ScheduleCallbackWithParam( |
DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED)); |
@@ -2050,7 +2089,7 @@ TEST_P(DownloadItemDestinationUpdateRaceTest, DownloadCancelledByUser) { |
base::RunLoop download_start_loop; |
DownloadFile::InitializeCallback initialize_callback; |
- EXPECT_CALL(*file_, Initialize(_)) |
+ EXPECT_CALL(*file_, Initialize(_, _)) |
.WillOnce(DoAll(SaveArg<0>(&initialize_callback), |
ScheduleClosure(download_start_loop.QuitClosure()))); |
item_->Start(std::move(file_), std::move(request_handle_), *create_info()); |
@@ -2103,7 +2142,7 @@ TEST_P(DownloadItemDestinationUpdateRaceTest, IntermediateRenameFails) { |
base::RunLoop download_start_loop; |
DownloadFile::InitializeCallback initialize_callback; |
- EXPECT_CALL(*file_, Initialize(_)) |
+ EXPECT_CALL(*file_, Initialize(_, _)) |
.WillOnce(DoAll(SaveArg<0>(&initialize_callback), |
ScheduleClosure(download_start_loop.QuitClosure()))); |
@@ -2173,7 +2212,7 @@ TEST_P(DownloadItemDestinationUpdateRaceTest, IntermediateRenameSucceeds) { |
base::RunLoop download_start_loop; |
DownloadFile::InitializeCallback initialize_callback; |
- EXPECT_CALL(*file_, Initialize(_)) |
+ EXPECT_CALL(*file_, Initialize(_, _)) |
.WillOnce(DoAll(SaveArg<0>(&initialize_callback), |
ScheduleClosure(download_start_loop.QuitClosure()))); |