| Index: components/update_client/update_client_unittest.cc
|
| diff --git a/components/update_client/update_client_unittest.cc b/components/update_client/update_client_unittest.cc
|
| index a869f9a3cf9c0e286d77703a81a033ad988ab3dc..4dad5e2123917e659df9e89c8a2f1fcb426ebd9c 100644
|
| --- a/components/update_client/update_client_unittest.cc
|
| +++ b/components/update_client/update_client_unittest.cc
|
| @@ -148,7 +148,7 @@ class UpdateClientTest : public testing::Test {
|
| // Returns the full path to a test file.
|
| static base::FilePath TestFilePath(const char* file);
|
|
|
| - scoped_refptr<update_client::Configurator> config() { return config_; }
|
| + scoped_refptr<update_client::TestConfigurator> config() { return config_; }
|
| update_client::PersistedData* metadata() { return metadata_.get(); }
|
|
|
| base::Closure quit_closure() { return quit_closure_; }
|
| @@ -162,7 +162,7 @@ class UpdateClientTest : public testing::Test {
|
|
|
| std::unique_ptr<base::SequencedWorkerPoolOwner> worker_pool_;
|
|
|
| - scoped_refptr<update_client::Configurator> config_;
|
| + scoped_refptr<update_client::TestConfigurator> config_;
|
| std::unique_ptr<TestingPrefServiceSimple> pref_;
|
| std::unique_ptr<update_client::PersistedData> metadata_;
|
|
|
| @@ -2436,4 +2436,245 @@ TEST_F(UpdateClientTest, RetryAfter) {
|
| update_client->RemoveObserver(&observer);
|
| }
|
|
|
| +// Tests the update check for two CRXs scenario. The first component supports
|
| +// the group policy to enable updates, and has its updates disabled. The second
|
| +// component has an update. The server does not honor the "updatedisabled"
|
| +// attribute and returns updates for both components.
|
| +TEST_F(UpdateClientTest, TwoCrxUpdateOneUpdateDisabled) {
|
| + class DataCallbackFake {
|
| + public:
|
| + static void Callback(const std::vector<std::string>& ids,
|
| + std::vector<CrxComponent>* components) {
|
| + CrxComponent crx1;
|
| + crx1.name = "test_jebg";
|
| + crx1.pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
|
| + crx1.version = Version("0.9");
|
| + crx1.installer = new TestInstaller;
|
| + crx1.supports_group_policy_enable_component_updates = true;
|
| +
|
| + CrxComponent crx2;
|
| + crx2.name = "test_ihfo";
|
| + crx2.pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
|
| + crx2.version = Version("0.8");
|
| + crx2.installer = new TestInstaller;
|
| +
|
| + components->push_back(crx1);
|
| + components->push_back(crx2);
|
| + }
|
| + };
|
| +
|
| + class CompletionCallbackFake {
|
| + public:
|
| + static void Callback(const base::Closure& quit_closure, int error) {
|
| + EXPECT_EQ(0, error);
|
| + quit_closure.Run();
|
| + }
|
| + };
|
| +
|
| + class FakeUpdateChecker : public UpdateChecker {
|
| + public:
|
| + static std::unique_ptr<UpdateChecker> Create(
|
| + const scoped_refptr<Configurator>& config,
|
| + PersistedData* metadata) {
|
| + return std::unique_ptr<UpdateChecker>(new FakeUpdateChecker());
|
| + }
|
| +
|
| + bool CheckForUpdates(
|
| + const std::vector<CrxUpdateItem*>& items_to_check,
|
| + const std::string& additional_attributes,
|
| + const UpdateCheckCallback& update_check_callback) override {
|
| + /*
|
| + Fake the following response:
|
| +
|
| + <?xml version='1.0' encoding='UTF-8'?>
|
| + <response protocol='3.0'>
|
| + <app appid='jebgalgnebhfojomionfpkfelancnnkf'>
|
| + <updatecheck status='ok'>
|
| + <urls>
|
| + <url codebase='http://localhost/download/'/>
|
| + </urls>
|
| + <manifest version='1.0' prodversionmin='11.0.1.0'>
|
| + <packages>
|
| + <package name='jebgalgnebhfojomionfpkfelancnnkf.crx'
|
| + hash_sha256='6fc4b93fd11134de1300c2c0bb88c12b644a4ec0fd
|
| + 7c9b12cb7cc067667bde87'/>
|
| + </packages>
|
| + </manifest>
|
| + </updatecheck>
|
| + </app>
|
| + <app appid='ihfokbkgjpifnbbojhneepfflplebdkc'>
|
| + <updatecheck status='ok'>
|
| + <urls>
|
| + <url codebase='http://localhost/download/'/>
|
| + </urls>
|
| + <manifest version='1.0' prodversionmin='11.0.1.0'>
|
| + <packages>
|
| + <package name='ihfokbkgjpifnbbojhneepfflplebdkc_1.crx'
|
| + hash_sha256='813c59747e139a608b3b5fc49633affc6db574373f
|
| + 309f156ea6d27229c0b3f9'/>
|
| + </packages>
|
| + </manifest>
|
| + </updatecheck>
|
| + </app>
|
| + </response>
|
| + */
|
| + UpdateResponse::Result::Manifest::Package package1;
|
| + package1.name = "jebgalgnebhfojomionfpkfelancnnkf.crx";
|
| + package1.hash_sha256 =
|
| + "6fc4b93fd11134de1300c2c0bb88c12b644a4ec0fd7c9b12cb7cc067667bde87";
|
| +
|
| + UpdateResponse::Result result1;
|
| + result1.extension_id = "jebgalgnebhfojomionfpkfelancnnkf";
|
| + result1.crx_urls.push_back(GURL("http://localhost/download/"));
|
| + result1.manifest.version = "1.0";
|
| + result1.manifest.browser_min_version = "11.0.1.0";
|
| + result1.manifest.packages.push_back(package1);
|
| +
|
| + UpdateResponse::Result::Manifest::Package package2;
|
| + package2.name = "ihfokbkgjpifnbbojhneepfflplebdkc_1.crx";
|
| + package2.hash_sha256 =
|
| + "813c59747e139a608b3b5fc49633affc6db574373f309f156ea6d27229c0b3f9";
|
| +
|
| + UpdateResponse::Result result2;
|
| + result2.extension_id = "ihfokbkgjpifnbbojhneepfflplebdkc";
|
| + result2.crx_urls.push_back(GURL("http://localhost/download/"));
|
| + result2.manifest.version = "1.0";
|
| + result2.manifest.browser_min_version = "11.0.1.0";
|
| + result2.manifest.packages.push_back(package2);
|
| +
|
| + UpdateResponse::Results results;
|
| + results.list.push_back(result1);
|
| + results.list.push_back(result2);
|
| +
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(update_check_callback, 0, results, 0));
|
| + return true;
|
| + }
|
| + };
|
| +
|
| + class FakeCrxDownloader : public CrxDownloader {
|
| + public:
|
| + static std::unique_ptr<CrxDownloader> Create(
|
| + bool is_background_download,
|
| + net::URLRequestContextGetter* context_getter,
|
| + const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
|
| + return std::unique_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| + }
|
| +
|
| + private:
|
| + FakeCrxDownloader()
|
| + : CrxDownloader(base::ThreadTaskRunnerHandle::Get(), nullptr) {}
|
| + ~FakeCrxDownloader() override {}
|
| +
|
| + void DoStartDownload(const GURL& url) override {
|
| + DownloadMetrics download_metrics;
|
| + FilePath path;
|
| + Result result;
|
| + if (url.path() == "/download/ihfokbkgjpifnbbojhneepfflplebdkc_1.crx") {
|
| + download_metrics.url = url;
|
| + download_metrics.downloader = DownloadMetrics::kNone;
|
| + download_metrics.error = 0;
|
| + download_metrics.downloaded_bytes = 53638;
|
| + download_metrics.total_bytes = 53638;
|
| + download_metrics.download_time_ms = 2000;
|
| +
|
| + EXPECT_TRUE(MakeTestFile(
|
| + TestFilePath("ihfokbkgjpifnbbojhneepfflplebdkc_1.crx"), &path));
|
| +
|
| + result.error = 0;
|
| + result.response = path;
|
| + result.downloaded_bytes = 53638;
|
| + result.total_bytes = 53638;
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| +
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::Bind(&FakeCrxDownloader::OnDownloadProgress,
|
| + base::Unretained(this), result));
|
| +
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&FakeCrxDownloader::OnDownloadComplete,
|
| + base::Unretained(this), true, result, download_metrics));
|
| + }
|
| + };
|
| +
|
| + class FakePingManager : public FakePingManagerImpl {
|
| + public:
|
| + explicit FakePingManager(const scoped_refptr<Configurator>& config)
|
| + : FakePingManagerImpl(config) {}
|
| + ~FakePingManager() override {
|
| + const auto& ping_items = items();
|
| + EXPECT_EQ(2U, ping_items.size());
|
| + EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id);
|
| + EXPECT_EQ(base::Version("0.9"), ping_items[0].previous_version);
|
| + EXPECT_EQ(base::Version("1.0"), ping_items[0].next_version);
|
| + EXPECT_EQ(4, ping_items[0].error_category);
|
| + EXPECT_EQ(2, ping_items[0].error_code);
|
| + EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id);
|
| + EXPECT_EQ(base::Version("0.8"), ping_items[1].previous_version);
|
| + EXPECT_EQ(base::Version("1.0"), ping_items[1].next_version);
|
| + EXPECT_EQ(0, ping_items[1].error_category);
|
| + EXPECT_EQ(0, ping_items[1].error_code);
|
| + }
|
| + };
|
| +
|
| + // Disables updates for the components declaring support for the group policy.
|
| + config()->SetEnabledComponentUpdates(false);
|
| + std::unique_ptr<FakePingManager> ping_manager(new FakePingManager(config()));
|
| + scoped_refptr<UpdateClient> update_client(new UpdateClientImpl(
|
| + config(), std::move(ping_manager), &FakeUpdateChecker::Create,
|
| + &FakeCrxDownloader::Create));
|
| +
|
| + MockObserver observer;
|
| + {
|
| + InSequence seq;
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_CHECKING_FOR_UPDATES,
|
| + "jebgalgnebhfojomionfpkfelancnnkf"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_FOUND,
|
| + "jebgalgnebhfojomionfpkfelancnnkf"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_NOT_UPDATED,
|
| + "jebgalgnebhfojomionfpkfelancnnkf"))
|
| + .Times(1);
|
| + }
|
| + {
|
| + InSequence seq;
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_CHECKING_FOR_UPDATES,
|
| + "ihfokbkgjpifnbbojhneepfflplebdkc"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_FOUND,
|
| + "ihfokbkgjpifnbbojhneepfflplebdkc"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_WAIT,
|
| + "ihfokbkgjpifnbbojhneepfflplebdkc"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_DOWNLOADING,
|
| + "ihfokbkgjpifnbbojhneepfflplebdkc"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_READY,
|
| + "ihfokbkgjpifnbbojhneepfflplebdkc"))
|
| + .Times(1);
|
| + EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATED,
|
| + "ihfokbkgjpifnbbojhneepfflplebdkc"))
|
| + .Times(1);
|
| + }
|
| +
|
| + update_client->AddObserver(&observer);
|
| +
|
| + std::vector<std::string> ids;
|
| + ids.push_back(std::string("jebgalgnebhfojomionfpkfelancnnkf"));
|
| + ids.push_back(std::string("ihfokbkgjpifnbbojhneepfflplebdkc"));
|
| +
|
| + update_client->Update(
|
| + ids, base::Bind(&DataCallbackFake::Callback),
|
| + base::Bind(&CompletionCallbackFake::Callback, quit_closure()));
|
| +
|
| + RunThreads();
|
| +
|
| + update_client->RemoveObserver(&observer);
|
| +}
|
| +
|
| } // namespace update_client
|
|
|