Index: chrome/common/extensions/features/base_feature_provider_unittest.cc |
diff --git a/chrome/common/extensions/features/simple_feature_provider_unittest.cc b/chrome/common/extensions/features/base_feature_provider_unittest.cc |
similarity index 55% |
rename from chrome/common/extensions/features/simple_feature_provider_unittest.cc |
rename to chrome/common/extensions/features/base_feature_provider_unittest.cc |
index 0503ddc7a30e99f406d50950145ec7b93d104a2d..8a6991fca3c18b8e0867d0833ac00197c7e1bebc 100644 |
--- a/chrome/common/extensions/features/simple_feature_provider_unittest.cc |
+++ b/chrome/common/extensions/features/base_feature_provider_unittest.cc |
@@ -2,18 +2,24 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/common/extensions/features/simple_feature_provider.h" |
+#include "chrome/common/extensions/features/base_feature_provider.h" |
+#include "chrome/common/extensions/value_builder.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using chrome::VersionInfo; |
+using extensions::DictionaryBuilder; |
using extensions::Extension; |
using extensions::Feature; |
-using extensions::SimpleFeatureProvider; |
- |
-TEST(SimpleFeatureProvider, ManifestFeatures) { |
- SimpleFeatureProvider* provider = |
- SimpleFeatureProvider::GetManifestFeatures(); |
- Feature* feature = provider->GetFeature("description"); |
+using extensions::ListBuilder; |
+using extensions::SimpleFeature; |
+using extensions::BaseFeatureProvider; |
+ |
+TEST(BaseFeatureProvider, ManifestFeatures) { |
+ BaseFeatureProvider* provider = |
+ BaseFeatureProvider::GetManifestFeatures(); |
+ SimpleFeature* feature = |
+ static_cast<SimpleFeature*>(provider->GetFeature("description")); |
ASSERT_TRUE(feature); |
EXPECT_EQ(5u, feature->extension_types()->size()); |
EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION)); |
@@ -38,21 +44,24 @@ TEST(SimpleFeatureProvider, ManifestFeatures) { |
EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext( |
extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
- feature = provider->GetFeature("theme"); |
+ feature = |
+ static_cast<SimpleFeature*>(provider->GetFeature("theme")); |
ASSERT_TRUE(feature); |
EXPECT_EQ(Feature::INVALID_TYPE, feature->IsAvailableToContext( |
extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
- feature = provider->GetFeature("devtools_page"); |
+ feature = |
+ static_cast<SimpleFeature*>(provider->GetFeature("devtools_page")); |
ASSERT_TRUE(feature); |
EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext( |
extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
} |
-TEST(SimpleFeatureProvider, PermissionFeatures) { |
- SimpleFeatureProvider* provider = |
- SimpleFeatureProvider::GetPermissionFeatures(); |
- Feature* feature = provider->GetFeature("contextMenus"); |
+TEST(BaseFeatureProvider, PermissionFeatures) { |
+ BaseFeatureProvider* provider = |
+ BaseFeatureProvider::GetPermissionFeatures(); |
+ SimpleFeature* feature = |
+ static_cast<SimpleFeature*>(provider->GetFeature("contextMenus")); |
ASSERT_TRUE(feature); |
EXPECT_EQ(3u, feature->extension_types()->size()); |
EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION)); |
@@ -77,18 +86,20 @@ TEST(SimpleFeatureProvider, PermissionFeatures) { |
EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext( |
extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
- feature = provider->GetFeature("chromePrivate"); |
+ feature = |
+ static_cast<SimpleFeature*>(provider->GetFeature("chromePrivate")); |
ASSERT_TRUE(feature); |
EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature->IsAvailableToContext( |
extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
- feature = provider->GetFeature("clipboardWrite"); |
+ feature = |
+ static_cast<SimpleFeature*>(provider->GetFeature("clipboardWrite")); |
ASSERT_TRUE(feature); |
EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext( |
extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
} |
-TEST(SimpleFeatureProvider, Validation) { |
+TEST(BaseFeatureProvider, Validation) { |
scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
DictionaryValue* feature1 = new DictionaryValue(); |
@@ -103,15 +114,15 @@ TEST(SimpleFeatureProvider, Validation) { |
feature2->Set("contexts", contexts); |
value->Set("feature2", feature2); |
- scoped_ptr<SimpleFeatureProvider> provider( |
- new SimpleFeatureProvider(value.get(), NULL)); |
+ scoped_ptr<BaseFeatureProvider> provider( |
+ new BaseFeatureProvider(*value, NULL)); |
// feature1 won't validate because it lacks an extension type. |
EXPECT_FALSE(provider->GetFeature("feature1")); |
// If we add one, it works. |
feature1->Set("extension_types", extension_types->DeepCopy()); |
- provider.reset(new SimpleFeatureProvider(value.get(), NULL)); |
+ provider.reset(new BaseFeatureProvider(*value, NULL)); |
EXPECT_TRUE(provider->GetFeature("feature1")); |
// feature2 won't validate because of the presence of "contexts". |
@@ -119,6 +130,55 @@ TEST(SimpleFeatureProvider, Validation) { |
// If we remove it, it works. |
feature2->Remove("contexts", NULL); |
- provider.reset(new SimpleFeatureProvider(value.get(), NULL)); |
+ provider.reset(new BaseFeatureProvider(*value, NULL)); |
EXPECT_TRUE(provider->GetFeature("feature2")); |
} |
+ |
+TEST(BaseFeatureProvider, ComplexFeatures) { |
+ scoped_ptr<DictionaryValue> rule( |
+ DictionaryBuilder() |
+ .Set("feature1", |
+ ListBuilder().Append(DictionaryBuilder() |
+ .Set("channel", "beta") |
+ .Set("extension_types", |
+ ListBuilder().Append("extension"))) |
+ .Append(DictionaryBuilder() |
+ .Set("channel", "beta") |
+ .Set("extension_types", |
+ ListBuilder().Append("packaged_app")))) |
+ .Build()); |
+ |
+ scoped_ptr<BaseFeatureProvider> provider( |
+ new BaseFeatureProvider(*rule, NULL)); |
+ |
+ Feature *feature = provider->GetFeature("feature1"); |
+ EXPECT_TRUE(feature); |
+ |
+ // Make sure both rules are applied correctly. |
+ { |
+ Feature::ScopedCurrentChannel current_channel(VersionInfo::CHANNEL_BETA); |
+ EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
+ "1", |
+ Extension::TYPE_EXTENSION, |
+ Feature::UNSPECIFIED_LOCATION, |
+ Feature::UNSPECIFIED_PLATFORM).result()); |
+ EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
+ "2", |
+ Extension::TYPE_LEGACY_PACKAGED_APP, |
+ Feature::UNSPECIFIED_LOCATION, |
+ Feature::UNSPECIFIED_PLATFORM).result()); |
+ } |
+ { |
+ Feature::ScopedCurrentChannel current_channel(VersionInfo::CHANNEL_STABLE); |
+ EXPECT_NE(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
+ "1", |
+ Extension::TYPE_EXTENSION, |
+ Feature::UNSPECIFIED_LOCATION, |
+ Feature::UNSPECIFIED_PLATFORM).result()); |
+ EXPECT_NE(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
+ "2", |
+ Extension::TYPE_LEGACY_PACKAGED_APP, |
+ Feature::UNSPECIFIED_LOCATION, |
+ Feature::UNSPECIFIED_PLATFORM).result()); |
+ } |
+} |