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

Side by Side Diff: webkit/fileapi/local_file_system_cross_operation_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698