| 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 <list> | 5 #include <list> |
| 6 #include <map> | 6 #include <map> |
| 7 #include <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "chrome/browser/extensions/updater/extension_updater.h" | 38 #include "chrome/browser/extensions/updater/extension_updater.h" |
| 39 #include "chrome/browser/extensions/updater/manifest_fetch_data.h" | 39 #include "chrome/browser/extensions/updater/manifest_fetch_data.h" |
| 40 #include "chrome/browser/extensions/updater/request_queue_impl.h" | 40 #include "chrome/browser/extensions/updater/request_queue_impl.h" |
| 41 #include "chrome/browser/google/google_util.h" | 41 #include "chrome/browser/google/google_util.h" |
| 42 #include "chrome/browser/prefs/pref_service_syncable.h" | 42 #include "chrome/browser/prefs/pref_service_syncable.h" |
| 43 #include "chrome/common/chrome_notification_types.h" | 43 #include "chrome/common/chrome_notification_types.h" |
| 44 #include "chrome/common/extensions/extension.h" | 44 #include "chrome/common/extensions/extension.h" |
| 45 #include "chrome/common/extensions/extension_manifest_constants.h" | 45 #include "chrome/common/extensions/extension_manifest_constants.h" |
| 46 #include "chrome/common/extensions/manifest_handler.h" | 46 #include "chrome/common/extensions/manifest_handler.h" |
| 47 #include "chrome/common/extensions/manifest_url_handler.h" | 47 #include "chrome/common/extensions/manifest_url_handler.h" |
| 48 #include "chrome/common/omaha_query_params.h" |
| 48 #include "chrome/common/pref_names.h" | 49 #include "chrome/common/pref_names.h" |
| 49 #include "chrome/test/base/testing_profile.h" | 50 #include "chrome/test/base/testing_profile.h" |
| 50 #include "content/public/browser/notification_details.h" | 51 #include "content/public/browser/notification_details.h" |
| 51 #include "content/public/browser/notification_observer.h" | 52 #include "content/public/browser/notification_observer.h" |
| 52 #include "content/public/browser/notification_registrar.h" | 53 #include "content/public/browser/notification_registrar.h" |
| 53 #include "content/public/browser/notification_service.h" | 54 #include "content/public/browser/notification_service.h" |
| 54 #include "content/public/browser/notification_source.h" | 55 #include "content/public/browser/notification_source.h" |
| 55 #include "content/public/test/test_browser_thread.h" | 56 #include "content/public/test/test_browser_thread.h" |
| 56 #include "libxml/globals.h" | 57 #include "libxml/globals.h" |
| 57 #include "net/base/backoff_entry.h" | 58 #include "net/base/backoff_entry.h" |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 if (!key_val.empty()) { | 437 if (!key_val.empty()) { |
| 437 std::string key = key_val[0]; | 438 std::string key = key_val[0]; |
| 438 EXPECT_TRUE(result->find(key) == result->end()); | 439 EXPECT_TRUE(result->find(key) == result->end()); |
| 439 (*result)[key] = (key_val.size() == 2) ? key_val[1] : ""; | 440 (*result)[key] = (key_val.size() == 2) ? key_val[1] : ""; |
| 440 } else { | 441 } else { |
| 441 NOTREACHED(); | 442 NOTREACHED(); |
| 442 } | 443 } |
| 443 } | 444 } |
| 444 } | 445 } |
| 445 | 446 |
| 447 static void VerifyQueryAndExtractParameters( |
| 448 const std::string& query, |
| 449 std::map<std::string, std::string>* result) { |
| 450 std::map<std::string, std::string> params; |
| 451 ExtractParameters(query, ¶ms); |
| 452 |
| 453 chrome::OmahaQueryParams::ProdId prod = |
| 454 #if defined(GOOGLE_CHROME_BUILD) |
| 455 chrome::OmahaQueryParams::CHROMECRX; |
| 456 #else |
| 457 chrome::OmahaQueryParams::CHROMIUMCRX; |
| 458 #endif |
| 459 std::string omaha_params = chrome::OmahaQueryParams::Get(prod); |
| 460 std::map<std::string, std::string> expected; |
| 461 ExtractParameters(omaha_params, &expected); |
| 462 |
| 463 for (std::map<std::string, std::string>::iterator it = expected.begin(); |
| 464 it != expected.end(); ++it) { |
| 465 EXPECT_EQ(it->second, params[it->first]); |
| 466 } |
| 467 |
| 468 EXPECT_EQ(1U, params.count("x")); |
| 469 std::string decoded = net::UnescapeURLComponent( |
| 470 params["x"], net::UnescapeRule::URL_SPECIAL_CHARS); |
| 471 ExtractParameters(decoded, result); |
| 472 } |
| 473 |
| 446 // All of our tests that need to use private APIs of ExtensionUpdater live | 474 // All of our tests that need to use private APIs of ExtensionUpdater live |
| 447 // inside this class (which is a friend to ExtensionUpdater). | 475 // inside this class (which is a friend to ExtensionUpdater). |
| 448 class ExtensionUpdaterTest : public testing::Test { | 476 class ExtensionUpdaterTest : public testing::Test { |
| 449 public: | 477 public: |
| 450 ExtensionUpdaterTest() | 478 ExtensionUpdaterTest() |
| 451 : ui_thread_(BrowserThread::UI, &loop_), | 479 : ui_thread_(BrowserThread::UI, &loop_), |
| 452 file_thread_(BrowserThread::FILE, &loop_), | 480 file_thread_(BrowserThread::FILE, &loop_), |
| 453 io_thread_(BrowserThread::IO, &loop_) { | 481 io_thread_(BrowserThread::IO, &loop_) { |
| 454 } | 482 } |
| 455 | 483 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 net::TestURLFetcher* fetcher = | 575 net::TestURLFetcher* fetcher = |
| 548 factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId); | 576 factory.GetFetcherByID(ExtensionDownloader::kManifestFetcherId); |
| 549 const GURL& url = fetcher->GetOriginalURL(); | 577 const GURL& url = fetcher->GetOriginalURL(); |
| 550 EXPECT_FALSE(url.is_empty()); | 578 EXPECT_FALSE(url.is_empty()); |
| 551 EXPECT_TRUE(url.is_valid()); | 579 EXPECT_TRUE(url.is_valid()); |
| 552 EXPECT_TRUE(url.SchemeIs("http")); | 580 EXPECT_TRUE(url.SchemeIs("http")); |
| 553 EXPECT_EQ("foo.com", url.host()); | 581 EXPECT_EQ("foo.com", url.host()); |
| 554 EXPECT_EQ("/bar", url.path()); | 582 EXPECT_EQ("/bar", url.path()); |
| 555 | 583 |
| 556 // Validate the extension request parameters in the query. It should | 584 // Validate the extension request parameters in the query. It should |
| 557 // look something like "?x=id%3D<id>%26v%3D<version>%26uc". | 585 // look something like "x=id%3D<id>%26v%3D<version>%26uc". |
| 558 EXPECT_TRUE(url.has_query()); | 586 EXPECT_TRUE(url.has_query()); |
| 559 std::vector<std::string> parts; | |
| 560 base::SplitString(url.query(), '=', &parts); | |
| 561 EXPECT_EQ(2u, parts.size()); | |
| 562 EXPECT_EQ("x", parts[0]); | |
| 563 std::string decoded = net::UnescapeURLComponent( | |
| 564 parts[1], net::UnescapeRule::URL_SPECIAL_CHARS); | |
| 565 std::map<std::string, std::string> params; | 587 std::map<std::string, std::string> params; |
| 566 ExtractParameters(decoded, ¶ms); | 588 VerifyQueryAndExtractParameters(url.query(), ¶ms); |
| 567 if (pending) { | 589 if (pending) { |
| 568 EXPECT_TRUE(pending_extension_manager->IsIdPending(params["id"])); | 590 EXPECT_TRUE(pending_extension_manager->IsIdPending(params["id"])); |
| 569 EXPECT_EQ("0.0.0.0", params["v"]); | 591 EXPECT_EQ("0.0.0.0", params["v"]); |
| 570 } else { | 592 } else { |
| 571 EXPECT_EQ(extensions[0]->id(), params["id"]); | 593 EXPECT_EQ(extensions[0]->id(), params["id"]); |
| 572 EXPECT_EQ(extensions[0]->VersionString(), params["v"]); | 594 EXPECT_EQ(extensions[0]->VersionString(), params["v"]); |
| 573 } | 595 } |
| 574 EXPECT_EQ("", params["uc"]); | 596 EXPECT_EQ("", params["uc"]); |
| 575 } | 597 } |
| 576 | 598 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 596 ASSERT_FALSE(fetcher == NULL); | 618 ASSERT_FALSE(fetcher == NULL); |
| 597 const GURL& url = fetcher->GetOriginalURL(); | 619 const GURL& url = fetcher->GetOriginalURL(); |
| 598 | 620 |
| 599 EXPECT_FALSE(url.is_empty()); | 621 EXPECT_FALSE(url.is_empty()); |
| 600 EXPECT_TRUE(url.is_valid()); | 622 EXPECT_TRUE(url.is_valid()); |
| 601 EXPECT_TRUE(url.SchemeIs("https")); | 623 EXPECT_TRUE(url.SchemeIs("https")); |
| 602 EXPECT_EQ("clients2.google.com", url.host()); | 624 EXPECT_EQ("clients2.google.com", url.host()); |
| 603 EXPECT_EQ("/service/update2/crx", url.path()); | 625 EXPECT_EQ("/service/update2/crx", url.path()); |
| 604 | 626 |
| 605 // Validate the extension request parameters in the query. It should | 627 // Validate the extension request parameters in the query. It should |
| 606 // look something like "?x=id%3D<id>%26v%3D<version>%26uc". | 628 // look something like "x=id%3D<id>%26v%3D<version>%26uc". |
| 607 EXPECT_TRUE(url.has_query()); | 629 EXPECT_TRUE(url.has_query()); |
| 608 std::vector<std::string> parts; | |
| 609 base::SplitString(url.query(), '=', &parts); | |
| 610 EXPECT_EQ(2u, parts.size()); | |
| 611 EXPECT_EQ("x", parts[0]); | |
| 612 std::string decoded = net::UnescapeURLComponent( | |
| 613 parts[1], net::UnescapeRule::URL_SPECIAL_CHARS); | |
| 614 std::map<std::string, std::string> params; | 630 std::map<std::string, std::string> params; |
| 615 ExtractParameters(decoded, ¶ms); | 631 VerifyQueryAndExtractParameters(url.query(), ¶ms); |
| 616 EXPECT_EQ("com.google.crx.blacklist", params["id"]); | 632 EXPECT_EQ("com.google.crx.blacklist", params["id"]); |
| 617 EXPECT_EQ("0", params["v"]); | 633 EXPECT_EQ("0", params["v"]); |
| 618 EXPECT_EQ("", params["uc"]); | 634 EXPECT_EQ("", params["uc"]); |
| 619 EXPECT_TRUE(ContainsKey(params, "ping")); | 635 EXPECT_TRUE(ContainsKey(params, "ping")); |
| 620 } | 636 } |
| 621 | 637 |
| 622 void TestUpdateUrlDataEmpty() { | 638 void TestUpdateUrlDataEmpty() { |
| 623 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 639 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
| 624 const std::string version = "1.0"; | 640 const std::string version = "1.0"; |
| 625 | 641 |
| 626 // Make sure that an empty update URL data string does not cause a ap= | 642 // Make sure that an empty update URL data string does not cause a ap= |
| 627 // option to appear in the x= parameter. | 643 // option to appear in the x= parameter. |
| 628 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); | 644 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); |
| 629 fetch_data.AddExtension(id, version, &kNeverPingedData, "", ""); | 645 fetch_data.AddExtension(id, version, &kNeverPingedData, "", ""); |
| 630 EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 646 |
| 631 "%26v%3D1.0%26uc", | 647 std::map<std::string, std::string> params; |
| 632 fetch_data.full_url().spec()); | 648 VerifyQueryAndExtractParameters(fetch_data.full_url().query(), ¶ms); |
| 649 EXPECT_EQ(id, params["id"]); |
| 650 EXPECT_EQ(version, params["v"]); |
| 651 EXPECT_EQ(0U, params.count("ap")); |
| 633 } | 652 } |
| 634 | 653 |
| 635 void TestUpdateUrlDataSimple() { | 654 void TestUpdateUrlDataSimple() { |
| 636 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 655 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
| 637 const std::string version = "1.0"; | 656 const std::string version = "1.0"; |
| 638 | 657 |
| 639 // Make sure that an update URL data string causes an appropriate ap= | 658 // Make sure that an update URL data string causes an appropriate ap= |
| 640 // option to appear in the x= parameter. | 659 // option to appear in the x= parameter. |
| 641 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); | 660 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); |
| 642 fetch_data.AddExtension(id, version, &kNeverPingedData, "bar", ""); | 661 fetch_data.AddExtension(id, version, &kNeverPingedData, "bar", ""); |
| 643 EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 662 std::map<std::string, std::string> params; |
| 644 "%26v%3D1.0%26uc%26ap%3Dbar", | 663 VerifyQueryAndExtractParameters(fetch_data.full_url().query(), ¶ms); |
| 645 fetch_data.full_url().spec()); | 664 EXPECT_EQ(id, params["id"]); |
| 665 EXPECT_EQ(version, params["v"]); |
| 666 EXPECT_EQ("bar", params["ap"]); |
| 646 } | 667 } |
| 647 | 668 |
| 648 void TestUpdateUrlDataCompound() { | 669 void TestUpdateUrlDataCompound() { |
| 649 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 670 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
| 650 const std::string version = "1.0"; | 671 const std::string version = "1.0"; |
| 651 | 672 |
| 652 // Make sure that an update URL data string causes an appropriate ap= | 673 // Make sure that an update URL data string causes an appropriate ap= |
| 653 // option to appear in the x= parameter. | 674 // option to appear in the x= parameter. |
| 654 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); | 675 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); |
| 655 fetch_data.AddExtension(id, version, &kNeverPingedData, "a=1&b=2&c", ""); | 676 fetch_data.AddExtension(id, version, &kNeverPingedData, "a=1&b=2&c", ""); |
| 656 EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 677 std::map<std::string, std::string> params; |
| 657 "%26v%3D1.0%26uc%26ap%3Da%253D1%2526b%253D2%2526c", | 678 VerifyQueryAndExtractParameters(fetch_data.full_url().query(), ¶ms); |
| 658 fetch_data.full_url().spec()); | 679 EXPECT_EQ(id, params["id"]); |
| 680 EXPECT_EQ(version, params["v"]); |
| 681 EXPECT_EQ("a%3D1%26b%3D2%26c", params["ap"]); |
| 659 } | 682 } |
| 660 | 683 |
| 661 void TestUpdateUrlDataFromGallery(const std::string& gallery_url) { | 684 void TestUpdateUrlDataFromGallery(const std::string& gallery_url) { |
| 662 net::TestURLFetcherFactory factory; | 685 net::TestURLFetcherFactory factory; |
| 663 | 686 |
| 664 MockService service(prefs_.get()); | 687 MockService service(prefs_.get()); |
| 665 MockExtensionDownloaderDelegate delegate; | 688 MockExtensionDownloaderDelegate delegate; |
| 666 ExtensionDownloader downloader(&delegate, service.request_context()); | 689 ExtensionDownloader downloader(&delegate, service.request_context()); |
| 667 ExtensionList extensions; | 690 ExtensionList extensions; |
| 668 std::string url(gallery_url); | 691 std::string url(gallery_url); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 688 | 711 |
| 689 void TestInstallSource() { | 712 void TestInstallSource() { |
| 690 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 713 const std::string id = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
| 691 const std::string version = "1.0"; | 714 const std::string version = "1.0"; |
| 692 const std::string install_source = "instally"; | 715 const std::string install_source = "instally"; |
| 693 | 716 |
| 694 // Make sure that an installsource= appears in the x= parameter. | 717 // Make sure that an installsource= appears in the x= parameter. |
| 695 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); | 718 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); |
| 696 fetch_data.AddExtension(id, version, &kNeverPingedData, | 719 fetch_data.AddExtension(id, version, &kNeverPingedData, |
| 697 kEmptyUpdateUrlData, install_source); | 720 kEmptyUpdateUrlData, install_source); |
| 698 EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 721 std::map<std::string, std::string> params; |
| 699 "%26v%3D1.0%26installsource%3Dinstally%26uc", | 722 VerifyQueryAndExtractParameters(fetch_data.full_url().query(), ¶ms); |
| 700 fetch_data.full_url().spec()); | 723 EXPECT_EQ(id, params["id"]); |
| 724 EXPECT_EQ(version, params["v"]); |
| 725 EXPECT_EQ(install_source, params["installsource"]); |
| 701 } | 726 } |
| 702 | 727 |
| 703 void TestDetermineUpdates() { | 728 void TestDetermineUpdates() { |
| 704 TestingProfile profile; | 729 TestingProfile profile; |
| 705 profile.CreateRequestContext(); | 730 profile.CreateRequestContext(); |
| 706 MockExtensionDownloaderDelegate delegate; | 731 MockExtensionDownloaderDelegate delegate; |
| 707 ExtensionDownloader downloader(&delegate, profile.GetRequestContext()); | 732 ExtensionDownloader downloader(&delegate, profile.GetRequestContext()); |
| 708 | 733 |
| 709 // Check passing an empty list of parse results to DetermineUpdates | 734 // Check passing an empty list of parse results to DetermineUpdates |
| 710 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); | 735 ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0); |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1693 // -prodversionmin (shouldn't update if browser version too old) | 1718 // -prodversionmin (shouldn't update if browser version too old) |
| 1694 // -manifests & updates arriving out of order / interleaved | 1719 // -manifests & updates arriving out of order / interleaved |
| 1695 // -malformed update url (empty, file://, has query, has a # fragment, etc.) | 1720 // -malformed update url (empty, file://, has query, has a # fragment, etc.) |
| 1696 // -An extension gets uninstalled while updates are in progress (so it doesn't | 1721 // -An extension gets uninstalled while updates are in progress (so it doesn't |
| 1697 // "come back from the dead") | 1722 // "come back from the dead") |
| 1698 // -An extension gets manually updated to v3 while we're downloading v2 (ie | 1723 // -An extension gets manually updated to v3 while we're downloading v2 (ie |
| 1699 // you don't get downgraded accidentally) | 1724 // you don't get downgraded accidentally) |
| 1700 // -An update manifest mentions multiple updates | 1725 // -An update manifest mentions multiple updates |
| 1701 | 1726 |
| 1702 } // namespace extensions | 1727 } // namespace extensions |
| OLD | NEW |