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/base_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; |
11 using extensions::SimpleFeatureProvider; | 14 using extensions::ListBuilder; |
| 15 using extensions::SimpleFeature; |
| 16 using extensions::BaseFeatureProvider; |
12 | 17 |
13 TEST(SimpleFeatureProvider, ManifestFeatures) { | 18 TEST(BaseFeatureProvider, ManifestFeatures) { |
14 SimpleFeatureProvider* provider = | 19 BaseFeatureProvider* provider = |
15 SimpleFeatureProvider::GetManifestFeatures(); | 20 BaseFeatureProvider::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(BaseFeatureProvider, PermissionFeatures) { |
53 SimpleFeatureProvider* provider = | 61 BaseFeatureProvider* provider = |
54 SimpleFeatureProvider::GetPermissionFeatures(); | 62 BaseFeatureProvider::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(BaseFeatureProvider, 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<BaseFeatureProvider> provider( |
107 new SimpleFeatureProvider(value.get(), NULL)); | 118 new BaseFeatureProvider(*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 BaseFeatureProvider(*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 BaseFeatureProvider(*value, NULL)); |
123 EXPECT_TRUE(provider->GetFeature("feature2")); | 134 EXPECT_TRUE(provider->GetFeature("feature2")); |
124 } | 135 } |
| 136 |
| 137 TEST(BaseFeatureProvider, 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<BaseFeatureProvider> provider( |
| 152 new BaseFeatureProvider(*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 |