| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/features/simple_feature_provider.h" | 5 #include "chrome/common/extensions/features/simple_feature_provider.h" |
| 6 | 6 |
| 7 #include "chrome/common/extensions/value_builder.h" |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 8 | 9 |
| 10 using chrome::VersionInfo; |
| 11 using extensions::DictionaryBuilder; |
| 9 using extensions::Extension; | 12 using extensions::Extension; |
| 10 using extensions::Feature; | 13 using extensions::Feature; |
| 14 using extensions::ListBuilder; |
| 15 using extensions::SimpleFeature; |
| 11 using extensions::SimpleFeatureProvider; | 16 using extensions::SimpleFeatureProvider; |
| 12 | 17 |
| 13 TEST(SimpleFeatureProvider, ManifestFeatures) { | 18 TEST(SimpleFeatureProvider, ManifestFeatures) { |
| 14 SimpleFeatureProvider* provider = | 19 SimpleFeatureProvider* provider = |
| 15 SimpleFeatureProvider::GetManifestFeatures(); | 20 SimpleFeatureProvider::GetManifestFeatures(); |
| 16 Feature* feature = provider->GetFeature("description"); | 21 SimpleFeature* feature = |
| 22 static_cast<SimpleFeature*>(provider->GetFeature("description")); |
| 17 ASSERT_TRUE(feature); | 23 ASSERT_TRUE(feature); |
| 18 EXPECT_EQ(5u, feature->extension_types()->size()); | 24 EXPECT_EQ(5u, feature->extension_types()->size()); |
| 19 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION)); | 25 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION)); |
| 20 EXPECT_EQ(1u, | 26 EXPECT_EQ(1u, |
| 21 feature->extension_types()->count(Extension::TYPE_LEGACY_PACKAGED_APP)); | 27 feature->extension_types()->count(Extension::TYPE_LEGACY_PACKAGED_APP)); |
| 22 EXPECT_EQ(1u, | 28 EXPECT_EQ(1u, |
| 23 feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); | 29 feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); |
| 24 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_HOSTED_APP)); | 30 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_HOSTED_APP)); |
| 25 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_THEME)); | 31 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_THEME)); |
| 26 | 32 |
| 27 DictionaryValue manifest; | 33 DictionaryValue manifest; |
| 28 manifest.SetString("name", "test extension"); | 34 manifest.SetString("name", "test extension"); |
| 29 manifest.SetString("version", "1"); | 35 manifest.SetString("version", "1"); |
| 30 manifest.SetString("description", "hello there"); | 36 manifest.SetString("description", "hello there"); |
| 31 | 37 |
| 32 std::string error; | 38 std::string error; |
| 33 scoped_refptr<const Extension> extension(Extension::Create( | 39 scoped_refptr<const Extension> extension(Extension::Create( |
| 34 FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS, | 40 FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS, |
| 35 &error)); | 41 &error)); |
| 36 | 42 |
| 37 ASSERT_TRUE(extension.get()); | 43 ASSERT_TRUE(extension.get()); |
| 38 EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext( | 44 EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext( |
| 39 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); | 45 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
| 40 | 46 |
| 41 feature = provider->GetFeature("theme"); | 47 feature = |
| 48 static_cast<SimpleFeature*>(provider->GetFeature("theme")); |
| 42 ASSERT_TRUE(feature); | 49 ASSERT_TRUE(feature); |
| 43 EXPECT_EQ(Feature::INVALID_TYPE, feature->IsAvailableToContext( | 50 EXPECT_EQ(Feature::INVALID_TYPE, feature->IsAvailableToContext( |
| 44 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); | 51 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
| 45 | 52 |
| 46 feature = provider->GetFeature("devtools_page"); | 53 feature = |
| 54 static_cast<SimpleFeature*>(provider->GetFeature("devtools_page")); |
| 47 ASSERT_TRUE(feature); | 55 ASSERT_TRUE(feature); |
| 48 EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext( | 56 EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext( |
| 49 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); | 57 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
| 50 } | 58 } |
| 51 | 59 |
| 52 TEST(SimpleFeatureProvider, PermissionFeatures) { | 60 TEST(SimpleFeatureProvider, PermissionFeatures) { |
| 53 SimpleFeatureProvider* provider = | 61 SimpleFeatureProvider* provider = |
| 54 SimpleFeatureProvider::GetPermissionFeatures(); | 62 SimpleFeatureProvider::GetPermissionFeatures(); |
| 55 Feature* feature = provider->GetFeature("contextMenus"); | 63 SimpleFeature* feature = |
| 64 static_cast<SimpleFeature*>(provider->GetFeature("contextMenus")); |
| 56 ASSERT_TRUE(feature); | 65 ASSERT_TRUE(feature); |
| 57 EXPECT_EQ(3u, feature->extension_types()->size()); | 66 EXPECT_EQ(3u, feature->extension_types()->size()); |
| 58 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION)); | 67 EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION)); |
| 59 EXPECT_EQ(1u, | 68 EXPECT_EQ(1u, |
| 60 feature->extension_types()->count(Extension::TYPE_LEGACY_PACKAGED_APP)); | 69 feature->extension_types()->count(Extension::TYPE_LEGACY_PACKAGED_APP)); |
| 61 EXPECT_EQ(1u, | 70 EXPECT_EQ(1u, |
| 62 feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); | 71 feature->extension_types()->count(Extension::TYPE_PLATFORM_APP)); |
| 63 | 72 |
| 64 DictionaryValue manifest; | 73 DictionaryValue manifest; |
| 65 manifest.SetString("name", "test extension"); | 74 manifest.SetString("name", "test extension"); |
| 66 manifest.SetString("version", "1"); | 75 manifest.SetString("version", "1"); |
| 67 ListValue* permissions = new ListValue(); | 76 ListValue* permissions = new ListValue(); |
| 68 manifest.Set("permissions", permissions); | 77 manifest.Set("permissions", permissions); |
| 69 permissions->Append(Value::CreateStringValue("contextMenus")); | 78 permissions->Append(Value::CreateStringValue("contextMenus")); |
| 70 | 79 |
| 71 std::string error; | 80 std::string error; |
| 72 scoped_refptr<const Extension> extension(Extension::Create( | 81 scoped_refptr<const Extension> extension(Extension::Create( |
| 73 FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS, | 82 FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS, |
| 74 &error)); | 83 &error)); |
| 75 | 84 |
| 76 ASSERT_TRUE(extension.get()); | 85 ASSERT_TRUE(extension.get()); |
| 77 EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext( | 86 EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext( |
| 78 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); | 87 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
| 79 | 88 |
| 80 feature = provider->GetFeature("chromePrivate"); | 89 feature = |
| 90 static_cast<SimpleFeature*>(provider->GetFeature("chromePrivate")); |
| 81 ASSERT_TRUE(feature); | 91 ASSERT_TRUE(feature); |
| 82 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature->IsAvailableToContext( | 92 EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature->IsAvailableToContext( |
| 83 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); | 93 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
| 84 | 94 |
| 85 feature = provider->GetFeature("clipboardWrite"); | 95 feature = |
| 96 static_cast<SimpleFeature*>(provider->GetFeature("clipboardWrite")); |
| 86 ASSERT_TRUE(feature); | 97 ASSERT_TRUE(feature); |
| 87 EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext( | 98 EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext( |
| 88 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); | 99 extension.get(), Feature::UNSPECIFIED_CONTEXT).result()); |
| 89 } | 100 } |
| 90 | 101 |
| 91 TEST(SimpleFeatureProvider, Validation) { | 102 TEST(SimpleFeatureProvider, Validation) { |
| 92 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 103 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 93 | 104 |
| 94 DictionaryValue* feature1 = new DictionaryValue(); | 105 DictionaryValue* feature1 = new DictionaryValue(); |
| 95 value->Set("feature1", feature1); | 106 value->Set("feature1", feature1); |
| 96 | 107 |
| 97 DictionaryValue* feature2 = new DictionaryValue(); | 108 DictionaryValue* feature2 = new DictionaryValue(); |
| 98 ListValue* extension_types = new ListValue(); | 109 ListValue* extension_types = new ListValue(); |
| 99 extension_types->Append(Value::CreateStringValue("extension")); | 110 extension_types->Append(Value::CreateStringValue("extension")); |
| 100 feature2->Set("extension_types", extension_types); | 111 feature2->Set("extension_types", extension_types); |
| 101 ListValue* contexts = new ListValue(); | 112 ListValue* contexts = new ListValue(); |
| 102 contexts->Append(Value::CreateStringValue("blessed_extension")); | 113 contexts->Append(Value::CreateStringValue("blessed_extension")); |
| 103 feature2->Set("contexts", contexts); | 114 feature2->Set("contexts", contexts); |
| 104 value->Set("feature2", feature2); | 115 value->Set("feature2", feature2); |
| 105 | 116 |
| 106 scoped_ptr<SimpleFeatureProvider> provider( | 117 scoped_ptr<SimpleFeatureProvider> provider( |
| 107 new SimpleFeatureProvider(value.get(), NULL)); | 118 new SimpleFeatureProvider(*value, NULL)); |
| 108 | 119 |
| 109 // feature1 won't validate because it lacks an extension type. | 120 // feature1 won't validate because it lacks an extension type. |
| 110 EXPECT_FALSE(provider->GetFeature("feature1")); | 121 EXPECT_FALSE(provider->GetFeature("feature1")); |
| 111 | 122 |
| 112 // If we add one, it works. | 123 // If we add one, it works. |
| 113 feature1->Set("extension_types", extension_types->DeepCopy()); | 124 feature1->Set("extension_types", extension_types->DeepCopy()); |
| 114 provider.reset(new SimpleFeatureProvider(value.get(), NULL)); | 125 provider.reset(new SimpleFeatureProvider(*value, NULL)); |
| 115 EXPECT_TRUE(provider->GetFeature("feature1")); | 126 EXPECT_TRUE(provider->GetFeature("feature1")); |
| 116 | 127 |
| 117 // feature2 won't validate because of the presence of "contexts". | 128 // feature2 won't validate because of the presence of "contexts". |
| 118 EXPECT_FALSE(provider->GetFeature("feature2")); | 129 EXPECT_FALSE(provider->GetFeature("feature2")); |
| 119 | 130 |
| 120 // If we remove it, it works. | 131 // If we remove it, it works. |
| 121 feature2->Remove("contexts", NULL); | 132 feature2->Remove("contexts", NULL); |
| 122 provider.reset(new SimpleFeatureProvider(value.get(), NULL)); | 133 provider.reset(new SimpleFeatureProvider(*value, NULL)); |
| 123 EXPECT_TRUE(provider->GetFeature("feature2")); | 134 EXPECT_TRUE(provider->GetFeature("feature2")); |
| 124 } | 135 } |
| 136 |
| 137 TEST(SimpleFeatureProvider, ComplexFeatures) { |
| 138 scoped_ptr<DictionaryValue> rule( |
| 139 DictionaryBuilder() |
| 140 .Set("feature1", |
| 141 ListBuilder().Append(DictionaryBuilder() |
| 142 .Set("channel", "beta") |
| 143 .Set("extension_types", |
| 144 ListBuilder().Append("extension"))) |
| 145 .Append(DictionaryBuilder() |
| 146 .Set("channel", "beta") |
| 147 .Set("extension_types", |
| 148 ListBuilder().Append("packaged_app")))) |
| 149 .Build()); |
| 150 |
| 151 scoped_ptr<SimpleFeatureProvider> provider( |
| 152 new SimpleFeatureProvider(*rule, NULL)); |
| 153 |
| 154 Feature *feature = provider->GetFeature("feature1"); |
| 155 EXPECT_TRUE(feature); |
| 156 |
| 157 // Make sure both rules are applied correctly. |
| 158 { |
| 159 Feature::ScopedCurrentChannel current_channel(VersionInfo::CHANNEL_BETA); |
| 160 EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
| 161 "1", |
| 162 Extension::TYPE_EXTENSION, |
| 163 Feature::UNSPECIFIED_LOCATION, |
| 164 Feature::UNSPECIFIED_PLATFORM).result()); |
| 165 EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
| 166 "2", |
| 167 Extension::TYPE_LEGACY_PACKAGED_APP, |
| 168 Feature::UNSPECIFIED_LOCATION, |
| 169 Feature::UNSPECIFIED_PLATFORM).result()); |
| 170 } |
| 171 { |
| 172 Feature::ScopedCurrentChannel current_channel(VersionInfo::CHANNEL_STABLE); |
| 173 EXPECT_NE(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
| 174 "1", |
| 175 Extension::TYPE_EXTENSION, |
| 176 Feature::UNSPECIFIED_LOCATION, |
| 177 Feature::UNSPECIFIED_PLATFORM).result()); |
| 178 EXPECT_NE(Feature::IS_AVAILABLE, feature->IsAvailableToManifest( |
| 179 "2", |
| 180 Extension::TYPE_LEGACY_PACKAGED_APP, |
| 181 Feature::UNSPECIFIED_LOCATION, |
| 182 Feature::UNSPECIFIED_PLATFORM).result()); |
| 183 } |
| 184 } |
| OLD | NEW |