| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/callback.h" |
| 5 #include "base/command_line.h" | 6 #include "base/command_line.h" |
| 6 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 7 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 8 #include "base/threading/thread.h" | 9 #include "base/threading/thread.h" |
| 9 #include "content/browser/byte_stream.h" | 10 #include "content/browser/byte_stream.h" |
| 10 #include "content/browser/download/download_create_info.h" | 11 #include "content/browser/download/download_create_info.h" |
| 11 #include "content/browser/download/download_file_factory.h" | 12 #include "content/browser/download/download_file_factory.h" |
| 12 #include "content/browser/download/download_item_impl.h" | 13 #include "content/browser/download/download_item_impl.h" |
| 13 #include "content/browser/download/download_item_impl_delegate.h" | 14 #include "content/browser/download/download_item_impl_delegate.h" |
| 14 #include "content/browser/download/download_request_handle.h" | 15 #include "content/browser/download/download_request_handle.h" |
| 15 #include "content/browser/download/mock_download_file.h" | 16 #include "content/browser/download/mock_download_file.h" |
| 17 #include "content/public/browser/download_destination_observer.h" |
| 16 #include "content/public/browser/download_id.h" | 18 #include "content/public/browser/download_id.h" |
| 17 #include "content/public/browser/download_destination_observer.h" | |
| 18 #include "content/public/browser/download_interrupt_reasons.h" | 19 #include "content/public/browser/download_interrupt_reasons.h" |
| 19 #include "content/public/browser/download_url_parameters.h" | 20 #include "content/public/browser/download_url_parameters.h" |
| 20 #include "content/public/common/content_switches.h" | 21 #include "content/public/common/content_switches.h" |
| 21 #include "content/public/test/mock_download_item.h" | 22 #include "content/public/test/mock_download_item.h" |
| 22 #include "content/public/test/test_browser_thread.h" | 23 #include "content/public/test/test_browser_thread.h" |
| 23 #include "testing/gmock/include/gmock/gmock.h" | 24 #include "testing/gmock/include/gmock/gmock.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 25 | 26 |
| 26 using ::testing::_; | 27 using ::testing::_; |
| 27 using ::testing::NiceMock; | 28 using ::testing::NiceMock; |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 .WillRepeatedly(Return(false)); | 272 .WillRepeatedly(Return(false)); |
| 272 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(_, _)) | 273 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(_, _)) |
| 273 .WillRepeatedly(Return(true)); | 274 .WillRepeatedly(Return(true)); |
| 274 | 275 |
| 275 return mock_download_file; | 276 return mock_download_file; |
| 276 } | 277 } |
| 277 | 278 |
| 278 // Perform the intermediate rename for |item|. The target path for the | 279 // Perform the intermediate rename for |item|. The target path for the |
| 279 // download will be set to kDummyPath. Returns the MockDownloadFile* that was | 280 // download will be set to kDummyPath. Returns the MockDownloadFile* that was |
| 280 // added to the DownloadItem. | 281 // added to the DownloadItem. |
| 281 MockDownloadFile* DoIntermediateRename(DownloadItemImpl* item) { | 282 MockDownloadFile* DoIntermediateRename(DownloadItemImpl* item, |
| 283 DownloadDangerType danger_type) { |
| 282 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 284 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 283 EXPECT_TRUE(item->GetTargetFilePath().empty()); | 285 EXPECT_TRUE(item->GetTargetFilePath().empty()); |
| 284 DownloadItemImplDelegate::DownloadTargetCallback callback; | 286 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 285 MockDownloadFile* download_file = | 287 MockDownloadFile* download_file = |
| 286 AddDownloadFileToDownloadItem(item, &callback); | 288 AddDownloadFileToDownloadItem(item, &callback); |
| 287 base::FilePath target_path(kDummyPath); | 289 base::FilePath target_path(kDummyPath); |
| 288 base::FilePath intermediate_path( | 290 base::FilePath intermediate_path( |
| 289 target_path.InsertBeforeExtensionASCII("x")); | 291 target_path.InsertBeforeExtensionASCII("x")); |
| 290 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 292 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
| 291 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 293 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 292 intermediate_path)); | 294 intermediate_path)); |
| 293 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 295 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 294 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 296 danger_type, intermediate_path); |
| 295 RunAllPendingInMessageLoops(); | 297 RunAllPendingInMessageLoops(); |
| 296 return download_file; | 298 return download_file; |
| 297 } | 299 } |
| 298 | 300 |
| 299 // Cleanup a download item (specifically get rid of the DownloadFile on it). | 301 // Cleanup a download item (specifically get rid of the DownloadFile on it). |
| 300 // The item must be in the expected state. | 302 // The item must be in the expected state. |
| 301 void CleanupItem(DownloadItemImpl* item, | 303 void CleanupItem(DownloadItemImpl* item, |
| 302 MockDownloadFile* download_file, | 304 MockDownloadFile* download_file, |
| 303 DownloadItem::DownloadState expected_state) { | 305 DownloadItem::DownloadState expected_state) { |
| 304 EXPECT_EQ(expected_state, item->GetState()); | 306 EXPECT_EQ(expected_state, item->GetState()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 317 } | 319 } |
| 318 | 320 |
| 319 void RunAllPendingInMessageLoops() { | 321 void RunAllPendingInMessageLoops() { |
| 320 loop_.RunUntilIdle(); | 322 loop_.RunUntilIdle(); |
| 321 } | 323 } |
| 322 | 324 |
| 323 MockDelegate* mock_delegate() { | 325 MockDelegate* mock_delegate() { |
| 324 return &delegate_; | 326 return &delegate_; |
| 325 } | 327 } |
| 326 | 328 |
| 329 void OnDownloadFileAcquired(base::FilePath* return_path, |
| 330 const base::FilePath& path) { |
| 331 *return_path = path; |
| 332 } |
| 333 |
| 327 private: | 334 private: |
| 328 base::MessageLoopForUI loop_; | 335 base::MessageLoopForUI loop_; |
| 329 TestBrowserThread ui_thread_; // UI thread | 336 TestBrowserThread ui_thread_; // UI thread |
| 330 TestBrowserThread file_thread_; // FILE thread | 337 TestBrowserThread file_thread_; // FILE thread |
| 331 StrictMock<MockDelegate> delegate_; | 338 StrictMock<MockDelegate> delegate_; |
| 332 std::set<DownloadItem*> allocated_downloads_; | 339 std::set<DownloadItem*> allocated_downloads_; |
| 333 }; | 340 }; |
| 334 | 341 |
| 335 // Tests to ensure calls that change a DownloadItem generate an update to | 342 // Tests to ensure calls that change a DownloadItem generate an update to |
| 336 // observers. | 343 // observers. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) { | 389 TEST_F(DownloadItemTest, NotificationAfterDownloadedFileRemoved) { |
| 383 DownloadItemImpl* item = CreateDownloadItem(); | 390 DownloadItemImpl* item = CreateDownloadItem(); |
| 384 MockObserver observer(item); | 391 MockObserver observer(item); |
| 385 | 392 |
| 386 item->OnDownloadedFileRemoved(); | 393 item->OnDownloadedFileRemoved(); |
| 387 ASSERT_TRUE(observer.CheckUpdated()); | 394 ASSERT_TRUE(observer.CheckUpdated()); |
| 388 } | 395 } |
| 389 | 396 |
| 390 TEST_F(DownloadItemTest, NotificationAfterInterrupted) { | 397 TEST_F(DownloadItemTest, NotificationAfterInterrupted) { |
| 391 DownloadItemImpl* item = CreateDownloadItem(); | 398 DownloadItemImpl* item = CreateDownloadItem(); |
| 392 MockDownloadFile* download_file = DoIntermediateRename(item); | 399 MockDownloadFile* download_file = |
| 400 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 393 EXPECT_CALL(*download_file, Cancel()); | 401 EXPECT_CALL(*download_file, Cancel()); |
| 394 MockObserver observer(item); | 402 MockObserver observer(item); |
| 395 | 403 |
| 396 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_,_)) | 404 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_,_)) |
| 397 .Times(0); | 405 .Times(0); |
| 398 | 406 |
| 399 item->DestinationObserverAsWeakPtr()->DestinationError( | 407 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 400 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 408 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
| 401 ASSERT_TRUE(observer.CheckUpdated()); | 409 ASSERT_TRUE(observer.CheckUpdated()); |
| 402 } | 410 } |
| 403 | 411 |
| 404 TEST_F(DownloadItemTest, NotificationAfterDelete) { | |
| 405 DownloadItemImpl* item = CreateDownloadItem(); | |
| 406 MockDownloadFile* download_file = AddDownloadFileToDownloadItem(item, NULL); | |
| 407 EXPECT_CALL(*download_file, Cancel()); | |
| 408 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); | |
| 409 MockObserver observer(item); | |
| 410 | |
| 411 item->Delete(DownloadItem::DELETE_DUE_TO_BROWSER_SHUTDOWN); | |
| 412 ASSERT_TRUE(observer.CheckUpdated()); | |
| 413 } | |
| 414 | |
| 415 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { | 412 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { |
| 416 DownloadItemImpl* item = CreateDownloadItem(); | 413 DownloadItemImpl* item = CreateDownloadItem(); |
| 417 MockObserver observer(item); | 414 MockObserver observer(item); |
| 418 | 415 |
| 419 DestroyDownloadItem(item); | 416 DestroyDownloadItem(item); |
| 420 ASSERT_TRUE(observer.CheckDestroyed()); | 417 ASSERT_TRUE(observer.CheckDestroyed()); |
| 421 } | 418 } |
| 422 | 419 |
| 423 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { | 420 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { |
| 424 CommandLine::ForCurrentProcess()->AppendSwitch( | 421 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 425 switches::kEnableDownloadResumption); | 422 switches::kEnableDownloadResumption); |
| 426 | 423 |
| 427 DownloadItemImpl* item = CreateDownloadItem(); | 424 DownloadItemImpl* item = CreateDownloadItem(); |
| 428 MockObserver observer(item); | 425 MockObserver observer(item); |
| 429 DownloadItemImplDelegate::DownloadTargetCallback callback; | 426 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 430 MockDownloadFile* download_file = DoIntermediateRename(item); | 427 MockDownloadFile* download_file = |
| 428 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 431 | 429 |
| 432 // Interrupt the download, using a continuable interrupt. | 430 // Interrupt the download, using a continuable interrupt. |
| 431 EXPECT_CALL(*download_file, FullPath()) |
| 432 .WillOnce(Return(base::FilePath())); |
| 433 EXPECT_CALL(*download_file, Detach()); | 433 EXPECT_CALL(*download_file, Detach()); |
| 434 item->DestinationObserverAsWeakPtr()->DestinationError( | 434 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 435 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); | 435 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); |
| 436 ASSERT_TRUE(observer.CheckUpdated()); | 436 ASSERT_TRUE(observer.CheckUpdated()); |
| 437 // Should attempt to auto-resume. Because we don't have a mock WebContents, | 437 // Should attempt to auto-resume. Because we don't have a mock WebContents, |
| 438 // ResumeInterruptedDownload() will abort early, with another interrupt, | 438 // ResumeInterruptedDownload() will abort early, with another interrupt, |
| 439 // which will be ignored. | 439 // which will be ignored. |
| 440 ASSERT_EQ(1, observer.GetInterruptCount()); | 440 ASSERT_EQ(1, observer.GetInterruptCount()); |
| 441 ASSERT_EQ(0, observer.GetResumeCount()); | 441 ASSERT_EQ(0, observer.GetResumeCount()); |
| 442 RunAllPendingInMessageLoops(); | 442 RunAllPendingInMessageLoops(); |
| 443 | 443 |
| 444 CleanupItem(item, download_file, DownloadItem::INTERRUPTED); | 444 CleanupItem(item, download_file, DownloadItem::INTERRUPTED); |
| 445 } | 445 } |
| 446 | 446 |
| 447 // Same as above, but with a non-continuable interrupt. | 447 // Same as above, but with a non-continuable interrupt. |
| 448 TEST_F(DownloadItemTest, RestartAfterInterrupted) { | 448 TEST_F(DownloadItemTest, RestartAfterInterrupted) { |
| 449 CommandLine::ForCurrentProcess()->AppendSwitch( | 449 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 450 switches::kEnableDownloadResumption); | 450 switches::kEnableDownloadResumption); |
| 451 | 451 |
| 452 DownloadItemImpl* item = CreateDownloadItem(); | 452 DownloadItemImpl* item = CreateDownloadItem(); |
| 453 MockObserver observer(item); | 453 MockObserver observer(item); |
| 454 DownloadItemImplDelegate::DownloadTargetCallback callback; | 454 DownloadItemImplDelegate::DownloadTargetCallback callback; |
| 455 MockDownloadFile* download_file = DoIntermediateRename(item); | 455 MockDownloadFile* download_file = |
| 456 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 456 | 457 |
| 457 // Interrupt the download, using a restartable interrupt. | 458 // Interrupt the download, using a restartable interrupt. |
| 458 EXPECT_CALL(*download_file, Cancel()); | 459 EXPECT_CALL(*download_file, Cancel()); |
| 459 item->DestinationObserverAsWeakPtr()->DestinationError( | 460 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 460 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 461 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
| 461 ASSERT_TRUE(observer.CheckUpdated()); | 462 ASSERT_TRUE(observer.CheckUpdated()); |
| 462 // Should not try to auto-resume. | 463 // Should not try to auto-resume. |
| 463 ASSERT_EQ(1, observer.GetInterruptCount()); | 464 ASSERT_EQ(1, observer.GetInterruptCount()); |
| 464 ASSERT_EQ(0, observer.GetResumeCount()); | 465 ASSERT_EQ(0, observer.GetResumeCount()); |
| 465 RunAllPendingInMessageLoops(); | 466 RunAllPendingInMessageLoops(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 484 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) | 485 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) |
| 485 .WillRepeatedly(SaveArg<1>(&callback)); | 486 .WillRepeatedly(SaveArg<1>(&callback)); |
| 486 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { | 487 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { |
| 487 DVLOG(20) << "Loop iteration " << i; | 488 DVLOG(20) << "Loop iteration " << i; |
| 488 | 489 |
| 489 mock_download_file = new NiceMock<MockDownloadFile>; | 490 mock_download_file = new NiceMock<MockDownloadFile>; |
| 490 download_file.reset(mock_download_file); | 491 download_file.reset(mock_download_file); |
| 491 mock_request_handle = new NiceMock<MockRequestHandle>; | 492 mock_request_handle = new NiceMock<MockRequestHandle>; |
| 492 request_handle.reset(mock_request_handle); | 493 request_handle.reset(mock_request_handle); |
| 493 | 494 |
| 495 ON_CALL(*mock_download_file, FullPath()) |
| 496 .WillByDefault(Return(base::FilePath())); |
| 497 |
| 494 // It's too complicated to set up a WebContents instance that would cause | 498 // It's too complicated to set up a WebContents instance that would cause |
| 495 // the MockDownloadItemDelegate's ResumeInterruptedDownload() function | 499 // the MockDownloadItemDelegate's ResumeInterruptedDownload() function |
| 496 // to be callled, so we simply verify that GetWebContents() is called. | 500 // to be callled, so we simply verify that GetWebContents() is called. |
| 497 if (i < (DownloadItemImpl::kMaxAutoResumeAttempts - 1)) { | 501 if (i < (DownloadItemImpl::kMaxAutoResumeAttempts - 1)) { |
| 498 EXPECT_CALL(*mock_request_handle, GetWebContents()) | 502 EXPECT_CALL(*mock_request_handle, GetWebContents()) |
| 499 .WillOnce(Return(static_cast<WebContents*>(NULL))); | 503 .WillOnce(Return(static_cast<WebContents*>(NULL))); |
| 500 } | 504 } |
| 501 | 505 |
| 502 // Copied key parts of DoIntermediateRename & AddDownloadFileToDownloadItem | 506 // Copied key parts of DoIntermediateRename & AddDownloadFileToDownloadItem |
| 503 // to allow for holding onto the request handle. | 507 // to allow for holding onto the request handle. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 // Setting to unsafe url or unsafe file should trigger a notification. | 557 // Setting to unsafe url or unsafe file should trigger a notification. |
| 554 DownloadItemImpl* unsafeurl_item = | 558 DownloadItemImpl* unsafeurl_item = |
| 555 CreateDownloadItem(); | 559 CreateDownloadItem(); |
| 556 MockObserver unsafeurl_observer(unsafeurl_item); | 560 MockObserver unsafeurl_observer(unsafeurl_item); |
| 557 | 561 |
| 558 unsafeurl_item->OnAllDataSaved(std::string()); | 562 unsafeurl_item->OnAllDataSaved(std::string()); |
| 559 EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); | 563 EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); |
| 560 unsafeurl_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_URL); | 564 unsafeurl_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_URL); |
| 561 EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); | 565 EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); |
| 562 | 566 |
| 563 unsafeurl_item->DangerousDownloadValidated(); | 567 unsafeurl_item->ValidateDangerousDownload(); |
| 564 EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); | 568 EXPECT_TRUE(unsafeurl_observer.CheckUpdated()); |
| 565 | 569 |
| 566 DownloadItemImpl* unsafefile_item = | 570 DownloadItemImpl* unsafefile_item = |
| 567 CreateDownloadItem(); | 571 CreateDownloadItem(); |
| 568 MockObserver unsafefile_observer(unsafefile_item); | 572 MockObserver unsafefile_observer(unsafefile_item); |
| 569 | 573 |
| 570 unsafefile_item->OnAllDataSaved(std::string()); | 574 unsafefile_item->OnAllDataSaved(std::string()); |
| 571 EXPECT_TRUE(unsafefile_observer.CheckUpdated()); | 575 EXPECT_TRUE(unsafefile_observer.CheckUpdated()); |
| 572 unsafefile_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 576 unsafefile_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 573 EXPECT_TRUE(unsafefile_observer.CheckUpdated()); | 577 EXPECT_TRUE(unsafefile_observer.CheckUpdated()); |
| 574 | 578 |
| 575 unsafefile_item->DangerousDownloadValidated(); | 579 unsafefile_item->ValidateDangerousDownload(); |
| 576 EXPECT_TRUE(unsafefile_observer.CheckUpdated()); | 580 EXPECT_TRUE(unsafefile_observer.CheckUpdated()); |
| 577 } | 581 } |
| 578 | 582 |
| 579 // DownloadItemImpl::OnDownloadTargetDetermined will schedule a task to run | 583 // DownloadItemImpl::OnDownloadTargetDetermined will schedule a task to run |
| 580 // DownloadFile::Rename(). Once the rename | 584 // DownloadFile::Rename(). Once the rename |
| 581 // completes, DownloadItemImpl receives a notification with the new file | 585 // completes, DownloadItemImpl receives a notification with the new file |
| 582 // name. Check that observers are updated when the new filename is available and | 586 // name. Check that observers are updated when the new filename is available and |
| 583 // not before. | 587 // not before. |
| 584 TEST_F(DownloadItemTest, NotificationAfterOnDownloadTargetDetermined) { | 588 TEST_F(DownloadItemTest, NotificationAfterOnDownloadTargetDetermined) { |
| 585 DownloadItemImpl* item = CreateDownloadItem(); | 589 DownloadItemImpl* item = CreateDownloadItem(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 RunAllPendingInMessageLoops(); | 693 RunAllPendingInMessageLoops(); |
| 690 // All the callbacks should have happened by now. | 694 // All the callbacks should have happened by now. |
| 691 ::testing::Mock::VerifyAndClearExpectations(download_file); | 695 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 692 mock_delegate()->VerifyAndClearExpectations(); | 696 mock_delegate()->VerifyAndClearExpectations(); |
| 693 | 697 |
| 694 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 698 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 695 .WillOnce(Return(true)); | 699 .WillOnce(Return(true)); |
| 696 EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _)) | 700 EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _)) |
| 697 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 701 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 698 final_path)); | 702 final_path)); |
| 703 EXPECT_CALL(*download_file, FullPath()) |
| 704 .WillOnce(Return(base::FilePath())); |
| 699 EXPECT_CALL(*download_file, Detach()); | 705 EXPECT_CALL(*download_file, Detach()); |
| 700 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 706 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
| 701 RunAllPendingInMessageLoops(); | 707 RunAllPendingInMessageLoops(); |
| 702 ::testing::Mock::VerifyAndClearExpectations(download_file); | 708 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 703 mock_delegate()->VerifyAndClearExpectations(); | 709 mock_delegate()->VerifyAndClearExpectations(); |
| 704 } | 710 } |
| 705 | 711 |
| 706 // Test that the delegate is invoked after the download file is renamed and the | 712 // Test that the delegate is invoked after the download file is renamed and the |
| 707 // download item is in an interrupted state. | 713 // download item is in an interrupted state. |
| 708 TEST_F(DownloadItemTest, CallbackAfterInterruptedRename) { | 714 TEST_F(DownloadItemTest, CallbackAfterInterruptedRename) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 723 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 729 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
| 724 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 730 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
| 725 RunAllPendingInMessageLoops(); | 731 RunAllPendingInMessageLoops(); |
| 726 // All the callbacks should have happened by now. | 732 // All the callbacks should have happened by now. |
| 727 ::testing::Mock::VerifyAndClearExpectations(download_file); | 733 ::testing::Mock::VerifyAndClearExpectations(download_file); |
| 728 mock_delegate()->VerifyAndClearExpectations(); | 734 mock_delegate()->VerifyAndClearExpectations(); |
| 729 } | 735 } |
| 730 | 736 |
| 731 TEST_F(DownloadItemTest, Interrupted) { | 737 TEST_F(DownloadItemTest, Interrupted) { |
| 732 DownloadItemImpl* item = CreateDownloadItem(); | 738 DownloadItemImpl* item = CreateDownloadItem(); |
| 733 MockDownloadFile* download_file = DoIntermediateRename(item); | 739 MockDownloadFile* download_file = |
| 740 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 734 | 741 |
| 735 const DownloadInterruptReason reason( | 742 const DownloadInterruptReason reason( |
| 736 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); | 743 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
| 737 | 744 |
| 738 // Confirm interrupt sets state properly. | 745 // Confirm interrupt sets state properly. |
| 739 EXPECT_CALL(*download_file, Cancel()); | 746 EXPECT_CALL(*download_file, Cancel()); |
| 740 item->DestinationObserverAsWeakPtr()->DestinationError(reason); | 747 item->DestinationObserverAsWeakPtr()->DestinationError(reason); |
| 741 RunAllPendingInMessageLoops(); | 748 RunAllPendingInMessageLoops(); |
| 742 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 749 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 743 EXPECT_EQ(reason, item->GetLastReason()); | 750 EXPECT_EQ(reason, item->GetLastReason()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 as_observer->DestinationUpdate(200, 20, "livebeef"); | 829 as_observer->DestinationUpdate(200, 20, "livebeef"); |
| 823 EXPECT_EQ(20l, item->CurrentSpeed()); | 830 EXPECT_EQ(20l, item->CurrentSpeed()); |
| 824 EXPECT_EQ("livebeef", item->GetHashState()); | 831 EXPECT_EQ("livebeef", item->GetHashState()); |
| 825 EXPECT_EQ(200l, item->GetReceivedBytes()); | 832 EXPECT_EQ(200l, item->GetReceivedBytes()); |
| 826 EXPECT_EQ(0l, item->GetTotalBytes()); | 833 EXPECT_EQ(0l, item->GetTotalBytes()); |
| 827 EXPECT_TRUE(observer.CheckUpdated()); | 834 EXPECT_TRUE(observer.CheckUpdated()); |
| 828 } | 835 } |
| 829 | 836 |
| 830 TEST_F(DownloadItemTest, DestinationError) { | 837 TEST_F(DownloadItemTest, DestinationError) { |
| 831 DownloadItemImpl* item = CreateDownloadItem(); | 838 DownloadItemImpl* item = CreateDownloadItem(); |
| 832 MockDownloadFile* download_file = DoIntermediateRename(item); | 839 MockDownloadFile* download_file = |
| 840 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 833 base::WeakPtr<DownloadDestinationObserver> as_observer( | 841 base::WeakPtr<DownloadDestinationObserver> as_observer( |
| 834 item->DestinationObserverAsWeakPtr()); | 842 item->DestinationObserverAsWeakPtr()); |
| 835 MockObserver observer(item); | 843 MockObserver observer(item); |
| 836 | 844 |
| 837 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 845 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 838 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); | 846 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); |
| 839 EXPECT_FALSE(observer.CheckUpdated()); | 847 EXPECT_FALSE(observer.CheckUpdated()); |
| 840 | 848 |
| 841 EXPECT_CALL(*download_file, Cancel()); | 849 EXPECT_CALL(*download_file, Cancel()); |
| 842 as_observer->DestinationError( | 850 as_observer->DestinationError( |
| (...skipping 29 matching lines...) Expand all Loading... |
| 872 mock_delegate()->VerifyAndClearExpectations(); | 880 mock_delegate()->VerifyAndClearExpectations(); |
| 873 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 881 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 874 EXPECT_TRUE(observer.CheckUpdated()); | 882 EXPECT_TRUE(observer.CheckUpdated()); |
| 875 EXPECT_EQ("livebeef", item->GetHash()); | 883 EXPECT_EQ("livebeef", item->GetHash()); |
| 876 EXPECT_EQ("", item->GetHashState()); | 884 EXPECT_EQ("", item->GetHashState()); |
| 877 EXPECT_TRUE(item->AllDataSaved()); | 885 EXPECT_TRUE(item->AllDataSaved()); |
| 878 } | 886 } |
| 879 | 887 |
| 880 TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { | 888 TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { |
| 881 DownloadItemImpl* item = CreateDownloadItem(); | 889 DownloadItemImpl* item = CreateDownloadItem(); |
| 882 MockDownloadFile* download_file = DoIntermediateRename(item); | 890 MockDownloadFile* download_file = |
| 891 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 883 | 892 |
| 884 // InProgress | 893 // InProgress |
| 885 ASSERT_TRUE(item->IsInProgress()); | 894 ASSERT_TRUE(item->IsInProgress()); |
| 886 ASSERT_FALSE(item->GetTargetFilePath().empty()); | 895 ASSERT_FALSE(item->GetTargetFilePath().empty()); |
| 887 EXPECT_TRUE(item->CanShowInFolder()); | 896 EXPECT_TRUE(item->CanShowInFolder()); |
| 888 EXPECT_TRUE(item->CanOpenDownload()); | 897 EXPECT_TRUE(item->CanOpenDownload()); |
| 889 | 898 |
| 890 // Complete | 899 // Complete |
| 891 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) | 900 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) |
| 892 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 901 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 893 base::FilePath(kDummyPath))); | 902 base::FilePath(kDummyPath))); |
| 894 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 903 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 895 .WillOnce(Return(true)); | 904 .WillOnce(Return(true)); |
| 905 EXPECT_CALL(*download_file, FullPath()) |
| 906 .WillOnce(Return(base::FilePath())); |
| 896 EXPECT_CALL(*download_file, Detach()); | 907 EXPECT_CALL(*download_file, Detach()); |
| 897 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 908 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
| 898 RunAllPendingInMessageLoops(); | 909 RunAllPendingInMessageLoops(); |
| 899 | 910 |
| 900 ASSERT_TRUE(item->IsComplete()); | 911 ASSERT_TRUE(item->IsComplete()); |
| 901 EXPECT_TRUE(item->CanShowInFolder()); | 912 EXPECT_TRUE(item->CanShowInFolder()); |
| 902 EXPECT_TRUE(item->CanOpenDownload()); | 913 EXPECT_TRUE(item->CanOpenDownload()); |
| 903 } | 914 } |
| 904 | 915 |
| 905 TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { | 916 TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { |
| 906 DownloadItemImpl* item = CreateDownloadItem(); | 917 DownloadItemImpl* item = CreateDownloadItem(); |
| 907 MockDownloadFile* download_file = DoIntermediateRename(item); | 918 MockDownloadFile* download_file = |
| 919 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 908 item->SetIsTemporary(true); | 920 item->SetIsTemporary(true); |
| 909 | 921 |
| 910 // InProgress Temporary | 922 // InProgress Temporary |
| 911 ASSERT_TRUE(item->IsInProgress()); | 923 ASSERT_TRUE(item->IsInProgress()); |
| 912 ASSERT_FALSE(item->GetTargetFilePath().empty()); | 924 ASSERT_FALSE(item->GetTargetFilePath().empty()); |
| 913 ASSERT_TRUE(item->IsTemporary()); | 925 ASSERT_TRUE(item->IsTemporary()); |
| 914 EXPECT_FALSE(item->CanShowInFolder()); | 926 EXPECT_FALSE(item->CanShowInFolder()); |
| 915 EXPECT_FALSE(item->CanOpenDownload()); | 927 EXPECT_FALSE(item->CanOpenDownload()); |
| 916 | 928 |
| 917 // Complete Temporary | 929 // Complete Temporary |
| 918 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 930 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 919 .WillOnce(Return(true)); | 931 .WillOnce(Return(true)); |
| 920 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) | 932 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) |
| 921 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 933 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 922 base::FilePath(kDummyPath))); | 934 base::FilePath(kDummyPath))); |
| 935 EXPECT_CALL(*download_file, FullPath()) |
| 936 .WillOnce(Return(base::FilePath())); |
| 923 EXPECT_CALL(*download_file, Detach()); | 937 EXPECT_CALL(*download_file, Detach()); |
| 924 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 938 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
| 925 RunAllPendingInMessageLoops(); | 939 RunAllPendingInMessageLoops(); |
| 926 | 940 |
| 927 ASSERT_TRUE(item->IsComplete()); | 941 ASSERT_TRUE(item->IsComplete()); |
| 928 EXPECT_FALSE(item->CanShowInFolder()); | 942 EXPECT_FALSE(item->CanShowInFolder()); |
| 929 EXPECT_FALSE(item->CanOpenDownload()); | 943 EXPECT_FALSE(item->CanOpenDownload()); |
| 930 } | 944 } |
| 931 | 945 |
| 932 TEST_F(DownloadItemTest, EnabledActionsForInterruptedDownload) { | 946 TEST_F(DownloadItemTest, EnabledActionsForInterruptedDownload) { |
| 933 DownloadItemImpl* item = CreateDownloadItem(); | 947 DownloadItemImpl* item = CreateDownloadItem(); |
| 934 MockDownloadFile* download_file = DoIntermediateRename(item); | 948 MockDownloadFile* download_file = |
| 949 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 935 | 950 |
| 936 EXPECT_CALL(*download_file, Cancel()); | 951 EXPECT_CALL(*download_file, Cancel()); |
| 937 item->DestinationObserverAsWeakPtr()->DestinationError( | 952 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 938 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 953 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
| 939 RunAllPendingInMessageLoops(); | 954 RunAllPendingInMessageLoops(); |
| 940 | 955 |
| 941 ASSERT_TRUE(item->IsInterrupted()); | 956 ASSERT_TRUE(item->IsInterrupted()); |
| 942 ASSERT_FALSE(item->GetTargetFilePath().empty()); | 957 ASSERT_FALSE(item->GetTargetFilePath().empty()); |
| 943 EXPECT_FALSE(item->CanShowInFolder()); | 958 EXPECT_FALSE(item->CanShowInFolder()); |
| 944 EXPECT_FALSE(item->CanOpenDownload()); | 959 EXPECT_FALSE(item->CanOpenDownload()); |
| 945 } | 960 } |
| 946 | 961 |
| 947 TEST_F(DownloadItemTest, EnabledActionsForCancelledDownload) { | 962 TEST_F(DownloadItemTest, EnabledActionsForCancelledDownload) { |
| 948 DownloadItemImpl* item = CreateDownloadItem(); | 963 DownloadItemImpl* item = CreateDownloadItem(); |
| 949 MockDownloadFile* download_file = DoIntermediateRename(item); | 964 MockDownloadFile* download_file = |
| 965 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 950 | 966 |
| 951 EXPECT_CALL(*download_file, Cancel()); | 967 EXPECT_CALL(*download_file, Cancel()); |
| 952 item->Cancel(true); | 968 item->Cancel(true); |
| 953 RunAllPendingInMessageLoops(); | 969 RunAllPendingInMessageLoops(); |
| 954 | 970 |
| 955 ASSERT_TRUE(item->IsCancelled()); | 971 ASSERT_TRUE(item->IsCancelled()); |
| 956 EXPECT_FALSE(item->CanShowInFolder()); | 972 EXPECT_FALSE(item->CanShowInFolder()); |
| 957 EXPECT_FALSE(item->CanOpenDownload()); | 973 EXPECT_FALSE(item->CanOpenDownload()); |
| 958 } | 974 } |
| 959 | 975 |
| 960 // Test various aspects of the delegate completion blocker. | 976 // Test various aspects of the delegate completion blocker. |
| 961 | 977 |
| 962 // Just allowing completion. | 978 // Just allowing completion. |
| 963 TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) { | 979 TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) { |
| 964 // Test to confirm that if we have a callback that returns true, | 980 // Test to confirm that if we have a callback that returns true, |
| 965 // we complete immediately. | 981 // we complete immediately. |
| 966 DownloadItemImpl* item = CreateDownloadItem(); | 982 DownloadItemImpl* item = CreateDownloadItem(); |
| 967 MockDownloadFile* download_file = DoIntermediateRename(item); | 983 MockDownloadFile* download_file = |
| 984 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 968 | 985 |
| 969 // Drive the delegate interaction. | 986 // Drive the delegate interaction. |
| 970 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 987 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 971 .WillOnce(Return(true)); | 988 .WillOnce(Return(true)); |
| 972 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 989 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
| 973 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 990 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 974 EXPECT_FALSE(item->IsDangerous()); | 991 EXPECT_FALSE(item->IsDangerous()); |
| 975 | 992 |
| 976 // Make sure the download can complete. | 993 // Make sure the download can complete. |
| 977 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) | 994 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) |
| 978 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 995 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 979 base::FilePath(kDummyPath))); | 996 base::FilePath(kDummyPath))); |
| 980 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 997 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
| 981 .WillOnce(Return(true)); | 998 .WillOnce(Return(true)); |
| 999 EXPECT_CALL(*download_file, FullPath()) |
| 1000 .WillOnce(Return(base::FilePath())); |
| 982 EXPECT_CALL(*download_file, Detach()); | 1001 EXPECT_CALL(*download_file, Detach()); |
| 983 RunAllPendingInMessageLoops(); | 1002 RunAllPendingInMessageLoops(); |
| 984 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1003 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
| 985 } | 1004 } |
| 986 | 1005 |
| 987 // Just delaying completion. | 1006 // Just delaying completion. |
| 988 TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) { | 1007 TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) { |
| 989 // Test to confirm that if we have a callback that returns true, | 1008 // Test to confirm that if we have a callback that returns true, |
| 990 // we complete immediately. | 1009 // we complete immediately. |
| 991 DownloadItemImpl* item = CreateDownloadItem(); | 1010 DownloadItemImpl* item = CreateDownloadItem(); |
| 992 MockDownloadFile* download_file = DoIntermediateRename(item); | 1011 MockDownloadFile* download_file = |
| 1012 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 993 | 1013 |
| 994 // Drive the delegate interaction. | 1014 // Drive the delegate interaction. |
| 995 base::Closure delegate_callback; | 1015 base::Closure delegate_callback; |
| 996 base::Closure copy_delegate_callback; | 1016 base::Closure copy_delegate_callback; |
| 997 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1017 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 998 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1018 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
| 999 Return(false))) | 1019 Return(false))) |
| 1000 .WillOnce(Return(true)); | 1020 .WillOnce(Return(true)); |
| 1001 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1021 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
| 1002 ASSERT_FALSE(delegate_callback.is_null()); | 1022 ASSERT_FALSE(delegate_callback.is_null()); |
| 1003 copy_delegate_callback = delegate_callback; | 1023 copy_delegate_callback = delegate_callback; |
| 1004 delegate_callback.Reset(); | 1024 delegate_callback.Reset(); |
| 1005 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1025 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1006 copy_delegate_callback.Run(); | 1026 copy_delegate_callback.Run(); |
| 1007 ASSERT_TRUE(delegate_callback.is_null()); | 1027 ASSERT_TRUE(delegate_callback.is_null()); |
| 1008 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1028 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1009 EXPECT_FALSE(item->IsDangerous()); | 1029 EXPECT_FALSE(item->IsDangerous()); |
| 1010 | 1030 |
| 1011 // Make sure the download can complete. | 1031 // Make sure the download can complete. |
| 1012 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) | 1032 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) |
| 1013 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1033 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 1014 base::FilePath(kDummyPath))); | 1034 base::FilePath(kDummyPath))); |
| 1015 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1035 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
| 1016 .WillOnce(Return(true)); | 1036 .WillOnce(Return(true)); |
| 1037 EXPECT_CALL(*download_file, FullPath()) |
| 1038 .WillOnce(Return(base::FilePath())); |
| 1017 EXPECT_CALL(*download_file, Detach()); | 1039 EXPECT_CALL(*download_file, Detach()); |
| 1018 RunAllPendingInMessageLoops(); | 1040 RunAllPendingInMessageLoops(); |
| 1019 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1041 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
| 1020 } | 1042 } |
| 1021 | 1043 |
| 1022 // Delay and set danger. | 1044 // Delay and set danger. |
| 1023 TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) { | 1045 TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) { |
| 1024 // Test to confirm that if we have a callback that returns true, | 1046 // Test to confirm that if we have a callback that returns true, |
| 1025 // we complete immediately. | 1047 // we complete immediately. |
| 1026 DownloadItemImpl* item = CreateDownloadItem(); | 1048 DownloadItemImpl* item = CreateDownloadItem(); |
| 1027 MockDownloadFile* download_file = DoIntermediateRename(item); | 1049 MockDownloadFile* download_file = |
| 1050 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 1028 | 1051 |
| 1029 // Drive the delegate interaction. | 1052 // Drive the delegate interaction. |
| 1030 base::Closure delegate_callback; | 1053 base::Closure delegate_callback; |
| 1031 base::Closure copy_delegate_callback; | 1054 base::Closure copy_delegate_callback; |
| 1032 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1055 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 1033 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1056 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
| 1034 Return(false))) | 1057 Return(false))) |
| 1035 .WillOnce(Return(true)); | 1058 .WillOnce(Return(true)); |
| 1036 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1059 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); |
| 1037 ASSERT_FALSE(delegate_callback.is_null()); | 1060 ASSERT_FALSE(delegate_callback.is_null()); |
| 1038 copy_delegate_callback = delegate_callback; | 1061 copy_delegate_callback = delegate_callback; |
| 1039 delegate_callback.Reset(); | 1062 delegate_callback.Reset(); |
| 1040 EXPECT_FALSE(item->IsDangerous()); | 1063 EXPECT_FALSE(item->IsDangerous()); |
| 1041 item->OnContentCheckCompleted( | 1064 item->OnContentCheckCompleted( |
| 1042 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1065 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 1043 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1066 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1044 copy_delegate_callback.Run(); | 1067 copy_delegate_callback.Run(); |
| 1045 ASSERT_TRUE(delegate_callback.is_null()); | 1068 ASSERT_TRUE(delegate_callback.is_null()); |
| 1046 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1069 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1047 EXPECT_TRUE(item->IsDangerous()); | 1070 EXPECT_TRUE(item->IsDangerous()); |
| 1048 | 1071 |
| 1049 // Make sure the download doesn't complete until we've validated it. | 1072 // Make sure the download doesn't complete until we've validated it. |
| 1050 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) | 1073 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) |
| 1051 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1074 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 1052 base::FilePath(kDummyPath))); | 1075 base::FilePath(kDummyPath))); |
| 1053 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1076 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
| 1054 .WillOnce(Return(true)); | 1077 .WillOnce(Return(true)); |
| 1078 EXPECT_CALL(*download_file, FullPath()) |
| 1079 .WillOnce(Return(base::FilePath())); |
| 1055 EXPECT_CALL(*download_file, Detach()); | 1080 EXPECT_CALL(*download_file, Detach()); |
| 1056 RunAllPendingInMessageLoops(); | 1081 RunAllPendingInMessageLoops(); |
| 1057 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1082 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1058 EXPECT_TRUE(item->IsDangerous()); | 1083 EXPECT_TRUE(item->IsDangerous()); |
| 1059 | 1084 |
| 1060 item->DangerousDownloadValidated(); | 1085 item->ValidateDangerousDownload(); |
| 1061 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_USER_VALIDATED, item->GetDangerType()); | 1086 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_USER_VALIDATED, item->GetDangerType()); |
| 1062 RunAllPendingInMessageLoops(); | 1087 RunAllPendingInMessageLoops(); |
| 1063 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1088 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
| 1064 } | 1089 } |
| 1065 | 1090 |
| 1066 // Just delaying completion twice. | 1091 // Just delaying completion twice. |
| 1067 TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) { | 1092 TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) { |
| 1068 // Test to confirm that if we have a callback that returns true, | 1093 // Test to confirm that if we have a callback that returns true, |
| 1069 // we complete immediately. | 1094 // we complete immediately. |
| 1070 DownloadItemImpl* item = CreateDownloadItem(); | 1095 DownloadItemImpl* item = CreateDownloadItem(); |
| 1071 MockDownloadFile* download_file = DoIntermediateRename(item); | 1096 MockDownloadFile* download_file = |
| 1097 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 1072 | 1098 |
| 1073 // Drive the delegate interaction. | 1099 // Drive the delegate interaction. |
| 1074 base::Closure delegate_callback; | 1100 base::Closure delegate_callback; |
| 1075 base::Closure copy_delegate_callback; | 1101 base::Closure copy_delegate_callback; |
| 1076 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1102 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
| 1077 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1103 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
| 1078 Return(false))) | 1104 Return(false))) |
| 1079 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1105 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
| 1080 Return(false))) | 1106 Return(false))) |
| 1081 .WillOnce(Return(true)); | 1107 .WillOnce(Return(true)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1093 ASSERT_TRUE(delegate_callback.is_null()); | 1119 ASSERT_TRUE(delegate_callback.is_null()); |
| 1094 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1120 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1095 EXPECT_FALSE(item->IsDangerous()); | 1121 EXPECT_FALSE(item->IsDangerous()); |
| 1096 | 1122 |
| 1097 // Make sure the download can complete. | 1123 // Make sure the download can complete. |
| 1098 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) | 1124 EXPECT_CALL(*download_file, RenameAndAnnotate(base::FilePath(kDummyPath), _)) |
| 1099 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1125 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, |
| 1100 base::FilePath(kDummyPath))); | 1126 base::FilePath(kDummyPath))); |
| 1101 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1127 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
| 1102 .WillOnce(Return(true)); | 1128 .WillOnce(Return(true)); |
| 1129 EXPECT_CALL(*download_file, FullPath()) |
| 1130 .WillOnce(Return(base::FilePath())); |
| 1103 EXPECT_CALL(*download_file, Detach()); | 1131 EXPECT_CALL(*download_file, Detach()); |
| 1104 RunAllPendingInMessageLoops(); | 1132 RunAllPendingInMessageLoops(); |
| 1105 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1133 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
| 1106 } | 1134 } |
| 1107 | 1135 |
| 1136 TEST_F(DownloadItemTest, StealDangerousDownload) { |
| 1137 DownloadItemImpl* item = CreateDownloadItem(); |
| 1138 MockDownloadFile* download_file = |
| 1139 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 1140 ASSERT_TRUE(item->IsDangerous()); |
| 1141 base::FilePath full_path(FILE_PATH_LITERAL("foo.txt")); |
| 1142 base::FilePath returned_path; |
| 1143 |
| 1144 EXPECT_CALL(*download_file, FullPath()) |
| 1145 .WillOnce(Return(full_path)); |
| 1146 EXPECT_CALL(*download_file, Detach()); |
| 1147 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
| 1148 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
| 1149 item->StealDangerousDownload( |
| 1150 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
| 1151 weak_ptr_factory.GetWeakPtr(), |
| 1152 base::Unretained(&returned_path))); |
| 1153 RunAllPendingInMessageLoops(); |
| 1154 EXPECT_EQ(full_path, returned_path); |
| 1155 } |
| 1156 |
| 1157 TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { |
| 1158 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 1159 switches::kEnableDownloadResumption); |
| 1160 base::FilePath returned_path; |
| 1161 DownloadItemImpl* item = CreateDownloadItem(); |
| 1162 MockDownloadFile* download_file = |
| 1163 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 1164 base::FilePath full_path = item->GetFullPath(); |
| 1165 EXPECT_FALSE(full_path.empty()); |
| 1166 EXPECT_CALL(*download_file, FullPath()) |
| 1167 .WillOnce(Return(full_path)); |
| 1168 EXPECT_CALL(*download_file, Detach()); |
| 1169 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 1170 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); |
| 1171 ASSERT_TRUE(item->IsDangerous()); |
| 1172 |
| 1173 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
| 1174 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
| 1175 item->StealDangerousDownload( |
| 1176 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
| 1177 weak_ptr_factory.GetWeakPtr(), |
| 1178 base::Unretained(&returned_path))); |
| 1179 RunAllPendingInMessageLoops(); |
| 1180 EXPECT_EQ(full_path, returned_path); |
| 1181 } |
| 1182 |
| 1183 TEST_F(DownloadItemTest, StealInterruptedNonResumableDangerousDownload) { |
| 1184 CommandLine::ForCurrentProcess()->AppendSwitch( |
| 1185 switches::kEnableDownloadResumption); |
| 1186 base::FilePath returned_path; |
| 1187 DownloadItemImpl* item = CreateDownloadItem(); |
| 1188 MockDownloadFile* download_file = |
| 1189 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
| 1190 EXPECT_CALL(*download_file, Cancel()); |
| 1191 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 1192 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); |
| 1193 ASSERT_TRUE(item->IsDangerous()); |
| 1194 |
| 1195 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
| 1196 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
| 1197 item->StealDangerousDownload( |
| 1198 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
| 1199 weak_ptr_factory.GetWeakPtr(), |
| 1200 base::Unretained(&returned_path))); |
| 1201 RunAllPendingInMessageLoops(); |
| 1202 EXPECT_TRUE(returned_path.empty()); |
| 1203 } |
| 1204 |
| 1108 TEST(MockDownloadItem, Compiles) { | 1205 TEST(MockDownloadItem, Compiles) { |
| 1109 MockDownloadItem mock_item; | 1206 MockDownloadItem mock_item; |
| 1110 } | 1207 } |
| 1111 | 1208 |
| 1112 } // namespace content | 1209 } // namespace content |
| OLD | NEW |