Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: chrome/common/extensions/features/base_feature_provider_unittest.cc

Issue 11316164: Implement ComplexFeature to support permission features with multiple rules. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Renames and add TODO Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 }
OLDNEW
« no previous file with comments | « chrome/common/extensions/features/base_feature_provider.cc ('k') | chrome/common/extensions/features/complex_feature.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698