Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: chrome/browser/extensions/extension_updater_unittest.cc

Issue 6969067: Allow URLFetcher to save results in a file. Have CRX updates use this capability. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase for commit Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <map> 5 #include <map>
6 6
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/stl_util-inl.h" 10 #include "base/stl_util-inl.h"
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 fetch1->AddExtension("1111", "1.0", zeroDays, kEmptyUpdateUrlData); 570 fetch1->AddExtension("1111", "1.0", zeroDays, kEmptyUpdateUrlData);
571 fetch2->AddExtension("12345", "2.0", kNeverPingedData, 571 fetch2->AddExtension("12345", "2.0", kNeverPingedData,
572 kEmptyUpdateUrlData); 572 kEmptyUpdateUrlData);
573 updater.StartUpdateCheck(fetch1); 573 updater.StartUpdateCheck(fetch1);
574 updater.StartUpdateCheck(fetch2); 574 updater.StartUpdateCheck(fetch2);
575 575
576 std::string invalid_xml = "invalid xml"; 576 std::string invalid_xml = "invalid xml";
577 fetcher = factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId); 577 fetcher = factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId);
578 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 578 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
579 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags); 579 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags);
580 fetcher->delegate()->OnURLFetchComplete( 580
581 fetcher, url1, net::URLRequestStatus(), 200, net::ResponseCookies(), 581 fetcher->set_url(url1);
582 invalid_xml); 582 fetcher->set_status(net::URLRequestStatus());
583 fetcher->set_response_code(200);
584 fetcher->SetResponseString(invalid_xml);
585 fetcher->delegate()->OnURLFetchComplete(fetcher);
583 586
584 // Now that the first request is complete, make sure the second one has 587 // Now that the first request is complete, make sure the second one has
585 // been started. 588 // been started.
586 const std::string kValidXml = 589 const std::string kValidXml =
587 "<?xml version='1.0' encoding='UTF-8'?>" 590 "<?xml version='1.0' encoding='UTF-8'?>"
588 "<gupdate xmlns='http://www.google.com/update2/response'" 591 "<gupdate xmlns='http://www.google.com/update2/response'"
589 " protocol='2.0'>" 592 " protocol='2.0'>"
590 " <app appid='12345'>" 593 " <app appid='12345'>"
591 " <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'" 594 " <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
592 " version='1.2.3.4' prodversionmin='2.0.143.0' />" 595 " version='1.2.3.4' prodversionmin='2.0.143.0' />"
593 " </app>" 596 " </app>"
594 "</gupdate>"; 597 "</gupdate>";
595 fetcher = factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId); 598 fetcher = factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId);
596 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 599 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
597 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags); 600 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags);
598 fetcher->delegate()->OnURLFetchComplete( 601
599 fetcher, url2, net::URLRequestStatus(), 200, net::ResponseCookies(), 602 fetcher->set_url(url2);
600 kValidXml); 603 fetcher->set_status(net::URLRequestStatus());
604 fetcher->set_response_code(200);
605 fetcher->SetResponseString(kValidXml);
606 fetcher->delegate()->OnURLFetchComplete(fetcher);
601 607
602 // This should run the manifest parsing, then we want to make sure that our 608 // This should run the manifest parsing, then we want to make sure that our
603 // service was called with GetExtensionById with the matching id from 609 // service was called with GetExtensionById with the matching id from
604 // kValidXml. 610 // kValidXml.
605 file_thread.Stop(); 611 file_thread.Stop();
606 io_thread.Stop(); 612 io_thread.Stop();
607 ui_loop.RunAllPending(); 613 ui_loop.RunAllPending();
608 EXPECT_EQ("12345", service->last_inquired_extension_id()); 614 EXPECT_EQ("12345", service->last_inquired_extension_id());
609 xmlCleanupGlobals(); 615 xmlCleanupGlobals();
610 616
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 PendingExtensionManager* pending_extension_manager = 652 PendingExtensionManager* pending_extension_manager =
647 service->pending_extension_manager(); 653 service->pending_extension_manager();
648 pending_extension_manager->AddForTesting( 654 pending_extension_manager->AddForTesting(
649 id, 655 id,
650 PendingExtensionInfo(test_url, &ShouldAlwaysInstall, kIsFromSync, 656 PendingExtensionInfo(test_url, &ShouldAlwaysInstall, kIsFromSync,
651 kInstallSilently, 657 kInstallSilently,
652 Extension::INTERNAL)); 658 Extension::INTERNAL));
653 } 659 }
654 660
655 // Call back the ExtensionUpdater with a 200 response and some test data 661 // Call back the ExtensionUpdater with a 200 response and some test data
656 std::string extension_data("whatever"); 662 FilePath extension_file_path(FILE_PATH_LITERAL("/whatever"));
657 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId); 663 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId);
658 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 664 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
659 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags); 665 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags);
660 fetcher->delegate()->OnURLFetchComplete( 666
661 fetcher, test_url, net::URLRequestStatus(), 200, net::ResponseCookies(), 667 fetcher->set_url(test_url);
662 extension_data); 668 fetcher->set_status(net::URLRequestStatus());
669 fetcher->set_response_code(200);
670 fetcher->SetResponseFilePath(extension_file_path);
671 fetcher->delegate()->OnURLFetchComplete(fetcher);
663 672
664 file_thread.Stop(); 673 file_thread.Stop();
665 ui_loop.RunAllPending(); 674 ui_loop.RunAllPending();
666 675
667 // Expect that ExtensionUpdater asked the mock extensions service to install 676 // Expect that ExtensionUpdater asked the mock extensions service to install
668 // a file with the test data for the right id. 677 // a file with the test data for the right id.
669 EXPECT_EQ(id, service->extension_id()); 678 EXPECT_EQ(id, service->extension_id());
670 FilePath tmpfile_path = service->install_path(); 679 FilePath tmpfile_path = service->install_path();
671 EXPECT_FALSE(tmpfile_path.empty()); 680 EXPECT_FALSE(tmpfile_path.empty());
672 EXPECT_EQ(test_url, service->download_url()); 681 EXPECT_EQ(test_url, service->download_url());
673 std::string file_contents; 682 EXPECT_EQ(extension_file_path, tmpfile_path);
674 EXPECT_TRUE(file_util::ReadFileToString(tmpfile_path, &file_contents));
675 EXPECT_TRUE(extension_data == file_contents);
676 683
677 // The FILE thread is needed for |service|'s cleanup, 684 // The FILE thread is needed for |service|'s cleanup,
678 // because of ImportantFileWriter. 685 // because of ImportantFileWriter.
679 file_thread.Start(); 686 file_thread.Start();
680 service.reset(); 687 service.reset();
681 688
682 file_util::Delete(tmpfile_path, false);
683 URLFetcher::set_factory(NULL); 689 URLFetcher::set_factory(NULL);
684 } 690 }
685 691
686 static void TestBlacklistDownloading() { 692 static void TestBlacklistDownloading() {
687 MessageLoop message_loop; 693 MessageLoop message_loop;
688 BrowserThread ui_thread(BrowserThread::UI, &message_loop); 694 BrowserThread ui_thread(BrowserThread::UI, &message_loop);
689 BrowserThread file_thread(BrowserThread::FILE, &message_loop); 695 BrowserThread file_thread(BrowserThread::FILE, &message_loop);
690 BrowserThread io_thread(BrowserThread::IO); 696 BrowserThread io_thread(BrowserThread::IO);
691 io_thread.Start(); 697 io_thread.Start();
692 698
693 TestURLFetcherFactory factory; 699 TestURLFetcherFactory factory;
694 TestURLFetcher* fetcher = NULL; 700 TestURLFetcher* fetcher = NULL;
695 URLFetcher::set_factory(&factory); 701 URLFetcher::set_factory(&factory);
696 ServiceForBlacklistTests service; 702 ServiceForBlacklistTests service;
697 ExtensionUpdater updater( 703 ExtensionUpdater updater(
698 &service, service.extension_prefs(), service.pref_service(), 704 &service, service.extension_prefs(), service.pref_service(),
699 service.profile(), kUpdateFrequencySecs); 705 service.profile(), kUpdateFrequencySecs);
700 updater.Start(); 706 updater.Start();
701 GURL test_url("http://localhost/extension.crx"); 707 GURL test_url("http://localhost/extension.crx");
702 708
703 std::string id = "com.google.crx.blacklist"; 709 std::string id = "com.google.crx.blacklist";
704 710
705 std::string hash = 711 std::string hash =
706 "2CE109E9D0FAF820B2434E166297934E6177B65AB9951DBC3E204CAD4689B39C"; 712 "2CE109E9D0FAF820B2434E166297934E6177B65AB9951DBC3E204CAD4689B39C";
707 713
708 std::string version = "0.0.1"; 714 std::string version = "0.0.1";
709 updater.FetchUpdatedExtension(id, test_url, hash, version); 715 updater.FetchUpdatedExtension(id, test_url, hash, version);
710 716
711 // Call back the ExtensionUpdater with a 200 response and some test data 717 // Call back the ExtensionUpdater with a 200 response and some test data.
712 std::string extension_data("aaabbb"); 718 std::string extension_data("aaabbb");
719
713 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId); 720 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId);
714 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 721 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
715 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags); 722 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags);
716 fetcher->delegate()->OnURLFetchComplete( 723
717 fetcher, test_url, net::URLRequestStatus(), 200, net::ResponseCookies(), 724 fetcher->set_url(test_url);
718 extension_data); 725 fetcher->set_status(net::URLRequestStatus());
726 fetcher->set_response_code(200);
727 fetcher->SetResponseString(extension_data);
728 fetcher->delegate()->OnURLFetchComplete(fetcher);
719 729
720 message_loop.RunAllPending(); 730 message_loop.RunAllPending();
721 731
722 // The updater should have called extension service to process the 732 // The updater should have called extension service to process the
723 // blacklist. 733 // blacklist.
724 EXPECT_TRUE(service.processed_blacklist()); 734 EXPECT_TRUE(service.processed_blacklist());
725 735
726 EXPECT_EQ(version, service.pref_service()-> 736 EXPECT_EQ(version, service.pref_service()->
727 GetString(prefs::kExtensionBlacklistUpdateVersion)); 737 GetString(prefs::kExtensionBlacklistUpdateVersion));
728 738
(...skipping 25 matching lines...) Expand all
754 std::string hash1 = ""; 764 std::string hash1 = "";
755 std::string hash2 = ""; 765 std::string hash2 = "";
756 766
757 std::string version1 = "0.1"; 767 std::string version1 = "0.1";
758 std::string version2 = "0.1"; 768 std::string version2 = "0.1";
759 // Start two fetches 769 // Start two fetches
760 updater.FetchUpdatedExtension(id1, url1, hash1, version1); 770 updater.FetchUpdatedExtension(id1, url1, hash1, version1);
761 updater.FetchUpdatedExtension(id2, url2, hash2, version2); 771 updater.FetchUpdatedExtension(id2, url2, hash2, version2);
762 772
763 // Make the first fetch complete. 773 // Make the first fetch complete.
764 std::string extension_data1("whatever"); 774 FilePath extension_file_path(FILE_PATH_LITERAL("/whatever"));
775
765 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId); 776 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId);
766 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 777 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
767 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags); 778 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags);
768 fetcher->delegate()->OnURLFetchComplete( 779
769 fetcher, url1, net::URLRequestStatus(), 200, net::ResponseCookies(), 780 fetcher->set_url(url1);
770 extension_data1); 781 fetcher->set_status(net::URLRequestStatus());
782 fetcher->set_response_code(200);
783 fetcher->SetResponseFilePath(extension_file_path);
784 fetcher->delegate()->OnURLFetchComplete(fetcher);
785
771 message_loop.RunAllPending(); 786 message_loop.RunAllPending();
772 787
773 // Expect that the service was asked to do an install with the right data. 788 // Expect that the service was asked to do an install with the right data.
774 FilePath tmpfile_path = service.install_path(); 789 FilePath tmpfile_path = service.install_path();
775 EXPECT_FALSE(tmpfile_path.empty()); 790 EXPECT_FALSE(tmpfile_path.empty());
776 EXPECT_EQ(id1, service.extension_id()); 791 EXPECT_EQ(id1, service.extension_id());
777 EXPECT_EQ(url1, service.download_url()); 792 EXPECT_EQ(url1, service.download_url());
778 message_loop.RunAllPending(); 793 message_loop.RunAllPending();
779 file_util::Delete(tmpfile_path, false);
780 794
781 // Make sure the second fetch finished and asked the service to do an 795 // Make sure the second fetch finished and asked the service to do an
782 // update. 796 // update.
783 std::string extension_data2("whatever2"); 797 FilePath extension_file_path2(FILE_PATH_LITERAL("/whatever2"));
784 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId); 798 fetcher = factory.GetFetcherByID(ExtensionUpdater::kExtensionFetcherId);
785 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 799 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
786 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags); 800 EXPECT_TRUE(fetcher->load_flags() == expected_load_flags);
787 fetcher->delegate()->OnURLFetchComplete( 801
788 fetcher, url2, net::URLRequestStatus(), 200, net::ResponseCookies(), 802 fetcher->set_url(url2);
789 extension_data2); 803 fetcher->set_status(net::URLRequestStatus());
804 fetcher->set_response_code(200);
805 fetcher->SetResponseFilePath(extension_file_path2);
806 fetcher->delegate()->OnURLFetchComplete(fetcher);
790 message_loop.RunAllPending(); 807 message_loop.RunAllPending();
791 EXPECT_EQ(id2, service.extension_id()); 808 EXPECT_EQ(id2, service.extension_id());
792 EXPECT_EQ(url2, service.download_url()); 809 EXPECT_EQ(url2, service.download_url());
793 EXPECT_FALSE(service.install_path().empty()); 810 EXPECT_FALSE(service.install_path().empty());
794 811
795 // Make sure the correct crx contents were passed for the update call. 812 // Make sure the correct crx contents were passed for the update call.
796 std::string file_contents; 813 EXPECT_EQ(extension_file_path2, service.install_path());
797 EXPECT_TRUE(file_util::ReadFileToString(service.install_path(),
798 &file_contents));
799 EXPECT_TRUE(extension_data2 == file_contents);
800 file_util::Delete(service.install_path(), false);
801 } 814 }
802 815
803 // Test requests to both a Google server and a non-google server. This allows 816 // Test requests to both a Google server and a non-google server. This allows
804 // us to test various combinations of installed (ie roll call) and active 817 // us to test various combinations of installed (ie roll call) and active
805 // (ie app launch) ping scenarios. The invariant is that each type of ping 818 // (ie app launch) ping scenarios. The invariant is that each type of ping
806 // value should be present at most once per day, and can be calculated based 819 // value should be present at most once per day, and can be calculated based
807 // on the delta between now and the last ping time (or in the case of active 820 // on the delta between now and the last ping time (or in the case of active
808 // pings, that delta plus whether the app has been active). 821 // pings, that delta plus whether the app has been active).
809 static void TestGalleryRequests(int rollcall_ping_days, 822 static void TestGalleryRequests(int rollcall_ping_days,
810 int active_ping_days, 823 int active_ping_days,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 updater.set_blacklist_checks_enabled(false); 873 updater.set_blacklist_checks_enabled(false);
861 874
862 // Make the updater do manifest fetching, and note the urls it tries to 875 // Make the updater do manifest fetching, and note the urls it tries to
863 // fetch. 876 // fetch.
864 std::vector<GURL> fetched_urls; 877 std::vector<GURL> fetched_urls;
865 updater.CheckNow(); 878 updater.CheckNow();
866 TestURLFetcher* fetcher = 879 TestURLFetcher* fetcher =
867 factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId); 880 factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId);
868 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL); 881 EXPECT_TRUE(fetcher != NULL && fetcher->delegate() != NULL);
869 fetched_urls.push_back(fetcher->original_url()); 882 fetched_urls.push_back(fetcher->original_url());
870 fetcher->delegate()->OnURLFetchComplete( 883
871 fetcher, fetched_urls[0], net::URLRequestStatus(), 500, 884 fetcher->set_url(fetched_urls[0]);
872 net::ResponseCookies(), ""); 885 fetcher->set_status(net::URLRequestStatus());
873 fetcher = 886 fetcher->set_response_code(500);
874 factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId); 887 fetcher->SetResponseString("");
888 fetcher->delegate()->OnURLFetchComplete(fetcher);
889
890 fetcher = factory.GetFetcherByID(ExtensionUpdater::kManifestFetcherId);
875 fetched_urls.push_back(fetcher->original_url()); 891 fetched_urls.push_back(fetcher->original_url());
876 892
877 // The urls could have been fetched in either order, so use the host to 893 // The urls could have been fetched in either order, so use the host to
878 // tell them apart and note the query each used. 894 // tell them apart and note the query each used.
879 std::string url1_query; 895 std::string url1_query;
880 std::string url2_query; 896 std::string url2_query;
881 if (fetched_urls[0].host() == url1.host()) { 897 if (fetched_urls[0].host() == url1.host()) {
882 url1_query = fetched_urls[0].query(); 898 url1_query = fetched_urls[0].query();
883 url2_query = fetched_urls[1].query(); 899 url2_query = fetched_urls[1].query();
884 } else if (fetched_urls[0].host() == url2.host()) { 900 } else if (fetched_urls[0].host() == url2.host()) {
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 1154
1139 // TODO(asargent) - (http://crbug.com/12780) add tests for: 1155 // TODO(asargent) - (http://crbug.com/12780) add tests for:
1140 // -prodversionmin (shouldn't update if browser version too old) 1156 // -prodversionmin (shouldn't update if browser version too old)
1141 // -manifests & updates arriving out of order / interleaved 1157 // -manifests & updates arriving out of order / interleaved
1142 // -malformed update url (empty, file://, has query, has a # fragment, etc.) 1158 // -malformed update url (empty, file://, has query, has a # fragment, etc.)
1143 // -An extension gets uninstalled while updates are in progress (so it doesn't 1159 // -An extension gets uninstalled while updates are in progress (so it doesn't
1144 // "come back from the dead") 1160 // "come back from the dead")
1145 // -An extension gets manually updated to v3 while we're downloading v2 (ie 1161 // -An extension gets manually updated to v3 while we're downloading v2 (ie
1146 // you don't get downgraded accidentally) 1162 // you don't get downgraded accidentally)
1147 // -An update manifest mentions multiple updates 1163 // -An update manifest mentions multiple updates
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698