| 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 "content/browser/download/download_item_impl.h" | 5 #include "content/browser/download/download_item_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <deque> |
| 9 #include <iterator> | 10 #include <iterator> |
| 10 #include <map> | 11 #include <map> |
| 11 #include <memory> | 12 #include <memory> |
| 12 #include <queue> | 13 #include <queue> |
| 13 #include <utility> | 14 #include <utility> |
| 14 | 15 |
| 15 #include "base/callback.h" | 16 #include "base/callback.h" |
| 17 #include "base/callback_helpers.h" |
| 16 #include "base/feature_list.h" | 18 #include "base/feature_list.h" |
| 17 #include "base/memory/ptr_util.h" | 19 #include "base/memory/ptr_util.h" |
| 18 #include "base/message_loop/message_loop.h" | 20 #include "base/message_loop/message_loop.h" |
| 19 #include "base/run_loop.h" | 21 #include "base/run_loop.h" |
| 20 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
| 21 #include "content/browser/byte_stream.h" | 23 #include "content/browser/byte_stream.h" |
| 22 #include "content/browser/download/download_create_info.h" | 24 #include "content/browser/download/download_create_info.h" |
| 23 #include "content/browser/download/download_destination_observer.h" | 25 #include "content/browser/download/download_destination_observer.h" |
| 24 #include "content/browser/download/download_file_factory.h" | 26 #include "content/browser/download/download_file_factory.h" |
| 25 #include "content/browser/download/download_item_impl_delegate.h" | 27 #include "content/browser/download/download_item_impl_delegate.h" |
| 26 #include "content/browser/download/download_request_handle.h" | 28 #include "content/browser/download/download_request_handle.h" |
| 27 #include "content/browser/download/mock_download_file.h" | 29 #include "content/browser/download/mock_download_file.h" |
| 28 #include "content/public/browser/browser_thread.h" | 30 #include "content/public/browser/browser_thread.h" |
| 29 #include "content/public/browser/download_interrupt_reasons.h" | 31 #include "content/public/browser/download_interrupt_reasons.h" |
| 30 #include "content/public/browser/download_url_parameters.h" | 32 #include "content/public/browser/download_url_parameters.h" |
| 31 #include "content/public/common/content_features.h" | 33 #include "content/public/common/content_features.h" |
| 32 #include "content/public/test/mock_download_item.h" | 34 #include "content/public/test/mock_download_item.h" |
| 33 #include "content/public/test/test_browser_context.h" | 35 #include "content/public/test/test_browser_context.h" |
| 34 #include "content/public/test/test_browser_thread_bundle.h" | 36 #include "content/public/test/test_browser_thread_bundle.h" |
| 35 #include "content/public/test/web_contents_tester.h" | 37 #include "content/public/test/web_contents_tester.h" |
| 36 #include "crypto/secure_hash.h" | 38 #include "crypto/secure_hash.h" |
| 37 #include "testing/gmock/include/gmock/gmock.h" | 39 #include "testing/gmock/include/gmock/gmock.h" |
| 38 #include "testing/gtest/include/gtest/gtest.h" | 40 #include "testing/gtest/include/gtest/gtest.h" |
| 39 | 41 |
| 40 using ::testing::DoAll; | 42 using ::testing::DoAll; |
| 43 using ::testing::Invoke; |
| 44 using ::testing::InvokeWithoutArgs; |
| 41 using ::testing::NiceMock; | 45 using ::testing::NiceMock; |
| 42 using ::testing::Property; | 46 using ::testing::Property; |
| 43 using ::testing::Return; | 47 using ::testing::Return; |
| 44 using ::testing::ReturnRefOfCopy; | 48 using ::testing::ReturnRefOfCopy; |
| 45 using ::testing::SaveArg; | 49 using ::testing::SaveArg; |
| 46 using ::testing::StrictMock; | 50 using ::testing::StrictMock; |
| 47 using ::testing::WithArg; | 51 using ::testing::WithArg; |
| 48 using ::testing::_; | 52 using ::testing::_; |
| 49 | 53 |
| 50 const int kDownloadChunkSize = 1000; | 54 const int kDownloadChunkSize = 1000; |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 // called. | 282 // called. |
| 279 DownloadItemImpl* CreateDownloadItem() { | 283 DownloadItemImpl* CreateDownloadItem() { |
| 280 create_info_->download_id = ++next_download_id_; | 284 create_info_->download_id = ++next_download_id_; |
| 281 DownloadItemImpl* download = | 285 DownloadItemImpl* download = |
| 282 new DownloadItemImpl(&delegate_, create_info_->download_id, | 286 new DownloadItemImpl(&delegate_, create_info_->download_id, |
| 283 *create_info_, net::NetLogWithSource()); | 287 *create_info_, net::NetLogWithSource()); |
| 284 allocated_downloads_[download] = base::WrapUnique(download); | 288 allocated_downloads_[download] = base::WrapUnique(download); |
| 285 return download; | 289 return download; |
| 286 } | 290 } |
| 287 | 291 |
| 288 // Add DownloadFile to DownloadItem. Set |callback| to nullptr if a download | 292 // Add DownloadFile to DownloadItem. |
| 289 // target determination is not expected. | |
| 290 MockDownloadFile* CallDownloadItemStart( | 293 MockDownloadFile* CallDownloadItemStart( |
| 291 DownloadItemImpl* item, | 294 DownloadItemImpl* item, |
| 292 DownloadItemImplDelegate::DownloadTargetCallback* callback) { | 295 DownloadItemImplDelegate::DownloadTargetCallback* callback) { |
| 293 MockDownloadFile* mock_download_file = nullptr; | 296 MockDownloadFile* mock_download_file = nullptr; |
| 294 std::unique_ptr<DownloadFile> download_file; | 297 std::unique_ptr<DownloadFile> download_file; |
| 295 if (callback) { | 298 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) |
| 296 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) | 299 .WillOnce(SaveArg<1>(callback)); |
| 297 .WillOnce(SaveArg<1>(callback)); | |
| 298 } else { | |
| 299 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)).Times(0); | |
| 300 } | |
| 301 | 300 |
| 302 // Only create a DownloadFile if the request was successful. | 301 // Only create a DownloadFile if the request was successful. |
| 303 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) { | 302 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) { |
| 304 mock_download_file = new StrictMock<MockDownloadFile>; | 303 mock_download_file = new StrictMock<MockDownloadFile>; |
| 305 download_file.reset(mock_download_file); | 304 download_file.reset(mock_download_file); |
| 306 EXPECT_CALL(*mock_download_file, Initialize(_)) | 305 EXPECT_CALL(*mock_download_file, Initialize(_)) |
| 307 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE)); | 306 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE)); |
| 308 EXPECT_CALL(*mock_download_file, FullPath()) | 307 EXPECT_CALL(*mock_download_file, FullPath()) |
| 309 .WillRepeatedly(ReturnRefOfCopy(base::FilePath())); | 308 .WillRepeatedly(ReturnRefOfCopy(base::FilePath())); |
| 310 } | 309 } |
| 311 | 310 |
| 312 std::unique_ptr<MockRequestHandle> request_handle( | 311 std::unique_ptr<MockRequestHandle> request_handle = |
| 313 new NiceMock<MockRequestHandle>); | 312 base::MakeUnique<NiceMock<MockRequestHandle>>(); |
| 314 item->Start(std::move(download_file), std::move(request_handle), | 313 item->Start(std::move(download_file), std::move(request_handle), |
| 315 *create_info_); | 314 *create_info_); |
| 316 RunAllPendingInMessageLoops(); | 315 RunAllPendingInMessageLoops(); |
| 317 | 316 |
| 318 // So that we don't have a function writing to a stack variable | 317 // So that we don't have a function writing to a stack variable |
| 319 // lying around if the above failed. | 318 // lying around if the above failed. |
| 320 mock_delegate()->VerifyAndClearExpectations(); | 319 mock_delegate()->VerifyAndClearExpectations(); |
| 321 EXPECT_CALL(*mock_delegate(), AssertStateConsistent(_)) | 320 EXPECT_CALL(*mock_delegate(), AssertStateConsistent(_)) |
| 322 .WillRepeatedly(Return()); | 321 .WillRepeatedly(Return()); |
| 323 EXPECT_CALL(*mock_delegate(), ShouldOpenFileBasedOnExtension(_)) | 322 EXPECT_CALL(*mock_delegate(), ShouldOpenFileBasedOnExtension(_)) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 336 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 335 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 337 EXPECT_TRUE(item->GetTargetFilePath().empty()); | 336 EXPECT_TRUE(item->GetTargetFilePath().empty()); |
| 338 DownloadItemImplDelegate::DownloadTargetCallback callback; | 337 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 339 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 338 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
| 340 base::FilePath target_path(kDummyTargetPath); | 339 base::FilePath target_path(kDummyTargetPath); |
| 341 base::FilePath intermediate_path(kDummyIntermediatePath); | 340 base::FilePath intermediate_path(kDummyIntermediatePath); |
| 342 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 341 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 343 .WillOnce(ScheduleRenameAndUniquifyCallback( | 342 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 344 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); | 343 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); |
| 345 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 344 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 346 danger_type, intermediate_path); | 345 danger_type, intermediate_path, |
| 346 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 347 RunAllPendingInMessageLoops(); | 347 RunAllPendingInMessageLoops(); |
| 348 return download_file; | 348 return download_file; |
| 349 } | 349 } |
| 350 | 350 |
| 351 void DoDestinationComplete(DownloadItemImpl* item, | 351 void DoDestinationComplete(DownloadItemImpl* item, |
| 352 MockDownloadFile* download_file) { | 352 MockDownloadFile* download_file) { |
| 353 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) | 353 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) |
| 354 .WillOnce(Return(true)); | 354 .WillOnce(Return(true)); |
| 355 base::FilePath final_path(kDummyTargetPath); | 355 base::FilePath final_path(kDummyTargetPath); |
| 356 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) | 356 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 469 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 470 } | 470 } |
| 471 | 471 |
| 472 TEST_F(DownloadItemTest, NotificationAfterInterrupted) { | 472 TEST_F(DownloadItemTest, NotificationAfterInterrupted) { |
| 473 DownloadItemImpl* item = CreateDownloadItem(); | 473 DownloadItemImpl* item = CreateDownloadItem(); |
| 474 MockDownloadFile* download_file = | 474 MockDownloadFile* download_file = |
| 475 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 475 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 476 EXPECT_CALL(*download_file, Cancel()); | 476 EXPECT_CALL(*download_file, Cancel()); |
| 477 TestDownloadItemObserver observer(item); | 477 TestDownloadItemObserver observer(item); |
| 478 | 478 |
| 479 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_,_)) | 479 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(0); |
| 480 .Times(0); | |
| 481 | 480 |
| 482 item->DestinationObserverAsWeakPtr()->DestinationError( | 481 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 483 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 0, | 482 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 0, |
| 484 std::unique_ptr<crypto::SecureHash>()); | 483 std::unique_ptr<crypto::SecureHash>()); |
| 485 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 484 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 486 } | 485 } |
| 487 | 486 |
| 488 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { | 487 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { |
| 489 DownloadItemImpl* item = CreateDownloadItem(); | 488 DownloadItemImpl* item = CreateDownloadItem(); |
| 490 TestDownloadItemObserver observer(item); | 489 TestDownloadItemObserver observer(item); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); | 569 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); |
| 571 base::FilePath new_intermediate_path( | 570 base::FilePath new_intermediate_path( |
| 572 target_path.InsertBeforeExtensionASCII("y")); | 571 target_path.InsertBeforeExtensionASCII("y")); |
| 573 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 572 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 574 .WillOnce(ScheduleRenameAndUniquifyCallback( | 573 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 575 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); | 574 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
| 576 | 575 |
| 577 // Currently, a notification would be generated if the danger type is anything | 576 // Currently, a notification would be generated if the danger type is anything |
| 578 // other than NOT_DANGEROUS. | 577 // other than NOT_DANGEROUS. |
| 579 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 578 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 580 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 579 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 580 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 581 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 581 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
| 582 RunAllPendingInMessageLoops(); | 582 RunAllPendingInMessageLoops(); |
| 583 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 583 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 584 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); | 584 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); |
| 585 | 585 |
| 586 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); | 586 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
| 587 } | 587 } |
| 588 | 588 |
| 589 TEST_F(DownloadItemTest, NotificationAfterTogglePause) { | 589 TEST_F(DownloadItemTest, NotificationAfterTogglePause) { |
| 590 DownloadItemImpl* item = CreateDownloadItem(); | 590 DownloadItemImpl* item = CreateDownloadItem(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 606 | 606 |
| 607 item->Resume(); | 607 item->Resume(); |
| 608 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 608 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 609 | 609 |
| 610 RunAllPendingInMessageLoops(); | 610 RunAllPendingInMessageLoops(); |
| 611 | 611 |
| 612 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS); | 612 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS); |
| 613 } | 613 } |
| 614 | 614 |
| 615 // Test that a download is resumed automatcially after a continuable interrupt. | 615 // Test that a download is resumed automatcially after a continuable interrupt. |
| 616 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { | 616 TEST_F(DownloadItemTest, AutomaticResumption_Continue) { |
| 617 DownloadItemImpl* item = CreateDownloadItem(); | 617 DownloadItemImpl* item = CreateDownloadItem(); |
| 618 TestDownloadItemObserver observer(item); | 618 TestDownloadItemObserver observer(item); |
| 619 MockDownloadFile* download_file = | 619 MockDownloadFile* download_file = |
| 620 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 620 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 621 | 621 |
| 622 // Interrupt the download, using a continuable interrupt. | 622 // Interrupt the download using a continuable interrupt after writing a single |
| 623 // byte. An intermediate file with data shouldn't be discarding after a |
| 624 // continuable interrupt. |
| 625 |
| 626 // The DownloadFile should be detached without discarding. |
| 623 EXPECT_CALL(*download_file, FullPath()) | 627 EXPECT_CALL(*download_file, FullPath()) |
| 624 .WillOnce(ReturnRefOfCopy(base::FilePath())); | 628 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
| 625 EXPECT_CALL(*download_file, Detach()); | 629 EXPECT_CALL(*download_file, Detach()); |
| 626 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(1); | 630 |
| 631 // Resumption attempt should pass the intermediate file along. |
| 632 EXPECT_CALL(*mock_delegate(), |
| 633 MockResumeInterruptedDownload( |
| 634 AllOf(Property(&DownloadUrlParameters::file_path, |
| 635 Property(&base::FilePath::value, |
| 636 kDummyIntermediatePath)), |
| 637 Property(&DownloadUrlParameters::offset, 1)), |
| 638 _)); |
| 639 |
| 627 item->DestinationObserverAsWeakPtr()->DestinationError( | 640 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 628 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 0, | 641 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 1, |
| 629 std::unique_ptr<crypto::SecureHash>()); | 642 std::unique_ptr<crypto::SecureHash>()); |
| 630 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 643 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 631 // Since the download is resumed automatically, the interrupt count doesn't | 644 // Since the download is resumed automatically, the interrupt count doesn't |
| 632 // increase. | 645 // increase. |
| 633 ASSERT_EQ(0, observer.interrupt_count()); | 646 ASSERT_EQ(0, observer.interrupt_count()); |
| 634 | 647 |
| 635 // Test expectations verify that ResumeInterruptedDownload() is called (by way | 648 // Test expectations verify that ResumeInterruptedDownload() is called (by way |
| 636 // of MockResumeInterruptedDownload) after the download is interrupted. But | 649 // of MockResumeInterruptedDownload) after the download is interrupted. But |
| 637 // the mock doesn't follow through with the resumption. | 650 // the mock doesn't follow through with the resumption. |
| 638 // ResumeInterruptedDownload() being called is sufficient for verifying that | 651 // ResumeInterruptedDownload() being called is sufficient for verifying that |
| 639 // the automatic resumption was triggered. | 652 // the automatic resumption was triggered. |
| 640 RunAllPendingInMessageLoops(); | 653 RunAllPendingInMessageLoops(); |
| 641 | 654 |
| 642 // The download item is currently in RESUMING_INTERNAL state, which maps to | 655 // The download item is currently in RESUMING_INTERNAL state, which maps to |
| 643 // IN_PROGRESS. | 656 // IN_PROGRESS. |
| 644 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); | 657 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); |
| 645 } | 658 } |
| 646 | 659 |
| 647 // Test that automatic resumption doesn't happen after a non-continuable | 660 // Automatic resumption should restart and discard the intermediate file if the |
| 648 // interrupt. | 661 // interrupt reason requires it. |
| 649 TEST_F(DownloadItemTest, RestartAfterInterrupted) { | 662 TEST_F(DownloadItemTest, AutomaticResumption_Restart) { |
| 650 DownloadItemImpl* item = CreateDownloadItem(); | 663 DownloadItemImpl* item = CreateDownloadItem(); |
| 651 TestDownloadItemObserver observer(item); | 664 TestDownloadItemObserver observer(item); |
| 652 MockDownloadFile* download_file = | 665 MockDownloadFile* download_file = |
| 653 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 666 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 654 | 667 |
| 655 // Interrupt the download, using a restartable interrupt. | 668 // Interrupt the download, using a restartable interrupt. |
| 656 EXPECT_CALL(*download_file, Cancel()); | 669 EXPECT_CALL(*download_file, Cancel()); |
| 670 EXPECT_EQ(kDummyIntermediatePath, item->GetFullPath().value()); |
| 671 |
| 672 // Resumption attempt should have discarded intermediate file. |
| 673 EXPECT_CALL(*mock_delegate(), |
| 674 MockResumeInterruptedDownload( |
| 675 Property(&DownloadUrlParameters::file_path, |
| 676 Property(&base::FilePath::empty, true)), |
| 677 _)); |
| 678 |
| 679 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 680 DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE, 1, |
| 681 std::unique_ptr<crypto::SecureHash>()); |
| 682 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 683 |
| 684 // Since the download is resumed automatically, the interrupt count doesn't |
| 685 // increase. |
| 686 ASSERT_EQ(0, observer.interrupt_count()); |
| 687 RunAllPendingInMessageLoops(); |
| 688 |
| 689 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); |
| 690 } |
| 691 |
| 692 // Test that automatic resumption doesn't happen after an interrupt that |
| 693 // requires user action to resolve. |
| 694 TEST_F(DownloadItemTest, AutomaticResumption_NeedsUserAction) { |
| 695 DownloadItemImpl* item = CreateDownloadItem(); |
| 696 TestDownloadItemObserver observer(item); |
| 697 MockDownloadFile* download_file = |
| 698 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 699 |
| 700 // Interrupt the download, using a restartable interrupt. |
| 701 EXPECT_CALL(*download_file, Cancel()); |
| 657 item->DestinationObserverAsWeakPtr()->DestinationError( | 702 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 658 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 0, | 703 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 1, |
| 659 std::unique_ptr<crypto::SecureHash>()); | 704 std::unique_ptr<crypto::SecureHash>()); |
| 660 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 705 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 661 // Should not try to auto-resume. | 706 // Should not try to auto-resume. |
| 662 ASSERT_EQ(1, observer.interrupt_count()); | 707 ASSERT_EQ(1, observer.interrupt_count()); |
| 663 ASSERT_EQ(0, observer.resume_count()); | 708 ASSERT_EQ(0, observer.resume_count()); |
| 664 RunAllPendingInMessageLoops(); | 709 RunAllPendingInMessageLoops(); |
| 665 | 710 |
| 666 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); | 711 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); |
| 667 } | 712 } |
| 668 | 713 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 688 RunAllPendingInMessageLoops(); | 733 RunAllPendingInMessageLoops(); |
| 689 | 734 |
| 690 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 735 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 691 // Should not try to auto-resume. | 736 // Should not try to auto-resume. |
| 692 ASSERT_EQ(1, observer.interrupt_count()); | 737 ASSERT_EQ(1, observer.interrupt_count()); |
| 693 ASSERT_EQ(0, observer.resume_count()); | 738 ASSERT_EQ(0, observer.resume_count()); |
| 694 | 739 |
| 695 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); | 740 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); |
| 696 } | 741 } |
| 697 | 742 |
| 698 TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { | 743 TEST_F(DownloadItemTest, AutomaticResumption_AttemptLimit) { |
| 699 DownloadItemImpl* item = CreateDownloadItem(); | 744 DownloadItemImpl* item = CreateDownloadItem(); |
| 700 base::WeakPtr<DownloadDestinationObserver> as_observer( | 745 base::WeakPtr<DownloadDestinationObserver> as_observer( |
| 701 item->DestinationObserverAsWeakPtr()); | 746 item->DestinationObserverAsWeakPtr()); |
| 702 TestDownloadItemObserver observer(item); | 747 TestDownloadItemObserver observer(item); |
| 703 MockDownloadFile* mock_download_file(nullptr); | 748 MockDownloadFile* mock_download_file_ref = nullptr; |
| 704 std::unique_ptr<DownloadFile> download_file; | 749 std::unique_ptr<MockDownloadFile> mock_download_file; |
| 705 MockRequestHandle* mock_request_handle(nullptr); | 750 std::unique_ptr<MockRequestHandle> mock_request_handle; |
| 706 std::unique_ptr<DownloadRequestHandleInterface> request_handle; | |
| 707 DownloadItemImplDelegate::DownloadTargetCallback callback; | 751 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 708 | 752 |
| 709 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) | 753 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) |
| 710 .WillRepeatedly(SaveArg<1>(&callback)); | 754 .WillRepeatedly(SaveArg<1>(&callback)); |
| 711 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)) | 755 |
| 756 // All attempts at resumption should pass along the intermediate file. |
| 757 EXPECT_CALL(*mock_delegate(), |
| 758 MockResumeInterruptedDownload( |
| 759 AllOf(Property(&DownloadUrlParameters::file_path, |
| 760 Property(&base::FilePath::value, |
| 761 kDummyIntermediatePath)), |
| 762 Property(&DownloadUrlParameters::offset, 1)), |
| 763 _)) |
| 712 .Times(DownloadItemImpl::kMaxAutoResumeAttempts); | 764 .Times(DownloadItemImpl::kMaxAutoResumeAttempts); |
| 713 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { | 765 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { |
| 714 SCOPED_TRACE(::testing::Message() << "Iteration " << i); | 766 SCOPED_TRACE(::testing::Message() << "Iteration " << i); |
| 715 | 767 |
| 716 mock_download_file = new NiceMock<MockDownloadFile>; | 768 mock_download_file = base::MakeUnique<NiceMock<MockDownloadFile>>(); |
| 717 download_file.reset(mock_download_file); | 769 mock_download_file_ref = mock_download_file.get(); |
| 718 mock_request_handle = new NiceMock<MockRequestHandle>; | 770 mock_request_handle = base::MakeUnique<NiceMock<MockRequestHandle>>(); |
| 719 request_handle.reset(mock_request_handle); | |
| 720 | 771 |
| 721 ON_CALL(*mock_download_file, FullPath()) | 772 ON_CALL(*mock_download_file_ref, FullPath()) |
| 722 .WillByDefault(ReturnRefOfCopy(base::FilePath())); | 773 .WillByDefault(ReturnRefOfCopy(base::FilePath())); |
| 723 | 774 |
| 724 // Copied key parts of DoIntermediateRename & CallDownloadItemStart | 775 // Copied key parts of DoIntermediateRename & CallDownloadItemStart |
| 725 // to allow for holding onto the request handle. | 776 // to allow for holding onto the request handle. |
| 726 item->Start(std::move(download_file), std::move(request_handle), | 777 item->Start(std::move(mock_download_file), std::move(mock_request_handle), |
| 727 *create_info()); | 778 *create_info()); |
| 728 RunAllPendingInMessageLoops(); | 779 RunAllPendingInMessageLoops(); |
| 729 | 780 |
| 730 base::FilePath target_path(kDummyTargetPath); | 781 base::FilePath target_path(kDummyTargetPath); |
| 731 base::FilePath intermediate_path(kDummyIntermediatePath); | 782 base::FilePath intermediate_path(kDummyIntermediatePath); |
| 732 if (i == 0) { | 783 |
| 733 // RenameAndUniquify is only called the first time. In all the subsequent | 784 // Target of RenameAndUniquify is always the intermediate path. |
| 734 // iterations, the intermediate file already has the correct name, hence | 785 ON_CALL(*mock_download_file_ref, RenameAndUniquify(_, _)) |
| 735 // no rename is necessary. | 786 .WillByDefault(ScheduleRenameAndUniquifyCallback( |
| 736 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _)) | 787 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); |
| 737 .WillOnce(ScheduleRenameAndUniquifyCallback( | 788 |
| 738 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); | 789 // RenameAndUniquify is only called the first time. In all the subsequent |
| 739 } | 790 // iterations, the intermediate file already has the correct name, hence no |
| 740 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 791 // rename is necessary. |
| 741 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 792 EXPECT_CALL(*mock_download_file_ref, RenameAndUniquify(_, _)).Times(i == 0); |
| 793 |
| 794 ASSERT_FALSE(callback.is_null()); |
| 795 base::ResetAndReturn(&callback).Run( |
| 796 target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 797 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 798 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 742 RunAllPendingInMessageLoops(); | 799 RunAllPendingInMessageLoops(); |
| 743 | 800 |
| 744 // Use a continuable interrupt. | 801 // Use a continuable interrupt. |
| 802 EXPECT_CALL(*mock_download_file_ref, Cancel()).Times(0); |
| 745 item->DestinationObserverAsWeakPtr()->DestinationError( | 803 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 746 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 0, | 804 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 1, |
| 747 std::unique_ptr<crypto::SecureHash>()); | 805 std::unique_ptr<crypto::SecureHash>()); |
| 748 | 806 |
| 749 RunAllPendingInMessageLoops(); | 807 RunAllPendingInMessageLoops(); |
| 750 ::testing::Mock::VerifyAndClearExpectations(mock_download_file); | 808 ::testing::Mock::VerifyAndClearExpectations(mock_download_file_ref); |
| 751 } | 809 } |
| 752 | 810 |
| 753 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 811 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 754 EXPECT_EQ(1, observer.interrupt_count()); | 812 EXPECT_EQ(1, observer.interrupt_count()); |
| 755 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); | 813 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); |
| 756 } | 814 } |
| 757 | 815 |
| 758 // If the download attempts to resume and the resumption request fails, the | 816 // If the download attempts to resume and the resumption request fails, the |
| 759 // subsequent Start() call shouldn't update the origin state (URL redirect | 817 // subsequent Start() call shouldn't update the origin state (URL redirect |
| 760 // chains, Content-Disposition, download URL, etc..) | 818 // chains, Content-Disposition, download URL, etc..) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 772 | 830 |
| 773 DownloadItemImpl* item = CreateDownloadItem(); | 831 DownloadItemImpl* item = CreateDownloadItem(); |
| 774 MockDownloadFile* download_file = | 832 MockDownloadFile* download_file = |
| 775 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 833 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 776 EXPECT_EQ(kContentDisposition, item->GetContentDisposition()); | 834 EXPECT_EQ(kContentDisposition, item->GetContentDisposition()); |
| 777 EXPECT_EQ(kFirstETag, item->GetETag()); | 835 EXPECT_EQ(kFirstETag, item->GetETag()); |
| 778 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); | 836 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); |
| 779 EXPECT_EQ(kFirstURL, item->GetURL().spec()); | 837 EXPECT_EQ(kFirstURL, item->GetURL().spec()); |
| 780 EXPECT_EQ(kMimeType, item->GetMimeType()); | 838 EXPECT_EQ(kMimeType, item->GetMimeType()); |
| 781 | 839 |
| 782 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)); | 840 EXPECT_CALL(*mock_delegate(), |
| 841 MockResumeInterruptedDownload( |
| 842 AllOf(Property(&DownloadUrlParameters::file_path, |
| 843 Property(&base::FilePath::value, |
| 844 kDummyIntermediatePath)), |
| 845 Property(&DownloadUrlParameters::offset, 1)), |
| 846 _)); |
| 783 EXPECT_CALL(*download_file, Detach()); | 847 EXPECT_CALL(*download_file, Detach()); |
| 784 item->DestinationObserverAsWeakPtr()->DestinationError( | 848 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 785 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 0, | 849 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 1, |
| 786 std::unique_ptr<crypto::SecureHash>()); | 850 std::unique_ptr<crypto::SecureHash>()); |
| 787 RunAllPendingInMessageLoops(); | 851 RunAllPendingInMessageLoops(); |
| 788 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 852 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 789 | 853 |
| 790 // Now change the create info. The changes should not cause the DownloadItem | 854 // Now change the create info. The changes should not cause the DownloadItem |
| 791 // to be updated. | 855 // to be updated. |
| 792 const char kSecondContentDisposition[] = "attachment; filename=bar"; | 856 const char kSecondContentDisposition[] = "attachment; filename=bar"; |
| 793 const char kSecondETag[] = "123"; | 857 const char kSecondETag[] = "123"; |
| 794 const char kSecondLastModified[] = "Today"; | 858 const char kSecondLastModified[] = "Today"; |
| 795 const char kSecondURL[] = "http://example.com/another-download"; | 859 const char kSecondURL[] = "http://example.com/another-download"; |
| 796 const char kSecondMimeType[] = "text/html"; | 860 const char kSecondMimeType[] = "text/html"; |
| 797 create_info()->content_disposition = kSecondContentDisposition; | 861 create_info()->content_disposition = kSecondContentDisposition; |
| 798 create_info()->etag = kSecondETag; | 862 create_info()->etag = kSecondETag; |
| 799 create_info()->last_modified = kSecondLastModified; | 863 create_info()->last_modified = kSecondLastModified; |
| 800 create_info()->url_chain.clear(); | 864 create_info()->url_chain.clear(); |
| 801 create_info()->url_chain.push_back(GURL(kSecondURL)); | 865 create_info()->url_chain.push_back(GURL(kSecondURL)); |
| 802 create_info()->mime_type = kSecondMimeType; | 866 create_info()->mime_type = kSecondMimeType; |
| 803 create_info()->result = DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED; | 867 create_info()->result = DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED; |
| 868 create_info()->save_info->file_path = base::FilePath(kDummyIntermediatePath); |
| 869 create_info()->save_info->offset = 1; |
| 804 | 870 |
| 805 // The following ends up calling DownloadItem::Start(), but shouldn't result | 871 // Calling Start() with a response indicating failure shouldn't cause a target |
| 806 // in an origin update. | 872 // update, nor should it result in discarding the intermediate file. |
| 807 download_file = CallDownloadItemStart(item, nullptr); | 873 DownloadItemImplDelegate::DownloadTargetCallback target_callback; |
| 874 download_file = CallDownloadItemStart(item, &target_callback); |
| 875 ASSERT_FALSE(target_callback.is_null()); |
| 876 target_callback.Run(base::FilePath(kDummyTargetPath), |
| 877 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 878 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 879 base::FilePath(kDummyIntermediatePath), |
| 880 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 881 RunAllPendingInMessageLoops(); |
| 808 | 882 |
| 809 EXPECT_EQ(kContentDisposition, item->GetContentDisposition()); | 883 EXPECT_EQ(kContentDisposition, item->GetContentDisposition()); |
| 810 EXPECT_EQ(kFirstETag, item->GetETag()); | 884 EXPECT_EQ(kFirstETag, item->GetETag()); |
| 811 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); | 885 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); |
| 812 EXPECT_EQ(kFirstURL, item->GetURL().spec()); | 886 EXPECT_EQ(kFirstURL, item->GetURL().spec()); |
| 813 EXPECT_EQ(kMimeType, item->GetMimeType()); | 887 EXPECT_EQ(kMimeType, item->GetMimeType()); |
| 814 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 888 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 815 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); | 889 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); |
| 890 EXPECT_EQ(kDummyIntermediatePath, item->GetFullPath().value()); |
| 891 EXPECT_EQ(1, item->GetReceivedBytes()); |
| 816 } | 892 } |
| 817 | 893 |
| 818 // If the download resumption request succeeds, the origin state should be | 894 // If the download resumption request succeeds, the origin state should be |
| 819 // updated | 895 // updated |
| 820 TEST_F(DownloadItemTest, SucceededResumptionUpdatesOriginState) { | 896 TEST_F(DownloadItemTest, SucceededResumptionUpdatesOriginState) { |
| 821 const char kContentDisposition[] = "attachment; filename=foo"; | 897 const char kContentDisposition[] = "attachment; filename=foo"; |
| 822 const char kFirstETag[] = "ABC"; | 898 const char kFirstETag[] = "ABC"; |
| 823 const char kFirstLastModified[] = "Yesterday"; | 899 const char kFirstLastModified[] = "Yesterday"; |
| 824 const char kFirstURL[] = "http://www.example.com/download"; | 900 const char kFirstURL[] = "http://www.example.com/download"; |
| 825 const char kMimeType[] = "text/css"; | 901 const char kMimeType[] = "text/css"; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 EXPECT_EQ(kSecondContentDisposition, item->GetContentDisposition()); | 936 EXPECT_EQ(kSecondContentDisposition, item->GetContentDisposition()); |
| 861 EXPECT_EQ(kSecondETag, item->GetETag()); | 937 EXPECT_EQ(kSecondETag, item->GetETag()); |
| 862 EXPECT_EQ(kSecondLastModified, item->GetLastModifiedTime()); | 938 EXPECT_EQ(kSecondLastModified, item->GetLastModifiedTime()); |
| 863 EXPECT_EQ(kSecondURL, item->GetURL().spec()); | 939 EXPECT_EQ(kSecondURL, item->GetURL().spec()); |
| 864 EXPECT_EQ(kSecondMimeType, item->GetMimeType()); | 940 EXPECT_EQ(kSecondMimeType, item->GetMimeType()); |
| 865 | 941 |
| 866 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); | 942 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
| 867 } | 943 } |
| 868 | 944 |
| 869 // Test that resumption uses the final URL in a URL chain when resuming. | 945 // Test that resumption uses the final URL in a URL chain when resuming. |
| 870 TEST_F(DownloadItemTest, ResumeUsingFinalURL) { | 946 TEST_F(DownloadItemTest, ResumeUsesFinalURL) { |
| 871 create_info()->save_info->prompt_for_save_location = false; | 947 create_info()->save_info->prompt_for_save_location = false; |
| 872 create_info()->url_chain.clear(); | 948 create_info()->url_chain.clear(); |
| 873 create_info()->url_chain.push_back(GURL("http://example.com/a")); | 949 create_info()->url_chain.push_back(GURL("http://example.com/a")); |
| 874 create_info()->url_chain.push_back(GURL("http://example.com/b")); | 950 create_info()->url_chain.push_back(GURL("http://example.com/b")); |
| 875 create_info()->url_chain.push_back(GURL("http://example.com/c")); | 951 create_info()->url_chain.push_back(GURL("http://example.com/c")); |
| 876 | 952 |
| 877 DownloadItemImpl* item = CreateDownloadItem(); | 953 DownloadItemImpl* item = CreateDownloadItem(); |
| 878 TestDownloadItemObserver observer(item); | 954 TestDownloadItemObserver observer(item); |
| 879 MockDownloadFile* download_file = | 955 MockDownloadFile* download_file = |
| 880 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 956 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 881 | 957 |
| 882 // Interrupt the download, using a continuable interrupt. | 958 // Interrupt the download, using a continuable interrupt. |
| 883 EXPECT_CALL(*download_file, FullPath()) | 959 EXPECT_CALL(*download_file, FullPath()) |
| 884 .WillOnce(ReturnRefOfCopy(base::FilePath())); | 960 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
| 885 EXPECT_CALL(*download_file, Detach()); | 961 EXPECT_CALL(*download_file, Detach()); |
| 886 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload( | 962 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload( |
| 887 Property(&DownloadUrlParameters::url, | 963 Property(&DownloadUrlParameters::url, |
| 888 GURL("http://example.com/c")), | 964 GURL("http://example.com/c")), |
| 889 _)) | 965 _)) |
| 890 .Times(1); | 966 .Times(1); |
| 891 item->DestinationObserverAsWeakPtr()->DestinationError( | 967 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 892 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 0, | 968 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 1, |
| 893 std::unique_ptr<crypto::SecureHash>()); | 969 std::unique_ptr<crypto::SecureHash>()); |
| 894 | 970 |
| 895 // Test expectations verify that ResumeInterruptedDownload() is called (by way | 971 // Test expectations verify that ResumeInterruptedDownload() is called (by way |
| 896 // of MockResumeInterruptedDownload) after the download is interrupted. But | 972 // of MockResumeInterruptedDownload) after the download is interrupted. But |
| 897 // the mock doesn't follow through with the resumption. | 973 // the mock doesn't follow through with the resumption. |
| 898 // ResumeInterruptedDownload() being called is sufficient for verifying that | 974 // ResumeInterruptedDownload() being called is sufficient for verifying that |
| 899 // the resumption was triggered. | 975 // the resumption was triggered. |
| 900 RunAllPendingInMessageLoops(); | 976 RunAllPendingInMessageLoops(); |
| 901 | 977 |
| 902 // The download is currently in RESUMING_INTERNAL, which maps to IN_PROGRESS. | 978 // The download is currently in RESUMING_INTERNAL, which maps to IN_PROGRESS. |
| 903 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); | 979 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); |
| 904 } | 980 } |
| 905 | 981 |
| 906 TEST_F(DownloadItemTest, DisplayName) { | 982 TEST_F(DownloadItemTest, DisplayName) { |
| 907 DownloadItemImpl* item = CreateDownloadItem(); | 983 DownloadItemImpl* item = CreateDownloadItem(); |
| 908 DownloadItemImplDelegate::DownloadTargetCallback callback; | 984 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 909 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 985 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
| 910 base::FilePath target_path( | 986 base::FilePath target_path( |
| 911 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 987 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
| 912 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); | 988 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); |
| 913 EXPECT_EQ(FILE_PATH_LITERAL(""), | 989 EXPECT_EQ(FILE_PATH_LITERAL(""), |
| 914 item->GetFileNameToReportUser().value()); | 990 item->GetFileNameToReportUser().value()); |
| 915 EXPECT_CALL(*download_file, RenameAndUniquify(_, _)) | 991 EXPECT_CALL(*download_file, RenameAndUniquify(_, _)) |
| 916 .WillOnce(ScheduleRenameAndUniquifyCallback( | 992 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 917 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); | 993 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); |
| 918 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 994 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 919 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 995 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 996 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 920 RunAllPendingInMessageLoops(); | 997 RunAllPendingInMessageLoops(); |
| 921 EXPECT_EQ(FILE_PATH_LITERAL("foo.bar"), | 998 EXPECT_EQ(FILE_PATH_LITERAL("foo.bar"), |
| 922 item->GetFileNameToReportUser().value()); | 999 item->GetFileNameToReportUser().value()); |
| 923 item->SetDisplayName(base::FilePath(FILE_PATH_LITERAL("new.name"))); | 1000 item->SetDisplayName(base::FilePath(FILE_PATH_LITERAL("new.name"))); |
| 924 EXPECT_EQ(FILE_PATH_LITERAL("new.name"), | 1001 EXPECT_EQ(FILE_PATH_LITERAL("new.name"), |
| 925 item->GetFileNameToReportUser().value()); | 1002 item->GetFileNameToReportUser().value()); |
| 926 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); | 1003 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
| 927 } | 1004 } |
| 928 | 1005 |
| 929 // Test to make sure that Start method calls DF initialize properly. | 1006 // Test to make sure that Start method calls DF initialize properly. |
| 930 TEST_F(DownloadItemTest, Start) { | 1007 TEST_F(DownloadItemTest, Start) { |
| 931 MockDownloadFile* mock_download_file(new MockDownloadFile); | 1008 MockDownloadFile* mock_download_file(new MockDownloadFile); |
| 932 std::unique_ptr<DownloadFile> download_file(mock_download_file); | 1009 std::unique_ptr<DownloadFile> download_file(mock_download_file); |
| 933 DownloadItemImpl* item = CreateDownloadItem(); | 1010 DownloadItemImpl* item = CreateDownloadItem(); |
| 934 EXPECT_CALL(*mock_download_file, Initialize(_)); | 1011 EXPECT_CALL(*mock_download_file, Initialize(_)); |
| 935 std::unique_ptr<DownloadRequestHandleInterface> request_handle( | 1012 std::unique_ptr<DownloadRequestHandleInterface> request_handle( |
| 936 new NiceMock<MockRequestHandle>); | 1013 new NiceMock<MockRequestHandle>); |
| 937 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)); | 1014 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)); |
| 938 item->Start(std::move(download_file), std::move(request_handle), | 1015 item->Start(std::move(download_file), std::move(request_handle), |
| 939 *create_info()); | 1016 *create_info()); |
| 940 RunAllPendingInMessageLoops(); | 1017 RunAllPendingInMessageLoops(); |
| 941 | 1018 |
| 942 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS); | 1019 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS); |
| 943 } | 1020 } |
| 944 | 1021 |
| 945 // Download file and the request should be cancelled as a result of download | 1022 // Download file and the request should be cancelled as a result of download |
| 946 // file initialization failing. | 1023 // file initialization failing. |
| 947 TEST_F(DownloadItemTest, InitDownloadFileFails) { | 1024 TEST_F(DownloadItemTest, InitDownloadFileFails) { |
| 948 DownloadItemImpl* item = CreateDownloadItem(); | 1025 DownloadItemImpl* item = CreateDownloadItem(); |
| 949 std::unique_ptr<MockDownloadFile> file(new MockDownloadFile()); | 1026 std::unique_ptr<MockDownloadFile> file = base::MakeUnique<MockDownloadFile>(); |
| 950 std::unique_ptr<MockRequestHandle> request_handle(new MockRequestHandle()); | 1027 std::unique_ptr<MockRequestHandle> request_handle = |
| 1028 base::MakeUnique<MockRequestHandle>(); |
| 1029 |
| 951 EXPECT_CALL(*file, Cancel()); | 1030 EXPECT_CALL(*file, Cancel()); |
| 952 EXPECT_CALL(*request_handle, CancelRequest()); | 1031 EXPECT_CALL(*request_handle, CancelRequest()); |
| 953 EXPECT_CALL(*file, Initialize(_)) | 1032 EXPECT_CALL(*file, Initialize(_)) |
| 954 .WillOnce(ScheduleCallbackWithParam( | 1033 .WillOnce(ScheduleCallbackWithParam( |
| 955 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED)); | 1034 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED)); |
| 956 | 1035 |
| 957 base::RunLoop start_download_loop; | 1036 base::RunLoop start_download_loop; |
| 958 DownloadItemImplDelegate::DownloadTargetCallback download_target_callback; | 1037 DownloadItemImplDelegate::DownloadTargetCallback download_target_callback; |
| 959 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) | 1038 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) |
| 960 .WillOnce(DoAll(SaveArg<1>(&download_target_callback), | 1039 .WillOnce(DoAll(SaveArg<1>(&download_target_callback), |
| 961 ScheduleClosure(start_download_loop.QuitClosure()))); | 1040 ScheduleClosure(start_download_loop.QuitClosure()))); |
| 962 | 1041 |
| 963 item->Start(std::move(file), std::move(request_handle), *create_info()); | 1042 item->Start(std::move(file), std::move(request_handle), *create_info()); |
| 964 start_download_loop.Run(); | 1043 start_download_loop.Run(); |
| 965 | 1044 |
| 966 download_target_callback.Run(base::FilePath(kDummyTargetPath), | 1045 download_target_callback.Run(base::FilePath(kDummyTargetPath), |
| 967 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1046 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 968 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 1047 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 969 base::FilePath(kDummyIntermediatePath)); | 1048 base::FilePath(kDummyIntermediatePath), |
| 1049 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 970 RunAllPendingInMessageLoops(); | 1050 RunAllPendingInMessageLoops(); |
| 971 | 1051 |
| 972 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1052 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 973 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, | 1053 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, |
| 974 item->GetLastReason()); | 1054 item->GetLastReason()); |
| 1055 EXPECT_FALSE(item->GetTargetFilePath().empty()); |
| 1056 EXPECT_TRUE(item->GetFullPath().empty()); |
| 975 } | 1057 } |
| 976 | 1058 |
| 977 // Handling of downloads initiated via a failed request. In this case, Start() | 1059 // Handling of downloads initiated via a failed request. In this case, Start() |
| 978 // will get called with a DownloadCreateInfo with a non-zero interrupt_reason. | 1060 // will get called with a DownloadCreateInfo with a non-zero interrupt_reason. |
| 979 TEST_F(DownloadItemTest, StartFailedDownload) { | 1061 TEST_F(DownloadItemTest, StartFailedDownload) { |
| 980 create_info()->result = DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED; | 1062 create_info()->result = DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED; |
| 981 DownloadItemImpl* item = CreateDownloadItem(); | 1063 DownloadItemImpl* item = CreateDownloadItem(); |
| 982 | 1064 |
| 983 // DownloadFile and DownloadRequestHandleInterface objects aren't created for | 1065 // DownloadFile and DownloadRequestHandleInterface objects aren't created for |
| 984 // failed downloads. | 1066 // failed downloads. |
| 985 std::unique_ptr<DownloadFile> null_download_file; | 1067 std::unique_ptr<DownloadFile> null_download_file; |
| 986 std::unique_ptr<DownloadRequestHandleInterface> null_request_handle; | 1068 std::unique_ptr<DownloadRequestHandleInterface> null_request_handle; |
| 987 DownloadItemImplDelegate::DownloadTargetCallback download_target_callback; | 1069 DownloadItemImplDelegate::DownloadTargetCallback download_target_callback; |
| 988 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) | 1070 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) |
| 989 .WillOnce(SaveArg<1>(&download_target_callback)); | 1071 .WillOnce(SaveArg<1>(&download_target_callback)); |
| 990 item->Start(std::move(null_download_file), std::move(null_request_handle), | 1072 item->Start(std::move(null_download_file), std::move(null_request_handle), |
| 991 *create_info()); | 1073 *create_info()); |
| 992 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1074 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 993 RunAllPendingInMessageLoops(); | 1075 RunAllPendingInMessageLoops(); |
| 994 | 1076 |
| 995 // The DownloadItemImpl should attempt to determine a target path even if the | 1077 // The DownloadItemImpl should attempt to determine a target path even if the |
| 996 // download was interrupted. | 1078 // download was interrupted. |
| 997 ASSERT_FALSE(download_target_callback.is_null()); | 1079 ASSERT_FALSE(download_target_callback.is_null()); |
| 998 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1080 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 999 base::FilePath target_path(FILE_PATH_LITERAL("foo")); | 1081 base::FilePath target_path(FILE_PATH_LITERAL("foo")); |
| 1000 download_target_callback.Run(target_path, | 1082 download_target_callback.Run(target_path, |
| 1001 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1083 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1002 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, target_path); | 1084 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, target_path, |
| 1085 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1003 RunAllPendingInMessageLoops(); | 1086 RunAllPendingInMessageLoops(); |
| 1004 | 1087 |
| 1005 EXPECT_EQ(target_path, item->GetTargetFilePath()); | 1088 EXPECT_EQ(target_path, item->GetTargetFilePath()); |
| 1006 CleanupItem(item, NULL, DownloadItem::INTERRUPTED); | 1089 CleanupItem(item, NULL, DownloadItem::INTERRUPTED); |
| 1007 } | 1090 } |
| 1008 | 1091 |
| 1009 // Test that the delegate is invoked after the download file is renamed. | 1092 // Test that the delegate is invoked after the download file is renamed. |
| 1010 TEST_F(DownloadItemTest, CallbackAfterRename) { | 1093 TEST_F(DownloadItemTest, CallbackAfterRename) { |
| 1011 DownloadItemImpl* item = CreateDownloadItem(); | 1094 DownloadItemImpl* item = CreateDownloadItem(); |
| 1012 DownloadItemImplDelegate::DownloadTargetCallback callback; | 1095 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 1013 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 1096 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
| 1014 base::FilePath final_path( | 1097 base::FilePath final_path( |
| 1015 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 1098 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
| 1016 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1099 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
| 1017 base::FilePath new_intermediate_path( | 1100 base::FilePath new_intermediate_path( |
| 1018 final_path.InsertBeforeExtensionASCII("y")); | 1101 final_path.InsertBeforeExtensionASCII("y")); |
| 1019 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1102 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 1020 .WillOnce(ScheduleRenameAndUniquifyCallback( | 1103 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 1021 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); | 1104 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
| 1022 | 1105 |
| 1023 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1106 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1024 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1107 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 1108 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1025 RunAllPendingInMessageLoops(); | 1109 RunAllPendingInMessageLoops(); |
| 1026 // All the callbacks should have happened by now. | 1110 // All the callbacks should have happened by now. |
| 1027 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1111 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 1028 mock_delegate()->VerifyAndClearExpectations(); | 1112 mock_delegate()->VerifyAndClearExpectations(); |
| 1029 | 1113 |
| 1030 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1114 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 1031 .WillOnce(Return(true)); | 1115 .WillOnce(Return(true)); |
| 1032 EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _, _, _, _)) | 1116 EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _, _, _, _)) |
| 1033 .WillOnce(ScheduleRenameAndAnnotateCallback( | 1117 .WillOnce(ScheduleRenameAndAnnotateCallback( |
| 1034 DOWNLOAD_INTERRUPT_REASON_NONE, final_path)); | 1118 DOWNLOAD_INTERRUPT_REASON_NONE, final_path)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1053 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1137 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
| 1054 base::FilePath new_intermediate_path( | 1138 base::FilePath new_intermediate_path( |
| 1055 final_path.InsertBeforeExtensionASCII("y")); | 1139 final_path.InsertBeforeExtensionASCII("y")); |
| 1056 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1140 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 1057 .WillOnce(ScheduleRenameAndUniquifyCallback( | 1141 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 1058 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, new_intermediate_path)); | 1142 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, new_intermediate_path)); |
| 1059 EXPECT_CALL(*download_file, Cancel()) | 1143 EXPECT_CALL(*download_file, Cancel()) |
| 1060 .Times(1); | 1144 .Times(1); |
| 1061 | 1145 |
| 1062 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1146 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1063 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1147 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 1148 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1064 RunAllPendingInMessageLoops(); | 1149 RunAllPendingInMessageLoops(); |
| 1065 // All the callbacks should have happened by now. | 1150 // All the callbacks should have happened by now. |
| 1066 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1151 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 1067 mock_delegate()->VerifyAndClearExpectations(); | 1152 mock_delegate()->VerifyAndClearExpectations(); |
| 1068 } | 1153 } |
| 1069 | 1154 |
| 1070 TEST_F(DownloadItemTest, Interrupted) { | 1155 TEST_F(DownloadItemTest, Interrupted) { |
| 1071 DownloadItemImpl* item = CreateDownloadItem(); | 1156 DownloadItemImpl* item = CreateDownloadItem(); |
| 1072 MockDownloadFile* download_file = | 1157 MockDownloadFile* download_file = |
| 1073 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1158 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1190 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
| 1106 base::FilePath new_intermediate_path( | 1191 base::FilePath new_intermediate_path( |
| 1107 final_path.InsertBeforeExtensionASCII("y")); | 1192 final_path.InsertBeforeExtensionASCII("y")); |
| 1108 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1193 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 1109 .WillOnce(ScheduleRenameAndUniquifyCallback( | 1194 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 1110 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); | 1195 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
| 1111 EXPECT_CALL(*download_file, Cancel()) | 1196 EXPECT_CALL(*download_file, Cancel()) |
| 1112 .Times(1); | 1197 .Times(1); |
| 1113 | 1198 |
| 1114 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1199 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1115 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1200 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 1201 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1116 RunAllPendingInMessageLoops(); | 1202 RunAllPendingInMessageLoops(); |
| 1117 // All the callbacks should have happened by now. | 1203 // All the callbacks should have happened by now. |
| 1118 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1204 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 1119 mock_delegate()->VerifyAndClearExpectations(); | 1205 mock_delegate()->VerifyAndClearExpectations(); |
| 1120 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1206 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 1121 EXPECT_TRUE(item->GetFullPath().empty()); | 1207 EXPECT_TRUE(item->GetFullPath().empty()); |
| 1122 EXPECT_EQ(final_path, item->GetTargetFilePath()); | 1208 EXPECT_EQ(final_path, item->GetTargetFilePath()); |
| 1123 } | 1209 } |
| 1124 | 1210 |
| 1125 // As above. But if the download can be resumed by continuing, then the | 1211 // As above. But if the download can be resumed by continuing, then the |
| 1126 // intermediate path should be retained when the download is interrupted after | 1212 // intermediate path should be retained when the download is interrupted after |
| 1127 // the intermediate rename succeeds. | 1213 // the intermediate rename succeeds. |
| 1128 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) { | 1214 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) { |
| 1129 DownloadItemImpl* item = CreateDownloadItem(); | 1215 DownloadItemImpl* item = CreateDownloadItem(); |
| 1130 DownloadItemImplDelegate::DownloadTargetCallback callback; | 1216 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 1131 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 1217 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
| 1218 |
| 1219 // Write some data and interrupt with NETWORK_FAILED. The download shouldn't |
| 1220 // transition to INTERRUPTED until the destination callback has been invoked. |
| 1132 item->DestinationObserverAsWeakPtr()->DestinationError( | 1221 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 1133 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 0, | 1222 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 1, |
| 1134 std::unique_ptr<crypto::SecureHash>()); | 1223 std::unique_ptr<crypto::SecureHash>()); |
| 1135 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1224 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1136 | 1225 |
| 1137 base::FilePath final_path( | 1226 base::FilePath final_path( |
| 1138 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 1227 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
| 1139 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1228 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
| 1140 base::FilePath new_intermediate_path( | 1229 base::FilePath new_intermediate_path( |
| 1141 final_path.InsertBeforeExtensionASCII("y")); | 1230 final_path.InsertBeforeExtensionASCII("y")); |
| 1142 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1231 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 1143 .WillOnce(ScheduleRenameAndUniquifyCallback( | 1232 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 1144 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); | 1233 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
| 1145 EXPECT_CALL(*download_file, FullPath()) | 1234 EXPECT_CALL(*download_file, FullPath()) |
| 1146 .WillOnce(ReturnRefOfCopy(base::FilePath(new_intermediate_path))); | 1235 .WillOnce(ReturnRefOfCopy(base::FilePath(new_intermediate_path))); |
| 1147 EXPECT_CALL(*download_file, Detach()); | 1236 EXPECT_CALL(*download_file, Detach()); |
| 1148 | 1237 |
| 1149 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1238 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1150 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1239 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 1240 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1151 RunAllPendingInMessageLoops(); | 1241 RunAllPendingInMessageLoops(); |
| 1152 // All the callbacks should have happened by now. | 1242 // All the callbacks should have happened by now. |
| 1153 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1243 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 1154 mock_delegate()->VerifyAndClearExpectations(); | 1244 mock_delegate()->VerifyAndClearExpectations(); |
| 1155 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1245 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 1156 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); | 1246 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); |
| 1157 EXPECT_EQ(final_path, item->GetTargetFilePath()); | 1247 EXPECT_EQ(final_path, item->GetTargetFilePath()); |
| 1158 } | 1248 } |
| 1159 | 1249 |
| 1160 // As above. If the intermediate rename fails, then the interrupt reason should | 1250 // As above. If the intermediate rename fails, then the interrupt reason should |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1173 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1263 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
| 1174 base::FilePath new_intermediate_path( | 1264 base::FilePath new_intermediate_path( |
| 1175 final_path.InsertBeforeExtensionASCII("y")); | 1265 final_path.InsertBeforeExtensionASCII("y")); |
| 1176 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1266 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 1177 .WillOnce(ScheduleRenameAndUniquifyCallback( | 1267 .WillOnce(ScheduleRenameAndUniquifyCallback( |
| 1178 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, new_intermediate_path)); | 1268 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, new_intermediate_path)); |
| 1179 EXPECT_CALL(*download_file, Cancel()) | 1269 EXPECT_CALL(*download_file, Cancel()) |
| 1180 .Times(1); | 1270 .Times(1); |
| 1181 | 1271 |
| 1182 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1272 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1183 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1273 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path, |
| 1274 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1184 RunAllPendingInMessageLoops(); | 1275 RunAllPendingInMessageLoops(); |
| 1185 // All the callbacks should have happened by now. | 1276 // All the callbacks should have happened by now. |
| 1186 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1277 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 1187 mock_delegate()->VerifyAndClearExpectations(); | 1278 mock_delegate()->VerifyAndClearExpectations(); |
| 1188 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1279 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 1189 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, item->GetLastReason()); | 1280 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, item->GetLastReason()); |
| 1190 EXPECT_TRUE(item->GetFullPath().empty()); | 1281 EXPECT_TRUE(item->GetFullPath().empty()); |
| 1191 EXPECT_EQ(final_path, item->GetTargetFilePath()); | 1282 EXPECT_EQ(final_path, item->GetTargetFilePath()); |
| 1192 } | 1283 } |
| 1193 | 1284 |
| 1194 TEST_F(DownloadItemTest, Canceled) { | 1285 TEST_F(DownloadItemTest, Canceled) { |
| 1195 DownloadItemImpl* item = CreateDownloadItem(); | 1286 DownloadItemImpl* item = CreateDownloadItem(); |
| 1196 DownloadItemImplDelegate::DownloadTargetCallback target_callback; | 1287 DownloadItemImplDelegate::DownloadTargetCallback target_callback; |
| 1197 MockDownloadFile* download_file = | 1288 MockDownloadFile* download_file = |
| 1198 CallDownloadItemStart(item, &target_callback); | 1289 CallDownloadItemStart(item, &target_callback); |
| 1199 | 1290 |
| 1200 // Confirm cancel sets state properly. | 1291 // Confirm cancel sets state properly. |
| 1201 EXPECT_CALL(*download_file, Cancel()); | 1292 EXPECT_CALL(*download_file, Cancel()); |
| 1202 item->Cancel(true); | 1293 item->Cancel(true); |
| 1203 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); | 1294 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); |
| 1204 } | 1295 } |
| 1205 | 1296 |
| 1297 TEST_F(DownloadItemTest, DownloadTargetDetermined_Cancel) { |
| 1298 DownloadItemImpl* item = CreateDownloadItem(); |
| 1299 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 1300 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
| 1301 |
| 1302 EXPECT_CALL(*download_file, Cancel()); |
| 1303 callback.Run(base::FilePath(FILE_PATH_LITERAL("foo")), |
| 1304 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1305 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 1306 base::FilePath(FILE_PATH_LITERAL("bar")), |
| 1307 DOWNLOAD_INTERRUPT_REASON_USER_CANCELED); |
| 1308 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); |
| 1309 } |
| 1310 |
| 1311 TEST_F(DownloadItemTest, DownloadTargetDetermined_CancelWithEmptyName) { |
| 1312 DownloadItemImpl* item = CreateDownloadItem(); |
| 1313 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 1314 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
| 1315 |
| 1316 EXPECT_CALL(*download_file, Cancel()); |
| 1317 callback.Run(base::FilePath(), DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1318 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, base::FilePath(), |
| 1319 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1320 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); |
| 1321 } |
| 1322 |
| 1206 TEST_F(DownloadItemTest, FileRemoved) { | 1323 TEST_F(DownloadItemTest, FileRemoved) { |
| 1207 DownloadItemImpl* item = CreateDownloadItem(); | 1324 DownloadItemImpl* item = CreateDownloadItem(); |
| 1208 | 1325 |
| 1209 EXPECT_FALSE(item->GetFileExternallyRemoved()); | 1326 EXPECT_FALSE(item->GetFileExternallyRemoved()); |
| 1210 item->OnDownloadedFileRemoved(); | 1327 item->OnDownloadedFileRemoved(); |
| 1211 EXPECT_TRUE(item->GetFileExternallyRemoved()); | 1328 EXPECT_TRUE(item->GetFileExternallyRemoved()); |
| 1212 } | 1329 } |
| 1213 | 1330 |
| 1214 TEST_F(DownloadItemTest, DestinationUpdate) { | 1331 TEST_F(DownloadItemTest, DestinationUpdate) { |
| 1215 DownloadItemImpl* item = CreateDownloadItem(); | 1332 DownloadItemImpl* item = CreateDownloadItem(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 | 1373 |
| 1257 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1374 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1258 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); | 1375 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); |
| 1259 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 1376 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
| 1260 | 1377 |
| 1261 std::unique_ptr<crypto::SecureHash> hash( | 1378 std::unique_ptr<crypto::SecureHash> hash( |
| 1262 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); | 1379 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
| 1263 hash->Update(kTestData1, sizeof(kTestData1)); | 1380 hash->Update(kTestData1, sizeof(kTestData1)); |
| 1264 | 1381 |
| 1265 EXPECT_CALL(*download_file, Detach()); | 1382 EXPECT_CALL(*download_file, Detach()); |
| 1266 as_observer->DestinationError( | 1383 as_observer->DestinationError(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 1, |
| 1267 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 0, std::move(hash)); | 1384 std::move(hash)); |
| 1268 mock_delegate()->VerifyAndClearExpectations(); | 1385 mock_delegate()->VerifyAndClearExpectations(); |
| 1269 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1386 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 1270 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1387 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 1271 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); | 1388 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); |
| 1272 EXPECT_EQ( | 1389 EXPECT_EQ( |
| 1273 std::string(std::begin(kHashOfTestData1), std::end(kHashOfTestData1)), | 1390 std::string(std::begin(kHashOfTestData1), std::end(kHashOfTestData1)), |
| 1274 item->GetHash()); | 1391 item->GetHash()); |
| 1275 } | 1392 } |
| 1393 |
| 1276 TEST_F(DownloadItemTest, DestinationError_RestartRequired) { | 1394 TEST_F(DownloadItemTest, DestinationError_RestartRequired) { |
| 1277 DownloadItemImpl* item = CreateDownloadItem(); | 1395 DownloadItemImpl* item = CreateDownloadItem(); |
| 1278 MockDownloadFile* download_file = | 1396 MockDownloadFile* download_file = |
| 1279 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1397 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 1280 base::WeakPtr<DownloadDestinationObserver> as_observer( | 1398 base::WeakPtr<DownloadDestinationObserver> as_observer( |
| 1281 item->DestinationObserverAsWeakPtr()); | 1399 item->DestinationObserverAsWeakPtr()); |
| 1282 TestDownloadItemObserver observer(item); | 1400 TestDownloadItemObserver observer(item); |
| 1283 | 1401 |
| 1284 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1402 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1285 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); | 1403 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); |
| 1286 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 1404 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
| 1287 | 1405 |
| 1288 std::unique_ptr<crypto::SecureHash> hash( | 1406 std::unique_ptr<crypto::SecureHash> hash( |
| 1289 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); | 1407 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
| 1290 hash->Update(kTestData1, sizeof(kTestData1)); | 1408 hash->Update(kTestData1, sizeof(kTestData1)); |
| 1291 | 1409 |
| 1292 EXPECT_CALL(*download_file, Cancel()); | 1410 EXPECT_CALL(*download_file, Cancel()); |
| 1293 as_observer->DestinationError( | 1411 as_observer->DestinationError(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 1, |
| 1294 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 0, std::move(hash)); | 1412 std::move(hash)); |
| 1295 mock_delegate()->VerifyAndClearExpectations(); | 1413 mock_delegate()->VerifyAndClearExpectations(); |
| 1296 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1414 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 1297 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1415 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 1298 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, item->GetLastReason()); | 1416 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, item->GetLastReason()); |
| 1299 EXPECT_EQ(std::string(), item->GetHash()); | 1417 EXPECT_EQ(std::string(), item->GetHash()); |
| 1300 } | 1418 } |
| 1301 | 1419 |
| 1302 TEST_F(DownloadItemTest, DestinationCompleted) { | 1420 TEST_F(DownloadItemTest, DestinationCompleted) { |
| 1303 DownloadItemImpl* item = CreateDownloadItem(); | 1421 DownloadItemImpl* item = CreateDownloadItem(); |
| 1304 MockDownloadFile* download_file = | 1422 MockDownloadFile* download_file = |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1636 item->StealDangerousDownload( | 1754 item->StealDangerousDownload( |
| 1637 false, // delete_file_after_feedback | 1755 false, // delete_file_after_feedback |
| 1638 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, | 1756 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
| 1639 weak_ptr_factory.GetWeakPtr(), | 1757 weak_ptr_factory.GetWeakPtr(), |
| 1640 base::Unretained(&returned_path))); | 1758 base::Unretained(&returned_path))); |
| 1641 RunAllPendingInMessageLoops(); | 1759 RunAllPendingInMessageLoops(); |
| 1642 EXPECT_NE(full_path, returned_path); | 1760 EXPECT_NE(full_path, returned_path); |
| 1643 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); | 1761 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
| 1644 } | 1762 } |
| 1645 | 1763 |
| 1646 TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { | 1764 TEST_F(DownloadItemTest, StealInterruptedContinuableDangerousDownload) { |
| 1647 base::FilePath returned_path; | 1765 base::FilePath returned_path; |
| 1648 DownloadItemImpl* item = CreateDownloadItem(); | 1766 DownloadItemImpl* item = CreateDownloadItem(); |
| 1649 MockDownloadFile* download_file = | 1767 MockDownloadFile* download_file = |
| 1650 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1768 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 1651 base::FilePath full_path = item->GetFullPath(); | 1769 base::FilePath full_path = item->GetFullPath(); |
| 1652 EXPECT_FALSE(full_path.empty()); | 1770 EXPECT_FALSE(full_path.empty()); |
| 1653 EXPECT_CALL(*download_file, FullPath()).WillOnce(ReturnRefOfCopy(full_path)); | 1771 EXPECT_CALL(*download_file, FullPath()).WillOnce(ReturnRefOfCopy(full_path)); |
| 1654 EXPECT_CALL(*download_file, Detach()); | 1772 EXPECT_CALL(*download_file, Detach()); |
| 1655 item->DestinationObserverAsWeakPtr()->DestinationError( | 1773 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 1656 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 0, | 1774 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 1, |
| 1657 std::unique_ptr<crypto::SecureHash>()); | 1775 std::unique_ptr<crypto::SecureHash>()); |
| 1658 ASSERT_TRUE(item->IsDangerous()); | 1776 ASSERT_TRUE(item->IsDangerous()); |
| 1659 | 1777 |
| 1660 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); | 1778 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
| 1661 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); | 1779 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
| 1662 item->OnAllDataSaved(0, std::unique_ptr<crypto::SecureHash>()); | 1780 item->OnAllDataSaved(0, std::unique_ptr<crypto::SecureHash>()); |
| 1663 item->StealDangerousDownload( | 1781 item->StealDangerousDownload( |
| 1664 true, base::Bind(&DownloadItemTest::OnDownloadFileAcquired, | 1782 true, base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
| 1665 weak_ptr_factory.GetWeakPtr(), | 1783 weak_ptr_factory.GetWeakPtr(), |
| 1666 base::Unretained(&returned_path))); | 1784 base::Unretained(&returned_path))); |
| 1667 RunAllPendingInMessageLoops(); | 1785 RunAllPendingInMessageLoops(); |
| 1668 EXPECT_EQ(full_path, returned_path); | 1786 EXPECT_EQ(full_path, returned_path); |
| 1669 } | 1787 } |
| 1670 | 1788 |
| 1671 TEST_F(DownloadItemTest, StealInterruptedNonResumableDangerousDownload) { | 1789 TEST_F(DownloadItemTest, StealInterruptedNonContinuableDangerousDownload) { |
| 1672 base::FilePath returned_path; | 1790 base::FilePath returned_path; |
| 1673 DownloadItemImpl* item = CreateDownloadItem(); | 1791 DownloadItemImpl* item = CreateDownloadItem(); |
| 1674 MockDownloadFile* download_file = | 1792 MockDownloadFile* download_file = |
| 1675 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1793 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 1676 EXPECT_CALL(*download_file, Cancel()); | 1794 EXPECT_CALL(*download_file, Cancel()); |
| 1677 item->DestinationObserverAsWeakPtr()->DestinationError( | 1795 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 1678 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 0, | 1796 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 1, |
| 1679 std::unique_ptr<crypto::SecureHash>()); | 1797 std::unique_ptr<crypto::SecureHash>()); |
| 1680 ASSERT_TRUE(item->IsDangerous()); | 1798 ASSERT_TRUE(item->IsDangerous()); |
| 1681 | 1799 |
| 1682 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); | 1800 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
| 1683 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); | 1801 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
| 1684 item->OnAllDataSaved(0, std::unique_ptr<crypto::SecureHash>()); | 1802 item->OnAllDataSaved(0, std::unique_ptr<crypto::SecureHash>()); |
| 1685 item->StealDangerousDownload( | 1803 item->StealDangerousDownload( |
| 1686 true, base::Bind(&DownloadItemTest::OnDownloadFileAcquired, | 1804 true, base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
| 1687 weak_ptr_factory.GetWeakPtr(), | 1805 weak_ptr_factory.GetWeakPtr(), |
| 1688 base::Unretained(&returned_path))); | 1806 base::Unretained(&returned_path))); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1955 initialize_callback.Run(DOWNLOAD_INTERRUPT_REASON_NONE); | 2073 initialize_callback.Run(DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1956 initialize_completion_loop.Run(); | 2074 initialize_completion_loop.Run(); |
| 1957 | 2075 |
| 1958 RunAllPendingInMessageLoops(); | 2076 RunAllPendingInMessageLoops(); |
| 1959 | 2077 |
| 1960 ASSERT_FALSE(target_callback.is_null()); | 2078 ASSERT_FALSE(target_callback.is_null()); |
| 1961 ScheduleObservations(PostTargetDeterminationObservations(), | 2079 ScheduleObservations(PostTargetDeterminationObservations(), |
| 1962 destination_observer); | 2080 destination_observer); |
| 1963 target_callback.Run(base::FilePath(), | 2081 target_callback.Run(base::FilePath(), |
| 1964 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 2082 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 1965 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, base::FilePath()); | 2083 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, base::FilePath(), |
| 2084 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 1966 EXPECT_EQ(DownloadItem::CANCELLED, item_->GetState()); | 2085 EXPECT_EQ(DownloadItem::CANCELLED, item_->GetState()); |
| 1967 RunAllPendingInMessageLoops(); | 2086 RunAllPendingInMessageLoops(); |
| 1968 } | 2087 } |
| 1969 | 2088 |
| 1970 // Run through the DII workflow, but the intermediate rename fails. | 2089 // Run through the DII workflow, but the intermediate rename fails. |
| 1971 TEST_P(DownloadItemDestinationUpdateRaceTest, IntermediateRenameFails) { | 2090 TEST_P(DownloadItemDestinationUpdateRaceTest, IntermediateRenameFails) { |
| 1972 // Expect that the download file and the request will be cancelled as a | 2091 // Expect that the download file and the request will be cancelled as a |
| 1973 // result. | 2092 // result. |
| 1974 EXPECT_CALL(*file_, Cancel()); | 2093 EXPECT_CALL(*file_, Cancel()); |
| 1975 EXPECT_CALL(*request_handle_, CancelRequest()); | 2094 EXPECT_CALL(*request_handle_, CancelRequest()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2008 initialize_completion_loop.Run(); | 2127 initialize_completion_loop.Run(); |
| 2009 | 2128 |
| 2010 RunAllPendingInMessageLoops(); | 2129 RunAllPendingInMessageLoops(); |
| 2011 ASSERT_FALSE(target_callback.is_null()); | 2130 ASSERT_FALSE(target_callback.is_null()); |
| 2012 | 2131 |
| 2013 ScheduleObservations(PostTargetDeterminationObservations(), | 2132 ScheduleObservations(PostTargetDeterminationObservations(), |
| 2014 destination_observer); | 2133 destination_observer); |
| 2015 target_callback.Run(base::FilePath(kDummyTargetPath), | 2134 target_callback.Run(base::FilePath(kDummyTargetPath), |
| 2016 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 2135 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 2017 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 2136 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 2018 base::FilePath(kDummyIntermediatePath)); | 2137 base::FilePath(kDummyIntermediatePath), |
| 2138 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 2019 | 2139 |
| 2020 intermediate_rename_loop.Run(); | 2140 intermediate_rename_loop.Run(); |
| 2021 ASSERT_FALSE(intermediate_rename_callback.is_null()); | 2141 ASSERT_FALSE(intermediate_rename_callback.is_null()); |
| 2022 | 2142 |
| 2023 ScheduleObservations(PostIntermediateRenameObservations(), | 2143 ScheduleObservations(PostIntermediateRenameObservations(), |
| 2024 destination_observer); | 2144 destination_observer); |
| 2025 intermediate_rename_callback.Run(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 2145 intermediate_rename_callback.Run(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 2026 base::FilePath()); | 2146 base::FilePath()); |
| 2027 RunAllPendingInMessageLoops(); | 2147 RunAllPendingInMessageLoops(); |
| 2028 | 2148 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2077 initialize_completion_loop.Run(); | 2197 initialize_completion_loop.Run(); |
| 2078 | 2198 |
| 2079 RunAllPendingInMessageLoops(); | 2199 RunAllPendingInMessageLoops(); |
| 2080 ASSERT_FALSE(target_callback.is_null()); | 2200 ASSERT_FALSE(target_callback.is_null()); |
| 2081 | 2201 |
| 2082 ScheduleObservations(PostTargetDeterminationObservations(), | 2202 ScheduleObservations(PostTargetDeterminationObservations(), |
| 2083 destination_observer); | 2203 destination_observer); |
| 2084 target_callback.Run(base::FilePath(kDummyTargetPath), | 2204 target_callback.Run(base::FilePath(kDummyTargetPath), |
| 2085 DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 2205 DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 2086 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, | 2206 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, |
| 2087 base::FilePath(kDummyIntermediatePath)); | 2207 base::FilePath(kDummyIntermediatePath), |
| 2208 DOWNLOAD_INTERRUPT_REASON_NONE); |
| 2088 | 2209 |
| 2089 intermediate_rename_loop.Run(); | 2210 intermediate_rename_loop.Run(); |
| 2090 ASSERT_FALSE(intermediate_rename_callback.is_null()); | 2211 ASSERT_FALSE(intermediate_rename_callback.is_null()); |
| 2091 | 2212 |
| 2092 // This may or may not be called, depending on whether there are any errors in | 2213 // This may or may not be called, depending on whether there are any errors in |
| 2093 // our action list. | 2214 // our action list. |
| 2094 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) | 2215 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) |
| 2095 .Times(::testing::AnyNumber()); | 2216 .Times(::testing::AnyNumber()); |
| 2096 | 2217 |
| 2097 ScheduleObservations(PostIntermediateRenameObservations(), | 2218 ScheduleObservations(PostIntermediateRenameObservations(), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2112 | 2233 |
| 2113 item_->Cancel(true); | 2234 item_->Cancel(true); |
| 2114 RunAllPendingInMessageLoops(); | 2235 RunAllPendingInMessageLoops(); |
| 2115 } | 2236 } |
| 2116 | 2237 |
| 2117 TEST(MockDownloadItem, Compiles) { | 2238 TEST(MockDownloadItem, Compiles) { |
| 2118 MockDownloadItem mock_item; | 2239 MockDownloadItem mock_item; |
| 2119 } | 2240 } |
| 2120 | 2241 |
| 2121 } // namespace content | 2242 } // namespace content |
| OLD | NEW |