| 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 6f663664b0dbffc174231397cb3abca107cadef4..c5bccb0acacbb323445966fbcc999b4a21a5df45 100644
|
| --- a/components/update_client/update_client_unittest.cc
|
| +++ b/components/update_client/update_client_unittest.cc
|
| @@ -1974,6 +1974,120 @@ TEST_F(UpdateClientTest, OneCrxInstall) {
|
| StopWorkerPool();
|
| }
|
|
|
| +// Tests that overlapping installs of the same CRX result in an error.
|
| +TEST_F(UpdateClientTest, ConcurrentInstallSameCRX) {
|
| + 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.0");
|
| + crx.installer = new TestInstaller;
|
| +
|
| + components->push_back(crx);
|
| + }
|
| + };
|
| +
|
| + class CompletionCallbackFake {
|
| + public:
|
| + static void Callback(const base::Closure& quit_closure, int error) {
|
| + static int num_call = 0;
|
| + ++num_call;
|
| +
|
| + EXPECT_LE(num_call, 2);
|
| +
|
| + if (num_call == 1) {
|
| + EXPECT_EQ(Error::ERROR_UPDATE_IN_PROGRESS, error);
|
| + return;
|
| + }
|
| + if (num_call == 2) {
|
| + 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) {
|
| + 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<FakePingManager> ping_manager(new FakePingManager(*config()));
|
| + scoped_refptr<UpdateClient> update_client(new UpdateClientImpl(
|
| + config(), ping_manager.Pass(), &FakeUpdateChecker::Create,
|
| + &FakeCrxDownloader::Create));
|
| +
|
| + // Verify that calling Install sets ondemand.
|
| + OnDemandTester ondemand_tester(update_client, true);
|
| +
|
| + MockObserver observer;
|
| + ON_CALL(observer, OnEvent(_, _))
|
| + .WillByDefault(Invoke(&ondemand_tester, &OnDemandTester::CheckOnDemand));
|
| +
|
| + 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);
|
| +
|
| + update_client->Install(
|
| + std::string("jebgalgnebhfojomionfpkfelancnnkf"),
|
| + base::Bind(&DataCallbackFake::Callback),
|
| + base::Bind(&CompletionCallbackFake::Callback, quit_closure()));
|
| +
|
| + update_client->Install(
|
| + std::string("jebgalgnebhfojomionfpkfelancnnkf"),
|
| + base::Bind(&DataCallbackFake::Callback),
|
| + base::Bind(&CompletionCallbackFake::Callback, quit_closure()));
|
| +
|
| + RunThreads();
|
| +
|
| + update_client->RemoveObserver(&observer);
|
| +
|
| + StopWorkerPool();
|
| +}
|
| +
|
| // Make sure that we don't get any crashes when trying to update an empty list
|
| // of ids.
|
| TEST_F(UpdateClientTest, EmptyIdList) {
|
|
|