summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/feature_unittest.cc
diff options
context:
space:
mode:
authoraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-15 02:52:47 +0000
committeraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-15 02:52:47 +0000
commit9cd8a1a9dc80aff30171a5d2bb77254b4a8f0dff (patch)
treef05eb00a4584bfcef8dc63be58334df4c7531867 /chrome/common/extensions/feature_unittest.cc
parentf5bf184dd99e3e5331d6cdf979698a381dba1180 (diff)
downloadchromium_src-9cd8a1a9dc80aff30171a5d2bb77254b4a8f0dff.zip
chromium_src-9cd8a1a9dc80aff30171a5d2bb77254b4a8f0dff.tar.gz
chromium_src-9cd8a1a9dc80aff30171a5d2bb77254b4a8f0dff.tar.bz2
Introduce the extensions::Feature class.
This will be used for declaring and validating manifest, permission, and API features in a generalized way. Review URL: http://codereview.chromium.org/9386005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@122010 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/extensions/feature_unittest.cc')
-rw-r--r--chrome/common/extensions/feature_unittest.cc258
1 files changed, 258 insertions, 0 deletions
diff --git a/chrome/common/extensions/feature_unittest.cc b/chrome/common/extensions/feature_unittest.cc
new file mode 100644
index 0000000..9fb2df9
--- /dev/null
+++ b/chrome/common/extensions/feature_unittest.cc
@@ -0,0 +1,258 @@
+// Copyright (c) 2012 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 "chrome/common/extensions/feature.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+using extensions::Feature;
+
+namespace {
+
+struct IsAvailableTestData {
+ std::string extension_id;
+ Extension::Type extension_type;
+ Feature::Context context;
+ Feature::Location location;
+ Feature::Platform platform;
+ int manifest_version;
+ bool expected_result;
+};
+
+} // namespace
+
+TEST(ExtensionFeatureTest, IsAvailableNullCase) {
+ const IsAvailableTestData tests[] = {
+ { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT,
+ Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, true },
+ { "random-extension", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT,
+ Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, true },
+ { "", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_CONTEXT,
+ Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, true },
+ { "", Extension::TYPE_UNKNOWN, Feature::PRIVILEGED_CONTEXT,
+ Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, true },
+ { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT,
+ Feature::COMPONENT_LOCATION, Feature::UNSPECIFIED_PLATFORM, -1, true },
+ { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT,
+ Feature::UNSPECIFIED_LOCATION, Feature::CHROMEOS_PLATFORM, -1, true },
+ { "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_CONTEXT,
+ Feature::UNSPECIFIED_LOCATION, Feature::UNSPECIFIED_PLATFORM, 25, true }
+ };
+
+ Feature feature;
+ for (size_t i = 0; i < arraysize(tests); ++i) {
+ const IsAvailableTestData& test = tests[i];
+ EXPECT_EQ(test.expected_result,
+ feature.IsAvailable(test.extension_id, test.extension_type,
+ test.location, test.context, test.platform,
+ test.manifest_version));
+ }
+}
+
+TEST(ExtensionFeatureTest, Whitelist) {
+ Feature feature;
+ feature.whitelist()->insert("foo");
+ feature.whitelist()->insert("bar");
+
+ EXPECT_TRUE(feature.IsAvailable(
+ "foo", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_TRUE(feature.IsAvailable(
+ "bar", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+
+ EXPECT_FALSE(feature.IsAvailable(
+ "baz", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+
+ feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP);
+ EXPECT_FALSE(feature.IsAvailable(
+ "baz", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+}
+
+TEST(ExtensionFeatureTest, PackageType) {
+ Feature feature;
+ feature.extension_types()->insert(Extension::TYPE_EXTENSION);
+ feature.extension_types()->insert(Extension::TYPE_PACKAGED_APP);
+
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_EXTENSION, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_PACKAGED_APP, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_THEME, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+}
+
+TEST(ExtensionFeatureTest, Context) {
+ Feature feature;
+ feature.contexts()->insert(Feature::PRIVILEGED_CONTEXT);
+ feature.contexts()->insert(Feature::CONTENT_SCRIPT_CONTEXT);
+
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::PRIVILEGED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::CONTENT_SCRIPT_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNPRIVILEGED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+}
+
+TEST(ExtensionFeatureTest, Location) {
+ Feature feature;
+ feature.set_location(Feature::COMPONENT_LOCATION);
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::COMPONENT_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+}
+
+TEST(ExtensionFeatureTest, Platform) {
+ Feature feature;
+ feature.set_platform(Feature::CHROMEOS_PLATFORM);
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::CHROMEOS_PLATFORM, -1));
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, -1));
+}
+
+TEST(ExtensionFeatureTest, Version) {
+ Feature feature;
+ feature.set_min_manifest_version(5);
+
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 0));
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 4));
+
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 5));
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 10));
+
+ feature.set_max_manifest_version(8);
+
+ EXPECT_FALSE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 10));
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 8));
+ EXPECT_TRUE(feature.IsAvailable(
+ "", Extension::TYPE_UNKNOWN, Feature::UNSPECIFIED_LOCATION,
+ Feature::UNSPECIFIED_CONTEXT, Feature::UNSPECIFIED_PLATFORM, 7));
+}
+
+TEST(ExtensionFeatureTest, ParseNull) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_TRUE(feature->whitelist()->empty());
+ EXPECT_TRUE(feature->extension_types()->empty());
+ EXPECT_TRUE(feature->contexts()->empty());
+ EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location());
+ EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform());
+ EXPECT_EQ(0, feature->min_manifest_version());
+ EXPECT_EQ(0, feature->max_manifest_version());
+}
+
+TEST(ExtensionFeatureTest, ParseWhitelist) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ ListValue* whitelist = new ListValue();
+ whitelist->Append(Value::CreateStringValue("foo"));
+ whitelist->Append(Value::CreateStringValue("bar"));
+ value->Set("whitelist", whitelist);
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_EQ(2u, feature->whitelist()->size());
+ EXPECT_TRUE(feature->whitelist()->count("foo"));
+ EXPECT_TRUE(feature->whitelist()->count("bar"));
+}
+
+TEST(ExtensionFeatureTest, ParsePackageTypes) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ ListValue* extension_types = new ListValue();
+ extension_types->Append(Value::CreateStringValue("extension"));
+ extension_types->Append(Value::CreateStringValue("theme"));
+ extension_types->Append(Value::CreateStringValue("packaged_app"));
+ extension_types->Append(Value::CreateStringValue("hosted_app"));
+ extension_types->Append(Value::CreateStringValue("platform_app"));
+ value->Set("package_type", extension_types);
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_EQ(5u, feature->extension_types()->size());
+ EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_EXTENSION));
+ EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_THEME));
+ EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PACKAGED_APP));
+ EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_HOSTED_APP));
+ EXPECT_TRUE(feature->extension_types()->count(Extension::TYPE_PLATFORM_APP));
+
+ extension_types->Clear();
+ extension_types->Append(Value::CreateStringValue("all"));
+ scoped_ptr<Feature> feature2(Feature::Parse(value.get()));
+ EXPECT_EQ(*(feature->extension_types()), *(feature2->extension_types()));
+}
+
+TEST(ExtensionFeatureTest, ParseContexts) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ ListValue* contexts = new ListValue();
+ contexts->Append(Value::CreateStringValue("privileged"));
+ contexts->Append(Value::CreateStringValue("unprivileged"));
+ contexts->Append(Value::CreateStringValue("content_script"));
+ value->Set("contexts", contexts);
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_EQ(3u, feature->contexts()->size());
+ EXPECT_TRUE(feature->contexts()->count(Feature::PRIVILEGED_CONTEXT));
+ EXPECT_TRUE(feature->contexts()->count(Feature::UNPRIVILEGED_CONTEXT));
+ EXPECT_TRUE(feature->contexts()->count(Feature::CONTENT_SCRIPT_CONTEXT));
+
+ contexts->Clear();
+ contexts->Append(Value::CreateStringValue("all"));
+ scoped_ptr<Feature> feature2(Feature::Parse(value.get()));
+ EXPECT_EQ(*(feature->contexts()), *(feature2->contexts()));
+}
+
+TEST(ExtensionFeatureTest, ParseLocation) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ value->SetString("location", "component");
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_EQ(Feature::COMPONENT_LOCATION, feature->location());
+}
+
+TEST(ExtensionFeatureTest, ParsePlatform) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ value->SetString("platform", "chromeos");
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_EQ(Feature::CHROMEOS_PLATFORM, feature->platform());
+}
+
+TEST(ExtensionFeatureTest, ManifestVersion) {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ value->SetInteger("min_manifest_version", 1);
+ value->SetInteger("max_manifest_version", 5);
+ scoped_ptr<Feature> feature(Feature::Parse(value.get()));
+ EXPECT_EQ(1, feature->min_manifest_version());
+ EXPECT_EQ(5, feature->max_manifest_version());
+}