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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 void FinishStream(DownloadInterruptReason interrupt_reason, | 279 void FinishStream(DownloadInterruptReason interrupt_reason, |
280 bool check_observer, | 280 bool check_observer, |
281 const std::string& expected_hash) { | 281 const std::string& expected_hash) { |
282 ::testing::Sequence s1; | 282 ::testing::Sequence s1; |
283 SetupFinishStream(interrupt_reason, s1); | 283 SetupFinishStream(interrupt_reason, s1); |
284 sink_callback_.Run(); | 284 sink_callback_.Run(); |
285 VerifyStreamAndSize(); | 285 VerifyStreamAndSize(); |
286 if (check_observer) { | 286 if (check_observer) { |
287 EXPECT_CALL(*(observer_.get()), | 287 EXPECT_CALL(*(observer_.get()), |
288 MockDestinationCompleted(_, expected_hash)); | 288 MockDestinationCompleted(_, expected_hash)); |
289 loop_.RunUntilIdle(); | 289 base::RunLoop().RunUntilIdle(); |
290 ::testing::Mock::VerifyAndClearExpectations(observer_.get()); | 290 ::testing::Mock::VerifyAndClearExpectations(observer_.get()); |
291 EXPECT_CALL(*(observer_.get()), DestinationUpdate(_, _)) | 291 EXPECT_CALL(*(observer_.get()), DestinationUpdate(_, _)) |
292 .Times(AnyNumber()) | 292 .Times(AnyNumber()) |
293 .WillRepeatedly( | 293 .WillRepeatedly( |
294 Invoke(this, &DownloadFileTest::SetUpdateDownloadInfo)); | 294 Invoke(this, &DownloadFileTest::SetUpdateDownloadInfo)); |
295 } | 295 } |
296 } | 296 } |
297 | 297 |
298 DownloadInterruptReason RenameAndUniquify( | 298 DownloadInterruptReason RenameAndUniquify( |
299 const base::FilePath& full_path, | 299 const base::FilePath& full_path, |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 InvokeSelectedRenameMethod(path_3, &output_path)); | 481 InvokeSelectedRenameMethod(path_3, &output_path)); |
482 renamed_path = download_file_->FullPath(); | 482 renamed_path = download_file_->FullPath(); |
483 EXPECT_EQ(path_3, renamed_path); | 483 EXPECT_EQ(path_3, renamed_path); |
484 EXPECT_EQ(path_3, output_path); | 484 EXPECT_EQ(path_3, output_path); |
485 | 485 |
486 // Check the files. | 486 // Check the files. |
487 EXPECT_FALSE(base::PathExists(path_2)); | 487 EXPECT_FALSE(base::PathExists(path_2)); |
488 EXPECT_TRUE(base::PathExists(path_3)); | 488 EXPECT_TRUE(base::PathExists(path_3)); |
489 | 489 |
490 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kDataHash); | 490 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kDataHash); |
491 loop_.RunUntilIdle(); | 491 base::RunLoop().RunUntilIdle(); |
492 | 492 |
493 // Rename the file after downloading all the data and closing the file. | 493 // Rename the file after downloading all the data and closing the file. |
494 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, | 494 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
495 InvokeSelectedRenameMethod(path_4, &output_path)); | 495 InvokeSelectedRenameMethod(path_4, &output_path)); |
496 renamed_path = download_file_->FullPath(); | 496 renamed_path = download_file_->FullPath(); |
497 EXPECT_EQ(path_4, renamed_path); | 497 EXPECT_EQ(path_4, renamed_path); |
498 EXPECT_EQ(path_4, output_path); | 498 EXPECT_EQ(path_4, output_path); |
499 | 499 |
500 // Check the files. | 500 // Check the files. |
501 EXPECT_FALSE(base::PathExists(path_3)); | 501 EXPECT_FALSE(base::PathExists(path_3)); |
(...skipping 20 matching lines...) Expand all Loading... |
522 base::FilePath new_path; | 522 base::FilePath new_path; |
523 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, | 523 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
524 RenameAndAnnotate(path_1, &new_path)); | 524 RenameAndAnnotate(path_1, &new_path)); |
525 EXPECT_EQ(path_1.value(), new_path.value()); | 525 EXPECT_EQ(path_1.value(), new_path.value()); |
526 | 526 |
527 std::string file_contents; | 527 std::string file_contents; |
528 ASSERT_TRUE(base::ReadFileToString(new_path, &file_contents)); | 528 ASSERT_TRUE(base::ReadFileToString(new_path, &file_contents)); |
529 EXPECT_NE(std::string(file_data), file_contents); | 529 EXPECT_NE(std::string(file_data), file_contents); |
530 | 530 |
531 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); | 531 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); |
532 loop_.RunUntilIdle(); | 532 base::RunLoop().RunUntilIdle(); |
533 DestroyDownloadFile(0); | 533 DestroyDownloadFile(0); |
534 } | 534 } |
535 | 535 |
536 // Test to make sure the rename uniquifies if we aren't overwriting | 536 // Test to make sure the rename uniquifies if we aren't overwriting |
537 // and there's a file where we're aiming. As above, not a | 537 // and there's a file where we're aiming. As above, not a |
538 // DownloadFileTestWithRename test because this only applies to | 538 // DownloadFileTestWithRename test because this only applies to |
539 // RenameAndUniquify(). | 539 // RenameAndUniquify(). |
540 TEST_F(DownloadFileTest, RenameUniquifies) { | 540 TEST_F(DownloadFileTest, RenameUniquifies) { |
541 ASSERT_TRUE(CreateDownloadFile(0, true)); | 541 ASSERT_TRUE(CreateDownloadFile(0, true)); |
542 base::FilePath initial_path(download_file_->FullPath()); | 542 base::FilePath initial_path(download_file_->FullPath()); |
543 EXPECT_TRUE(base::PathExists(initial_path)); | 543 EXPECT_TRUE(base::PathExists(initial_path)); |
544 base::FilePath path_1(initial_path.InsertBeforeExtensionASCII("_1")); | 544 base::FilePath path_1(initial_path.InsertBeforeExtensionASCII("_1")); |
545 base::FilePath path_1_suffixed(path_1.InsertBeforeExtensionASCII(" (1)")); | 545 base::FilePath path_1_suffixed(path_1.InsertBeforeExtensionASCII(" (1)")); |
546 | 546 |
547 ASSERT_FALSE(base::PathExists(path_1)); | 547 ASSERT_FALSE(base::PathExists(path_1)); |
548 static const char file_data[] = "xyzzy"; | 548 static const char file_data[] = "xyzzy"; |
549 ASSERT_EQ(static_cast<int>(sizeof(file_data)), | 549 ASSERT_EQ(static_cast<int>(sizeof(file_data)), |
550 base::WriteFile(path_1, file_data, sizeof(file_data))); | 550 base::WriteFile(path_1, file_data, sizeof(file_data))); |
551 ASSERT_TRUE(base::PathExists(path_1)); | 551 ASSERT_TRUE(base::PathExists(path_1)); |
552 | 552 |
553 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, RenameAndUniquify(path_1, NULL)); | 553 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, RenameAndUniquify(path_1, NULL)); |
554 EXPECT_TRUE(base::PathExists(path_1_suffixed)); | 554 EXPECT_TRUE(base::PathExists(path_1_suffixed)); |
555 | 555 |
556 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); | 556 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); |
557 loop_.RunUntilIdle(); | 557 base::RunLoop().RunUntilIdle(); |
558 DestroyDownloadFile(0); | 558 DestroyDownloadFile(0); |
559 } | 559 } |
560 | 560 |
561 // Test that RenameAndUniquify doesn't try to uniquify in the case where the | 561 // Test that RenameAndUniquify doesn't try to uniquify in the case where the |
562 // target filename is the same as the current filename. | 562 // target filename is the same as the current filename. |
563 TEST_F(DownloadFileTest, RenameRecognizesSelfConflict) { | 563 TEST_F(DownloadFileTest, RenameRecognizesSelfConflict) { |
564 ASSERT_TRUE(CreateDownloadFile(0, true)); | 564 ASSERT_TRUE(CreateDownloadFile(0, true)); |
565 base::FilePath initial_path(download_file_->FullPath()); | 565 base::FilePath initial_path(download_file_->FullPath()); |
566 EXPECT_TRUE(base::PathExists(initial_path)); | 566 EXPECT_TRUE(base::PathExists(initial_path)); |
567 | 567 |
568 base::FilePath new_path; | 568 base::FilePath new_path; |
569 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, | 569 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, |
570 RenameAndUniquify(initial_path, &new_path)); | 570 RenameAndUniquify(initial_path, &new_path)); |
571 EXPECT_TRUE(base::PathExists(initial_path)); | 571 EXPECT_TRUE(base::PathExists(initial_path)); |
572 | 572 |
573 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); | 573 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); |
574 loop_.RunUntilIdle(); | 574 base::RunLoop().RunUntilIdle(); |
575 DestroyDownloadFile(0); | 575 DestroyDownloadFile(0); |
576 EXPECT_EQ(initial_path.value(), new_path.value()); | 576 EXPECT_EQ(initial_path.value(), new_path.value()); |
577 } | 577 } |
578 | 578 |
579 // Test to make sure we get the proper error on failure. | 579 // Test to make sure we get the proper error on failure. |
580 TEST_P(DownloadFileTestWithRename, RenameError) { | 580 TEST_P(DownloadFileTestWithRename, RenameError) { |
581 ASSERT_TRUE(CreateDownloadFile(0, true)); | 581 ASSERT_TRUE(CreateDownloadFile(0, true)); |
582 base::FilePath initial_path(download_file_->FullPath()); | 582 base::FilePath initial_path(download_file_->FullPath()); |
583 | 583 |
584 // Create a subdirectory. | 584 // Create a subdirectory. |
(...skipping 14 matching lines...) Expand all Loading... |
599 base::FilePermissionRestorer restorer(target_dir); | 599 base::FilePermissionRestorer restorer(target_dir); |
600 ASSERT_TRUE(base::MakeFileUnwritable(target_dir)); | 600 ASSERT_TRUE(base::MakeFileUnwritable(target_dir)); |
601 | 601 |
602 // Expect nulling out of further processing. | 602 // Expect nulling out of further processing. |
603 EXPECT_CALL(*input_stream_, RegisterCallback(IsNullCallback())); | 603 EXPECT_CALL(*input_stream_, RegisterCallback(IsNullCallback())); |
604 ExpectPermissionError(InvokeSelectedRenameMethod(target_path, NULL)); | 604 ExpectPermissionError(InvokeSelectedRenameMethod(target_path, NULL)); |
605 EXPECT_FALSE(base::PathExists(target_path_suffixed)); | 605 EXPECT_FALSE(base::PathExists(target_path_suffixed)); |
606 } | 606 } |
607 | 607 |
608 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); | 608 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); |
609 loop_.RunUntilIdle(); | 609 base::RunLoop().RunUntilIdle(); |
610 DestroyDownloadFile(0); | 610 DestroyDownloadFile(0); |
611 } | 611 } |
612 | 612 |
613 namespace { | 613 namespace { |
614 | 614 |
615 void TestRenameCompletionCallback(const base::Closure& closure, | 615 void TestRenameCompletionCallback(const base::Closure& closure, |
616 bool* did_run_callback, | 616 bool* did_run_callback, |
617 DownloadInterruptReason interrupt_reason, | 617 DownloadInterruptReason interrupt_reason, |
618 const base::FilePath& new_path) { | 618 const base::FilePath& new_path) { |
619 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); | 619 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 FROM_HERE, second_failing_run.QuitClosure()); | 692 FROM_HERE, second_failing_run.QuitClosure()); |
693 second_failing_run.Run(); | 693 second_failing_run.Run(); |
694 EXPECT_FALSE(did_run_callback); | 694 EXPECT_FALSE(did_run_callback); |
695 } | 695 } |
696 | 696 |
697 // This time the QuitClosure from succeeding_run should get executed. | 697 // This time the QuitClosure from succeeding_run should get executed. |
698 succeeding_run.Run(); | 698 succeeding_run.Run(); |
699 EXPECT_TRUE(did_run_callback); | 699 EXPECT_TRUE(did_run_callback); |
700 | 700 |
701 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); | 701 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); |
702 loop_.RunUntilIdle(); | 702 base::RunLoop().RunUntilIdle(); |
703 DestroyDownloadFile(0); | 703 DestroyDownloadFile(0); |
704 } | 704 } |
705 | 705 |
706 // Various tests of the StreamActive method. | 706 // Various tests of the StreamActive method. |
707 TEST_F(DownloadFileTest, StreamEmptySuccess) { | 707 TEST_F(DownloadFileTest, StreamEmptySuccess) { |
708 ASSERT_TRUE(CreateDownloadFile(0, true)); | 708 ASSERT_TRUE(CreateDownloadFile(0, true)); |
709 base::FilePath initial_path(download_file_->FullPath()); | 709 base::FilePath initial_path(download_file_->FullPath()); |
710 EXPECT_TRUE(base::PathExists(initial_path)); | 710 EXPECT_TRUE(base::PathExists(initial_path)); |
711 | 711 |
712 // Test that calling the sink_callback_ on an empty stream shouldn't | 712 // Test that calling the sink_callback_ on an empty stream shouldn't |
713 // do anything. | 713 // do anything. |
714 AppendDataToFile(NULL, 0); | 714 AppendDataToFile(NULL, 0); |
715 | 715 |
716 // Finish the download this way and make sure we see it on the observer. | 716 // Finish the download this way and make sure we see it on the observer. |
717 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); | 717 FinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, true, kEmptyHash); |
718 loop_.RunUntilIdle(); | 718 base::RunLoop().RunUntilIdle(); |
719 | 719 |
720 DestroyDownloadFile(0); | 720 DestroyDownloadFile(0); |
721 } | 721 } |
722 | 722 |
723 TEST_F(DownloadFileTest, StreamEmptyError) { | 723 TEST_F(DownloadFileTest, StreamEmptyError) { |
724 ASSERT_TRUE(CreateDownloadFile(0, true)); | 724 ASSERT_TRUE(CreateDownloadFile(0, true)); |
725 base::FilePath initial_path(download_file_->FullPath()); | 725 base::FilePath initial_path(download_file_->FullPath()); |
726 EXPECT_TRUE(base::PathExists(initial_path)); | 726 EXPECT_TRUE(base::PathExists(initial_path)); |
727 | 727 |
728 // Finish the download in error and make sure we see it on the | 728 // Finish the download in error and make sure we see it on the |
729 // observer. | 729 // observer. |
730 EXPECT_CALL( | 730 EXPECT_CALL( |
731 *(observer_.get()), | 731 *(observer_.get()), |
732 MockDestinationError( | 732 MockDestinationError( |
733 DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, 0, kEmptyHash)) | 733 DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, 0, kEmptyHash)) |
734 .WillOnce(InvokeWithoutArgs( | 734 .WillOnce(InvokeWithoutArgs( |
735 this, &DownloadFileTest::ConfirmUpdateDownloadInfo)); | 735 this, &DownloadFileTest::ConfirmUpdateDownloadInfo)); |
736 | 736 |
737 // If this next EXPECT_CALL fails flakily, it's probably a real failure. | 737 // If this next EXPECT_CALL fails flakily, it's probably a real failure. |
738 // We'll be getting a stream of UpdateDownload calls from the timer, and | 738 // We'll be getting a stream of UpdateDownload calls from the timer, and |
739 // the last one may have the correct information even if the failure | 739 // the last one may have the correct information even if the failure |
740 // doesn't produce an update, as the timer update may have triggered at the | 740 // doesn't produce an update, as the timer update may have triggered at the |
741 // same time. | 741 // same time. |
742 EXPECT_CALL(*(observer_.get()), CurrentUpdateStatus(0, _)); | 742 EXPECT_CALL(*(observer_.get()), CurrentUpdateStatus(0, _)); |
743 | 743 |
744 FinishStream( | 744 FinishStream( |
745 DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, false, kEmptyHash); | 745 DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, false, kEmptyHash); |
746 | 746 |
747 loop_.RunUntilIdle(); | 747 base::RunLoop().RunUntilIdle(); |
748 | 748 |
749 DestroyDownloadFile(0); | 749 DestroyDownloadFile(0); |
750 } | 750 } |
751 | 751 |
752 TEST_F(DownloadFileTest, StreamNonEmptySuccess) { | 752 TEST_F(DownloadFileTest, StreamNonEmptySuccess) { |
753 ASSERT_TRUE(CreateDownloadFile(0, true)); | 753 ASSERT_TRUE(CreateDownloadFile(0, true)); |
754 base::FilePath initial_path(download_file_->FullPath()); | 754 base::FilePath initial_path(download_file_->FullPath()); |
755 EXPECT_TRUE(base::PathExists(initial_path)); | 755 EXPECT_TRUE(base::PathExists(initial_path)); |
756 | 756 |
757 const char* chunks1[] = { kTestData1, kTestData2 }; | 757 const char* chunks1[] = { kTestData1, kTestData2 }; |
758 ::testing::Sequence s1; | 758 ::testing::Sequence s1; |
759 SetupDataAppend(chunks1, 2, s1); | 759 SetupDataAppend(chunks1, 2, s1); |
760 SetupFinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, s1); | 760 SetupFinishStream(DOWNLOAD_INTERRUPT_REASON_NONE, s1); |
761 EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _)); | 761 EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _)); |
762 sink_callback_.Run(); | 762 sink_callback_.Run(); |
763 VerifyStreamAndSize(); | 763 VerifyStreamAndSize(); |
764 loop_.RunUntilIdle(); | 764 base::RunLoop().RunUntilIdle(); |
765 DestroyDownloadFile(0); | 765 DestroyDownloadFile(0); |
766 } | 766 } |
767 | 767 |
768 TEST_F(DownloadFileTest, StreamNonEmptyError) { | 768 TEST_F(DownloadFileTest, StreamNonEmptyError) { |
769 ASSERT_TRUE(CreateDownloadFile(0, true)); | 769 ASSERT_TRUE(CreateDownloadFile(0, true)); |
770 base::FilePath initial_path(download_file_->FullPath()); | 770 base::FilePath initial_path(download_file_->FullPath()); |
771 EXPECT_TRUE(base::PathExists(initial_path)); | 771 EXPECT_TRUE(base::PathExists(initial_path)); |
772 | 772 |
773 const char* chunks1[] = { kTestData1, kTestData2 }; | 773 const char* chunks1[] = { kTestData1, kTestData2 }; |
774 ::testing::Sequence s1; | 774 ::testing::Sequence s1; |
775 SetupDataAppend(chunks1, 2, s1); | 775 SetupDataAppend(chunks1, 2, s1); |
776 SetupFinishStream(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, s1); | 776 SetupFinishStream(DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, s1); |
777 | 777 |
778 EXPECT_CALL(*(observer_.get()), | 778 EXPECT_CALL(*(observer_.get()), |
779 MockDestinationError( | 779 MockDestinationError( |
780 DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, _, _)) | 780 DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, _, _)) |
781 .WillOnce(InvokeWithoutArgs( | 781 .WillOnce(InvokeWithoutArgs( |
782 this, &DownloadFileTest::ConfirmUpdateDownloadInfo)); | 782 this, &DownloadFileTest::ConfirmUpdateDownloadInfo)); |
783 | 783 |
784 // If this next EXPECT_CALL fails flakily, it's probably a real failure. | 784 // If this next EXPECT_CALL fails flakily, it's probably a real failure. |
785 // We'll be getting a stream of UpdateDownload calls from the timer, and | 785 // We'll be getting a stream of UpdateDownload calls from the timer, and |
786 // the last one may have the correct information even if the failure | 786 // the last one may have the correct information even if the failure |
787 // doesn't produce an update, as the timer update may have triggered at the | 787 // doesn't produce an update, as the timer update may have triggered at the |
788 // same time. | 788 // same time. |
789 EXPECT_CALL(*(observer_.get()), | 789 EXPECT_CALL(*(observer_.get()), |
790 CurrentUpdateStatus(strlen(kTestData1) + strlen(kTestData2), _)); | 790 CurrentUpdateStatus(strlen(kTestData1) + strlen(kTestData2), _)); |
791 | 791 |
792 sink_callback_.Run(); | 792 sink_callback_.Run(); |
793 loop_.RunUntilIdle(); | 793 base::RunLoop().RunUntilIdle(); |
794 VerifyStreamAndSize(); | 794 VerifyStreamAndSize(); |
795 DestroyDownloadFile(0); | 795 DestroyDownloadFile(0); |
796 } | 796 } |
797 | 797 |
798 } // namespace content | 798 } // namespace content |
OLD | NEW |