Index: chrome/common/extensions/features/simple_feature_provider_unittest.cc |
diff --git a/chrome/common/extensions/features/simple_feature_provider_unittest.cc b/chrome/common/extensions/features/simple_feature_provider_unittest.cc |
index 0503ddc7a30e99f406d50950145ec7b93d104a2d..234acacad45feb598d0624843553a40ac65775a0 100644 |
--- a/chrome/common/extensions/features/simple_feature_provider_unittest.cc |
+++ b/chrome/common/extensions/features/simple_feature_provider_unittest.cc |
@@ -4,16 +4,22 @@ |
#include "chrome/common/extensions/features/simple_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::ListBuilder; |
+using extensions::SimpleFeature; |
using extensions::SimpleFeatureProvider; |
TEST(SimpleFeatureProvider, ManifestFeatures) { |
SimpleFeatureProvider* provider = |
SimpleFeatureProvider::GetManifestFeatures(); |
- Feature* feature = provider->GetFeature("description"); |
+ 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,12 +44,14 @@ 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()); |
@@ -52,7 +60,8 @@ TEST(SimpleFeatureProvider, ManifestFeatures) { |
TEST(SimpleFeatureProvider, PermissionFeatures) { |
SimpleFeatureProvider* provider = |
SimpleFeatureProvider::GetPermissionFeatures(); |
- Feature* feature = provider->GetFeature("contextMenus"); |
+ 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,12 +86,14 @@ 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()); |
@@ -104,14 +115,14 @@ TEST(SimpleFeatureProvider, Validation) { |
value->Set("feature2", feature2); |
scoped_ptr<SimpleFeatureProvider> provider( |
- new SimpleFeatureProvider(value.get(), NULL)); |
+ new SimpleFeatureProvider(*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 SimpleFeatureProvider(*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 SimpleFeatureProvider(*value, NULL)); |
EXPECT_TRUE(provider->GetFeature("feature2")); |
} |
+ |
+TEST(SimpleFeatureProvider, 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<SimpleFeatureProvider> provider( |
+ new SimpleFeatureProvider(*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()); |
+ } |
+} |