| Index: components/update_client/test/update_client_unittest.cc
|
| diff --git a/components/update_client/test/update_client_unittest.cc b/components/update_client/test/update_client_unittest.cc
|
| deleted file mode 100644
|
| index 602fb96b1175f5f8af41d0921a7de1178b550de2..0000000000000000000000000000000000000000
|
| --- a/components/update_client/test/update_client_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1422 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/location.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/path_service.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "base/values.h"
|
| -#include "base/version.h"
|
| -#include "components/update_client/crx_update_item.h"
|
| -#include "components/update_client/ping_manager.h"
|
| -#include "components/update_client/test/test_configurator.h"
|
| -#include "components/update_client/test/test_installer.h"
|
| -#include "components/update_client/update_checker.h"
|
| -#include "components/update_client/update_client_internal.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "url/gurl.h"
|
| -
|
| -namespace update_client {
|
| -
|
| -namespace {
|
| -
|
| -using base::FilePath;
|
| -
|
| -// Makes a copy of the file specified by |from_path| in a temporary directory
|
| -// and returns the path of the copy. Returns true if successful. Cleans up if
|
| -// there was an error creating the copy.
|
| -bool MakeTestFile(const FilePath& from_path, FilePath* to_path) {
|
| - FilePath temp_dir;
|
| - bool result =
|
| - CreateNewTempDirectory(FILE_PATH_LITERAL("update_client"), &temp_dir);
|
| - if (!result)
|
| - return false;
|
| -
|
| - FilePath temp_file;
|
| - result = CreateTemporaryFileInDir(temp_dir, &temp_file);
|
| - if (!result)
|
| - return false;
|
| -
|
| - result = CopyFile(from_path, temp_file);
|
| - if (!result) {
|
| - DeleteFile(temp_file, false);
|
| - return false;
|
| - }
|
| -
|
| - *to_path = temp_file;
|
| - return true;
|
| -}
|
| -
|
| -using Events = UpdateClient::Observer::Events;
|
| -
|
| -class MockObserver : public UpdateClient::Observer {
|
| - public:
|
| - MOCK_METHOD2(OnEvent, void(Events event, const std::string&));
|
| -};
|
| -
|
| -class FakePingManagerImpl : public PingManager {
|
| - public:
|
| - explicit FakePingManagerImpl(const Configurator& config);
|
| - ~FakePingManagerImpl() override;
|
| -
|
| - void OnUpdateComplete(const CrxUpdateItem* item) override;
|
| -
|
| - const std::vector<CrxUpdateItem>& items() const;
|
| -
|
| - private:
|
| - std::vector<CrxUpdateItem> items_;
|
| - DISALLOW_COPY_AND_ASSIGN(FakePingManagerImpl);
|
| -};
|
| -
|
| -FakePingManagerImpl::FakePingManagerImpl(const Configurator& config)
|
| - : PingManager(config) {
|
| -}
|
| -
|
| -FakePingManagerImpl::~FakePingManagerImpl() {
|
| -}
|
| -
|
| -void FakePingManagerImpl::OnUpdateComplete(const CrxUpdateItem* item) {
|
| - items_.push_back(*item);
|
| -}
|
| -
|
| -const std::vector<CrxUpdateItem>& FakePingManagerImpl::items() const {
|
| - return items_;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -using ::testing::_;
|
| -using ::testing::AnyNumber;
|
| -using ::testing::DoAll;
|
| -using ::testing::InSequence;
|
| -using ::testing::Invoke;
|
| -using ::testing::Mock;
|
| -using ::testing::Return;
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -using std::string;
|
| -
|
| -class UpdateClientTest : public testing::Test {
|
| - public:
|
| - UpdateClientTest();
|
| - ~UpdateClientTest() override;
|
| -
|
| - void SetUp() override;
|
| - void TearDown() override;
|
| -
|
| - protected:
|
| - void RunThreads();
|
| -
|
| - // Returns the full path to a test file.
|
| - static base::FilePath TestFilePath(const char* file);
|
| -
|
| - content::TestBrowserThreadBundle thread_bundle_;
|
| -
|
| - base::RunLoop runloop_;
|
| - base::Closure quit_closure_;
|
| -
|
| - scoped_refptr<update_client::TestConfigurator> config_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(UpdateClientTest);
|
| -};
|
| -
|
| -UpdateClientTest::UpdateClientTest()
|
| - : config_(new TestConfigurator(
|
| - BrowserThread::GetBlockingPool()
|
| - ->GetSequencedTaskRunnerWithShutdownBehavior(
|
| - BrowserThread::GetBlockingPool()->GetSequenceToken(),
|
| - base::SequencedWorkerPool::SKIP_ON_SHUTDOWN),
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))) {
|
| -}
|
| -
|
| -UpdateClientTest::~UpdateClientTest() {
|
| -}
|
| -
|
| -void UpdateClientTest::SetUp() {
|
| - quit_closure_ = runloop_.QuitClosure();
|
| -}
|
| -
|
| -void UpdateClientTest::TearDown() {
|
| -}
|
| -
|
| -void UpdateClientTest::RunThreads() {
|
| - runloop_.Run();
|
| -}
|
| -
|
| -base::FilePath UpdateClientTest::TestFilePath(const char* file) {
|
| - base::FilePath path;
|
| - PathService::Get(base::DIR_SOURCE_ROOT, &path);
|
| - return path.AppendASCII("components")
|
| - .AppendASCII("test")
|
| - .AppendASCII("data")
|
| - .AppendASCII("update_client")
|
| - .AppendASCII(file);
|
| -}
|
| -
|
| -// Tests the scenario where one update check is done for one CRX. The CRX
|
| -// has no update.
|
| -TEST_F(UpdateClientTest, OneCrxNoUpdate) {
|
| - class DataCallbackFake {
|
| - public:
|
| - static void Callback(const std::vector<std::string>& ids,
|
| - std::vector<CrxComponent>* components) {
|
| - CrxComponent crx;
|
| - crx.name = "test_jebg";
|
| - crx.pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
|
| - crx.version = Version("0.9");
|
| - crx.installer = new TestInstaller;
|
| - components->push_back(crx);
|
| - }
|
| - };
|
| -
|
| - 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 scoped_ptr<UpdateChecker> Create(const Configurator& config) {
|
| - return scoped_ptr<UpdateChecker>(new FakeUpdateChecker());
|
| - }
|
| -
|
| - bool CheckForUpdates(
|
| - const std::vector<CrxUpdateItem*>& items_to_check,
|
| - const std::string& additional_attributes,
|
| - const UpdateCheckCallback& update_check_callback) override {
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(update_check_callback, GURL(), 0, "",
|
| - UpdateResponse::Results()));
|
| - return true;
|
| - }
|
| - };
|
| -
|
| - class FakeCrxDownloader : public CrxDownloader {
|
| - public:
|
| - static scoped_ptr<CrxDownloader> Create(
|
| - bool is_background_download,
|
| - net::URLRequestContextGetter* context_getter,
|
| - const scoped_refptr<base::SequencedTaskRunner>& url_fetcher_task_runner,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>&
|
| - background_task_runner) {
|
| - return scoped_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| - }
|
| -
|
| - private:
|
| - FakeCrxDownloader() : CrxDownloader(scoped_ptr<CrxDownloader>().Pass()) {}
|
| - ~FakeCrxDownloader() override {}
|
| -
|
| - void DoStartDownload(const GURL& url) override { EXPECT_TRUE(false); }
|
| - };
|
| -
|
| - class FakePingManager : public FakePingManagerImpl {
|
| - public:
|
| - explicit FakePingManager(const Configurator& config)
|
| - : FakePingManagerImpl(config) {}
|
| - ~FakePingManager() override { EXPECT_TRUE(items().empty()); }
|
| - };
|
| -
|
| - scoped_ptr<PingManager> ping_manager(new FakePingManager(*config_));
|
| - scoped_ptr<UpdateClient> update_client(new UpdateClientImpl(
|
| - config_, ping_manager.Pass(), &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_NOT_UPDATED,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| -
|
| - update_client->AddObserver(&observer);
|
| -
|
| - std::vector<std::string> ids;
|
| - ids.push_back(std::string("jebgalgnebhfojomionfpkfelancnnkf"));
|
| -
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, quit_closure_));
|
| -
|
| - RunThreads();
|
| -
|
| - update_client->RemoveObserver(&observer);
|
| -}
|
| -
|
| -// Tests the scenario where two CRXs are checked for updates. On CRX has
|
| -// an update, the other CRX does not.
|
| -TEST_F(UpdateClientTest, TwoCrxUpdateNoUpdate) {
|
| - 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;
|
| -
|
| - CrxComponent crx2;
|
| - crx2.name = "test_abag";
|
| - crx2.pk_hash.assign(abag_hash, abag_hash + arraysize(abag_hash));
|
| - crx2.version = Version("2.2");
|
| - 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 scoped_ptr<UpdateChecker> Create(const Configurator& config) {
|
| - return scoped_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'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package;
|
| - package.name = "jebgalgnebhfojomionfpkfelancnnkf.crx";
|
| -
|
| - UpdateResponse::Result result;
|
| - result.extension_id = "jebgalgnebhfojomionfpkfelancnnkf";
|
| - result.crx_urls.push_back(GURL("http://localhost/download/"));
|
| - result.manifest.version = "1.0";
|
| - result.manifest.browser_min_version = "11.0.1.0";
|
| - result.manifest.packages.push_back(package);
|
| -
|
| - UpdateResponse::Results results;
|
| - results.list.push_back(result);
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(update_check_callback, GURL(), 0, "", results));
|
| - return true;
|
| - }
|
| - };
|
| -
|
| - class FakeCrxDownloader : public CrxDownloader {
|
| - public:
|
| - static scoped_ptr<CrxDownloader> Create(
|
| - bool is_background_download,
|
| - net::URLRequestContextGetter* context_getter,
|
| - const scoped_refptr<base::SequencedTaskRunner>& url_fetcher_task_runner,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>&
|
| - background_task_runner) {
|
| - return scoped_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| - }
|
| -
|
| - private:
|
| - FakeCrxDownloader() : CrxDownloader(scoped_ptr<CrxDownloader>().Pass()) {}
|
| - ~FakeCrxDownloader() override {}
|
| -
|
| - void DoStartDownload(const GURL& url) override {
|
| - DownloadMetrics download_metrics;
|
| - download_metrics.url = url;
|
| - download_metrics.downloader = DownloadMetrics::kNone;
|
| - download_metrics.error = 0;
|
| - download_metrics.downloaded_bytes = 1843;
|
| - download_metrics.total_bytes = 1843;
|
| - download_metrics.download_time_ms = 1000;
|
| -
|
| - FilePath path;
|
| - EXPECT_TRUE(MakeTestFile(
|
| - TestFilePath("jebgalgnebhfojomionfpkfelancnnkf.crx"), &path));
|
| -
|
| - Result result;
|
| - result.error = 0;
|
| - result.response = path;
|
| - result.downloaded_bytes = 1843;
|
| - result.total_bytes = 1843;
|
| -
|
| - 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 Configurator& config)
|
| - : FakePingManagerImpl(config) {}
|
| - ~FakePingManager() override {
|
| - const auto& ping_items = items();
|
| - EXPECT_EQ(1U, ping_items.size());
|
| - EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id);
|
| - EXPECT_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version));
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version));
|
| - EXPECT_EQ(0, ping_items[0].error_category);
|
| - EXPECT_EQ(0, ping_items[0].error_code);
|
| - }
|
| - };
|
| -
|
| - scoped_ptr<PingManager> ping_manager(new FakePingManager(*config_));
|
| - scoped_ptr<UpdateClient> update_client(new UpdateClientImpl(
|
| - config_, ping_manager.Pass(), &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_UPDATE_DOWNLOADING,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_READY,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATED,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - }
|
| - {
|
| - InSequence seq;
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_CHECKING_FOR_UPDATES,
|
| - "abagagagagagagagagagagagagagagag")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_NOT_UPDATED,
|
| - "abagagagagagagagagagagagagagagag")).Times(1);
|
| - }
|
| -
|
| - update_client->AddObserver(&observer);
|
| -
|
| - std::vector<std::string> ids;
|
| - ids.push_back(std::string("jebgalgnebhfojomionfpkfelancnnkf"));
|
| - ids.push_back(std::string("abagagagagagagagagagagagagagagag"));
|
| -
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, quit_closure_));
|
| -
|
| - RunThreads();
|
| -
|
| - update_client->RemoveObserver(&observer);
|
| -}
|
| -
|
| -// Tests the update check for two CRXs scenario. Both CRXs have updates.
|
| -TEST_F(UpdateClientTest, TwoCrxUpdate) {
|
| - 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;
|
| -
|
| - 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 scoped_ptr<UpdateChecker> Create(const Configurator& config) {
|
| - return scoped_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'/>
|
| - </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'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package1;
|
| - package1.name = "jebgalgnebhfojomionfpkfelancnnkf.crx";
|
| -
|
| - 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";
|
| -
|
| - 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, GURL(), 0, "", results));
|
| - return true;
|
| - }
|
| - };
|
| -
|
| - class FakeCrxDownloader : public CrxDownloader {
|
| - public:
|
| - static scoped_ptr<CrxDownloader> Create(
|
| - bool is_background_download,
|
| - net::URLRequestContextGetter* context_getter,
|
| - const scoped_refptr<base::SequencedTaskRunner>& url_fetcher_task_runner,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>&
|
| - background_task_runner) {
|
| - return scoped_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| - }
|
| -
|
| - private:
|
| - FakeCrxDownloader() : CrxDownloader(scoped_ptr<CrxDownloader>().Pass()) {}
|
| - ~FakeCrxDownloader() override {}
|
| -
|
| - void DoStartDownload(const GURL& url) override {
|
| - DownloadMetrics download_metrics;
|
| - FilePath path;
|
| - Result result;
|
| - if (url.path() == "/download/jebgalgnebhfojomionfpkfelancnnkf.crx") {
|
| - download_metrics.url = url;
|
| - download_metrics.downloader = DownloadMetrics::kNone;
|
| - download_metrics.error = 0;
|
| - download_metrics.downloaded_bytes = 1843;
|
| - download_metrics.total_bytes = 1843;
|
| - download_metrics.download_time_ms = 1000;
|
| -
|
| - EXPECT_TRUE(MakeTestFile(
|
| - TestFilePath("jebgalgnebhfojomionfpkfelancnnkf.crx"), &path));
|
| -
|
| - result.error = 0;
|
| - result.response = path;
|
| - result.downloaded_bytes = 1843;
|
| - result.total_bytes = 1843;
|
| - } else 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 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_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version));
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version));
|
| - EXPECT_EQ(0, ping_items[0].error_category);
|
| - EXPECT_EQ(0, ping_items[0].error_code);
|
| - EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id);
|
| - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[1].previous_version));
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].next_version));
|
| - EXPECT_EQ(0, ping_items[1].error_category);
|
| - EXPECT_EQ(0, ping_items[1].error_code);
|
| - }
|
| - };
|
| -
|
| - scoped_ptr<FakePingManager> ping_manager(new FakePingManager(*config_));
|
| - scoped_ptr<UpdateClient> update_client(new UpdateClientImpl(
|
| - config_, ping_manager.Pass(), &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_UPDATE_DOWNLOADING,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_READY,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_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);
|
| -}
|
| -
|
| -// Tests the differential update scenario for one CRX.
|
| -TEST_F(UpdateClientTest, OneCrxDiffUpdate) {
|
| - class DataCallbackFake {
|
| - public:
|
| - static void Callback(const std::vector<std::string>& ids,
|
| - std::vector<CrxComponent>* components) {
|
| - static int num_calls = 0;
|
| -
|
| - // Must use the same stateful installer object.
|
| - static scoped_refptr<CrxInstaller> installer(
|
| - new VersionedTestInstaller());
|
| -
|
| - ++num_calls;
|
| -
|
| - CrxComponent crx;
|
| - crx.name = "test_ihfo";
|
| - crx.pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
|
| - crx.installer = installer;
|
| - if (num_calls == 1) {
|
| - crx.version = Version("0.8");
|
| - } else if (num_calls == 2) {
|
| - crx.version = Version("1.0");
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - components->push_back(crx);
|
| - }
|
| - };
|
| -
|
| - 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 scoped_ptr<UpdateChecker> Create(const Configurator& config) {
|
| - return scoped_ptr<UpdateChecker>(new FakeUpdateChecker());
|
| - }
|
| -
|
| - bool CheckForUpdates(
|
| - const std::vector<CrxUpdateItem*>& items_to_check,
|
| - const std::string& additional_attributes,
|
| - const UpdateCheckCallback& update_check_callback) override {
|
| - static int num_call = 0;
|
| - ++num_call;
|
| -
|
| - UpdateResponse::Results results;
|
| -
|
| - if (num_call == 1) {
|
| - /*
|
| - Fake the following response:
|
| - <?xml version='1.0' encoding='UTF-8'?>
|
| - <response protocol='3.0'>
|
| - <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'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package;
|
| - package.name = "ihfokbkgjpifnbbojhneepfflplebdkc_1.crx";
|
| - package.fingerprint = "1";
|
| - UpdateResponse::Result result;
|
| - result.extension_id = "ihfokbkgjpifnbbojhneepfflplebdkc";
|
| - result.crx_urls.push_back(GURL("http://localhost/download/"));
|
| - result.manifest.version = "1.0";
|
| - result.manifest.browser_min_version = "11.0.1.0";
|
| - result.manifest.packages.push_back(package);
|
| - results.list.push_back(result);
|
| - } else if (num_call == 2) {
|
| - /*
|
| - Fake the following response:
|
| - <?xml version='1.0' encoding='UTF-8'?>
|
| - <response protocol='3.0'>
|
| - <app appid='ihfokbkgjpifnbbojhneepfflplebdkc'>
|
| - <updatecheck status='ok'>
|
| - <urls>
|
| - <url codebase='http://localhost/download/'/>
|
| - <url codebasediff='http://localhost/download/'/>
|
| - </urls>
|
| - <manifest version='2.0' prodversionmin='11.0.1.0'>
|
| - <packages>
|
| - <package name='ihfokbkgjpifnbbojhneepfflplebdkc_2.crx'
|
| - namediff='ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx'
|
| - fp='22'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package;
|
| - package.name = "ihfokbkgjpifnbbojhneepfflplebdkc_2.crx";
|
| - package.namediff = "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx";
|
| - package.fingerprint = "22";
|
| - UpdateResponse::Result result;
|
| - result.extension_id = "ihfokbkgjpifnbbojhneepfflplebdkc";
|
| - result.crx_urls.push_back(GURL("http://localhost/download/"));
|
| - result.crx_diffurls.push_back(GURL("http://localhost/download/"));
|
| - result.manifest.version = "2.0";
|
| - result.manifest.browser_min_version = "11.0.1.0";
|
| - result.manifest.packages.push_back(package);
|
| - results.list.push_back(result);
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(update_check_callback, GURL(), 0, "", results));
|
| - return true;
|
| - }
|
| - };
|
| -
|
| - class FakeCrxDownloader : public CrxDownloader {
|
| - public:
|
| - static scoped_ptr<CrxDownloader> Create(
|
| - bool is_background_download,
|
| - net::URLRequestContextGetter* context_getter,
|
| - const scoped_refptr<base::SequencedTaskRunner>& url_fetcher_task_runner,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>&
|
| - background_task_runner) {
|
| - return scoped_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| - }
|
| -
|
| - private:
|
| - FakeCrxDownloader() : CrxDownloader(scoped_ptr<CrxDownloader>().Pass()) {}
|
| - ~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 if (url.path() ==
|
| - "/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx") {
|
| - download_metrics.url = url;
|
| - download_metrics.downloader = DownloadMetrics::kNone;
|
| - download_metrics.error = 0;
|
| - download_metrics.downloaded_bytes = 2105;
|
| - download_metrics.total_bytes = 2105;
|
| - download_metrics.download_time_ms = 1000;
|
| -
|
| - EXPECT_TRUE(MakeTestFile(
|
| - TestFilePath("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"), &path));
|
| -
|
| - result.error = 0;
|
| - result.response = path;
|
| - result.downloaded_bytes = 2105;
|
| - result.total_bytes = 2105;
|
| - } 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 Configurator& config)
|
| - : FakePingManagerImpl(config) {}
|
| - ~FakePingManager() override {
|
| - const auto& ping_items = items();
|
| - EXPECT_EQ(2U, ping_items.size());
|
| - EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[0].id);
|
| - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[0].previous_version));
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version));
|
| - EXPECT_EQ(0, ping_items[0].error_category);
|
| - EXPECT_EQ(0, ping_items[0].error_code);
|
| - EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id);
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].previous_version));
|
| - EXPECT_TRUE(base::Version("2.0").Equals(ping_items[1].next_version));
|
| - EXPECT_EQ(0, ping_items[1].diff_error_category);
|
| - EXPECT_EQ(0, ping_items[1].diff_error_code);
|
| - }
|
| - };
|
| -
|
| - scoped_ptr<FakePingManager> ping_manager(new FakePingManager(*config_));
|
| - scoped_ptr<UpdateClient> update_client(new UpdateClientImpl(
|
| - config_, ping_manager.Pass(), &FakeUpdateChecker::Create,
|
| - &FakeCrxDownloader::Create));
|
| -
|
| - MockObserver observer;
|
| - {
|
| - 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_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);
|
| - 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_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("ihfokbkgjpifnbbojhneepfflplebdkc"));
|
| -
|
| - {
|
| - base::RunLoop runloop;
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, runloop.QuitClosure()));
|
| - runloop.Run();
|
| - }
|
| -
|
| - {
|
| - base::RunLoop runloop;
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, runloop.QuitClosure()));
|
| - runloop.Run();
|
| - }
|
| -
|
| - update_client->RemoveObserver(&observer);
|
| -}
|
| -
|
| -// Tests the update scenario for one CRX where the CRX installer returns
|
| -// an error.
|
| -TEST_F(UpdateClientTest, OneCrxInstallError) {
|
| - class MockInstaller : public CrxInstaller {
|
| - public:
|
| - MOCK_METHOD1(OnUpdateError, void(int error));
|
| - MOCK_METHOD2(Install,
|
| - bool(const base::DictionaryValue& manifest,
|
| - const base::FilePath& unpack_path));
|
| - MOCK_METHOD2(GetInstalledFile,
|
| - bool(const std::string& file, base::FilePath* installed_file));
|
| - MOCK_METHOD0(Uninstall, bool());
|
| -
|
| - static void OnInstall(const base::DictionaryValue& manifest,
|
| - const base::FilePath& unpack_path) {
|
| - base::DeleteFile(unpack_path, true);
|
| - }
|
| -
|
| - protected:
|
| - ~MockInstaller() override {}
|
| - };
|
| -
|
| - class DataCallbackFake {
|
| - public:
|
| - static void Callback(const std::vector<std::string>& ids,
|
| - std::vector<CrxComponent>* components) {
|
| - scoped_refptr<MockInstaller> installer(new MockInstaller());
|
| -
|
| - EXPECT_CALL(*installer, OnUpdateError(_)).Times(0);
|
| - EXPECT_CALL(*installer, Install(_, _))
|
| - .WillOnce(DoAll(Invoke(MockInstaller::OnInstall), Return(false)));
|
| - EXPECT_CALL(*installer, GetInstalledFile(_, _)).Times(0);
|
| - EXPECT_CALL(*installer, Uninstall()).Times(0);
|
| -
|
| - CrxComponent crx;
|
| - crx.name = "test_jebg";
|
| - crx.pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash));
|
| - crx.version = Version("0.9");
|
| - crx.installer = installer;
|
| - components->push_back(crx);
|
| - }
|
| - };
|
| -
|
| - 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 scoped_ptr<UpdateChecker> Create(const Configurator& config) {
|
| - return scoped_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'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package;
|
| - package.name = "jebgalgnebhfojomionfpkfelancnnkf.crx";
|
| -
|
| - UpdateResponse::Result result;
|
| - result.extension_id = "jebgalgnebhfojomionfpkfelancnnkf";
|
| - result.crx_urls.push_back(GURL("http://localhost/download/"));
|
| - result.manifest.version = "1.0";
|
| - result.manifest.browser_min_version = "11.0.1.0";
|
| - result.manifest.packages.push_back(package);
|
| -
|
| - UpdateResponse::Results results;
|
| - results.list.push_back(result);
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(update_check_callback, GURL(), 0, "", results));
|
| - return true;
|
| - }
|
| - };
|
| -
|
| - class FakeCrxDownloader : public CrxDownloader {
|
| - public:
|
| - static scoped_ptr<CrxDownloader> Create(
|
| - bool is_background_download,
|
| - net::URLRequestContextGetter* context_getter,
|
| - const scoped_refptr<base::SequencedTaskRunner>& url_fetcher_task_runner,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>&
|
| - background_task_runner) {
|
| - return scoped_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| - }
|
| -
|
| - private:
|
| - FakeCrxDownloader() : CrxDownloader(scoped_ptr<CrxDownloader>().Pass()) {}
|
| - ~FakeCrxDownloader() override {}
|
| -
|
| - void DoStartDownload(const GURL& url) override {
|
| - DownloadMetrics download_metrics;
|
| - download_metrics.url = url;
|
| - download_metrics.downloader = DownloadMetrics::kNone;
|
| - download_metrics.error = 0;
|
| - download_metrics.downloaded_bytes = 1843;
|
| - download_metrics.total_bytes = 1843;
|
| - download_metrics.download_time_ms = 1000;
|
| -
|
| - FilePath path;
|
| - EXPECT_TRUE(MakeTestFile(
|
| - TestFilePath("jebgalgnebhfojomionfpkfelancnnkf.crx"), &path));
|
| -
|
| - Result result;
|
| - result.error = 0;
|
| - result.response = path;
|
| - result.downloaded_bytes = 1843;
|
| - result.total_bytes = 1843;
|
| -
|
| - 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 Configurator& config)
|
| - : FakePingManagerImpl(config) {}
|
| - ~FakePingManager() override {
|
| - const auto& ping_items = items();
|
| - EXPECT_EQ(1U, ping_items.size());
|
| - EXPECT_EQ("jebgalgnebhfojomionfpkfelancnnkf", ping_items[0].id);
|
| - EXPECT_TRUE(base::Version("0.9").Equals(ping_items[0].previous_version));
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version));
|
| - EXPECT_EQ(3, ping_items[0].error_category); // kInstallError.
|
| - EXPECT_EQ(9, ping_items[0].error_code); // kInstallerError.
|
| - }
|
| - };
|
| -
|
| - scoped_ptr<PingManager> ping_manager(new FakePingManager(*config_));
|
| - scoped_ptr<UpdateClient> update_client(new UpdateClientImpl(
|
| - config_, ping_manager.Pass(), &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_UPDATE_DOWNLOADING,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_UPDATE_READY,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - EXPECT_CALL(observer, OnEvent(Events::COMPONENT_NOT_UPDATED,
|
| - "jebgalgnebhfojomionfpkfelancnnkf")).Times(1);
|
| - }
|
| -
|
| - update_client->AddObserver(&observer);
|
| -
|
| - std::vector<std::string> ids;
|
| - ids.push_back(std::string("jebgalgnebhfojomionfpkfelancnnkf"));
|
| -
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, quit_closure_));
|
| -
|
| - RunThreads();
|
| -
|
| - update_client->RemoveObserver(&observer);
|
| -}
|
| -
|
| -// Tests the fallback from differential to full update scenario for one CRX.
|
| -TEST_F(UpdateClientTest, OneCrxDiffUpdateFailsFullUpdateSucceeds) {
|
| - class DataCallbackFake {
|
| - public:
|
| - static void Callback(const std::vector<std::string>& ids,
|
| - std::vector<CrxComponent>* components) {
|
| - static int num_calls = 0;
|
| -
|
| - // Must use the same stateful installer object.
|
| - static scoped_refptr<CrxInstaller> installer(
|
| - new VersionedTestInstaller());
|
| -
|
| - ++num_calls;
|
| -
|
| - CrxComponent crx;
|
| - crx.name = "test_ihfo";
|
| - crx.pk_hash.assign(ihfo_hash, ihfo_hash + arraysize(ihfo_hash));
|
| - crx.installer = installer;
|
| - if (num_calls == 1) {
|
| - crx.version = Version("0.8");
|
| - } else if (num_calls == 2) {
|
| - crx.version = Version("1.0");
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - components->push_back(crx);
|
| - }
|
| - };
|
| -
|
| - 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 scoped_ptr<UpdateChecker> Create(const Configurator& config) {
|
| - return scoped_ptr<UpdateChecker>(new FakeUpdateChecker());
|
| - }
|
| -
|
| - bool CheckForUpdates(
|
| - const std::vector<CrxUpdateItem*>& items_to_check,
|
| - const std::string& additional_attributes,
|
| - const UpdateCheckCallback& update_check_callback) override {
|
| - static int num_call = 0;
|
| - ++num_call;
|
| -
|
| - UpdateResponse::Results results;
|
| -
|
| - if (num_call == 1) {
|
| - /*
|
| - Fake the following response:
|
| - <?xml version='1.0' encoding='UTF-8'?>
|
| - <response protocol='3.0'>
|
| - <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'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package;
|
| - package.name = "ihfokbkgjpifnbbojhneepfflplebdkc_1.crx";
|
| - package.fingerprint = "1";
|
| - UpdateResponse::Result result;
|
| - result.extension_id = "ihfokbkgjpifnbbojhneepfflplebdkc";
|
| - result.crx_urls.push_back(GURL("http://localhost/download/"));
|
| - result.manifest.version = "1.0";
|
| - result.manifest.browser_min_version = "11.0.1.0";
|
| - result.manifest.packages.push_back(package);
|
| - results.list.push_back(result);
|
| - } else if (num_call == 2) {
|
| - /*
|
| - Fake the following response:
|
| - <?xml version='1.0' encoding='UTF-8'?>
|
| - <response protocol='3.0'>
|
| - <app appid='ihfokbkgjpifnbbojhneepfflplebdkc'>
|
| - <updatecheck status='ok'>
|
| - <urls>
|
| - <url codebase='http://localhost/download/'/>
|
| - <url codebasediff='http://localhost/download/'/>
|
| - </urls>
|
| - <manifest version='2.0' prodversionmin='11.0.1.0'>
|
| - <packages>
|
| - <package name='ihfokbkgjpifnbbojhneepfflplebdkc_2.crx'
|
| - namediff='ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx'
|
| - fp='22'/>
|
| - </packages>
|
| - </manifest>
|
| - </updatecheck>
|
| - </app>
|
| - </response>
|
| - */
|
| - UpdateResponse::Result::Manifest::Package package;
|
| - package.name = "ihfokbkgjpifnbbojhneepfflplebdkc_2.crx";
|
| - package.namediff = "ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx";
|
| - package.fingerprint = "22";
|
| - UpdateResponse::Result result;
|
| - result.extension_id = "ihfokbkgjpifnbbojhneepfflplebdkc";
|
| - result.crx_urls.push_back(GURL("http://localhost/download/"));
|
| - result.crx_diffurls.push_back(GURL("http://localhost/download/"));
|
| - result.manifest.version = "2.0";
|
| - result.manifest.browser_min_version = "11.0.1.0";
|
| - result.manifest.packages.push_back(package);
|
| - results.list.push_back(result);
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(update_check_callback, GURL(), 0, "", results));
|
| - return true;
|
| - }
|
| - };
|
| -
|
| - class FakeCrxDownloader : public CrxDownloader {
|
| - public:
|
| - static scoped_ptr<CrxDownloader> Create(
|
| - bool is_background_download,
|
| - net::URLRequestContextGetter* context_getter,
|
| - const scoped_refptr<base::SequencedTaskRunner>& url_fetcher_task_runner,
|
| - const scoped_refptr<base::SingleThreadTaskRunner>&
|
| - background_task_runner) {
|
| - return scoped_ptr<CrxDownloader>(new FakeCrxDownloader());
|
| - }
|
| -
|
| - private:
|
| - FakeCrxDownloader() : CrxDownloader(scoped_ptr<CrxDownloader>().Pass()) {}
|
| - ~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 if (url.path() ==
|
| - "/download/ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx") {
|
| - // A download error is injected on this execution path.
|
| - download_metrics.url = url;
|
| - download_metrics.downloader = DownloadMetrics::kNone;
|
| - download_metrics.error = -1;
|
| - download_metrics.downloaded_bytes = 0;
|
| - download_metrics.total_bytes = 2105;
|
| - download_metrics.download_time_ms = 1000;
|
| -
|
| - EXPECT_TRUE(MakeTestFile(
|
| - TestFilePath("ihfokbkgjpifnbbojhneepfflplebdkc_1to2.crx"), &path));
|
| -
|
| - result.error = -1;
|
| - result.response = path;
|
| - result.downloaded_bytes = 0;
|
| - result.total_bytes = 2105;
|
| - } else if (url.path() ==
|
| - "/download/ihfokbkgjpifnbbojhneepfflplebdkc_2.crx") {
|
| - download_metrics.url = url;
|
| - download_metrics.downloader = DownloadMetrics::kNone;
|
| - download_metrics.error = 0;
|
| - download_metrics.downloaded_bytes = 53855;
|
| - download_metrics.total_bytes = 53855;
|
| - download_metrics.download_time_ms = 1000;
|
| -
|
| - EXPECT_TRUE(MakeTestFile(
|
| - TestFilePath("ihfokbkgjpifnbbojhneepfflplebdkc_2.crx"), &path));
|
| -
|
| - result.error = 0;
|
| - result.response = path;
|
| - result.downloaded_bytes = 53855;
|
| - result.total_bytes = 53855;
|
| - }
|
| -
|
| - 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 Configurator& config)
|
| - : FakePingManagerImpl(config) {}
|
| - ~FakePingManager() override {
|
| - const auto& ping_items = items();
|
| - EXPECT_EQ(2U, ping_items.size());
|
| - EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[0].id);
|
| - EXPECT_TRUE(base::Version("0.8").Equals(ping_items[0].previous_version));
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[0].next_version));
|
| - EXPECT_EQ(0, ping_items[0].error_category);
|
| - EXPECT_EQ(0, ping_items[0].error_code);
|
| - EXPECT_EQ("ihfokbkgjpifnbbojhneepfflplebdkc", ping_items[1].id);
|
| - EXPECT_TRUE(base::Version("1.0").Equals(ping_items[1].previous_version));
|
| - EXPECT_TRUE(base::Version("2.0").Equals(ping_items[1].next_version));
|
| - EXPECT_TRUE(ping_items[1].diff_update_failed);
|
| - EXPECT_EQ(1, ping_items[1].diff_error_category); // kNetworkError.
|
| - EXPECT_EQ(-1, ping_items[1].diff_error_code);
|
| - }
|
| - };
|
| -
|
| - scoped_ptr<FakePingManager> ping_manager(new FakePingManager(*config_));
|
| - scoped_ptr<UpdateClient> update_client(new UpdateClientImpl(
|
| - config_, ping_manager.Pass(), &FakeUpdateChecker::Create,
|
| - &FakeCrxDownloader::Create));
|
| -
|
| - MockObserver observer;
|
| - {
|
| - 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_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);
|
| -
|
| - 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_UPDATE_DOWNLOADING,
|
| - "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("ihfokbkgjpifnbbojhneepfflplebdkc"));
|
| -
|
| - {
|
| - base::RunLoop runloop;
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, runloop.QuitClosure()));
|
| - runloop.Run();
|
| - }
|
| -
|
| - {
|
| - base::RunLoop runloop;
|
| - update_client->Update(
|
| - ids, base::Bind(&DataCallbackFake::Callback),
|
| - base::Bind(&CompletionCallbackFake::Callback, runloop.QuitClosure()));
|
| - runloop.Run();
|
| - }
|
| -
|
| - update_client->RemoveObserver(&observer);
|
| -}
|
| -
|
| -} // namespace update_client
|
|
|