OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <map> | 5 #include <map> |
6 #include <set> | 6 #include <set> |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 }; | 43 }; |
44 | 44 |
45 FilePath GetTopLevelPath(const FilePath& path) { | 45 FilePath GetTopLevelPath(const FilePath& path) { |
46 std::vector<FilePath::StringType> components; | 46 std::vector<FilePath::StringType> components; |
47 path.GetComponents(&components); | 47 path.GetComponents(&components); |
48 return FilePath(components[0]); | 48 return FilePath(components[0]); |
49 } | 49 } |
50 | 50 |
51 } // namespace | 51 } // namespace |
52 | 52 |
| 53 // TODO(kinuko): we should have separate tests for DraggedFileUtil and |
| 54 // IsolatedFileUtil. |
53 class IsolatedFileUtilTest : public testing::Test { | 55 class IsolatedFileUtilTest : public testing::Test { |
54 public: | 56 public: |
55 IsolatedFileUtilTest() {} | 57 IsolatedFileUtilTest() {} |
56 | 58 |
57 void SetUp() { | 59 void SetUp() { |
58 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); | 60 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); |
59 file_util_.reset(new IsolatedFileUtil()); | 61 file_util_.reset(new DraggedFileUtil()); |
60 | 62 |
61 // Register the files/directories of RegularTestCases (with random | 63 // Register the files/directories of RegularTestCases (with random |
62 // root paths) as dropped files. | 64 // root paths) as dropped files. |
63 SimulateDropFiles(); | 65 SimulateDropFiles(); |
64 | 66 |
65 file_system_context_ = new FileSystemContext( | 67 file_system_context_ = new FileSystemContext( |
66 base::MessageLoopProxy::current(), | 68 base::MessageLoopProxy::current(), |
67 base::MessageLoopProxy::current(), | 69 base::MessageLoopProxy::current(), |
68 make_scoped_refptr(new quota::MockSpecialStoragePolicy()), | 70 make_scoped_refptr(new quota::MockSpecialStoragePolicy()), |
69 NULL /* quota_manager */, | 71 NULL /* quota_manager */, |
(...skipping 22 matching lines...) Expand all Loading... |
92 } | 94 } |
93 FileSystemFileUtil* file_util() const { return file_util_.get(); } | 95 FileSystemFileUtil* file_util() const { return file_util_.get(); } |
94 FileSystemFileUtil* other_file_util() const { return other_file_util_.get(); } | 96 FileSystemFileUtil* other_file_util() const { return other_file_util_.get(); } |
95 std::string filesystem_id() const { return filesystem_id_; } | 97 std::string filesystem_id() const { return filesystem_id_; } |
96 | 98 |
97 FilePath GetTestCasePlatformPath(const FilePath::StringType& path) { | 99 FilePath GetTestCasePlatformPath(const FilePath::StringType& path) { |
98 return toplevel_root_map_[GetTopLevelPath(FilePath(path))].Append(path). | 100 return toplevel_root_map_[GetTopLevelPath(FilePath(path))].Append(path). |
99 NormalizePathSeparators(); | 101 NormalizePathSeparators(); |
100 } | 102 } |
101 | 103 |
| 104 FilePath GetTestCaseLocalPath(const FilePath& path) { |
| 105 FilePath relative; |
| 106 if (data_dir_.path().AppendRelativePath(path, &relative)) |
| 107 return relative; |
| 108 return path; |
| 109 } |
| 110 |
102 FileSystemURL GetFileSystemURL(const FilePath& path) const { | 111 FileSystemURL GetFileSystemURL(const FilePath& path) const { |
103 FilePath virtual_path = isolated_context()->CreateVirtualRootPath( | 112 FilePath virtual_path = isolated_context()->CreateVirtualRootPath( |
104 filesystem_id()).Append(path); | 113 filesystem_id()).Append(path); |
105 return FileSystemURL(GURL("http://example.com"), | 114 return FileSystemURL(GURL("http://example.com"), |
106 kFileSystemTypeIsolated, | 115 kFileSystemTypeIsolated, |
107 virtual_path); | 116 virtual_path); |
108 } | 117 } |
109 | 118 |
110 FileSystemURL GetOtherFileSystemURL(const FilePath& path) { | 119 FileSystemURL GetOtherFileSystemURL(const FilePath& path) { |
111 return other_file_util_helper_.CreateURL(path); | 120 return other_file_util_helper_.CreateURL(GetTestCaseLocalPath(path)); |
112 } | 121 } |
113 | 122 |
114 void VerifyFilesHaveSameContent(FileSystemFileUtil* file_util1, | 123 void VerifyFilesHaveSameContent(FileSystemFileUtil* file_util1, |
115 FileSystemFileUtil* file_util2, | 124 FileSystemFileUtil* file_util2, |
116 const FileSystemURL& url1, | 125 const FileSystemURL& url1, |
117 const FileSystemURL& url2) { | 126 const FileSystemURL& url2) { |
118 scoped_ptr<FileSystemOperationContext> context; | 127 scoped_ptr<FileSystemOperationContext> context; |
119 | 128 |
120 // Get the file info for url1. | 129 // Get the file info for url1. |
121 base::PlatformFileInfo info1; | 130 base::PlatformFileInfo info1; |
(...skipping 21 matching lines...) Expand all Loading... |
143 EXPECT_TRUE(file_util::ReadFileToString(platform_path1, &content1)); | 152 EXPECT_TRUE(file_util::ReadFileToString(platform_path1, &content1)); |
144 EXPECT_TRUE(file_util::ReadFileToString(platform_path2, &content2)); | 153 EXPECT_TRUE(file_util::ReadFileToString(platform_path2, &content2)); |
145 EXPECT_EQ(content1, content2); | 154 EXPECT_EQ(content1, content2); |
146 } | 155 } |
147 | 156 |
148 void VerifyDirectoriesHaveSameContent(FileSystemFileUtil* file_util1, | 157 void VerifyDirectoriesHaveSameContent(FileSystemFileUtil* file_util1, |
149 FileSystemFileUtil* file_util2, | 158 FileSystemFileUtil* file_util2, |
150 const FileSystemURL& root1, | 159 const FileSystemURL& root1, |
151 const FileSystemURL& root2) { | 160 const FileSystemURL& root2) { |
152 scoped_ptr<FileSystemOperationContext> context; | 161 scoped_ptr<FileSystemOperationContext> context; |
| 162 FilePath root_path1 = root1.path(); |
| 163 FilePath root_path2 = root2.path(); |
153 | 164 |
154 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum1; | 165 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum1; |
155 context.reset(new FileSystemOperationContext(file_system_context())); | 166 context.reset(new FileSystemOperationContext(file_system_context())); |
156 file_enum1.reset(file_util1->CreateFileEnumerator( | 167 file_enum1.reset(file_util1->CreateFileEnumerator( |
157 context.get(), root1, true /* recursive */)); | 168 context.get(), root1, true /* recursive */)); |
158 | 169 |
159 FilePath current; | 170 FilePath current; |
160 std::set<FilePath> file_set1; | 171 std::set<FilePath> file_set1; |
161 while (!(current = file_enum1->Next()).empty()) { | 172 while (!(current = file_enum1->Next()).empty()) { |
162 if (file_enum1->IsDirectory()) | 173 if (file_enum1->IsDirectory()) |
163 continue; | 174 continue; |
164 file_set1.insert(current); | 175 FilePath relative; |
| 176 root_path1.AppendRelativePath(current, &relative); |
| 177 file_set1.insert(relative); |
165 } | 178 } |
166 | 179 |
167 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum2; | 180 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum2; |
168 context.reset(new FileSystemOperationContext(file_system_context())); | 181 context.reset(new FileSystemOperationContext(file_system_context())); |
169 file_enum2.reset(file_util2->CreateFileEnumerator( | 182 file_enum2.reset(file_util2->CreateFileEnumerator( |
170 context.get(), root2, true /* recursive */)); | 183 context.get(), root2, true /* recursive */)); |
171 | 184 |
172 while (!(current = file_enum2->Next()).empty()) { | 185 while (!(current = file_enum2->Next()).empty()) { |
173 FileSystemURL url1 = root1.WithPath(current); | 186 FilePath relative; |
174 FileSystemURL url2 = root2.WithPath(current); | 187 root_path2.AppendRelativePath(current, &relative); |
| 188 FileSystemURL url1 = root1.WithPath(root_path1.Append(relative)); |
| 189 FileSystemURL url2 = root2.WithPath(root_path2.Append(relative)); |
175 if (file_enum2->IsDirectory()) { | 190 if (file_enum2->IsDirectory()) { |
176 FileSystemOperationContext context1(file_system_context()); | 191 FileSystemOperationContext context1(file_system_context()); |
177 FileSystemOperationContext context2(file_system_context()); | 192 FileSystemOperationContext context2(file_system_context()); |
178 EXPECT_EQ(file_util1->IsDirectoryEmpty(&context1, url1), | 193 EXPECT_EQ(file_util1->IsDirectoryEmpty(&context1, url1), |
179 file_util2->IsDirectoryEmpty(&context2, url2)); | 194 file_util2->IsDirectoryEmpty(&context2, url2)); |
180 continue; | 195 continue; |
181 } | 196 } |
182 EXPECT_TRUE(file_set1.find(current) != file_set1.end()); | 197 EXPECT_TRUE(file_set1.find(relative) != file_set1.end()); |
183 VerifyFilesHaveSameContent(file_util1, file_util2, url1, url2); | 198 VerifyFilesHaveSameContent(file_util1, file_util2, url1, url2); |
184 } | 199 } |
185 } | 200 } |
186 | 201 |
187 scoped_ptr<FileSystemOperationContext> GetOperationContext() { | 202 scoped_ptr<FileSystemOperationContext> GetOperationContext() { |
188 return make_scoped_ptr( | 203 return make_scoped_ptr( |
189 new FileSystemOperationContext(file_system_context())).Pass(); | 204 new FileSystemOperationContext(file_system_context())).Pass(); |
190 } | 205 } |
191 | 206 |
192 | 207 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 for (size_t i = 0; i < arraysize(kUnregisteredCases); ++i) { | 295 for (size_t i = 0; i < arraysize(kUnregisteredCases); ++i) { |
281 SCOPED_TRACE(testing::Message() << "Creating kUnregisteredCases " << i); | 296 SCOPED_TRACE(testing::Message() << "Creating kUnregisteredCases " << i); |
282 const test::TestCaseRecord& test_case = kUnregisteredCases[i]; | 297 const test::TestCaseRecord& test_case = kUnregisteredCases[i]; |
283 FileSystemURL url = GetFileSystemURL(FilePath(test_case.path)); | 298 FileSystemURL url = GetFileSystemURL(FilePath(test_case.path)); |
284 | 299 |
285 // This should fail as the paths in kUnregisteredCases are not included | 300 // This should fail as the paths in kUnregisteredCases are not included |
286 // in the dropped files (i.e. the regular test cases). | 301 // in the dropped files (i.e. the regular test cases). |
287 base::PlatformFileInfo info; | 302 base::PlatformFileInfo info; |
288 FilePath platform_path; | 303 FilePath platform_path; |
289 FileSystemOperationContext context(file_system_context()); | 304 FileSystemOperationContext context(file_system_context()); |
290 ASSERT_EQ(base::PLATFORM_FILE_ERROR_SECURITY, | 305 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, |
291 file_util()->GetFileInfo(&context, url, &info, &platform_path)); | 306 file_util()->GetFileInfo(&context, url, &info, &platform_path)); |
292 } | 307 } |
293 } | 308 } |
294 | 309 |
295 TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) { | 310 TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) { |
296 for (size_t i = 0; i < test::kRegularTestCaseSize; ++i) { | 311 for (size_t i = 0; i < test::kRegularTestCaseSize; ++i) { |
297 const test::TestCaseRecord& test_case = test::kRegularTestCases[i]; | 312 const test::TestCaseRecord& test_case = test::kRegularTestCases[i]; |
298 if (!test_case.is_directory) | 313 if (!test_case.is_directory) |
299 continue; | 314 continue; |
300 | 315 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 false /* exclusive */, | 402 false /* exclusive */, |
388 true /* recursive */)); | 403 true /* recursive */)); |
389 | 404 |
390 context.reset(new FileSystemOperationContext(file_system_context())); | 405 context.reset(new FileSystemOperationContext(file_system_context())); |
391 ASSERT_EQ(base::PLATFORM_FILE_OK, | 406 ASSERT_EQ(base::PLATFORM_FILE_OK, |
392 FileUtilHelper::Copy( | 407 FileUtilHelper::Copy( |
393 context.get(), | 408 context.get(), |
394 file_util(), other_file_util(), | 409 file_util(), other_file_util(), |
395 src_url, dest_url)); | 410 src_url, dest_url)); |
396 | 411 |
397 // The other way (copy-in) should not work. | |
398 context.reset(new FileSystemOperationContext(file_system_context())); | |
399 ASSERT_EQ(base::PLATFORM_FILE_ERROR_SECURITY, | |
400 FileUtilHelper::Copy( | |
401 context.get(), | |
402 other_file_util(), file_util(), | |
403 dest_url, src_url)); | |
404 | |
405 VerifyFilesHaveSameContent(file_util(), other_file_util(), | 412 VerifyFilesHaveSameContent(file_util(), other_file_util(), |
406 src_url, dest_url); | 413 src_url, dest_url); |
407 } | 414 } |
408 } | 415 } |
409 | 416 |
410 TEST_F(IsolatedFileUtilTest, CopyOutDirectoryTest) { | 417 TEST_F(IsolatedFileUtilTest, CopyOutDirectoryTest) { |
411 scoped_ptr<FileSystemOperationContext> context( | 418 scoped_ptr<FileSystemOperationContext> context( |
412 new FileSystemOperationContext(file_system_context())); | 419 new FileSystemOperationContext(file_system_context())); |
413 FileSystemURL root_url = GetFileSystemURL(FilePath()); | 420 FileSystemURL root_url = GetFileSystemURL(FilePath()); |
414 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum( | 421 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum( |
(...skipping 20 matching lines...) Expand all Loading... |
435 false /* exclusive */, | 442 false /* exclusive */, |
436 true /* recursive */)); | 443 true /* recursive */)); |
437 | 444 |
438 context.reset(new FileSystemOperationContext(file_system_context())); | 445 context.reset(new FileSystemOperationContext(file_system_context())); |
439 ASSERT_EQ(base::PLATFORM_FILE_OK, | 446 ASSERT_EQ(base::PLATFORM_FILE_OK, |
440 FileUtilHelper::Copy( | 447 FileUtilHelper::Copy( |
441 context.get(), | 448 context.get(), |
442 file_util(), other_file_util(), | 449 file_util(), other_file_util(), |
443 src_url, dest_url)); | 450 src_url, dest_url)); |
444 | 451 |
445 // The other way (copy-in) should not work for two reasons: | |
446 // write is prohibited in the isolated filesystem, and copying directory | |
447 // to non-empty directory shouldn't work. | |
448 context.reset(new FileSystemOperationContext(file_system_context())); | |
449 base::PlatformFileError result = FileUtilHelper::Copy( | |
450 context.get(), other_file_util(), file_util(), dest_url, src_url); | |
451 ASSERT_TRUE(result == base::PLATFORM_FILE_ERROR_FAILED || | |
452 result == base::PLATFORM_FILE_ERROR_NOT_EMPTY); | |
453 | |
454 VerifyDirectoriesHaveSameContent(file_util(), other_file_util(), | 452 VerifyDirectoriesHaveSameContent(file_util(), other_file_util(), |
455 src_url, dest_url); | 453 src_url, dest_url); |
456 } | 454 } |
457 } | 455 } |
458 | 456 |
459 TEST_F(IsolatedFileUtilTest, TouchTest) { | 457 TEST_F(IsolatedFileUtilTest, TouchTest) { |
460 for (size_t i = 0; i < test::kRegularTestCaseSize; ++i) { | 458 for (size_t i = 0; i < test::kRegularTestCaseSize; ++i) { |
461 const test::TestCaseRecord& test_case = test::kRegularTestCases[i]; | 459 const test::TestCaseRecord& test_case = test::kRegularTestCases[i]; |
462 if (test_case.is_directory) | 460 if (test_case.is_directory) |
463 continue; | 461 continue; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 EXPECT_EQ(base::PLATFORM_FILE_OK, | 504 EXPECT_EQ(base::PLATFORM_FILE_OK, |
507 file_util()->Truncate(GetOperationContext().get(), url, 999)); | 505 file_util()->Truncate(GetOperationContext().get(), url, 999)); |
508 ASSERT_EQ(base::PLATFORM_FILE_OK, | 506 ASSERT_EQ(base::PLATFORM_FILE_OK, |
509 file_util()->GetFileInfo(GetOperationContext().get(), url, | 507 file_util()->GetFileInfo(GetOperationContext().get(), url, |
510 &info, &platform_path)); | 508 &info, &platform_path)); |
511 EXPECT_EQ(999, info.size); | 509 EXPECT_EQ(999, info.size); |
512 } | 510 } |
513 } | 511 } |
514 | 512 |
515 } // namespace fileapi | 513 } // namespace fileapi |
OLD | NEW |