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

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

Issue 303693011: Add garbage collection for shared extensions on Chrome OS (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 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
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/file_util.h"
6 #include "base/prefs/scoped_user_pref_update.h"
7 #include "base/prefs/testing_pref_service.h"
8 #include "base/strings/string_util.h"
9 #include "base/threading/sequenced_worker_pool.h"
10 #include "base/values.h"
11 #include "chrome/browser/chromeos/login/users/fake_user_manager.h"
12 #include "chrome/browser/chromeos/login/users/user_manager.h"
13 #include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
14 #include "chrome/browser/extensions/extension_garbage_collector_chromeos.h"
15 #include "chrome/browser/extensions/extension_service_unittest.h"
16 #include "chrome/browser/prefs/browser_prefs.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/test/base/testing_browser_process.h"
19 #include "chrome/test/base/testing_profile.h"
20 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/plugin_service.h"
22 #include "extensions/common/manifest_constants.h"
23
24 namespace {
25 const char kExtensionId1[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
26 const char kExtensionId2[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
27 } // namespace
28
29 namespace extensions {
30
31 class ExtensionGarbageCollectorChromeOSUnitTest
32 : public ExtensionServiceTestBase {
33 protected:
34 virtual void SetUp() OVERRIDE {
35 TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
36 chrome::RegisterLocalState(local_state_.registry());
37
38 #if defined(ENABLE_PLUGINS)
39 content::PluginService::GetInstance()->Init();
40 #endif
41 InitializeGoodInstalledExtensionService();
42
43 // Need real IO thread.
44 service_->SetFileTaskRunnerForTesting(
45 content::BrowserThread::GetBlockingPool()
46 ->GetSequencedTaskRunnerWithShutdownBehavior(
47 content::BrowserThread::GetBlockingPool()
48 ->GetNamedSequenceToken("ext_install-"),
49 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));
50
51 CHECK(cache_dir_.CreateUniqueTempDir());
52 ExtensionAssetsManagerChromeOS::SetSharedInstallDirForTesting(
53 cache_dir_.path());
54
55 // Initialize the UserManager singleton to a fresh FakeUserManager instance.
56 user_manager_enabler_.reset(
57 new chromeos::ScopedUserManagerEnabler(new chromeos::FakeUserManager));
58
59 GetFakeUserManager()->AddUser(chromeos::UserManager::kStubUser);
60 GetFakeUserManager()->LoginUser(chromeos::UserManager::kStubUser);
61 GetFakeUserManager()->SetProfileForUser(
62 GetFakeUserManager()->GetActiveUser(), profile_.get());
63 }
64
65 virtual void TearDown() OVERRIDE {
66 TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
67 }
68
69 void GarbageCollectExtensions() {
70 ExtensionGarbageCollector::Get(profile_.get())
71 ->GarbageCollectExtensionsForTest();
72 // Wait for GarbageCollectExtensions task to complete.
73 content::BrowserThread::GetBlockingPool()->FlushForTesting();
74 }
75
76 base::FilePath CreateSharedExtensionDir(const std::string& id,
77 const std::string& version,
78 const base::FilePath& shared_dir) {
79 base::FilePath path = shared_dir.AppendASCII(id).AppendASCII(version);
80 CreateDirectory(path);
81 return path;
82 }
83
84 void CreateSharedExtensionPrefs(const std::string& id,
85 const std::string& version,
86 const std::string& users_string,
87 const base::FilePath& path) {
88 DictionaryPrefUpdate shared_extensions(&local_state_,
89 ExtensionAssetsManagerChromeOS::kSharedExtensions);
90
91 base::DictionaryValue* extension_info = NULL;
92 if (!shared_extensions->GetDictionary(id, &extension_info)) {
93 extension_info = new base::DictionaryValue;
94 shared_extensions->Set(id, extension_info);
95 }
96
97 base::DictionaryValue* version_info = new base::DictionaryValue;
98 extension_info->SetWithoutPathExpansion(version, version_info);
99 version_info->SetString(
100 ExtensionAssetsManagerChromeOS::kSharedExtensionPath, path.value());
101
102 base::ListValue* users = new base::ListValue;
103 version_info->Set(ExtensionAssetsManagerChromeOS::kSharedExtensionUsers,
104 users);
105 std::vector<std::string> users_list;
106 if (Tokenize(users_string, ",", &users_list)) {
107 for (size_t i = 0; i < users_list.size(); i++) {
108 users->AppendString(users_list[i]);
109 }
110 }
111 }
112
113 scoped_refptr<Extension> CreateExtension(const std::string& id,
114 const std::string& version,
115 const base::FilePath& path) {
116 base::DictionaryValue manifest;
117 manifest.SetString(manifest_keys::kName, "test");
118 manifest.SetString(manifest_keys::kVersion, version);
119
120 std::string error;
121 scoped_refptr<Extension> extension = Extension::Create(
122 path, Manifest::INTERNAL, manifest, Extension::NO_FLAGS, id, &error);
123 // ASSERT_TRUE(extension.get()) << error;
124 // ASSERT_EQ(id, extension->id());
125
126 return extension;
127 }
128
129 ExtensionPrefs* GetExtensionPrefs() {
130 return ExtensionPrefs::Get(profile_.get());
131 }
132
133 chromeos::FakeUserManager* GetFakeUserManager() {
134 return static_cast<chromeos::FakeUserManager*>(
135 chromeos::UserManager::Get());
136 }
137
138 scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
139 TestingPrefServiceSimple local_state_;
140 base::ScopedTempDir cache_dir_;
141 };
142
143 // Test shared extensions clean up.
144 TEST_F(ExtensionGarbageCollectorChromeOSUnitTest, SharedExtensions) {
145 // Version for non-existing user.
146 base::FilePath path_id1_1 = CreateSharedExtensionDir(
147 kExtensionId1, "1.0", cache_dir_.path());
148 CreateSharedExtensionPrefs(kExtensionId1, "1.0", "test@test.com", path_id1_1);
149 EXPECT_TRUE(base::PathExists(path_id1_1));
150
151 // Version for current user but the extension is not installed.
152 base::FilePath path_id1_2 = CreateSharedExtensionDir(
153 kExtensionId1, "2.0", cache_dir_.path());
154 CreateSharedExtensionPrefs(
155 kExtensionId1, "2.0", chromeos::UserManager::kStubUser, path_id1_2);
156 EXPECT_TRUE(base::PathExists(path_id1_2));
157
158 // Version for current user that delayed install.
159 base::FilePath path_id2_1 = CreateSharedExtensionDir(
160 kExtensionId2, "1.0", cache_dir_.path());
161 CreateSharedExtensionPrefs(
162 kExtensionId2, "1.0", chromeos::UserManager::kStubUser, path_id2_1);
163 scoped_refptr<Extension> extension2 = CreateExtension(kExtensionId2, "1.0",
164 path_id2_1);
165 GetExtensionPrefs()->SetDelayedInstallInfo(
166 extension2.get(),
167 Extension::ENABLED,
168 false,
169 false,
170 ExtensionPrefs::DELAY_REASON_WAIT_FOR_IDLE,
171 syncer::StringOrdinal(),
172 std::string());
173 EXPECT_TRUE(base::PathExists(path_id2_1));
174
175 GarbageCollectExtensions();
176
177 EXPECT_FALSE(base::PathExists(path_id1_1));
178 EXPECT_FALSE(base::PathExists(path_id1_2));
179 EXPECT_FALSE(base::PathExists(cache_dir_.path().AppendASCII(kExtensionId1)));
180
181 EXPECT_TRUE(base::PathExists(path_id2_1));
182 }
183
184 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698