OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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 <algorithm> | |
6 #include <set> | |
7 #include <string> | |
8 | |
9 #include "base/file_path.h" | |
10 #include "base/file_util.h" | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/platform_file.h" | |
13 #include "base/scoped_temp_dir.h" | |
14 #include "base/sys_string_conversions.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 #include "webkit/fileapi/file_system_context.h" | |
17 #include "webkit/fileapi/file_system_operation_context.h" | |
18 #include "webkit/fileapi/file_system_test_helper.h" | |
19 #include "webkit/fileapi/obfuscated_file_system_file_util.h" | |
20 | |
21 using namespace fileapi; | |
22 | |
23 namespace { | |
24 | |
25 FilePath UTF8ToFilePath(const std::string& str) { | |
26 FilePath::StringType result; | |
27 #if defined(OS_POSIX) | |
28 result = str; | |
29 #elif defined(OS_WIN) | |
30 result = base::SysUTF8ToWide(str); | |
31 #endif | |
32 return FilePath(result); | |
33 } | |
34 | |
35 bool FileExists(const FilePath& path) { | |
36 return file_util::PathExists(path) && !file_util::DirectoryExists(path); | |
37 } | |
38 | |
39 int64 GetSize(const FilePath& path) { | |
40 int64 size; | |
41 EXPECT_TRUE(file_util::GetFileSize(path, &size)); | |
42 return size; | |
43 } | |
44 | |
45 // After a move, the dest exists and the source doesn't. | |
46 // After a copy, both source and dest exist. | |
47 struct CopyMoveTestCaseRecord { | |
48 bool is_copy_not_move; | |
49 const char source_path[64]; | |
50 const char dest_path[64]; | |
51 bool cause_overwrite; | |
52 }; | |
53 | |
54 const CopyMoveTestCaseRecord kCopyMoveTestCases[] = { | |
55 // This is the combinatoric set of: | |
56 // rename vs. same-name | |
57 // different directory vs. same directory | |
58 // overwrite vs. no-overwrite | |
59 // copy vs. move | |
60 // We can never be called with source and destination paths identical, so | |
61 // those cases are omitted. | |
62 {true, "dir0/file0", "dir0/file1", false}, | |
63 {false, "dir0/file0", "dir0/file1", false}, | |
64 {true, "dir0/file0", "dir0/file1", true}, | |
65 {false, "dir0/file0", "dir0/file1", true}, | |
66 | |
67 {true, "dir0/file0", "dir1/file0", false}, | |
68 {false, "dir0/file0", "dir1/file0", false}, | |
69 {true, "dir0/file0", "dir1/file0", true}, | |
70 {false, "dir0/file0", "dir1/file0", true}, | |
71 {true, "dir0/file0", "dir1/file1", false}, | |
72 {false, "dir0/file0", "dir1/file1", false}, | |
73 {true, "dir0/file0", "dir1/file1", true}, | |
74 {false, "dir0/file0", "dir1/file1", true}, | |
75 }; | |
76 | |
77 struct MigrationTestCaseRecord { | |
78 bool is_directory; | |
79 const FilePath::CharType path[64]; | |
80 int64 data_file_size; | |
81 }; | |
82 | |
83 const MigrationTestCaseRecord kMigrationTestCases[] = { | |
84 {true, FILE_PATH_LITERAL("dir a"), 0}, | |
85 {true, FILE_PATH_LITERAL("dir a/dir a"), 0}, | |
86 {true, FILE_PATH_LITERAL("dir a/dir d"), 0}, | |
87 {true, FILE_PATH_LITERAL("dir a/dir d/dir e"), 0}, | |
88 {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir f"), 0}, | |
89 {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g"), 0}, | |
90 {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir h"), 0}, | |
91 {true, FILE_PATH_LITERAL("dir b"), 0}, | |
92 {true, FILE_PATH_LITERAL("dir b/dir a"), 0}, | |
93 {true, FILE_PATH_LITERAL("dir c"), 0}, | |
94 {false, FILE_PATH_LITERAL("file 0"), 38}, | |
95 {false, FILE_PATH_LITERAL("file 2"), 60}, | |
96 {false, FILE_PATH_LITERAL("file 3"), 0}, | |
97 {false, FILE_PATH_LITERAL("dir a/file 0"), 39}, | |
98 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 0"), 40}, | |
99 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 1"), 41}, | |
100 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 2"), 42}, | |
101 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 3"), 50}, | |
102 }; | |
103 | |
104 struct OriginEnumerationTestRecord { | |
105 std::string origin_url; | |
106 bool has_temporary; | |
107 bool has_persistent; | |
108 }; | |
109 | |
110 const OriginEnumerationTestRecord kOriginEnumerationTestRecords[] = { | |
111 {"http://example.com", false, true}, | |
112 {"http://example1.com", true, false}, | |
113 {"https://example1.com", true, true}, | |
114 {"file://", false, true}, | |
115 {"http://example.com:8000", false, true}, | |
116 }; | |
117 | |
118 } // namespace (anonymous) | |
119 | |
120 // TODO(ericu): The vast majority of this and the other FSFU subclass tests | |
121 // could theoretically be shared. It would basically be a FSFU interface | |
122 // compliance test, and only the subclass-specific bits that look into the | |
123 // implementation would need to be written per-subclass. | |
124 class ObfuscatedFileSystemFileUtilTest : public testing::Test { | |
125 public: | |
126 ObfuscatedFileSystemFileUtilTest() | |
127 : origin_(GURL("http://www.example.com")), | |
128 type_(kFileSystemTypeTemporary), | |
129 test_helper_(origin_, type_) { | |
130 } | |
131 | |
132 void SetUp() { | |
133 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); | |
134 | |
135 obfuscated_file_system_file_util_ = | |
136 new ObfuscatedFileSystemFileUtil(data_dir_.path(), | |
137 new FileSystemFileUtil()); | |
138 test_helper_.SetUp(data_dir_.path(), | |
139 false, // incognito | |
140 false, // unlimited quota | |
141 NULL, // quota::QuotaManagerProxy | |
142 obfuscated_file_system_file_util_.get()); | |
143 } | |
144 | |
145 FileSystemOperationContext* NewContext() { | |
146 FileSystemOperationContext* context = test_helper_.NewOperationContext(); | |
147 return context; | |
148 } | |
149 | |
150 ObfuscatedFileSystemFileUtil* ofsfu() { | |
151 return obfuscated_file_system_file_util_.get(); | |
152 } | |
153 | |
154 const FilePath& test_directory() const { | |
155 return data_dir_.path(); | |
156 } | |
157 | |
158 const GURL& origin_url() const { | |
159 return origin_; | |
160 } | |
161 | |
162 fileapi::FileSystemType type() const { | |
163 return type_; | |
164 } | |
165 | |
166 void CheckFileAndCloseHandle( | |
167 const FilePath& virtual_path, PlatformFile file_handle) { | |
168 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
169 FilePath local_path; | |
170 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
171 context.get(), virtual_path, &local_path)); | |
172 | |
173 base::PlatformFileInfo file_info0; | |
174 FilePath data_path; | |
175 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
176 context.get(), virtual_path, &file_info0, &data_path)); | |
177 EXPECT_EQ(data_path, local_path); | |
178 EXPECT_TRUE(FileExists(data_path)); | |
179 EXPECT_EQ(0, GetSize(data_path)); | |
180 | |
181 const char data[] = "test data"; | |
182 const int length = arraysize(data) - 1; | |
183 | |
184 if (base::kInvalidPlatformFileValue == file_handle) { | |
185 bool created = true; | |
186 PlatformFileError error; | |
187 file_handle = base::CreatePlatformFile( | |
188 data_path, | |
189 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE, | |
190 &created, | |
191 &error); | |
192 ASSERT_NE(base::kInvalidPlatformFileValue, file_handle); | |
193 ASSERT_EQ(base::PLATFORM_FILE_OK, error); | |
194 EXPECT_FALSE(created); | |
195 } | |
196 ASSERT_EQ(length, base::WritePlatformFile(file_handle, 0, data, length)); | |
197 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); | |
198 | |
199 base::PlatformFileInfo file_info1; | |
200 EXPECT_EQ(length, GetSize(data_path)); | |
201 context.reset(NewContext()); | |
202 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
203 context.get(), virtual_path, &file_info1, &data_path)); | |
204 EXPECT_EQ(data_path, local_path); | |
205 | |
206 EXPECT_FALSE(file_info0.is_directory); | |
207 EXPECT_FALSE(file_info1.is_directory); | |
208 EXPECT_FALSE(file_info0.is_symbolic_link); | |
209 EXPECT_FALSE(file_info1.is_symbolic_link); | |
210 EXPECT_EQ(0, file_info0.size); | |
211 EXPECT_EQ(length, file_info1.size); | |
212 EXPECT_LE(file_info0.last_modified, file_info1.last_modified); | |
213 | |
214 context.reset(NewContext()); | |
215 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
216 context.get(), virtual_path, length * 2)); | |
217 EXPECT_EQ(length * 2, GetSize(data_path)); | |
218 | |
219 context.reset(NewContext()); | |
220 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
221 context.get(), virtual_path, 1)); | |
222 EXPECT_EQ(1, GetSize(data_path)); | |
223 } | |
224 | |
225 void ValidateTestDirectory( | |
226 const FilePath& root_path, | |
227 const std::set<FilePath::StringType>& files, | |
228 const std::set<FilePath::StringType>& directories) { | |
229 scoped_ptr<FileSystemOperationContext> context; | |
230 std::set<FilePath::StringType>::const_iterator iter; | |
231 for (iter = files.begin(); iter != files.end(); ++iter) { | |
232 bool created = true; | |
233 context.reset(NewContext()); | |
234 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
235 ofsfu()->EnsureFileExists( | |
236 context.get(), root_path.Append(*iter), | |
237 &created)); | |
238 ASSERT_FALSE(created); | |
239 } | |
240 for (iter = directories.begin(); iter != directories.end(); ++iter) { | |
241 context.reset(NewContext()); | |
242 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), | |
243 root_path.Append(*iter))); | |
244 } | |
245 } | |
246 | |
247 void FillTestDirectory( | |
248 const FilePath& root_path, | |
249 std::set<FilePath::StringType>* files, | |
250 std::set<FilePath::StringType>* directories) { | |
251 scoped_ptr<FileSystemOperationContext> context; | |
252 context.reset(NewContext()); | |
253 std::vector<base::FileUtilProxy::Entry> entries; | |
254 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
255 ofsfu()->ReadDirectory(context.get(), root_path, &entries)); | |
256 EXPECT_EQ(0UL, entries.size()); | |
257 | |
258 files->clear(); | |
259 files->insert(FILE_PATH_LITERAL("first")); | |
260 files->insert(FILE_PATH_LITERAL("second")); | |
261 files->insert(FILE_PATH_LITERAL("third")); | |
262 directories->clear(); | |
263 directories->insert(FILE_PATH_LITERAL("fourth")); | |
264 directories->insert(FILE_PATH_LITERAL("fifth")); | |
265 directories->insert(FILE_PATH_LITERAL("sixth")); | |
266 std::set<FilePath::StringType>::iterator iter; | |
267 for (iter = files->begin(); iter != files->end(); ++iter) { | |
268 bool created = false; | |
269 context.reset(NewContext()); | |
270 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
271 ofsfu()->EnsureFileExists( | |
272 context.get(), root_path.Append(*iter), &created)); | |
273 ASSERT_TRUE(created); | |
274 } | |
275 for (iter = directories->begin(); iter != directories->end(); ++iter) { | |
276 bool exclusive = true; | |
277 bool recursive = false; | |
278 context.reset(NewContext()); | |
279 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
280 ofsfu()->CreateDirectory( | |
281 context.get(), root_path.Append(*iter), exclusive, recursive)); | |
282 } | |
283 ValidateTestDirectory(root_path, *files, *directories); | |
284 } | |
285 | |
286 void TestReadDirectoryHelper(const FilePath& root_path) { | |
287 std::set<FilePath::StringType> files; | |
288 std::set<FilePath::StringType> directories; | |
289 FillTestDirectory(root_path, &files, &directories); | |
290 | |
291 scoped_ptr<FileSystemOperationContext> context; | |
292 std::vector<base::FileUtilProxy::Entry> entries; | |
293 context.reset(NewContext()); | |
294 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
295 ofsfu()->ReadDirectory(context.get(), root_path, &entries)); | |
296 std::vector<base::FileUtilProxy::Entry>::iterator entry_iter; | |
297 EXPECT_EQ(files.size() + directories.size(), entries.size()); | |
298 for (entry_iter = entries.begin(); entry_iter != entries.end(); | |
299 ++entry_iter) { | |
300 const base::FileUtilProxy::Entry& entry = *entry_iter; | |
301 std::set<FilePath::StringType>::iterator iter = files.find(entry.name); | |
302 if (iter != files.end()) { | |
303 EXPECT_FALSE(entry.is_directory); | |
304 files.erase(iter); | |
305 continue; | |
306 } | |
307 iter = directories.find(entry.name); | |
308 EXPECT_FALSE(directories.end() == iter); | |
309 EXPECT_TRUE(entry.is_directory); | |
310 directories.erase(iter); | |
311 } | |
312 } | |
313 | |
314 void TestTouchHelper(const FilePath& path) { | |
315 base::Time last_access_time = base::Time::Now(); // Ignored, so not tested. | |
316 base::Time last_modified_time = base::Time::Now(); | |
317 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
318 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
319 ofsfu()->Touch( | |
320 context.get(), path, last_access_time, last_modified_time)); | |
321 FilePath local_path; | |
322 base::PlatformFileInfo file_info; | |
323 context.reset(NewContext()); | |
324 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
325 context.get(), path, &file_info, &local_path)); | |
326 // We compare as time_t here to lower our resolution, to avoid false | |
327 // negatives caused by conversion to the local filesystem's native | |
328 // representation and back. | |
329 EXPECT_EQ(file_info.last_modified.ToTimeT(), last_modified_time.ToTimeT()); | |
330 | |
331 context.reset(NewContext()); | |
332 last_modified_time += base::TimeDelta::FromHours(1); | |
333 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
334 ofsfu()->Touch( | |
335 context.get(), path, last_access_time, last_modified_time)); | |
336 context.reset(NewContext()); | |
337 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
338 context.get(), path, &file_info, &local_path)); | |
339 EXPECT_EQ(file_info.last_modified.ToTimeT(), last_modified_time.ToTimeT()); | |
340 } | |
341 | |
342 void TestCopyInForeignFileHelper(bool overwrite) { | |
343 ScopedTempDir source_dir; | |
344 ASSERT_TRUE(source_dir.CreateUniqueTempDir()); | |
345 FilePath root_path = source_dir.path(); | |
346 FilePath src_path = root_path.AppendASCII("file_name"); | |
347 FilePath dest_path(FILE_PATH_LITERAL("new file")); | |
348 int64 src_file_length = 87; | |
349 | |
350 base::PlatformFileError error_code; | |
351 bool created = false; | |
352 int file_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE; | |
353 base::PlatformFile file_handle = | |
354 base::CreatePlatformFile( | |
355 src_path, file_flags, &created, &error_code); | |
356 EXPECT_TRUE(created); | |
357 ASSERT_EQ(base::PLATFORM_FILE_OK, error_code); | |
358 ASSERT_NE(base::kInvalidPlatformFileValue, file_handle); | |
359 ASSERT_TRUE(base::TruncatePlatformFile(file_handle, src_file_length)); | |
360 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); | |
361 | |
362 scoped_ptr<FileSystemOperationContext> context; | |
363 | |
364 if (overwrite) { | |
365 context.reset(NewContext()); | |
366 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
367 ofsfu()->EnsureFileExists(context.get(), dest_path, &created)); | |
368 EXPECT_TRUE(created); | |
369 } | |
370 | |
371 context.reset(NewContext()); | |
372 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
373 ofsfu()->CopyInForeignFile(context.get(), src_path, dest_path)); | |
374 context.reset(NewContext()); | |
375 EXPECT_TRUE(ofsfu()->PathExists(context.get(), dest_path)); | |
376 context.reset(NewContext()); | |
377 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
378 context.reset(NewContext()); | |
379 base::PlatformFileInfo file_info; | |
380 FilePath data_path; | |
381 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
382 context.get(), dest_path, &file_info, &data_path)); | |
383 EXPECT_NE(data_path, src_path); | |
384 EXPECT_TRUE(FileExists(data_path)); | |
385 EXPECT_EQ(src_file_length, GetSize(data_path)); | |
386 | |
387 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
388 ofsfu()->DeleteFile(context.get(), dest_path)); | |
389 } | |
390 | |
391 private: | |
392 ScopedTempDir data_dir_; | |
393 scoped_refptr<ObfuscatedFileSystemFileUtil> obfuscated_file_system_file_util_; | |
394 GURL origin_; | |
395 fileapi::FileSystemType type_; | |
396 FileSystemTestOriginHelper test_helper_; | |
397 | |
398 DISALLOW_COPY_AND_ASSIGN(ObfuscatedFileSystemFileUtilTest); | |
399 }; | |
400 | |
401 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCreateAndDeleteFile) { | |
402 base::PlatformFile file_handle = base::kInvalidPlatformFileValue; | |
403 bool created; | |
404 FilePath path = UTF8ToFilePath("fake/file"); | |
405 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
406 int file_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE; | |
407 | |
408 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
409 ofsfu()->CreateOrOpen( | |
410 context.get(), path, file_flags, &file_handle, | |
411 &created)); | |
412 | |
413 context.reset(NewContext()); | |
414 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
415 ofsfu()->DeleteFile(context.get(), path)); | |
416 | |
417 path = UTF8ToFilePath("test file"); | |
418 | |
419 context.reset(NewContext()); | |
420 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
421 ofsfu()->CreateOrOpen( | |
422 context.get(), path, file_flags, &file_handle, &created)); | |
423 ASSERT_TRUE(created); | |
424 EXPECT_NE(base::kInvalidPlatformFileValue, file_handle); | |
425 | |
426 CheckFileAndCloseHandle(path, file_handle); | |
427 | |
428 context.reset(NewContext()); | |
429 FilePath local_path; | |
430 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
431 context.get(), path, &local_path)); | |
432 EXPECT_TRUE(file_util::PathExists(local_path)); | |
433 | |
434 context.reset(NewContext()); | |
435 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
436 ofsfu()->DeleteFile(context.get(), path)); | |
437 EXPECT_FALSE(file_util::PathExists(local_path)); | |
438 | |
439 context.reset(NewContext()); | |
440 bool exclusive = true; | |
441 bool recursive = true; | |
442 FilePath directory_path = UTF8ToFilePath("series/of/directories"); | |
443 path = directory_path.AppendASCII("file name"); | |
444 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
445 context.get(), directory_path, exclusive, recursive)); | |
446 | |
447 context.reset(NewContext()); | |
448 file_handle = base::kInvalidPlatformFileValue; | |
449 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
450 ofsfu()->CreateOrOpen( | |
451 context.get(), path, file_flags, &file_handle, &created)); | |
452 ASSERT_TRUE(created); | |
453 EXPECT_NE(base::kInvalidPlatformFileValue, file_handle); | |
454 | |
455 CheckFileAndCloseHandle(path, file_handle); | |
456 | |
457 context.reset(NewContext()); | |
458 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
459 context.get(), path, &local_path)); | |
460 EXPECT_TRUE(file_util::PathExists(local_path)); | |
461 | |
462 context.reset(NewContext()); | |
463 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
464 ofsfu()->DeleteFile(context.get(), path)); | |
465 EXPECT_FALSE(file_util::PathExists(local_path)); | |
466 } | |
467 | |
468 TEST_F(ObfuscatedFileSystemFileUtilTest, TestTruncate) { | |
469 bool created = false; | |
470 FilePath path = UTF8ToFilePath("file"); | |
471 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
472 | |
473 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
474 ofsfu()->Truncate(context.get(), path, 4)); | |
475 | |
476 context.reset(NewContext()); | |
477 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
478 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
479 ASSERT_TRUE(created); | |
480 | |
481 context.reset(NewContext()); | |
482 FilePath local_path; | |
483 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
484 context.get(), path, &local_path)); | |
485 EXPECT_EQ(0, GetSize(local_path)); | |
486 | |
487 context.reset(NewContext()); | |
488 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
489 context.get(), path, 10)); | |
490 EXPECT_EQ(10, GetSize(local_path)); | |
491 | |
492 context.reset(NewContext()); | |
493 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
494 context.get(), path, 1)); | |
495 EXPECT_EQ(1, GetSize(local_path)); | |
496 | |
497 context.reset(NewContext()); | |
498 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
499 context.reset(NewContext()); | |
500 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
501 } | |
502 | |
503 TEST_F(ObfuscatedFileSystemFileUtilTest, TestEnsureFileExists) { | |
504 FilePath path = UTF8ToFilePath("fake/file"); | |
505 bool created = false; | |
506 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
507 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
508 ofsfu()->EnsureFileExists( | |
509 context.get(), path, &created)); | |
510 | |
511 context.reset(NewContext()); | |
512 path = UTF8ToFilePath("test file"); | |
513 created = false; | |
514 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
515 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
516 ASSERT_TRUE(created); | |
517 | |
518 CheckFileAndCloseHandle(path, base::kInvalidPlatformFileValue); | |
519 | |
520 context.reset(NewContext()); | |
521 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
522 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
523 ASSERT_FALSE(created); | |
524 | |
525 // Also test in a subdirectory. | |
526 path = UTF8ToFilePath("path/to/file.txt"); | |
527 context.reset(NewContext()); | |
528 bool exclusive = true; | |
529 bool recursive = true; | |
530 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
531 context.get(), path.DirName(), exclusive, recursive)); | |
532 | |
533 context.reset(NewContext()); | |
534 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
535 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
536 ASSERT_TRUE(created); | |
537 context.reset(NewContext()); | |
538 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
539 context.reset(NewContext()); | |
540 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
541 } | |
542 | |
543 TEST_F(ObfuscatedFileSystemFileUtilTest, TestDirectoryOps) { | |
544 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
545 | |
546 bool exclusive = false; | |
547 bool recursive = false; | |
548 FilePath path = UTF8ToFilePath("foo/bar"); | |
549 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, ofsfu()->CreateDirectory( | |
550 context.get(), path, exclusive, recursive)); | |
551 | |
552 context.reset(NewContext()); | |
553 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
554 ofsfu()->DeleteSingleDirectory(context.get(), path)); | |
555 | |
556 FilePath root = UTF8ToFilePath(""); | |
557 context.reset(NewContext()); | |
558 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
559 context.reset(NewContext()); | |
560 EXPECT_FALSE(ofsfu()->PathExists(context.get(), path)); | |
561 context.reset(NewContext()); | |
562 EXPECT_TRUE(ofsfu()->IsDirectoryEmpty(context.get(), root)); | |
563 | |
564 context.reset(NewContext()); | |
565 exclusive = false; | |
566 recursive = true; | |
567 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
568 context.get(), path, exclusive, recursive)); | |
569 | |
570 context.reset(NewContext()); | |
571 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path)); | |
572 context.reset(NewContext()); | |
573 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
574 context.reset(NewContext()); | |
575 EXPECT_FALSE(ofsfu()->IsDirectoryEmpty(context.get(), root)); | |
576 context.reset(NewContext()); | |
577 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path.DirName())); | |
578 context.reset(NewContext()); | |
579 EXPECT_FALSE(ofsfu()->IsDirectoryEmpty(context.get(), path.DirName())); | |
580 | |
581 // Can't remove a non-empty directory. | |
582 context.reset(NewContext()); | |
583 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_EMPTY, | |
584 ofsfu()->DeleteSingleDirectory(context.get(), path.DirName())); | |
585 | |
586 base::PlatformFileInfo file_info; | |
587 FilePath local_path; | |
588 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
589 context.get(), path, &file_info, &local_path)); | |
590 EXPECT_TRUE(local_path.empty()); | |
591 EXPECT_TRUE(file_info.is_directory); | |
592 EXPECT_FALSE(file_info.is_symbolic_link); | |
593 | |
594 // Same create again should succeed, since exclusive is false. | |
595 context.reset(NewContext()); | |
596 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
597 context.get(), path, exclusive, recursive)); | |
598 | |
599 exclusive = true; | |
600 recursive = true; | |
601 context.reset(NewContext()); | |
602 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
603 context.get(), path, exclusive, recursive)); | |
604 | |
605 context.reset(NewContext()); | |
606 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
607 ofsfu()->DeleteSingleDirectory(context.get(), path)); | |
608 | |
609 path = UTF8ToFilePath("foo/bop"); | |
610 | |
611 context.reset(NewContext()); | |
612 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
613 context.reset(NewContext()); | |
614 EXPECT_FALSE(ofsfu()->PathExists(context.get(), path)); | |
615 context.reset(NewContext()); | |
616 EXPECT_TRUE(ofsfu()->IsDirectoryEmpty(context.get(), path)); | |
617 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, ofsfu()->GetFileInfo( | |
618 context.get(), path, &file_info, &local_path)); | |
619 | |
620 exclusive = true; | |
621 recursive = false; | |
622 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
623 context.get(), path, exclusive, recursive)); | |
624 | |
625 context.reset(NewContext()); | |
626 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path)); | |
627 context.reset(NewContext()); | |
628 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
629 | |
630 exclusive = true; | |
631 recursive = false; | |
632 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
633 context.get(), path, exclusive, recursive)); | |
634 | |
635 exclusive = true; | |
636 recursive = false; | |
637 path = UTF8ToFilePath("foo"); | |
638 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
639 context.get(), path, exclusive, recursive)); | |
640 | |
641 path = UTF8ToFilePath("blah"); | |
642 | |
643 context.reset(NewContext()); | |
644 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
645 context.reset(NewContext()); | |
646 EXPECT_FALSE(ofsfu()->PathExists(context.get(), path)); | |
647 | |
648 exclusive = true; | |
649 recursive = false; | |
650 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
651 context.get(), path, exclusive, recursive)); | |
652 | |
653 context.reset(NewContext()); | |
654 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path)); | |
655 context.reset(NewContext()); | |
656 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
657 | |
658 exclusive = true; | |
659 recursive = false; | |
660 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
661 context.get(), path, exclusive, recursive)); | |
662 } | |
663 | |
664 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadDirectory) { | |
665 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
666 bool exclusive = true; | |
667 bool recursive = true; | |
668 FilePath path = UTF8ToFilePath("directory/to/use"); | |
669 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
670 context.get(), path, exclusive, recursive)); | |
671 TestReadDirectoryHelper(path); | |
672 } | |
673 | |
674 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadRootWithSlash) { | |
675 TestReadDirectoryHelper(UTF8ToFilePath("")); | |
676 } | |
677 | |
678 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadRootWithEmptyString) { | |
679 TestReadDirectoryHelper(UTF8ToFilePath("/")); | |
680 } | |
681 | |
682 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadDirectoryOnFile) { | |
683 FilePath path = UTF8ToFilePath("file"); | |
684 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
685 | |
686 bool created = false; | |
687 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
688 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
689 ASSERT_TRUE(created); | |
690 | |
691 context.reset(NewContext()); | |
692 std::vector<base::FileUtilProxy::Entry> entries; | |
693 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
694 ofsfu()->ReadDirectory(context.get(), path, &entries)); | |
695 | |
696 EXPECT_TRUE(ofsfu()->IsDirectoryEmpty(context.get(), path)); | |
697 } | |
698 | |
699 TEST_F(ObfuscatedFileSystemFileUtilTest, TestTouch) { | |
700 FilePath path = UTF8ToFilePath("fake/file"); | |
701 base::Time last_access_time = base::Time::Now(); // Ignored, so not tested. | |
702 base::Time last_modified_time = base::Time::Now(); | |
703 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
704 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
705 ofsfu()->Touch( | |
706 context.get(), path, last_access_time, last_modified_time)); | |
707 | |
708 // Touch will create a file if it's not there but its parent is. | |
709 path = UTF8ToFilePath("file name"); | |
710 TestTouchHelper(path); | |
711 | |
712 bool exclusive = true; | |
713 bool recursive = true; | |
714 path = UTF8ToFilePath("directory/to/use"); | |
715 context.reset(NewContext()); | |
716 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
717 context.get(), path, exclusive, recursive)); | |
718 TestTouchHelper(path); | |
719 } | |
720 | |
721 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyOrMoveFileNotFound) { | |
722 FilePath source_path = UTF8ToFilePath("path0.txt"); | |
723 FilePath dest_path = UTF8ToFilePath("path1.txt"); | |
724 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
725 | |
726 bool is_copy_not_move = false; | |
727 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
728 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
729 is_copy_not_move)); | |
730 context.reset(NewContext()); | |
731 is_copy_not_move = true; | |
732 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
733 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
734 is_copy_not_move)); | |
735 source_path = UTF8ToFilePath("dir/dir/file"); | |
736 bool exclusive = true; | |
737 bool recursive = true; | |
738 context.reset(NewContext()); | |
739 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
740 context.get(), source_path.DirName(), exclusive, recursive)); | |
741 is_copy_not_move = false; | |
742 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
743 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
744 is_copy_not_move)); | |
745 context.reset(NewContext()); | |
746 is_copy_not_move = true; | |
747 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
748 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
749 is_copy_not_move)); | |
750 } | |
751 | |
752 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyOrMoveFileSuccess) { | |
753 const int64 kSourceLength = 5; | |
754 const int64 kDestLength = 50; | |
755 | |
756 for (size_t i = 0; i < arraysize(kCopyMoveTestCases); ++i) { | |
757 SCOPED_TRACE(testing::Message() << "kCopyMoveTestCase " << i); | |
758 const CopyMoveTestCaseRecord& test_case = kCopyMoveTestCases[i]; | |
759 SCOPED_TRACE(testing::Message() << "\t is_copy_not_move " << | |
760 test_case.is_copy_not_move); | |
761 SCOPED_TRACE(testing::Message() << "\t source_path " << | |
762 test_case.source_path); | |
763 SCOPED_TRACE(testing::Message() << "\t dest_path " << | |
764 test_case.dest_path); | |
765 SCOPED_TRACE(testing::Message() << "\t cause_overwrite " << | |
766 test_case.cause_overwrite); | |
767 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
768 | |
769 bool exclusive = false; | |
770 bool recursive = true; | |
771 FilePath source_path = UTF8ToFilePath(test_case.source_path); | |
772 FilePath dest_path = UTF8ToFilePath(test_case.dest_path); | |
773 | |
774 context.reset(NewContext()); | |
775 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
776 context.get(), source_path.DirName(), exclusive, recursive)); | |
777 context.reset(NewContext()); | |
778 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
779 context.get(), dest_path.DirName(), exclusive, recursive)); | |
780 | |
781 bool created = false; | |
782 context.reset(NewContext()); | |
783 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
784 ofsfu()->EnsureFileExists(context.get(), source_path, &created)); | |
785 ASSERT_TRUE(created); | |
786 context.reset(NewContext()); | |
787 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
788 ofsfu()->Truncate(context.get(), source_path, kSourceLength)); | |
789 | |
790 if (test_case.cause_overwrite) { | |
791 context.reset(NewContext()); | |
792 created = false; | |
793 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
794 ofsfu()->EnsureFileExists(context.get(), dest_path, &created)); | |
795 ASSERT_TRUE(created); | |
796 context.reset(NewContext()); | |
797 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
798 ofsfu()->Truncate(context.get(), dest_path, kDestLength)); | |
799 } | |
800 | |
801 context.reset(NewContext()); | |
802 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CopyOrMoveFile(context.get(), | |
803 source_path, dest_path, test_case.is_copy_not_move)); | |
804 if (test_case.is_copy_not_move) { | |
805 base::PlatformFileInfo file_info; | |
806 FilePath local_path; | |
807 context.reset(NewContext()); | |
808 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
809 context.get(), source_path, &file_info, &local_path)); | |
810 EXPECT_EQ(kSourceLength, file_info.size); | |
811 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
812 ofsfu()->DeleteFile(context.get(), source_path)); | |
813 } else { | |
814 base::PlatformFileInfo file_info; | |
815 FilePath local_path; | |
816 context.reset(NewContext()); | |
817 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, ofsfu()->GetFileInfo( | |
818 context.get(), source_path, &file_info, &local_path)); | |
819 } | |
820 base::PlatformFileInfo file_info; | |
821 FilePath local_path; | |
822 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
823 context.get(), dest_path, &file_info, &local_path)); | |
824 EXPECT_EQ(kSourceLength, file_info.size); | |
825 | |
826 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
827 ofsfu()->DeleteFile(context.get(), dest_path)); | |
828 } | |
829 } | |
830 | |
831 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyInForeignFile) { | |
832 TestCopyInForeignFileHelper(false /* overwrite */); | |
833 TestCopyInForeignFileHelper(true /* overwrite */); | |
834 } | |
835 | |
836 TEST_F(ObfuscatedFileSystemFileUtilTest, TestEnumerator) { | |
837 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
838 FilePath src_path = UTF8ToFilePath("source dir"); | |
839 bool exclusive = true; | |
840 bool recursive = false; | |
841 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
842 context.get(), src_path, exclusive, recursive)); | |
843 | |
844 std::set<FilePath::StringType> files; | |
845 std::set<FilePath::StringType> directories; | |
846 FillTestDirectory(src_path, &files, &directories); | |
847 | |
848 FilePath dest_path = UTF8ToFilePath("destination dir"); | |
849 | |
850 context.reset(NewContext()); | |
851 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
852 context.reset(NewContext()); | |
853 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
854 ofsfu()->Copy(context.get(), src_path, dest_path)); | |
855 | |
856 ValidateTestDirectory(dest_path, files, directories); | |
857 context.reset(NewContext()); | |
858 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), src_path)); | |
859 context.reset(NewContext()); | |
860 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
861 context.reset(NewContext()); | |
862 recursive = true; | |
863 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
864 ofsfu()->Delete(context.get(), dest_path, recursive)); | |
865 context.reset(NewContext()); | |
866 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
867 } | |
868 | |
869 TEST_F(ObfuscatedFileSystemFileUtilTest, TestMigration) { | |
870 ScopedTempDir source_dir; | |
871 ASSERT_TRUE(source_dir.CreateUniqueTempDir()); | |
872 FilePath root_path = source_dir.path().AppendASCII("chrome-pLmnMWXE7NzTFRsn"); | |
873 ASSERT_TRUE(file_util::CreateDirectory(root_path)); | |
874 | |
875 for (size_t i = 0; i < arraysize(kMigrationTestCases); ++i) { | |
876 SCOPED_TRACE(testing::Message() << "Creating kMigrationTestPath " << i); | |
877 const MigrationTestCaseRecord& test_case = kMigrationTestCases[i]; | |
878 FilePath local_src_path = root_path.Append(test_case.path); | |
879 if (test_case.is_directory) { | |
880 ASSERT_TRUE( | |
881 file_util::CreateDirectory(local_src_path)); | |
882 } else { | |
883 base::PlatformFileError error_code; | |
884 bool created = false; | |
885 int file_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE; | |
886 base::PlatformFile file_handle = | |
887 base::CreatePlatformFile( | |
888 local_src_path, file_flags, &created, &error_code); | |
889 EXPECT_TRUE(created); | |
890 ASSERT_NE(base::kInvalidPlatformFileValue, file_handle); | |
891 ASSERT_EQ(base::PLATFORM_FILE_OK, error_code); | |
892 ASSERT_TRUE( | |
893 base::TruncatePlatformFile(file_handle, test_case.data_file_size)); | |
894 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); | |
895 } | |
896 } | |
897 | |
898 EXPECT_TRUE(ofsfu()->MigrateFromOldSandbox(origin_url(), type(), root_path)); | |
899 | |
900 FilePath new_root = | |
901 test_directory().AppendASCII("000").Append( | |
902 ofsfu()->GetDirectoryNameForType(type())).AppendASCII("Legacy"); | |
903 for (size_t i = 0; i < arraysize(kMigrationTestCases); ++i) { | |
904 SCOPED_TRACE(testing::Message() << "Validating kMigrationTestPath " << i); | |
905 const MigrationTestCaseRecord& test_case = kMigrationTestCases[i]; | |
906 FilePath local_data_path = new_root.Append(test_case.path); | |
907 #if defined(OS_WIN) | |
908 local_data_path = local_data_path.NormalizeWindowsPathSeparators(); | |
909 #endif | |
910 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
911 base::PlatformFileInfo ofsfu_file_info; | |
912 FilePath data_path; | |
913 SCOPED_TRACE(testing::Message() << "Path is " << test_case.path); | |
914 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
915 ofsfu()->GetFileInfo(context.get(), FilePath(test_case.path), | |
916 &ofsfu_file_info, &data_path)); | |
917 if (test_case.is_directory) { | |
918 EXPECT_TRUE(ofsfu_file_info.is_directory); | |
919 } else { | |
920 base::PlatformFileInfo platform_file_info; | |
921 SCOPED_TRACE(testing::Message() << "local_data_path is " << | |
922 local_data_path.value()); | |
923 SCOPED_TRACE(testing::Message() << "data_path is " << data_path.value()); | |
924 ASSERT_TRUE(file_util::GetFileInfo(local_data_path, &platform_file_info)); | |
925 EXPECT_EQ(test_case.data_file_size, platform_file_info.size); | |
926 EXPECT_FALSE(platform_file_info.is_directory); | |
927 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
928 EXPECT_EQ(local_data_path, data_path); | |
929 EXPECT_EQ(platform_file_info.size, ofsfu_file_info.size); | |
930 EXPECT_FALSE(ofsfu_file_info.is_directory); | |
931 } | |
932 } | |
933 } | |
934 | |
935 TEST_F(ObfuscatedFileSystemFileUtilTest, TestOriginEnumerator) { | |
936 scoped_ptr<ObfuscatedFileSystemFileUtil::AbstractOriginEnumerator> | |
937 enumerator(ofsfu()->CreateOriginEnumerator()); | |
938 EXPECT_TRUE(enumerator.get()); | |
939 EXPECT_EQ(GURL(), enumerator->Next()); | |
940 EXPECT_FALSE(enumerator->HasFileSystemType(kFileSystemTypeTemporary)); | |
941 EXPECT_FALSE(enumerator->HasFileSystemType(kFileSystemTypePersistent)); | |
942 | |
943 std::set<GURL> origins_expected; | |
944 | |
945 for (size_t i = 0; i < arraysize(kOriginEnumerationTestRecords); ++i) { | |
946 SCOPED_TRACE(testing::Message() << | |
947 "Validating kOriginEnumerationTestRecords " << i); | |
948 const OriginEnumerationTestRecord& record = | |
949 kOriginEnumerationTestRecords[i]; | |
950 GURL origin_url(record.origin_url); | |
951 origins_expected.insert(origin_url); | |
952 if (record.has_temporary) { | |
953 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
954 context->set_src_origin_url(origin_url); | |
955 context->set_src_type(kFileSystemTypeTemporary); | |
956 bool created = false; | |
957 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
958 ofsfu()->EnsureFileExists(context.get(), | |
959 FilePath().AppendASCII("file"), &created)); | |
960 EXPECT_TRUE(created); | |
961 } | |
962 if (record.has_persistent) { | |
963 scoped_ptr<FileSystemOperationContext> context(NewContext()); | |
964 context->set_src_origin_url(origin_url); | |
965 context->set_src_type(kFileSystemTypePersistent); | |
966 bool created = false; | |
967 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
968 ofsfu()->EnsureFileExists(context.get(), | |
969 FilePath().AppendASCII("file"), &created)); | |
970 EXPECT_TRUE(created); | |
971 } | |
972 } | |
973 enumerator.reset(ofsfu()->CreateOriginEnumerator()); | |
974 EXPECT_TRUE(enumerator.get()); | |
975 std::set<GURL> origins_found; | |
976 GURL origin; | |
977 while (!(origin = enumerator->Next()).is_empty()) { | |
978 origins_found.insert(origin); | |
979 SCOPED_TRACE(testing::Message() << "Handling " << origin.spec()); | |
980 bool found = false; | |
981 for (size_t i = 0; !found && i < arraysize(kOriginEnumerationTestRecords); | |
982 ++i) { | |
983 const OriginEnumerationTestRecord& record = | |
984 kOriginEnumerationTestRecords[i]; | |
985 if (GURL(record.origin_url) != origin) | |
986 continue; | |
987 found = true; | |
988 EXPECT_EQ(record.has_temporary, | |
989 enumerator->HasFileSystemType(kFileSystemTypeTemporary)); | |
990 EXPECT_EQ(record.has_persistent, | |
991 enumerator->HasFileSystemType(kFileSystemTypePersistent)); | |
992 } | |
993 EXPECT_TRUE(found); | |
994 } | |
995 | |
996 std::set<GURL> diff; | |
997 std::set_symmetric_difference(origins_expected.begin(), | |
998 origins_expected.end(), origins_found.begin(), origins_found.end(), | |
999 inserter(diff, diff.begin())); | |
1000 EXPECT_TRUE(diff.empty()); | |
1001 } | |
OLD | NEW |