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

Side by Side Diff: chrome/browser/extensions/extension_service_unittest.cc

Issue 6293006: Allow relative paths to external extension files for some providers, error out for others. (Closed) Base URL: http://git.chromium.org/git/chromium.git
Patch Set: Rebase for commit. Created 9 years, 11 months 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/browser/extensions/extension_service_unittest.h" 5 #include "chrome/browser/extensions/extension_service_unittest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 // VisitRegisteredExtension(), which must be a const method to inherit 202 // VisitRegisteredExtension(), which must be a const method to inherit
203 // from the class being mocked. 203 // from the class being mocked.
204 mutable int visit_count_; 204 mutable int visit_count_;
205 205
206 DISALLOW_COPY_AND_ASSIGN(MockExtensionProvider); 206 DISALLOW_COPY_AND_ASSIGN(MockExtensionProvider);
207 }; 207 };
208 208
209 class MockProviderVisitor 209 class MockProviderVisitor
210 : public ExternalExtensionProviderInterface::VisitorInterface { 210 : public ExternalExtensionProviderInterface::VisitorInterface {
211 public: 211 public:
212 MockProviderVisitor() : ids_found_(0) { 212
213 // The provider will return |fake_base_path| from
214 // GetBaseCrxFilePath(). User can test the behavior with
215 // and without an empty path using this parameter.
216 explicit MockProviderVisitor(FilePath fake_base_path)
217 : ids_found_(0),
218 fake_base_path_(fake_base_path) {
213 } 219 }
214 220
215 int Visit(const std::string& json_data) { 221 int Visit(const std::string& json_data) {
216 // Give the test json file to the provider for parsing. 222 // Give the test json file to the provider for parsing.
217 provider_.reset(new ExternalExtensionProviderImpl( 223 provider_.reset(new ExternalExtensionProviderImpl(
218 this, 224 this,
219 new ExternalTestingExtensionLoader(json_data), 225 new ExternalTestingExtensionLoader(json_data, fake_base_path_),
220 Extension::EXTERNAL_PREF, 226 Extension::EXTERNAL_PREF,
221 Extension::EXTERNAL_PREF_DOWNLOAD)); 227 Extension::EXTERNAL_PREF_DOWNLOAD));
222 228
223 // We also parse the file into a dictionary to compare what we get back 229 // We also parse the file into a dictionary to compare what we get back
224 // from the provider. 230 // from the provider.
225 JSONStringValueSerializer serializer(json_data); 231 JSONStringValueSerializer serializer(json_data);
226 Value* json_value = serializer.Deserialize(NULL, NULL); 232 Value* json_value = serializer.Deserialize(NULL, NULL);
227 233
228 if (!json_value || !json_value->IsType(Value::TYPE_DICTIONARY)) { 234 if (!json_value || !json_value->IsType(Value::TYPE_DICTIONARY)) {
229 NOTREACHED() << "Unable to deserialize json data"; 235 NOTREACHED() << "Unable to deserialize json data";
(...skipping 17 matching lines...) Expand all
247 const FilePath& path, 253 const FilePath& path,
248 Extension::Location unused) { 254 Extension::Location unused) {
249 ++ids_found_; 255 ++ids_found_;
250 DictionaryValue* pref; 256 DictionaryValue* pref;
251 // This tests is to make sure that the provider only notifies us of the 257 // This tests is to make sure that the provider only notifies us of the
252 // values we gave it. So if the id we doesn't exist in our internal 258 // values we gave it. So if the id we doesn't exist in our internal
253 // dictionary then something is wrong. 259 // dictionary then something is wrong.
254 EXPECT_TRUE(prefs_->GetDictionary(id, &pref)) 260 EXPECT_TRUE(prefs_->GetDictionary(id, &pref))
255 << "Got back ID (" << id.c_str() << ") we weren't expecting"; 261 << "Got back ID (" << id.c_str() << ") we weren't expecting";
256 262
263 EXPECT_TRUE(path.IsAbsolute());
264 if (!fake_base_path_.empty())
265 EXPECT_TRUE(fake_base_path_.IsParent(path));
266
257 if (pref) { 267 if (pref) {
258 EXPECT_TRUE(provider_->HasExtension(id)); 268 EXPECT_TRUE(provider_->HasExtension(id));
259 269
260 // Ask provider if the extension we got back is registered. 270 // Ask provider if the extension we got back is registered.
261 Extension::Location location = Extension::INVALID; 271 Extension::Location location = Extension::INVALID;
262 scoped_ptr<Version> v1; 272 scoped_ptr<Version> v1;
263 FilePath crx_path; 273 FilePath crx_path;
264 274
265 EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1)); 275 EXPECT_TRUE(provider_->GetExtensionDetails(id, NULL, &v1));
266 EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str()); 276 EXPECT_STREQ(version->GetString().c_str(), v1->GetString().c_str());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 prefs_->Remove(id, NULL); 312 prefs_->Remove(id, NULL);
303 } 313 }
304 } 314 }
305 315
306 virtual void OnExternalProviderReady() { 316 virtual void OnExternalProviderReady() {
307 EXPECT_TRUE(provider_->IsReady()); 317 EXPECT_TRUE(provider_->IsReady());
308 } 318 }
309 319
310 private: 320 private:
311 int ids_found_; 321 int ids_found_;
312 322 FilePath fake_base_path_;
313 scoped_ptr<ExternalExtensionProviderImpl> provider_; 323 scoped_ptr<ExternalExtensionProviderImpl> provider_;
314 scoped_ptr<DictionaryValue> prefs_; 324 scoped_ptr<DictionaryValue> prefs_;
315 325
316 DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor); 326 DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor);
317 }; 327 };
318 328
319 class ExtensionTestingProfile : public TestingProfile { 329 class ExtensionTestingProfile : public TestingProfile {
320 public: 330 public:
321 ExtensionTestingProfile() : service_(NULL) { 331 ExtensionTestingProfile() : service_(NULL) {
322 } 332 }
(...skipping 2674 matching lines...) Expand 10 before | Expand all | Expand 10 after
2997 set_extensions_enabled(true); 3007 set_extensions_enabled(true);
2998 service_->ReloadExtensions(); 3008 service_->ReloadExtensions();
2999 loop_.RunAllPending(); 3009 loop_.RunAllPending();
3000 3010
3001 ASSERT_EQ(0u, GetErrors().size()); 3011 ASSERT_EQ(0u, GetErrors().size());
3002 ASSERT_EQ(0u, loaded_.size()); 3012 ASSERT_EQ(0u, loaded_.size());
3003 } 3013 }
3004 3014
3005 TEST_F(ExtensionServiceTest, ExternalPrefProvider) { 3015 TEST_F(ExtensionServiceTest, ExternalPrefProvider) {
3006 InitializeEmptyExtensionService(); 3016 InitializeEmptyExtensionService();
3017
3018 // Test some valid extension records.
3019 // Set a base path to avoid erroring out on relative paths.
3020 // Paths starting with // are absolute on every platform we support.
3021 FilePath base_path(FILE_PATH_LITERAL("//base/path"));
3022 ASSERT_TRUE(base_path.IsAbsolute());
3023 MockProviderVisitor visitor(base_path);
3007 std::string json_data = 3024 std::string json_data =
3008 "{" 3025 "{"
3009 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {" 3026 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
3010 " \"external_crx\": \"RandomExtension.crx\"," 3027 " \"external_crx\": \"RandomExtension.crx\","
3011 " \"external_version\": \"1.0\"" 3028 " \"external_version\": \"1.0\""
3012 " }," 3029 " },"
3013 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {" 3030 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
3014 " \"external_crx\": \"RandomExtension2.crx\"," 3031 " \"external_crx\": \"RandomExtension2.crx\","
3015 " \"external_version\": \"2.0\"" 3032 " \"external_version\": \"2.0\""
3016 " }," 3033 " },"
3017 " \"cccccccccccccccccccccccccccccccc\": {" 3034 " \"cccccccccccccccccccccccccccccccc\": {"
3018 " \"external_update_url\": \"http:\\\\foo.com/update\"" 3035 " \"external_update_url\": \"http:\\\\foo.com/update\""
3019 " }" 3036 " }"
3020 "}"; 3037 "}";
3021 3038 EXPECT_EQ(3, visitor.Visit(json_data));
3022 MockProviderVisitor visitor;
3023 3039
3024 // Simulate an external_extensions.json file that contains seven invalid 3040 // Simulate an external_extensions.json file that contains seven invalid
3025 // extensions: 3041 // records:
3026 // - One that is missing the 'external_crx' key. 3042 // - One that is missing the 'external_crx' key.
3027 // - One that is missing the 'external_version' key. 3043 // - One that is missing the 'external_version' key.
3028 // - One that is specifying .. in the path. 3044 // - One that is specifying .. in the path.
3029 // - One that specifies both a file and update URL. 3045 // - One that specifies both a file and update URL.
3030 // - One that specifies no file or update URL. 3046 // - One that specifies no file or update URL.
3031 // - One that has an update URL that is not well formed. 3047 // - One that has an update URL that is not well formed.
3032 // - One that contains a malformed version. 3048 // - One that contains a malformed version.
3033 // - One that has an invalid id. 3049 // - One that has an invalid id.
3034 // - One that has a non-dictionary value. 3050 // - One that has a non-dictionary value.
3035 // The final extension is valid, and we check that it is read to make sure 3051 // The final extension is valid, and we check that it is read to make sure
(...skipping 25 matching lines...) Expand all
3061 " \"external_version\": \"This is not a valid version!\"" 3077 " \"external_version\": \"This is not a valid version!\""
3062 " }," 3078 " },"
3063 " \"This is not a valid id!\": {}," 3079 " \"This is not a valid id!\": {},"
3064 " \"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\": true," 3080 " \"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\": true,"
3065 " \"pppppppppppppppppppppppppppppppp\": {" 3081 " \"pppppppppppppppppppppppppppppppp\": {"
3066 " \"external_crx\": \"RandomValidExtension.crx\"," 3082 " \"external_crx\": \"RandomValidExtension.crx\","
3067 " \"external_version\": \"1.0\"" 3083 " \"external_version\": \"1.0\""
3068 " }" 3084 " }"
3069 "}"; 3085 "}";
3070 EXPECT_EQ(1, visitor.Visit(json_data)); 3086 EXPECT_EQ(1, visitor.Visit(json_data));
3087
3088 // Check that if a base path is not provided, use of a relative
3089 // path fails.
3090 FilePath empty;
3091 MockProviderVisitor visitor_no_relative_paths(empty);
3092
3093 // Use absolute paths. Expect success.
3094 json_data =
3095 "{"
3096 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
3097 " \"external_crx\": \"//RandomExtension1.crx\","
3098 " \"external_version\": \"3.0\""
3099 " },"
3100 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\": {"
3101 " \"external_crx\": \"//path/to/RandomExtension2.crx\","
3102 " \"external_version\": \"3.0\""
3103 " }"
3104 "}";
3105 EXPECT_EQ(2, visitor_no_relative_paths.Visit(json_data));
3106
3107 // Use a relative path. Expect that it will error out.
3108 json_data =
3109 "{"
3110 " \"cccccccccccccccccccccccccccccccc\": {"
3111 " \"external_crx\": \"RandomExtension2.crx\","
3112 " \"external_version\": \"3.0\""
3113 " }"
3114 "}";
3115 EXPECT_EQ(0, visitor_no_relative_paths.Visit(json_data));
3071 } 3116 }
3072 3117
3073 // Test loading good extensions from the profile directory. 3118 // Test loading good extensions from the profile directory.
3074 TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) { 3119 TEST_F(ExtensionServiceTest, LoadAndRelocalizeExtensions) {
3075 // Initialize the test dir with a good Preferences/extensions. 3120 // Initialize the test dir with a good Preferences/extensions.
3076 FilePath source_install_dir; 3121 FilePath source_install_dir;
3077 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &source_install_dir)); 3122 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &source_install_dir));
3078 source_install_dir = source_install_dir 3123 source_install_dir = source_install_dir
3079 .AppendASCII("extensions") 3124 .AppendASCII("extensions")
3080 .AppendASCII("l10n"); 3125 .AppendASCII("l10n");
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
3285 // Component extensions shouldn't get recourded in the prefs. 3330 // Component extensions shouldn't get recourded in the prefs.
3286 ValidatePrefKeyCount(0); 3331 ValidatePrefKeyCount(0);
3287 3332
3288 // Reload all extensions, and make sure it comes back. 3333 // Reload all extensions, and make sure it comes back.
3289 std::string extension_id = service_->extensions()->at(0)->id(); 3334 std::string extension_id = service_->extensions()->at(0)->id();
3290 loaded_.clear(); 3335 loaded_.clear();
3291 service_->ReloadExtensions(); 3336 service_->ReloadExtensions();
3292 ASSERT_EQ(1u, service_->extensions()->size()); 3337 ASSERT_EQ(1u, service_->extensions()->size());
3293 EXPECT_EQ(extension_id, service_->extensions()->at(0)->id()); 3338 EXPECT_EQ(extension_id, service_->extensions()->at(0)->id());
3294 } 3339 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_service.cc ('k') | chrome/browser/extensions/external_extension_loader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698