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

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

Issue 16352002: Rename CrossOperationDelegate to CopyOrMoveOperationDelegate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 (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
OLDNEW
« no previous file with comments | « webkit/browser/fileapi/cross_operation_delegate.cc ('k') | webkit/browser/fileapi/local_file_system_operation.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698