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

Unified Diff: chrome/browser/extensions/extension_service_unittest.cc

Issue 1495403002: Observe adding external extensions via windows registry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move prefs to OnUpdated's param, instead of storing, to avoid multi-thread issues Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_service_unittest.cc
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 8047d11b1c2e51ca1692e5a014c167b0073568f7..27b95131df6fe514d719989d232efafe3eea77e8 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -97,6 +97,7 @@
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
+#include "extensions/browser/external_install_info.h"
#include "extensions/browser/external_provider_interface.h"
#include "extensions/browser/install_flag.h"
#include "extensions/browser/management_policy.h"
@@ -163,6 +164,9 @@ using extensions::ExtensionRegistry;
using extensions::ExtensionResource;
using extensions::ExtensionSystem;
using extensions::ExternalInstallError;
+using extensions::ExternalInstallInfoFile;
+using extensions::ExternalInstallInfoUpdateUrl;
+using extensions::ExternalProviderInterface;
using extensions::FakeSafeBrowsingDatabaseManager;
using extensions::FeatureSwitch;
using extensions::Manifest;
@@ -248,11 +252,12 @@ class MockExtensionProvider : public extensions::ExternalProviderInterface {
visit_count_++;
for (DataMap::const_iterator i = extension_map_.begin();
i != extension_map_.end(); ++i) {
- Version version(i->second.first);
+ scoped_ptr<Version> version(new Version(i->second.first));
- visitor_->OnExternalExtensionFileFound(
- i->first, &version, i->second.second, location_,
- Extension::NO_FLAGS, false, false);
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ i->first, std::move(version), i->second.second, location_,
+ Extension::NO_FLAGS, false, false));
+ visitor_->OnExternalExtensionFileFound(*info);
}
visitor_->OnExternalProviderReady(this);
}
@@ -324,26 +329,22 @@ class MockProviderVisitor
}
int Visit(const std::string& json_data) {
+ return Visit(json_data, Manifest::EXTERNAL_PREF,
+ Manifest::EXTERNAL_PREF_DOWNLOAD);
+ }
+
+ int Visit(const std::string& json_data,
+ Manifest::Location crx_location,
+ Manifest::Location download_location) {
+ crx_location_ = crx_location;
// Give the test json file to the provider for parsing.
provider_.reset(new extensions::ExternalProviderImpl(
- this,
- new extensions::ExternalTestingLoader(json_data, fake_base_path_),
- profile_.get(),
- Manifest::EXTERNAL_PREF,
- Manifest::EXTERNAL_PREF_DOWNLOAD,
- Extension::NO_FLAGS));
+ this, new extensions::ExternalTestingLoader(json_data, fake_base_path_),
+ profile_.get(), crx_location, download_location, Extension::NO_FLAGS));
// We also parse the file into a dictionary to compare what we get back
// from the provider.
- JSONStringValueDeserializer deserializer(json_data);
- scoped_ptr<base::Value> json_value = deserializer.Deserialize(NULL, NULL);
-
- if (!json_value || !json_value->IsType(base::Value::TYPE_DICTIONARY)) {
- NOTREACHED() << "Unable to deserialize json data";
- return -1;
- } else {
- prefs_ = base::DictionaryValue::From(std::move(json_value));
- }
+ prefs_ = GetDictionaryFromJSON(json_data);
// Reset our counter.
ids_found_ = 0;
@@ -353,85 +354,90 @@ class MockProviderVisitor
return ids_found_;
}
- bool OnExternalExtensionFileFound(const std::string& id,
- const Version* version,
- const base::FilePath& path,
- Manifest::Location unused,
- int creation_flags,
- bool mark_acknowledged,
- bool install_immediately) override {
- EXPECT_EQ(expected_creation_flags_, creation_flags);
+ bool OnExternalExtensionFileFound(
+ const ExternalInstallInfoFile& info) override {
+ EXPECT_EQ(expected_creation_flags_, info.creation_flags);
++ids_found_;
base::DictionaryValue* pref;
// This tests is to make sure that the provider only notifies us of the
// values we gave it. So if the id we doesn't exist in our internal
// dictionary then something is wrong.
- EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
- << "Got back ID (" << id.c_str() << ") we weren't expecting";
+ EXPECT_TRUE(prefs_->GetDictionary(info.extension_id, &pref))
+ << "Got back ID (" << info.extension_id.c_str()
+ << ") we weren't expecting";
- EXPECT_TRUE(path.IsAbsolute());
+ EXPECT_TRUE(info.path.IsAbsolute());
if (!fake_base_path_.empty())
- EXPECT_TRUE(fake_base_path_.IsParent(path));
+ EXPECT_TRUE(fake_base_path_.IsParent(info.path));
if (pref) {
- EXPECT_TRUE(provider_->HasExtension(id));
+ EXPECT_TRUE(provider_->HasExtension(info.extension_id));
// Ask provider if the extension we got back is registered.
Manifest::Location location = Manifest::INVALID_LOCATION;
scoped_ptr<Version> v1;
base::FilePath crx_path;
- EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1));
- EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
+ EXPECT_TRUE(provider_->GetExtensionDetails(info.extension_id, NULL, &v1));
+ EXPECT_STREQ(info.version->GetString().c_str(), v1->GetString().c_str());
scoped_ptr<Version> v2;
- EXPECT_TRUE(provider_->GetExtensionDetails(id, &location, &v2));
- EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
- EXPECT_STREQ(version->GetString().c_str(), v2->GetString().c_str());
- EXPECT_EQ(Manifest::EXTERNAL_PREF, location);
+ EXPECT_TRUE(
+ provider_->GetExtensionDetails(info.extension_id, &location, &v2));
+ EXPECT_STREQ(info.version->GetString().c_str(), v1->GetString().c_str());
+ EXPECT_STREQ(info.version->GetString().c_str(), v2->GetString().c_str());
+ EXPECT_EQ(crx_location_, location);
// Remove it so we won't count it ever again.
- prefs_->Remove(id, NULL);
+ prefs_->Remove(info.extension_id, NULL);
}
return true;
}
- bool OnExternalExtensionUpdateUrlFound(const std::string& id,
- const std::string& install_parameter,
- const GURL& update_url,
- Manifest::Location location,
- int creation_flags,
- bool mark_acknowledged) override {
+ bool OnExternalExtensionUpdateUrlFound(
+ const ExternalInstallInfoUpdateUrl& info,
+ bool is_initial_load) override {
++ids_found_;
base::DictionaryValue* pref;
// This tests is to make sure that the provider only notifies us of the
// values we gave it. So if the id we doesn't exist in our internal
// dictionary then something is wrong.
- EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
- << L"Got back ID (" << id.c_str() << ") we weren't expecting";
- EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location);
+ EXPECT_TRUE(prefs_->GetDictionary(info.extension_id, &pref))
+ << L"Got back ID (" << info.extension_id.c_str()
+ << ") we weren't expecting";
+ EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, info.download_location);
if (pref) {
- EXPECT_TRUE(provider_->HasExtension(id));
+ EXPECT_TRUE(provider_->HasExtension(info.extension_id));
// External extensions with update URLs do not have versions.
scoped_ptr<Version> v1;
Manifest::Location location1 = Manifest::INVALID_LOCATION;
- EXPECT_TRUE(provider_->GetExtensionDetails(id, &location1, &v1));
+ EXPECT_TRUE(
+ provider_->GetExtensionDetails(info.extension_id, &location1, &v1));
EXPECT_FALSE(v1.get());
EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, location1);
std::string parsed_install_parameter;
pref->GetString("install_parameter", &parsed_install_parameter);
- EXPECT_EQ(parsed_install_parameter, install_parameter);
+ EXPECT_EQ(parsed_install_parameter, info.install_parameter);
// Remove it so we won't count it again.
- prefs_->Remove(id, NULL);
+ prefs_->Remove(info.extension_id, NULL);
}
return true;
}
+ void OnExternalProviderUpdateComplete(
+ const ExternalProviderInterface* provider,
+ const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
+ const ScopedVector<ExternalInstallInfoFile>& file_extensions,
+ const std::set<std::string>& removed_extensions) override {
+ ADD_FAILURE() << "MockProviderVisitor does not provide incremental updates,"
+ " use MockUpdateProviderVisitor instead.";
+ }
+
void OnExternalProviderReady(
const extensions::ExternalProviderInterface* provider) override {
EXPECT_EQ(provider, provider_.get());
@@ -440,17 +446,98 @@ class MockProviderVisitor
Profile* profile() { return profile_.get(); }
+ protected:
+ scoped_ptr<extensions::ExternalProviderImpl> provider_;
+
+ scoped_ptr<base::DictionaryValue> GetDictionaryFromJSON(
+ const std::string& json_data) {
+ // We also parse the file into a dictionary to compare what we get back
+ // from the provider.
+ JSONStringValueDeserializer deserializer(json_data);
+ scoped_ptr<base::Value> json_value = deserializer.Deserialize(NULL, NULL);
+
+ if (!json_value || !json_value->IsType(base::Value::TYPE_DICTIONARY)) {
+ ADD_FAILURE() << "Unable to deserialize json data";
+ return scoped_ptr<base::DictionaryValue>();
+ } else {
+ return base::DictionaryValue::From(std::move(json_value));
+ }
+ }
+
private:
int ids_found_;
base::FilePath fake_base_path_;
int expected_creation_flags_;
- scoped_ptr<extensions::ExternalProviderImpl> provider_;
+ Manifest::Location crx_location_;
scoped_ptr<base::DictionaryValue> prefs_;
scoped_ptr<TestingProfile> profile_;
DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor);
};
+// Mock provider that can simulate incremental update like
+// ExternalRegistryLoader.
+class MockUpdateProviderVisitor : public MockProviderVisitor {
+ public:
+ // The provider will return |fake_base_path| from
+ // GetBaseCrxFilePath(). User can test the behavior with
+ // and without an empty path using this parameter.
+ explicit MockUpdateProviderVisitor(base::FilePath fake_base_path)
+ : MockProviderVisitor(fake_base_path) {}
+
+ void VisitDueToUpdate(const std::string& json_data) {
+ update_url_extension_ids_.clear();
+ file_extension_ids_.clear();
+ removed_extension_ids_.clear();
+
+ scoped_ptr<base::DictionaryValue> new_prefs =
+ GetDictionaryFromJSON(json_data);
+ if (!new_prefs)
+ return;
+ provider_->UpdatePrefs(new_prefs.release());
+ }
+
+ void OnExternalProviderUpdateComplete(
+ const ExternalProviderInterface* provider,
+ const ScopedVector<ExternalInstallInfoUpdateUrl>& update_url_extensions,
+ const ScopedVector<ExternalInstallInfoFile>& file_extensions,
+ const std::set<std::string>& removed_extensions) override {
+ for (const auto& extension_info : update_url_extensions)
+ update_url_extension_ids_.insert(extension_info->extension_id);
+ EXPECT_EQ(update_url_extension_ids_.size(), update_url_extensions.size());
+
+ for (const auto& extension_info : file_extensions)
+ file_extension_ids_.insert(extension_info->extension_id);
+ EXPECT_EQ(file_extension_ids_.size(), file_extensions.size());
+
+ for (const auto& extension_id : removed_extensions)
+ removed_extension_ids_.insert(extension_id);
+ }
+
+ size_t GetUpdateURLExtensionCount() {
+ return update_url_extension_ids_.size();
+ }
+ size_t GetFileExtensionCount() { return file_extension_ids_.size(); }
+ size_t GetRemovedExtensionCount() { return removed_extension_ids_.size(); }
+
+ bool HasSeenUpdateWithUpdateUrl(const std::string& extension_id) {
+ return update_url_extension_ids_.count(extension_id) > 0u;
+ }
+ bool HasSeenUpdateWithFile(const std::string& extension_id) {
+ return file_extension_ids_.count(extension_id) > 0u;
+ }
+ bool HasSeenRemoval(const std::string& extension_id) {
+ return removed_extension_ids_.count(extension_id) > 0u;
+ }
+
+ private:
+ std::set<std::string> update_url_extension_ids_;
+ std::set<std::string> file_extension_ids_;
+ std::set<std::string> removed_extension_ids_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockUpdateProviderVisitor);
+};
+
class ExtensionServiceTest
: public extensions::ExtensionServiceTestWithInstall {
public:
@@ -1029,20 +1116,16 @@ TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) {
service()->set_extensions_enabled(true);
// Register and install an external extension.
- Version version("1.0.0.0");
+ scoped_ptr<Version> version(new Version("1.0.0.0"));
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- if (service()->OnExternalExtensionFileFound(
- good_crx,
- &version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::FROM_BOOKMARK,
- false /* mark_acknowledged */,
- false /* install_immediately */)) {
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ good_crx, std::move(version), path, Manifest::EXTERNAL_PREF,
+ Extension::FROM_BOOKMARK, false /* mark_acknowledged */,
+ false /* install_immediately */));
+ if (service()->OnExternalExtensionFileFound(*info))
observer.Wait();
- }
const Extension* extension = service()->GetExtensionById(good_crx, false);
ASSERT_TRUE(extension);
@@ -1066,19 +1149,15 @@ TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) {
service()->set_extensions_enabled(true);
// Install an external extension.
- Version version("1.0.0.0");
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- if (service()->OnExternalExtensionFileFound(good_crx,
- &version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false)) {
+ scoped_ptr<Version> version(new Version("1.0.0.0"));
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ good_crx, std::move(version), path, Manifest::EXTERNAL_PREF,
+ Extension::NO_FLAGS, false, false));
+ if (service()->OnExternalExtensionFileFound(*info))
observer.Wait();
- }
ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
@@ -1088,28 +1167,19 @@ TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) {
Extension::EXTERNAL_EXTENSION_UNINSTALLED);
// Try to re-install it externally. This should fail because of the killbit.
- service()->OnExternalExtensionFileFound(good_crx,
- &version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false);
+ service()->OnExternalExtensionFileFound(*info);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
ValidateIntegerPref(good_crx, "state",
Extension::EXTERNAL_EXTENSION_UNINSTALLED);
- version = Version("1.0.0.1");
+ version.reset(new Version("1.0.0.1"));
// Repeat the same thing with a newer version of the extension.
path = data_dir().AppendASCII("good2.crx");
- service()->OnExternalExtensionFileFound(good_crx,
- &version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false);
+ info.reset(new ExternalInstallInfoFile(good_crx, std::move(version), path,
+ Manifest::EXTERNAL_PREF,
+ Extension::NO_FLAGS, false, false));
+ service()->OnExternalExtensionFileFound(*info);
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(NULL == service()->GetExtensionById(good_crx, false));
ValidateIntegerPref(good_crx, "state",
@@ -1160,7 +1230,7 @@ TEST_F(ExtensionServiceTest, FailOnWrongId) {
base::FilePath path = data_dir().AppendASCII("good.crx");
service()->set_extensions_enabled(true);
- Version version("1.0.0.0");
+ scoped_ptr<Version> version(new Version("1.0.0.0"));
const std::string wrong_id = all_zero;
const std::string correct_id = good_crx;
@@ -1171,13 +1241,10 @@ TEST_F(ExtensionServiceTest, FailOnWrongId) {
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- service()->OnExternalExtensionFileFound(wrong_id,
- &version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false);
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ wrong_id, std::move(version), path, Manifest::EXTERNAL_PREF,
+ Extension::NO_FLAGS, false, false));
+ service()->OnExternalExtensionFileFound(*info);
observer.Wait();
ASSERT_FALSE(service()->GetExtensionById(good_crx, false));
@@ -1186,15 +1253,9 @@ TEST_F(ExtensionServiceTest, FailOnWrongId) {
content::WindowedNotificationObserver observer2(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- if (service()->OnExternalExtensionFileFound(correct_id,
- &version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false)) {
+ info->extension_id = correct_id;
+ if (service()->OnExternalExtensionFileFound(*info))
observer2.Wait();
- }
ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
}
@@ -1206,36 +1267,27 @@ TEST_F(ExtensionServiceTest, FailOnWrongVersion) {
// Install an external extension with a version from the external
// source that is not equal to the version in the extension manifest.
- Version wrong_version("1.2.3.4");
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- service()->OnExternalExtensionFileFound(good_crx,
- &wrong_version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false);
+ scoped_ptr<Version> wrong_version(new Version("1.2.3.4"));
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ good_crx, std::move(wrong_version), path, Manifest::EXTERNAL_PREF,
+ Extension::NO_FLAGS, false, false));
+ service()->OnExternalExtensionFileFound(*info);
observer.Wait();
ASSERT_FALSE(service()->GetExtensionById(good_crx, false));
// Try again with the right version. Expect success.
service()->pending_extension_manager()->Remove(good_crx);
- Version correct_version("1.0.0.0");
+ scoped_ptr<Version> correct_version(new Version("1.0.0.0"));
+ info->version = std::move(correct_version);
content::WindowedNotificationObserver observer2(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- if (service()->OnExternalExtensionFileFound(good_crx,
- &correct_version,
- path,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false)) {
+ if (service()->OnExternalExtensionFileFound(*info))
observer2.Wait();
- }
ASSERT_TRUE(service()->GetExtensionById(good_crx, false));
}
@@ -5051,6 +5103,90 @@ TEST_F(ExtensionServiceTest, DoNotInstallForEnterprise) {
EXPECT_EQ(1, visitor.Visit(json_data));
}
+TEST_F(ExtensionServiceTest, IncrementalUpdateThroughRegistry) {
+ InitializeEmptyExtensionService();
+
+ // Test some valid extension records.
+ // Set a base path to avoid erroring out on relative paths.
+ // Paths starting with // are absolute on every platform we support.
+ base::FilePath base_path(FILE_PATH_LITERAL("//base/path"));
+ ASSERT_TRUE(base_path.IsAbsolute());
+ MockUpdateProviderVisitor visitor(base_path);
+ std::string json_data =
+ "{"
+ " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
+ " \"external_crx\": \"RandomExtension.crx\","
+ " \"external_version\": \"1.0\""
+ " },"
+ " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
+ " \"external_crx\": \"RandomExtension2.crx\","
+ " \"external_version\": \"2.0\""
+ " },"
+ " \"cccccccccccccccccccccccccccccccc\": {"
+ " \"external_update_url\": \"http:\\\\foo.com/update\","
+ " \"install_parameter\": \"id\""
+ " }"
+ "}";
+ EXPECT_EQ(3, visitor.Visit(json_data, Manifest::EXTERNAL_REGISTRY,
+ Manifest::EXTERNAL_PREF_DOWNLOAD));
+
+ // c* removed and d*, e*, f* added, a*, b* existing.
+ json_data =
+ "{"
+ " \"dddddddddddddddddddddddddddddddd\": {"
+ " \"external_crx\": \"RandomExtension3.crx\","
+ " \"external_version\": \"1.0\""
+ " },"
+ " \"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\": {"
+ " \"external_update_url\": \"http:\\\\foo.com/update\","
+ " \"install_parameter\": \"id\""
+ " },"
+ " \"ffffffffffffffffffffffffffffffff\": {"
+ " \"external_update_url\": \"http:\\\\bar.com/update\","
+ " \"install_parameter\": \"id\""
+ " },"
+ " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
+ " \"external_crx\": \"RandomExtension.crx\","
+ " \"external_version\": \"1.0\""
+ " },"
+ " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
+ " \"external_crx\": \"RandomExtension2.crx\","
+ " \"external_version\": \"2.0\""
+ " }"
+ "}";
+
+ // This will simulate registry loader observing new changes in registry and
+ // hence will discover new extensions.
+ visitor.VisitDueToUpdate(json_data);
+
+ // UpdateUrl.
+ EXPECT_EQ(2u, visitor.GetUpdateURLExtensionCount());
+ EXPECT_TRUE(
+ visitor.HasSeenUpdateWithUpdateUrl("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"));
+ EXPECT_TRUE(
+ visitor.HasSeenUpdateWithUpdateUrl("ffffffffffffffffffffffffffffffff"));
+
+ // File.
+ EXPECT_EQ(3u, visitor.GetFileExtensionCount());
+ EXPECT_TRUE(
+ visitor.HasSeenUpdateWithFile("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
+ EXPECT_TRUE(
+ visitor.HasSeenUpdateWithFile("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
+ EXPECT_TRUE(
+ visitor.HasSeenUpdateWithFile("dddddddddddddddddddddddddddddddd"));
+
+ // Removed extensions.
+ EXPECT_EQ(1u, visitor.GetRemovedExtensionCount());
+ EXPECT_TRUE(visitor.HasSeenRemoval("cccccccccccccccccccccccccccccccc"));
+
+ // Simulate all 5 extensions being removed.
+ json_data = "{}";
+ visitor.VisitDueToUpdate(json_data);
+ EXPECT_EQ(0u, visitor.GetUpdateURLExtensionCount());
+ EXPECT_EQ(0u, visitor.GetFileExtensionCount());
+ EXPECT_EQ(5u, visitor.GetRemovedExtensionCount());
+}
+
// Test loading good extensions from the profile directory.
TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) {
// Ensure we're testing in "en" and leave global state untouched.
@@ -5295,33 +5431,22 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) {
EXPECT_FALSE(pending->IsIdPending(kGoodId));
// Skip install when the location is the same.
- EXPECT_FALSE(
- service()->OnExternalExtensionUpdateUrlFound(kGoodId,
- std::string(),
- GURL(kGoodUpdateURL),
- Manifest::INTERNAL,
- Extension::NO_FLAGS,
- false));
+ scoped_ptr<GURL> good_update_url(new GURL(kGoodUpdateURL));
+ scoped_ptr<ExternalInstallInfoUpdateUrl> info(
+ new ExternalInstallInfoUpdateUrl(
+ kGoodId, std::string(), std::move(good_update_url),
+ Manifest::INTERNAL, Extension::NO_FLAGS, false));
+ EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound(*info, true));
EXPECT_FALSE(pending->IsIdPending(kGoodId));
// Install when the location has higher priority.
- EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(
- kGoodId,
- std::string(),
- GURL(kGoodUpdateURL),
- Manifest::EXTERNAL_POLICY_DOWNLOAD,
- Extension::NO_FLAGS,
- false));
+ info->download_location = Manifest::EXTERNAL_POLICY_DOWNLOAD;
+ EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(*info, true));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
// Try the low priority again. Should be rejected.
- EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound(
- kGoodId,
- std::string(),
- GURL(kGoodUpdateURL),
- Manifest::EXTERNAL_PREF_DOWNLOAD,
- Extension::NO_FLAGS,
- false));
+ info->download_location = Manifest::EXTERNAL_PREF_DOWNLOAD;
+ EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound(*info, true));
// The existing record should still be present in the pending extension
// manager.
EXPECT_TRUE(pending->IsIdPending(kGoodId));
@@ -5330,13 +5455,8 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalUpdateUrl) {
// Skip install when the location has the same priority as the installed
// location.
- EXPECT_FALSE(
- service()->OnExternalExtensionUpdateUrlFound(kGoodId,
- std::string(),
- GURL(kGoodUpdateURL),
- Manifest::INTERNAL,
- Extension::NO_FLAGS,
- false));
+ info->download_location = Manifest::INTERNAL;
+ EXPECT_FALSE(service()->OnExternalExtensionUpdateUrlFound(*info, true));
EXPECT_FALSE(pending->IsIdPending(kGoodId));
}
@@ -5374,19 +5494,17 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
service()->pending_extension_manager();
EXPECT_FALSE(pending->IsIdPending(kGoodId));
+ scoped_ptr<Version> older_version_ptr(new Version(older_version));
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ kGoodId, std::move(older_version_ptr), kInvalidPathToCrx,
+ Manifest::INTERNAL, kCreationFlags, kDontMarkAcknowledged,
+ kDontInstallImmediately));
{
// Simulate an external source adding the extension as INTERNAL.
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::INTERNAL,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
observer.Wait();
VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
@@ -5397,14 +5515,8 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::EXTERNAL_PREF;
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
observer.Wait();
VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
@@ -5413,25 +5525,12 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
// Simulate an external source adding as EXTERNAL_PREF again.
// This is rejected because the version and the location are the same as
// the previous installation, which is still pending.
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
// Try INTERNAL again. Should fail.
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::INTERNAL,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::INTERNAL;
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
{
@@ -5439,38 +5538,20 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
content::WindowedNotificationObserver observer(
extensions::NOTIFICATION_CRX_INSTALLER_DONE,
content::NotificationService::AllSources());
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_REGISTRY,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::EXTERNAL_REGISTRY;
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
observer.Wait();
VerifyCrxInstall(kInvalidPathToCrx, INSTALL_FAILED);
}
// Registry outranks both external pref and internal, so both fail.
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::EXTERNAL_PREF;
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::INTERNAL,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::INTERNAL;
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
pending->Remove(kGoodId);
@@ -5494,83 +5575,42 @@ TEST_F(ExtensionServiceTest, InstallPriorityExternalLocalFile) {
// older, or the same, and succeed if the version is newer.
// Older than the installed version...
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::INTERNAL,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->version.reset(new Version(older_version));
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_FALSE(pending->IsIdPending(kGoodId));
// Same version as the installed version...
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- ext->version(),
- kInvalidPathToCrx,
- Manifest::INTERNAL,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->version.reset(new Version(ext->VersionString()));
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_FALSE(pending->IsIdPending(kGoodId));
// Newer than the installed version...
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &newer_version,
- kInvalidPathToCrx,
- Manifest::INTERNAL,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->version.reset(new Version(newer_version));
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
// An external install for a higher priority install source should succeed
// if the version is greater. |older_version| is not...
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &older_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->version.reset(new Version(older_version));
+ info->crx_location = Manifest::EXTERNAL_PREF;
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
// |newer_version| is newer.
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &newer_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->version.reset(new Version(newer_version));
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
// An external install for an even higher priority install source should
// succeed if the version is greater.
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &newer_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_REGISTRY,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::EXTERNAL_REGISTRY;
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
// Because EXTERNAL_PREF is a lower priority source than EXTERNAL_REGISTRY,
// adding from external pref will now fail.
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &newer_version,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
+ info->crx_location = Manifest::EXTERNAL_PREF;
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
EXPECT_TRUE(pending->IsIdPending(kGoodId));
}
@@ -5590,70 +5630,48 @@ TEST_F(ExtensionServiceTest, ConcurrentExternalLocalFile) {
EXPECT_FALSE(pending->IsIdPending(kGoodId));
// An external provider starts installing from a local crx.
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &kVersion123,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ kGoodId, make_scoped_ptr(new Version(kVersion123)), kInvalidPathToCrx,
+ Manifest::EXTERNAL_PREF, kCreationFlags, kDontMarkAcknowledged,
kDontInstallImmediately));
- const extensions::PendingExtensionInfo* info;
- EXPECT_TRUE((info = pending->GetById(kGoodId)));
- EXPECT_TRUE(info->version().IsValid());
- EXPECT_EQ(info->version(), kVersion123);
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
+
+ const extensions::PendingExtensionInfo* pending_info;
+ EXPECT_TRUE((pending_info = pending->GetById(kGoodId)));
+ EXPECT_TRUE(pending_info->version().IsValid());
+ EXPECT_EQ(pending_info->version(), kVersion123);
// Adding a newer version overrides the currently pending version.
- EXPECT_TRUE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &kVersion124,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
- EXPECT_TRUE((info = pending->GetById(kGoodId)));
- EXPECT_TRUE(info->version().IsValid());
- EXPECT_EQ(info->version(), kVersion124);
+ info->version.reset(new Version(kVersion124));
+ EXPECT_TRUE(service()->OnExternalExtensionFileFound(*info));
+ EXPECT_TRUE((pending_info = pending->GetById(kGoodId)));
+ EXPECT_TRUE(pending_info->version().IsValid());
+ EXPECT_EQ(pending_info->version(), kVersion124);
// Adding an older version fails.
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &kVersion123,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_PREF,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
- EXPECT_TRUE((info = pending->GetById(kGoodId)));
- EXPECT_TRUE(info->version().IsValid());
- EXPECT_EQ(info->version(), kVersion124);
+ info->version.reset(new Version(kVersion123));
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
+ EXPECT_TRUE((pending_info = pending->GetById(kGoodId)));
+ EXPECT_TRUE(pending_info->version().IsValid());
+ EXPECT_EQ(pending_info->version(), kVersion124);
// Adding an older version fails even when coming from a higher-priority
// location.
- EXPECT_FALSE(service()->OnExternalExtensionFileFound(
- kGoodId,
- &kVersion123,
- kInvalidPathToCrx,
- Manifest::EXTERNAL_REGISTRY,
- kCreationFlags,
- kDontMarkAcknowledged,
- kDontInstallImmediately));
- EXPECT_TRUE((info = pending->GetById(kGoodId)));
- EXPECT_TRUE(info->version().IsValid());
- EXPECT_EQ(info->version(), kVersion124);
+ info->crx_location = Manifest::EXTERNAL_REGISTRY;
+ EXPECT_FALSE(service()->OnExternalExtensionFileFound(*info));
+ EXPECT_TRUE((pending_info = pending->GetById(kGoodId)));
+ EXPECT_TRUE(pending_info->version().IsValid());
+ EXPECT_EQ(pending_info->version(), kVersion124);
// Adding the latest version from the webstore overrides a specific version.
GURL kUpdateUrl("http://example.com/update");
- EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(
- kGoodId,
- std::string(),
- kUpdateUrl,
- Manifest::EXTERNAL_POLICY_DOWNLOAD,
- Extension::NO_FLAGS,
- false));
- EXPECT_TRUE((info = pending->GetById(kGoodId)));
- EXPECT_FALSE(info->version().IsValid());
+ scoped_ptr<ExternalInstallInfoUpdateUrl> update_info(
+ new ExternalInstallInfoUpdateUrl(
+ kGoodId, std::string(), make_scoped_ptr(new GURL(kUpdateUrl)),
+ Manifest::EXTERNAL_POLICY_DOWNLOAD, Extension::NO_FLAGS, false));
+ EXPECT_TRUE(service()->OnExternalExtensionUpdateUrlFound(*update_info, true));
+ EXPECT_TRUE((pending_info = pending->GetById(kGoodId)));
+ EXPECT_FALSE(pending_info->version().IsValid());
}
// This makes sure we can package and install CRX files that use whitelisted
@@ -5704,15 +5722,11 @@ class ExtensionSourcePriorityTest : public ExtensionServiceTest {
// Fake an external file from external_extensions.json.
bool AddPendingExternalPrefFileInstall() {
- Version version("1.0.0.0");
-
- return service()->OnExternalExtensionFileFound(crx_id_,
- &version,
- crx_path_,
- Manifest::EXTERNAL_PREF,
- Extension::NO_FLAGS,
- false,
- false);
+ scoped_ptr<Version> version(new Version("1.0.0.0"));
+ scoped_ptr<ExternalInstallInfoFile> info(new ExternalInstallInfoFile(
+ crx_id_, std::move(version), crx_path_, Manifest::EXTERNAL_PREF,
+ Extension::NO_FLAGS, false, false));
+ return service()->OnExternalExtensionFileFound(*info);
}
// Fake a request from sync to install an extension.
@@ -5729,13 +5743,12 @@ class ExtensionSourcePriorityTest : public ExtensionServiceTest {
// Fake a policy install.
bool AddPendingPolicyInstall() {
// Get path to the CRX with id |kGoodId|.
- return service()->OnExternalExtensionUpdateUrlFound(
- crx_id_,
- std::string(),
- GURL(),
- Manifest::EXTERNAL_POLICY_DOWNLOAD,
- Extension::NO_FLAGS,
- false);
+ scoped_ptr<GURL> empty_url(new GURL());
+ scoped_ptr<ExternalInstallInfoUpdateUrl> info(
+ new ExternalInstallInfoUpdateUrl(
+ crx_id_, std::string(), std::move(empty_url),
+ Manifest::EXTERNAL_POLICY_DOWNLOAD, Extension::NO_FLAGS, false));
+ return service()->OnExternalExtensionUpdateUrlFound(*info, true);
}
// Get the install source of a pending extension.

Powered by Google App Engine
This is Rietveld 408576698