OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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/chromeos/file_system_provider/service.h" | 5 #include "chrome/browser/chromeos/file_system_provider/service.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "extensions/common/extension.h" | 25 #include "extensions/common/extension.h" |
26 #include "extensions/common/manifest_constants.h" | 26 #include "extensions/common/manifest_constants.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
28 #include "webkit/browser/fileapi/external_mount_points.h" | 28 #include "webkit/browser/fileapi/external_mount_points.h" |
29 | 29 |
30 namespace chromeos { | 30 namespace chromeos { |
31 namespace file_system_provider { | 31 namespace file_system_provider { |
32 namespace { | 32 namespace { |
33 | 33 |
34 const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; | 34 const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; |
35 const char kFileSystemId[] = "camera/pictures/id !@#$%^&*()_+"; | |
36 const char kDisplayName[] = "Camera Pictures"; | 35 const char kDisplayName[] = "Camera Pictures"; |
37 | 36 |
| 37 // The dot in the file system ID is there in order to check that saving to |
| 38 // preferences works correctly. File System ID is used as a key in |
| 39 // a base::DictionaryValue, so it has to be stored without path expansion. |
| 40 const char kFileSystemId[] = "camera/pictures/id .!@#$%^&*()_+"; |
| 41 |
38 // Utility observer, logging events from file_system_provider::Service. | 42 // Utility observer, logging events from file_system_provider::Service. |
39 class LoggingObserver : public Observer { | 43 class LoggingObserver : public Observer { |
40 public: | 44 public: |
41 class Event { | 45 class Event { |
42 public: | 46 public: |
43 Event(const ProvidedFileSystemInfo& file_system_info, | 47 Event(const ProvidedFileSystemInfo& file_system_info, |
44 base::File::Error error) | 48 base::File::Error error) |
45 : file_system_info_(file_system_info), error_(error) {} | 49 : file_system_info_(file_system_info), error_(error) {} |
46 ~Event() {} | 50 ~Event() {} |
47 | 51 |
(...skipping 25 matching lines...) Expand all Loading... |
73 | 77 |
74 std::vector<Event> mounts; | 78 std::vector<Event> mounts; |
75 std::vector<Event> unmounts; | 79 std::vector<Event> unmounts; |
76 }; | 80 }; |
77 | 81 |
78 // Creates a fake extension with the specified |extension_id|. | 82 // Creates a fake extension with the specified |extension_id|. |
79 scoped_refptr<extensions::Extension> createFakeExtension( | 83 scoped_refptr<extensions::Extension> createFakeExtension( |
80 const std::string& extension_id) { | 84 const std::string& extension_id) { |
81 base::DictionaryValue manifest; | 85 base::DictionaryValue manifest; |
82 std::string error; | 86 std::string error; |
83 manifest.SetString(extensions::manifest_keys::kVersion, "1.0.0.0"); | 87 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, |
84 manifest.SetString(extensions::manifest_keys::kName, "unused"); | 88 "1.0.0.0"); |
| 89 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kName, |
| 90 "unused"); |
85 return extensions::Extension::Create(base::FilePath(), | 91 return extensions::Extension::Create(base::FilePath(), |
86 extensions::Manifest::UNPACKED, | 92 extensions::Manifest::UNPACKED, |
87 manifest, | 93 manifest, |
88 extensions::Extension::NO_FLAGS, | 94 extensions::Extension::NO_FLAGS, |
89 extension_id, | 95 extension_id, |
90 &error); | 96 &error); |
91 } | 97 } |
92 | 98 |
93 // Stores a provided file system information in preferences. | 99 // Stores a provided file system information in preferences. |
94 void RememberFakeFileSystem(TestingProfile* profile, | 100 void RememberFakeFileSystem(TestingProfile* profile, |
95 const std::string& extension_id, | 101 const std::string& extension_id, |
96 const std::string& file_system_id, | 102 const std::string& file_system_id, |
97 const std::string& display_name) { | 103 const std::string& display_name) { |
98 TestingPrefServiceSyncable* pref_service = profile->GetTestingPrefService(); | 104 TestingPrefServiceSyncable* const pref_service = |
| 105 profile->GetTestingPrefService(); |
99 ASSERT_TRUE(pref_service); | 106 ASSERT_TRUE(pref_service); |
100 | 107 |
101 base::DictionaryValue extensions; | 108 base::DictionaryValue extensions; |
102 base::ListValue* file_systems = new base::ListValue(); | 109 base::DictionaryValue* file_systems = new base::DictionaryValue(); |
103 base::DictionaryValue* file_system = new base::DictionaryValue(); | 110 base::DictionaryValue* file_system = new base::DictionaryValue(); |
104 file_system->SetString(kPrefKeyFileSystemId, kFileSystemId); | 111 file_system->SetStringWithoutPathExpansion(kPrefKeyFileSystemId, |
105 file_system->SetString(kPrefKeyDisplayName, kDisplayName); | 112 kFileSystemId); |
106 file_systems->Append(file_system); | 113 file_system->SetStringWithoutPathExpansion(kPrefKeyDisplayName, kDisplayName); |
107 extensions.Set(kExtensionId, file_systems); | 114 file_systems->SetWithoutPathExpansion(kFileSystemId, file_system); |
| 115 extensions.SetWithoutPathExpansion(kExtensionId, file_systems); |
108 | 116 |
109 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); | 117 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); |
110 } | 118 } |
111 | 119 |
112 } // namespace | 120 } // namespace |
113 | 121 |
114 class FileSystemProviderServiceTest : public testing::Test { | 122 class FileSystemProviderServiceTest : public testing::Test { |
115 protected: | 123 protected: |
116 FileSystemProviderServiceTest() {} | 124 FileSystemProviderServiceTest() {} |
117 virtual ~FileSystemProviderServiceTest() {} | 125 virtual ~FileSystemProviderServiceTest() {} |
118 | 126 |
119 virtual void SetUp() OVERRIDE { | 127 virtual void SetUp() OVERRIDE { |
120 profile_.reset(new TestingProfile); | 128 profile_.reset(new TestingProfile); |
121 user_manager_ = new FakeUserManager(); | 129 user_manager_ = new FakeUserManager(); |
122 user_manager_->AddUser(profile_->GetProfileName()); | 130 user_manager_->AddUser(profile_->GetProfileName()); |
123 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); | 131 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); |
124 extension_registry_.reset( | 132 extension_registry_.reset( |
125 new extensions::ExtensionRegistry(profile_.get())); | 133 new extensions::ExtensionRegistry(profile_.get())); |
126 file_system_provider_service_.reset( | 134 service_.reset(new Service(profile_.get(), extension_registry_.get())); |
127 new Service(profile_.get(), extension_registry_.get())); | 135 service_->SetFileSystemFactoryForTesting( |
128 file_system_provider_service_->SetFileSystemFactoryForTesting( | |
129 base::Bind(&FakeProvidedFileSystem::Create)); | 136 base::Bind(&FakeProvidedFileSystem::Create)); |
130 extension_ = createFakeExtension(kExtensionId); | 137 extension_ = createFakeExtension(kExtensionId); |
131 } | 138 } |
132 | 139 |
133 content::TestBrowserThreadBundle thread_bundle_; | 140 content::TestBrowserThreadBundle thread_bundle_; |
134 scoped_ptr<TestingProfile> profile_; | 141 scoped_ptr<TestingProfile> profile_; |
135 FakeUserManager* user_manager_; | 142 FakeUserManager* user_manager_; |
136 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; | 143 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; |
137 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; | 144 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; |
138 scoped_ptr<Service> file_system_provider_service_; | 145 scoped_ptr<Service> service_; |
139 scoped_refptr<extensions::Extension> extension_; | 146 scoped_refptr<extensions::Extension> extension_; |
140 }; | 147 }; |
141 | 148 |
142 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { | 149 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { |
143 LoggingObserver observer; | 150 LoggingObserver observer; |
144 file_system_provider_service_->AddObserver(&observer); | 151 service_->AddObserver(&observer); |
145 | 152 |
146 const bool result = file_system_provider_service_->MountFileSystem( | 153 EXPECT_TRUE( |
147 kExtensionId, kFileSystemId, kDisplayName); | 154 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
148 EXPECT_TRUE(result); | |
149 | 155 |
150 ASSERT_EQ(1u, observer.mounts.size()); | 156 ASSERT_EQ(1u, observer.mounts.size()); |
151 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); | 157 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); |
152 EXPECT_EQ(kFileSystemId, | 158 EXPECT_EQ(kFileSystemId, |
153 observer.mounts[0].file_system_info().file_system_id()); | 159 observer.mounts[0].file_system_info().file_system_id()); |
154 base::FilePath expected_mount_path = | 160 base::FilePath expected_mount_path = |
155 util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); | 161 util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); |
156 EXPECT_EQ(expected_mount_path.AsUTF8Unsafe(), | 162 EXPECT_EQ(expected_mount_path.AsUTF8Unsafe(), |
157 observer.mounts[0].file_system_info().mount_path().AsUTF8Unsafe()); | 163 observer.mounts[0].file_system_info().mount_path().AsUTF8Unsafe()); |
158 EXPECT_EQ(kDisplayName, observer.mounts[0].file_system_info().display_name()); | 164 EXPECT_EQ(kDisplayName, observer.mounts[0].file_system_info().display_name()); |
159 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 165 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
160 ASSERT_EQ(0u, observer.unmounts.size()); | 166 ASSERT_EQ(0u, observer.unmounts.size()); |
161 | 167 |
162 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 168 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
163 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 169 service_->GetProvidedFileSystemInfoList(); |
164 ASSERT_EQ(1u, file_system_info_list.size()); | 170 ASSERT_EQ(1u, file_system_info_list.size()); |
165 | 171 |
166 file_system_provider_service_->RemoveObserver(&observer); | 172 service_->RemoveObserver(&observer); |
167 } | 173 } |
168 | 174 |
169 TEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) { | 175 TEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) { |
170 LoggingObserver observer; | 176 LoggingObserver observer; |
171 file_system_provider_service_->AddObserver(&observer); | 177 service_->AddObserver(&observer); |
172 | 178 |
173 const bool result = file_system_provider_service_->MountFileSystem( | 179 EXPECT_TRUE( |
174 kExtensionId, kFileSystemId, kDisplayName); | 180 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
175 EXPECT_TRUE(result); | 181 EXPECT_FALSE( |
176 | 182 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
177 const bool second_result = file_system_provider_service_->MountFileSystem( | |
178 kExtensionId, kFileSystemId, kDisplayName); | |
179 EXPECT_FALSE(second_result); | |
180 | 183 |
181 ASSERT_EQ(2u, observer.mounts.size()); | 184 ASSERT_EQ(2u, observer.mounts.size()); |
182 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 185 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
183 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, observer.mounts[1].error()); | 186 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, observer.mounts[1].error()); |
184 | 187 |
185 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 188 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
186 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 189 service_->GetProvidedFileSystemInfoList(); |
187 ASSERT_EQ(1u, file_system_info_list.size()); | 190 ASSERT_EQ(1u, file_system_info_list.size()); |
188 | 191 |
189 file_system_provider_service_->RemoveObserver(&observer); | 192 service_->RemoveObserver(&observer); |
190 } | 193 } |
191 | 194 |
192 TEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) { | 195 TEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) { |
193 LoggingObserver observer; | 196 LoggingObserver observer; |
194 file_system_provider_service_->AddObserver(&observer); | 197 service_->AddObserver(&observer); |
195 | 198 |
196 const size_t kMaxFileSystems = 16; | 199 const size_t kMaxFileSystems = 16; |
197 for (size_t i = 0; i < kMaxFileSystems; ++i) { | 200 for (size_t i = 0; i < kMaxFileSystems; ++i) { |
198 const std::string file_system_id = | 201 const std::string file_system_id = |
199 std::string("test-") + base::IntToString(i); | 202 std::string("test-") + base::IntToString(i); |
200 const bool result = file_system_provider_service_->MountFileSystem( | 203 EXPECT_TRUE( |
201 kExtensionId, file_system_id, kDisplayName); | 204 service_->MountFileSystem(kExtensionId, file_system_id, kDisplayName)); |
202 EXPECT_TRUE(result); | |
203 } | 205 } |
204 ASSERT_EQ(kMaxFileSystems, observer.mounts.size()); | 206 ASSERT_EQ(kMaxFileSystems, observer.mounts.size()); |
205 | 207 |
206 // The next file system is out of limit, and registering it should fail. | 208 // The next file system is out of limit, and registering it should fail. |
207 const bool result = file_system_provider_service_->MountFileSystem( | 209 EXPECT_FALSE( |
208 kExtensionId, kFileSystemId, kDisplayName); | 210 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
209 EXPECT_FALSE(result); | |
210 | 211 |
211 ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size()); | 212 ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size()); |
212 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, | 213 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, |
213 observer.mounts[kMaxFileSystems].error()); | 214 observer.mounts[kMaxFileSystems].error()); |
214 | 215 |
215 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 216 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
216 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 217 service_->GetProvidedFileSystemInfoList(); |
217 ASSERT_EQ(kMaxFileSystems, file_system_info_list.size()); | 218 ASSERT_EQ(kMaxFileSystems, file_system_info_list.size()); |
218 | 219 |
219 file_system_provider_service_->RemoveObserver(&observer); | 220 service_->RemoveObserver(&observer); |
220 } | 221 } |
221 | 222 |
222 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem) { | 223 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem) { |
223 LoggingObserver observer; | 224 LoggingObserver observer; |
224 file_system_provider_service_->AddObserver(&observer); | 225 service_->AddObserver(&observer); |
225 | 226 |
226 const bool result = file_system_provider_service_->MountFileSystem( | 227 EXPECT_TRUE( |
227 kExtensionId, kFileSystemId, kDisplayName); | 228 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
228 EXPECT_TRUE(result); | |
229 ASSERT_EQ(1u, observer.mounts.size()); | 229 ASSERT_EQ(1u, observer.mounts.size()); |
230 | 230 |
231 const bool unmount_result = file_system_provider_service_->UnmountFileSystem( | 231 EXPECT_TRUE(service_->UnmountFileSystem( |
232 kExtensionId, kFileSystemId); | 232 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); |
233 EXPECT_TRUE(unmount_result); | |
234 ASSERT_EQ(1u, observer.unmounts.size()); | 233 ASSERT_EQ(1u, observer.unmounts.size()); |
235 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); | 234 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); |
236 | 235 |
237 EXPECT_EQ(kExtensionId, | 236 EXPECT_EQ(kExtensionId, |
238 observer.unmounts[0].file_system_info().extension_id()); | 237 observer.unmounts[0].file_system_info().extension_id()); |
239 EXPECT_EQ(kFileSystemId, | 238 EXPECT_EQ(kFileSystemId, |
240 observer.unmounts[0].file_system_info().file_system_id()); | 239 observer.unmounts[0].file_system_info().file_system_id()); |
241 | 240 |
242 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 241 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
243 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 242 service_->GetProvidedFileSystemInfoList(); |
244 ASSERT_EQ(0u, file_system_info_list.size()); | 243 ASSERT_EQ(0u, file_system_info_list.size()); |
245 | 244 |
246 file_system_provider_service_->RemoveObserver(&observer); | 245 service_->RemoveObserver(&observer); |
247 } | 246 } |
248 | 247 |
249 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_OnExtensionUnload) { | 248 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_OnExtensionUnload) { |
250 LoggingObserver observer; | 249 LoggingObserver observer; |
251 file_system_provider_service_->AddObserver(&observer); | 250 service_->AddObserver(&observer); |
252 | 251 |
253 const bool result = file_system_provider_service_->MountFileSystem( | 252 EXPECT_TRUE( |
254 kExtensionId, kFileSystemId, kDisplayName); | 253 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
255 EXPECT_TRUE(result); | |
256 ASSERT_EQ(1u, observer.mounts.size()); | 254 ASSERT_EQ(1u, observer.mounts.size()); |
257 | 255 |
258 // Directly call the observer's method. | 256 // Directly call the observer's method. |
259 file_system_provider_service_->OnExtensionUnloaded( | 257 service_->OnExtensionUnloaded( |
260 profile_.get(), | 258 profile_.get(), |
261 extension_.get(), | 259 extension_.get(), |
262 extensions::UnloadedExtensionInfo::REASON_DISABLE); | 260 extensions::UnloadedExtensionInfo::REASON_DISABLE); |
263 | 261 |
264 ASSERT_EQ(1u, observer.unmounts.size()); | 262 ASSERT_EQ(1u, observer.unmounts.size()); |
265 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); | 263 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); |
266 | 264 |
267 EXPECT_EQ(kExtensionId, | 265 EXPECT_EQ(kExtensionId, |
268 observer.unmounts[0].file_system_info().extension_id()); | 266 observer.unmounts[0].file_system_info().extension_id()); |
269 EXPECT_EQ(kFileSystemId, | 267 EXPECT_EQ(kFileSystemId, |
270 observer.unmounts[0].file_system_info().file_system_id()); | 268 observer.unmounts[0].file_system_info().file_system_id()); |
271 | 269 |
272 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 270 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
273 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 271 service_->GetProvidedFileSystemInfoList(); |
274 ASSERT_EQ(0u, file_system_info_list.size()); | 272 ASSERT_EQ(0u, file_system_info_list.size()); |
275 | 273 |
276 file_system_provider_service_->RemoveObserver(&observer); | 274 service_->RemoveObserver(&observer); |
277 } | 275 } |
278 | 276 |
279 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) { | 277 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) { |
280 LoggingObserver observer; | 278 LoggingObserver observer; |
281 file_system_provider_service_->AddObserver(&observer); | 279 service_->AddObserver(&observer); |
282 | 280 |
283 const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe"; | 281 const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe"; |
284 | 282 |
285 const bool result = file_system_provider_service_->MountFileSystem( | 283 EXPECT_TRUE( |
286 kExtensionId, kFileSystemId, kDisplayName); | 284 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
287 EXPECT_TRUE(result); | |
288 ASSERT_EQ(1u, observer.mounts.size()); | 285 ASSERT_EQ(1u, observer.mounts.size()); |
289 ASSERT_EQ( | 286 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size()); |
290 1u, | |
291 file_system_provider_service_->GetProvidedFileSystemInfoList().size()); | |
292 | 287 |
293 const bool unmount_result = file_system_provider_service_->UnmountFileSystem( | 288 EXPECT_FALSE(service_->UnmountFileSystem( |
294 kWrongExtensionId, kFileSystemId); | 289 kWrongExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); |
295 EXPECT_FALSE(unmount_result); | |
296 ASSERT_EQ(1u, observer.unmounts.size()); | 290 ASSERT_EQ(1u, observer.unmounts.size()); |
297 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error()); | 291 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error()); |
298 ASSERT_EQ( | 292 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size()); |
299 1u, | |
300 file_system_provider_service_->GetProvidedFileSystemInfoList().size()); | |
301 | 293 |
302 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 294 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
303 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 295 service_->GetProvidedFileSystemInfoList(); |
304 ASSERT_EQ(1u, file_system_info_list.size()); | 296 ASSERT_EQ(1u, file_system_info_list.size()); |
305 | 297 |
306 file_system_provider_service_->RemoveObserver(&observer); | 298 service_->RemoveObserver(&observer); |
307 } | 299 } |
308 | 300 |
309 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { | 301 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { |
310 LoggingObserver observer; | |
311 file_system_provider_service_->AddObserver(&observer); | |
312 | |
313 // Create a fake entry in the preferences. | 302 // Create a fake entry in the preferences. |
314 RememberFakeFileSystem( | 303 RememberFakeFileSystem( |
315 profile_.get(), kExtensionId, kFileSystemId, kDisplayName); | 304 profile_.get(), kExtensionId, kFileSystemId, kDisplayName); |
316 | 305 |
| 306 // Create a new service instance in order to load remembered file systems |
| 307 // from preferences. |
| 308 scoped_ptr<Service> new_service( |
| 309 new Service(profile_.get(), extension_registry_.get())); |
| 310 LoggingObserver observer; |
| 311 new_service->AddObserver(&observer); |
| 312 |
| 313 new_service->SetFileSystemFactoryForTesting( |
| 314 base::Bind(&FakeProvidedFileSystem::Create)); |
| 315 |
317 EXPECT_EQ(0u, observer.mounts.size()); | 316 EXPECT_EQ(0u, observer.mounts.size()); |
318 | 317 |
319 // Directly call the observer's method. | 318 // Directly call the observer's method. |
320 file_system_provider_service_->OnExtensionLoaded(profile_.get(), | 319 new_service->OnExtensionLoaded(profile_.get(), extension_.get()); |
321 extension_.get()); | |
322 | 320 |
323 ASSERT_EQ(1u, observer.mounts.size()); | 321 ASSERT_EQ(1u, observer.mounts.size()); |
324 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 322 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
325 | 323 |
326 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); | 324 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); |
327 EXPECT_EQ(kFileSystemId, | 325 EXPECT_EQ(kFileSystemId, |
328 observer.mounts[0].file_system_info().file_system_id()); | 326 observer.mounts[0].file_system_info().file_system_id()); |
329 | 327 |
330 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 328 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
331 file_system_provider_service_->GetProvidedFileSystemInfoList(); | 329 new_service->GetProvidedFileSystemInfoList(); |
332 ASSERT_EQ(1u, file_system_info_list.size()); | 330 ASSERT_EQ(1u, file_system_info_list.size()); |
333 | 331 |
334 file_system_provider_service_->RemoveObserver(&observer); | 332 new_service->RemoveObserver(&observer); |
335 } | 333 } |
336 | 334 |
337 TEST_F(FileSystemProviderServiceTest, ForgetFileSystem_OnExtensionUnload) { | 335 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { |
338 LoggingObserver observer; | 336 LoggingObserver observer; |
339 file_system_provider_service_->AddObserver(&observer); | 337 service_->AddObserver(&observer); |
340 | 338 |
341 // Create a fake entry in the preferences. | 339 EXPECT_TRUE( |
342 RememberFakeFileSystem( | 340 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
343 profile_.get(), kExtensionId, kFileSystemId, kDisplayName); | 341 ASSERT_EQ(1u, observer.mounts.size()); |
344 | 342 |
345 // Directly call the observer's methods. | 343 TestingPrefServiceSyncable* const pref_service = |
346 file_system_provider_service_->OnExtensionLoaded(profile_.get(), | 344 profile_->GetTestingPrefService(); |
347 extension_.get()); | |
348 | |
349 file_system_provider_service_->OnExtensionUnloaded( | |
350 profile_.get(), | |
351 extension_.get(), | |
352 extensions::UnloadedExtensionInfo::REASON_DISABLE); | |
353 | |
354 ASSERT_EQ(1u, observer.mounts.size()); | |
355 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | |
356 ASSERT_EQ(1u, observer.unmounts.size()); | |
357 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); | |
358 | |
359 TestingPrefServiceSyncable* pref_service = profile_->GetTestingPrefService(); | |
360 ASSERT_TRUE(pref_service); | 345 ASSERT_TRUE(pref_service); |
361 | 346 |
362 const base::DictionaryValue* extensions = | 347 const base::DictionaryValue* const extensions = |
363 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 348 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
364 ASSERT_TRUE(extensions); | 349 ASSERT_TRUE(extensions); |
365 | 350 |
366 const base::ListValue* file_systems; | 351 const base::DictionaryValue* file_systems = NULL; |
367 EXPECT_FALSE(extensions->GetList(kExtensionId, &file_systems)); | 352 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 353 &file_systems)); |
| 354 EXPECT_EQ(1u, file_systems->size()); |
368 | 355 |
369 file_system_provider_service_->RemoveObserver(&observer); | 356 const base::Value* file_system_value = NULL; |
370 } | |
371 | |
372 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnShutdown) { | |
373 { | |
374 scoped_ptr<Service> service( | |
375 new Service(profile_.get(), extension_registry_.get())); | |
376 service->SetFileSystemFactoryForTesting( | |
377 base::Bind(&FakeProvidedFileSystem::Create)); | |
378 | |
379 LoggingObserver observer; | |
380 service->AddObserver(&observer); | |
381 | |
382 const bool result = | |
383 service->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName); | |
384 EXPECT_TRUE(result); | |
385 ASSERT_EQ(1u, observer.mounts.size()); | |
386 | |
387 service->RemoveObserver(&observer); | |
388 } | |
389 | |
390 TestingPrefServiceSyncable* pref_service = profile_->GetTestingPrefService(); | |
391 ASSERT_TRUE(pref_service); | |
392 | |
393 const base::DictionaryValue* extensions = | |
394 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | |
395 ASSERT_TRUE(extensions); | |
396 | |
397 const base::ListValue* file_systems; | |
398 ASSERT_TRUE(extensions->GetList(kExtensionId, &file_systems)); | |
399 ASSERT_EQ(1u, file_systems->GetSize()); | |
400 | |
401 const base::DictionaryValue* file_system = NULL; | 357 const base::DictionaryValue* file_system = NULL; |
402 ASSERT_TRUE(file_systems->GetDictionary(0, &file_system)); | 358 ASSERT_TRUE( |
| 359 file_systems->GetWithoutPathExpansion(kFileSystemId, &file_system_value)); |
| 360 ASSERT_TRUE(file_system_value->GetAsDictionary(&file_system)); |
403 | 361 |
404 std::string file_system_id; | 362 std::string file_system_id; |
405 file_system->GetString(kPrefKeyFileSystemId, &file_system_id); | 363 EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyFileSystemId, |
| 364 &file_system_id)); |
406 EXPECT_EQ(kFileSystemId, file_system_id); | 365 EXPECT_EQ(kFileSystemId, file_system_id); |
407 | 366 |
408 std::string display_name; | 367 std::string display_name; |
409 file_system->GetString(kPrefKeyDisplayName, &display_name); | 368 EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyDisplayName, |
| 369 &display_name)); |
410 EXPECT_EQ(kDisplayName, display_name); | 370 EXPECT_EQ(kDisplayName, display_name); |
| 371 |
| 372 service_->RemoveObserver(&observer); |
| 373 } |
| 374 |
| 375 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { |
| 376 LoggingObserver observer; |
| 377 service_->AddObserver(&observer); |
| 378 |
| 379 TestingPrefServiceSyncable* const pref_service = |
| 380 profile_->GetTestingPrefService(); |
| 381 ASSERT_TRUE(pref_service); |
| 382 |
| 383 { |
| 384 EXPECT_TRUE( |
| 385 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
| 386 ASSERT_EQ(1u, observer.mounts.size()); |
| 387 |
| 388 const base::DictionaryValue* extensions = |
| 389 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
| 390 ASSERT_TRUE(extensions); |
| 391 |
| 392 const base::DictionaryValue* file_systems = NULL; |
| 393 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 394 &file_systems)); |
| 395 EXPECT_EQ(1u, file_systems->size()); |
| 396 } |
| 397 |
| 398 { |
| 399 EXPECT_TRUE(service_->UnmountFileSystem( |
| 400 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); |
| 401 |
| 402 const base::DictionaryValue* const extensions = |
| 403 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
| 404 ASSERT_TRUE(extensions); |
| 405 |
| 406 const base::DictionaryValue* file_systems = NULL; |
| 407 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 408 &file_systems)); |
| 409 EXPECT_EQ(1u, file_systems->size()); |
| 410 } |
| 411 |
| 412 service_->RemoveObserver(&observer); |
| 413 } |
| 414 |
| 415 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { |
| 416 LoggingObserver observer; |
| 417 service_->AddObserver(&observer); |
| 418 |
| 419 TestingPrefServiceSyncable* const pref_service = |
| 420 profile_->GetTestingPrefService(); |
| 421 ASSERT_TRUE(pref_service); |
| 422 |
| 423 { |
| 424 EXPECT_TRUE( |
| 425 service_->MountFileSystem(kExtensionId, kFileSystemId, kDisplayName)); |
| 426 ASSERT_EQ(1u, observer.mounts.size()); |
| 427 |
| 428 const base::DictionaryValue* extensions = |
| 429 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
| 430 ASSERT_TRUE(extensions); |
| 431 |
| 432 const base::DictionaryValue* file_systems = NULL; |
| 433 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 434 &file_systems)); |
| 435 EXPECT_EQ(1u, file_systems->size()); |
| 436 } |
| 437 |
| 438 { |
| 439 EXPECT_TRUE(service_->UnmountFileSystem( |
| 440 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); |
| 441 |
| 442 const base::DictionaryValue* const extensions = |
| 443 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
| 444 ASSERT_TRUE(extensions); |
| 445 |
| 446 const base::DictionaryValue* file_systems = NULL; |
| 447 EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 448 &file_systems)); |
| 449 } |
| 450 |
| 451 service_->RemoveObserver(&observer); |
411 } | 452 } |
412 | 453 |
413 } // namespace file_system_provider | 454 } // namespace file_system_provider |
414 } // namespace chromeos | 455 } // namespace chromeos |
OLD | NEW |