OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013 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 <map> | |
6 #include <queue> | |
7 | |
8 #include "base/basictypes.h" | |
9 #include "base/bind.h" | |
10 #include "base/files/scoped_temp_dir.h" | |
11 #include "base/message_loop.h" | |
12 #include "base/run_loop.h" | |
13 #include "base/stl_util.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 #include "webkit/browser/fileapi/async_file_test_helper.h" | |
16 #include "webkit/browser/fileapi/file_system_context.h" | |
17 #include "webkit/browser/fileapi/file_system_mount_point_provider.h" | |
18 #include "webkit/browser/fileapi/file_system_operation.h" | |
19 #include "webkit/browser/fileapi/file_system_url.h" | |
20 #include "webkit/browser/fileapi/mock_file_system_context.h" | |
21 #include "webkit/browser/fileapi/test_file_set.h" | |
22 #include "webkit/browser/quota/mock_quota_manager.h" | |
23 #include "webkit/browser/quota/quota_manager.h" | |
24 #include "webkit/common/fileapi/file_system_util.h" | |
25 | |
26 namespace fileapi { | |
27 | |
28 typedef FileSystemOperation::FileEntryList FileEntryList; | |
29 | |
30 namespace { | |
31 | |
32 void ExpectOk(base::PlatformFileError error) { | |
33 ASSERT_EQ(base::PLATFORM_FILE_OK, error); | |
34 } | |
35 | |
36 } // namespace | |
37 | |
38 class CrossOperationTestHelper { | |
39 public: | |
40 CrossOperationTestHelper( | |
41 const GURL& origin, | |
42 FileSystemType src_type, | |
43 FileSystemType dest_type) | |
44 : origin_(origin), | |
45 src_type_(src_type), | |
46 dest_type_(dest_type) {} | |
47 | |
48 ~CrossOperationTestHelper() { | |
49 file_system_context_ = NULL; | |
50 quota_manager_proxy_->SimulateQuotaManagerDestroyed(); | |
51 quota_manager_ = NULL; | |
52 quota_manager_proxy_ = NULL; | |
53 base::MessageLoop::current()->RunUntilIdle(); | |
54 } | |
55 | |
56 void SetUp() { | |
57 ASSERT_TRUE(base_.CreateUniqueTempDir()); | |
58 base::FilePath base_dir = base_.path(); | |
59 quota_manager_ = new quota::MockQuotaManager( | |
60 false /* is_incognito */, base_dir, | |
61 base::MessageLoopProxy::current(), | |
62 base::MessageLoopProxy::current(), | |
63 NULL /* special storage policy */); | |
64 quota_manager_proxy_ = new quota::MockQuotaManagerProxy( | |
65 quota_manager_.get(), base::MessageLoopProxy::current()); | |
66 file_system_context_ = | |
67 CreateFileSystemContextForTesting(quota_manager_proxy_.get(), base_dir); | |
68 | |
69 // Prepare the origin's root directory. | |
70 FileSystemMountPointProvider* mount_point_provider = | |
71 file_system_context_->GetMountPointProvider(src_type_); | |
72 mount_point_provider->OpenFileSystem( | |
73 origin_, src_type_, | |
74 OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, | |
75 base::Bind(&ExpectOk)); | |
76 mount_point_provider = | |
77 file_system_context_->GetMountPointProvider(dest_type_); | |
78 mount_point_provider->OpenFileSystem( | |
79 origin_, dest_type_, | |
80 OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, | |
81 base::Bind(&ExpectOk)); | |
82 base::MessageLoop::current()->RunUntilIdle(); | |
83 | |
84 // Grant relatively big quota initially. | |
85 quota_manager_->SetQuota(origin_, | |
86 FileSystemTypeToQuotaStorageType(src_type_), | |
87 1024 * 1024); | |
88 quota_manager_->SetQuota(origin_, | |
89 FileSystemTypeToQuotaStorageType(dest_type_), | |
90 1024 * 1024); | |
91 } | |
92 | |
93 int64 GetSourceUsage() { | |
94 int64 usage = 0; | |
95 GetUsageAndQuota(src_type_, &usage, NULL); | |
96 return usage; | |
97 } | |
98 | |
99 int64 GetDestUsage() { | |
100 int64 usage = 0; | |
101 GetUsageAndQuota(dest_type_, &usage, NULL); | |
102 return usage; | |
103 } | |
104 | |
105 FileSystemURL SourceURL(const std::string& path) { | |
106 return file_system_context_->CreateCrackedFileSystemURL( | |
107 origin_, src_type_, base::FilePath::FromUTF8Unsafe(path)); | |
108 } | |
109 | |
110 FileSystemURL DestURL(const std::string& path) { | |
111 return file_system_context_->CreateCrackedFileSystemURL( | |
112 origin_, dest_type_, base::FilePath::FromUTF8Unsafe(path)); | |
113 } | |
114 | |
115 base::PlatformFileError Copy(const FileSystemURL& src, | |
116 const FileSystemURL& dest) { | |
117 return AsyncFileTestHelper::Copy(file_system_context_.get(), src, dest); | |
118 } | |
119 | |
120 base::PlatformFileError Move(const FileSystemURL& src, | |
121 const FileSystemURL& dest) { | |
122 return AsyncFileTestHelper::Move(file_system_context_.get(), src, dest); | |
123 } | |
124 | |
125 base::PlatformFileError SetUpTestCaseFiles( | |
126 const FileSystemURL& root, | |
127 const test::TestCaseRecord* const test_cases, | |
128 size_t test_case_size) { | |
129 base::PlatformFileError result = base::PLATFORM_FILE_ERROR_FAILED; | |
130 for (size_t i = 0; i < test_case_size; ++i) { | |
131 const test::TestCaseRecord& test_case = test_cases[i]; | |
132 FileSystemURL url = file_system_context_->CreateCrackedFileSystemURL( | |
133 root.origin(), | |
134 root.mount_type(), | |
135 root.virtual_path().Append(test_case.path)); | |
136 if (test_case.is_directory) | |
137 result = CreateDirectory(url); | |
138 else | |
139 result = CreateFile(url, test_case.data_file_size); | |
140 EXPECT_EQ(base::PLATFORM_FILE_OK, result) << url.DebugString(); | |
141 if (result != base::PLATFORM_FILE_OK) | |
142 return result; | |
143 } | |
144 return result; | |
145 } | |
146 | |
147 void VerifyTestCaseFiles( | |
148 const FileSystemURL& root, | |
149 const test::TestCaseRecord* const test_cases, | |
150 size_t test_case_size) { | |
151 std::map<base::FilePath, const test::TestCaseRecord*> test_case_map; | |
152 for (size_t i = 0; i < test_case_size; ++i) | |
153 test_case_map[ | |
154 base::FilePath(test_cases[i].path).NormalizePathSeparators()] = | |
155 &test_cases[i]; | |
156 | |
157 std::queue<FileSystemURL> directories; | |
158 FileEntryList entries; | |
159 directories.push(root); | |
160 while (!directories.empty()) { | |
161 FileSystemURL dir = directories.front(); | |
162 directories.pop(); | |
163 ASSERT_EQ(base::PLATFORM_FILE_OK, ReadDirectory(dir, &entries)); | |
164 for (size_t i = 0; i < entries.size(); ++i) { | |
165 FileSystemURL url = file_system_context_->CreateCrackedFileSystemURL( | |
166 dir.origin(), | |
167 dir.mount_type(), | |
168 dir.virtual_path().Append(entries[i].name)); | |
169 base::FilePath relative; | |
170 root.virtual_path().AppendRelativePath(url.virtual_path(), &relative); | |
171 relative = relative.NormalizePathSeparators(); | |
172 ASSERT_TRUE(ContainsKey(test_case_map, relative)); | |
173 if (entries[i].is_directory) { | |
174 EXPECT_TRUE(test_case_map[relative]->is_directory); | |
175 directories.push(url); | |
176 } else { | |
177 EXPECT_FALSE(test_case_map[relative]->is_directory); | |
178 EXPECT_TRUE(FileExists(url, test_case_map[relative]->data_file_size)); | |
179 } | |
180 test_case_map.erase(relative); | |
181 } | |
182 } | |
183 EXPECT_TRUE(test_case_map.empty()); | |
184 } | |
185 | |
186 base::PlatformFileError ReadDirectory(const FileSystemURL& url, | |
187 FileEntryList* entries) { | |
188 return AsyncFileTestHelper::ReadDirectory( | |
189 file_system_context_.get(), url, entries); | |
190 } | |
191 | |
192 base::PlatformFileError CreateDirectory(const FileSystemURL& url) { | |
193 return AsyncFileTestHelper::CreateDirectory(file_system_context_.get(), | |
194 url); | |
195 } | |
196 | |
197 base::PlatformFileError CreateFile(const FileSystemURL& url, size_t size) { | |
198 base::PlatformFileError result = | |
199 AsyncFileTestHelper::CreateFile(file_system_context_.get(), url); | |
200 if (result != base::PLATFORM_FILE_OK) | |
201 return result; | |
202 return AsyncFileTestHelper::TruncateFile( | |
203 file_system_context_.get(), url, size); | |
204 } | |
205 | |
206 bool FileExists(const FileSystemURL& url, int64 expected_size) { | |
207 return AsyncFileTestHelper::FileExists( | |
208 file_system_context_.get(), url, expected_size); | |
209 } | |
210 | |
211 bool DirectoryExists(const FileSystemURL& url) { | |
212 return AsyncFileTestHelper::DirectoryExists(file_system_context_.get(), | |
213 url); | |
214 } | |
215 | |
216 private: | |
217 void GetUsageAndQuota(FileSystemType type, int64* usage, int64* quota) { | |
218 quota::QuotaStatusCode status = AsyncFileTestHelper::GetUsageAndQuota( | |
219 quota_manager_.get(), origin_, type, usage, quota); | |
220 ASSERT_EQ(quota::kQuotaStatusOk, status); | |
221 } | |
222 | |
223 private: | |
224 base::ScopedTempDir base_; | |
225 | |
226 const GURL origin_; | |
227 const FileSystemType src_type_; | |
228 const FileSystemType dest_type_; | |
229 | |
230 base::MessageLoop message_loop_; | |
231 scoped_refptr<FileSystemContext> file_system_context_; | |
232 scoped_refptr<quota::MockQuotaManagerProxy> quota_manager_proxy_; | |
233 scoped_refptr<quota::MockQuotaManager> quota_manager_; | |
234 | |
235 DISALLOW_COPY_AND_ASSIGN(CrossOperationTestHelper); | |
236 }; | |
237 | |
238 TEST(LocalFileSystemCrossOperationTest, CopySingleFile) { | |
239 CrossOperationTestHelper helper(GURL("http://foo"), | |
240 kFileSystemTypeTemporary, | |
241 kFileSystemTypePersistent); | |
242 helper.SetUp(); | |
243 | |
244 FileSystemURL src = helper.SourceURL("a"); | |
245 FileSystemURL dest = helper.DestURL("b"); | |
246 int64 src_initial_usage = helper.GetSourceUsage(); | |
247 int64 dest_initial_usage = helper.GetDestUsage(); | |
248 | |
249 // Set up a source file. | |
250 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.CreateFile(src, 10)); | |
251 int64 src_increase = helper.GetSourceUsage() - src_initial_usage; | |
252 | |
253 // Copy it. | |
254 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.Copy(src, dest)); | |
255 | |
256 // Verify. | |
257 ASSERT_TRUE(helper.FileExists(src, 10)); | |
258 ASSERT_TRUE(helper.FileExists(dest, 10)); | |
259 | |
260 int64 src_new_usage = helper.GetSourceUsage(); | |
261 ASSERT_EQ(src_initial_usage + src_increase, src_new_usage); | |
262 | |
263 int64 dest_increase = helper.GetDestUsage() - dest_initial_usage; | |
264 ASSERT_EQ(src_increase, dest_increase); | |
265 } | |
266 | |
267 TEST(LocalFileSystemCrossOperationTest, MoveSingleFile) { | |
268 CrossOperationTestHelper helper(GURL("http://foo"), | |
269 kFileSystemTypeTemporary, | |
270 kFileSystemTypePersistent); | |
271 helper.SetUp(); | |
272 | |
273 FileSystemURL src = helper.SourceURL("a"); | |
274 FileSystemURL dest = helper.DestURL("b"); | |
275 int64 src_initial_usage = helper.GetSourceUsage(); | |
276 int64 dest_initial_usage = helper.GetDestUsage(); | |
277 | |
278 // Set up a source file. | |
279 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.CreateFile(src, 10)); | |
280 int64 src_increase = helper.GetSourceUsage() - src_initial_usage; | |
281 | |
282 // Move it. | |
283 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.Move(src, dest)); | |
284 | |
285 // Verify. | |
286 ASSERT_FALSE(helper.FileExists(src, AsyncFileTestHelper::kDontCheckSize)); | |
287 ASSERT_TRUE(helper.FileExists(dest, 10)); | |
288 | |
289 int64 src_new_usage = helper.GetSourceUsage(); | |
290 ASSERT_EQ(src_initial_usage, src_new_usage); | |
291 | |
292 int64 dest_increase = helper.GetDestUsage() - dest_initial_usage; | |
293 ASSERT_EQ(src_increase, dest_increase); | |
294 } | |
295 | |
296 TEST(LocalFileSystemCrossOperationTest, CopySingleDirectory) { | |
297 CrossOperationTestHelper helper(GURL("http://foo"), | |
298 kFileSystemTypeTemporary, | |
299 kFileSystemTypePersistent); | |
300 helper.SetUp(); | |
301 | |
302 FileSystemURL src = helper.SourceURL("a"); | |
303 FileSystemURL dest = helper.DestURL("b"); | |
304 int64 src_initial_usage = helper.GetSourceUsage(); | |
305 int64 dest_initial_usage = helper.GetDestUsage(); | |
306 | |
307 // Set up a source directory. | |
308 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.CreateDirectory(src)); | |
309 int64 src_increase = helper.GetSourceUsage() - src_initial_usage; | |
310 | |
311 // Copy it. | |
312 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.Copy(src, dest)); | |
313 | |
314 // Verify. | |
315 ASSERT_TRUE(helper.DirectoryExists(src)); | |
316 ASSERT_TRUE(helper.DirectoryExists(dest)); | |
317 | |
318 int64 src_new_usage = helper.GetSourceUsage(); | |
319 ASSERT_EQ(src_initial_usage + src_increase, src_new_usage); | |
320 | |
321 int64 dest_increase = helper.GetDestUsage() - dest_initial_usage; | |
322 ASSERT_EQ(src_increase, dest_increase); | |
323 } | |
324 | |
325 TEST(LocalFileSystemCrossOperationTest, MoveSingleDirectory) { | |
326 CrossOperationTestHelper helper(GURL("http://foo"), | |
327 kFileSystemTypeTemporary, | |
328 kFileSystemTypePersistent); | |
329 helper.SetUp(); | |
330 | |
331 FileSystemURL src = helper.SourceURL("a"); | |
332 FileSystemURL dest = helper.DestURL("b"); | |
333 int64 src_initial_usage = helper.GetSourceUsage(); | |
334 int64 dest_initial_usage = helper.GetDestUsage(); | |
335 | |
336 // Set up a source directory. | |
337 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.CreateDirectory(src)); | |
338 int64 src_increase = helper.GetSourceUsage() - src_initial_usage; | |
339 | |
340 // Move it. | |
341 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.Move(src, dest)); | |
342 | |
343 // Verify. | |
344 ASSERT_FALSE(helper.DirectoryExists(src)); | |
345 ASSERT_TRUE(helper.DirectoryExists(dest)); | |
346 | |
347 int64 src_new_usage = helper.GetSourceUsage(); | |
348 ASSERT_EQ(src_initial_usage, src_new_usage); | |
349 | |
350 int64 dest_increase = helper.GetDestUsage() - dest_initial_usage; | |
351 ASSERT_EQ(src_increase, dest_increase); | |
352 } | |
353 | |
354 TEST(LocalFileSystemCrossOperationTest, CopyDirectory) { | |
355 CrossOperationTestHelper helper(GURL("http://foo"), | |
356 kFileSystemTypeTemporary, | |
357 kFileSystemTypePersistent); | |
358 helper.SetUp(); | |
359 | |
360 FileSystemURL src = helper.SourceURL("a"); | |
361 FileSystemURL dest = helper.DestURL("b"); | |
362 int64 src_initial_usage = helper.GetSourceUsage(); | |
363 int64 dest_initial_usage = helper.GetDestUsage(); | |
364 | |
365 // Set up a source directory. | |
366 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.CreateDirectory(src)); | |
367 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
368 helper.SetUpTestCaseFiles(src, | |
369 test::kRegularTestCases, | |
370 test::kRegularTestCaseSize)); | |
371 int64 src_increase = helper.GetSourceUsage() - src_initial_usage; | |
372 | |
373 // Copy it. | |
374 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.Copy(src, dest)); | |
375 | |
376 // Verify. | |
377 ASSERT_TRUE(helper.DirectoryExists(src)); | |
378 ASSERT_TRUE(helper.DirectoryExists(dest)); | |
379 | |
380 helper.VerifyTestCaseFiles(dest, | |
381 test::kRegularTestCases, | |
382 test::kRegularTestCaseSize); | |
383 | |
384 int64 src_new_usage = helper.GetSourceUsage(); | |
385 ASSERT_EQ(src_initial_usage + src_increase, src_new_usage); | |
386 | |
387 int64 dest_increase = helper.GetDestUsage() - dest_initial_usage; | |
388 ASSERT_EQ(src_increase, dest_increase); | |
389 } | |
390 | |
391 TEST(LocalFileSystemCrossOperationTest, MoveDirectory) { | |
392 CrossOperationTestHelper helper(GURL("http://foo"), | |
393 kFileSystemTypeTemporary, | |
394 kFileSystemTypePersistent); | |
395 helper.SetUp(); | |
396 | |
397 FileSystemURL src = helper.SourceURL("a"); | |
398 FileSystemURL dest = helper.DestURL("b"); | |
399 int64 src_initial_usage = helper.GetSourceUsage(); | |
400 int64 dest_initial_usage = helper.GetDestUsage(); | |
401 | |
402 // Set up a source directory. | |
403 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.CreateDirectory(src)); | |
404 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
405 helper.SetUpTestCaseFiles(src, | |
406 test::kRegularTestCases, | |
407 test::kRegularTestCaseSize)); | |
408 int64 src_increase = helper.GetSourceUsage() - src_initial_usage; | |
409 | |
410 // Move it. | |
411 ASSERT_EQ(base::PLATFORM_FILE_OK, helper.Move(src, dest)); | |
412 | |
413 // Verify. | |
414 ASSERT_FALSE(helper.DirectoryExists(src)); | |
415 ASSERT_TRUE(helper.DirectoryExists(dest)); | |
416 | |
417 helper.VerifyTestCaseFiles(dest, | |
418 test::kRegularTestCases, | |
419 test::kRegularTestCaseSize); | |
420 | |
421 int64 src_new_usage = helper.GetSourceUsage(); | |
422 ASSERT_EQ(src_initial_usage, src_new_usage); | |
423 | |
424 int64 dest_increase = helper.GetDestUsage() - dest_initial_usage; | |
425 ASSERT_EQ(src_increase, dest_increase); | |
426 } | |
427 | |
428 } // namespace fileapi | |
OLD | NEW |