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/memory/scoped_callback_factory.h" | |
13 #include "base/message_loop.h" | |
14 #include "base/platform_file.h" | |
15 #include "base/scoped_temp_dir.h" | |
16 #include "base/sys_string_conversions.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | |
18 #include "webkit/fileapi/file_system_context.h" | |
19 #include "webkit/fileapi/file_system_operation_context.h" | |
20 #include "webkit/fileapi/file_system_path_manager.h" | |
21 #include "webkit/fileapi/file_system_test_helper.h" | |
22 #include "webkit/fileapi/file_system_usage_cache.h" | |
23 #include "webkit/fileapi/obfuscated_file_system_file_util.h" | |
24 #include "webkit/quota/mock_special_storage_policy.h" | |
25 #include "webkit/quota/quota_manager.h" | |
26 #include "webkit/quota/quota_types.h" | |
27 | |
28 using namespace fileapi; | |
29 | |
30 namespace { | |
31 | |
32 FilePath UTF8ToFilePath(const std::string& str) { | |
33 FilePath::StringType result; | |
34 #if defined(OS_POSIX) | |
35 result = str; | |
36 #elif defined(OS_WIN) | |
37 result = base::SysUTF8ToWide(str); | |
38 #endif | |
39 return FilePath(result); | |
40 } | |
41 | |
42 bool FileExists(const FilePath& path) { | |
43 return file_util::PathExists(path) && !file_util::DirectoryExists(path); | |
44 } | |
45 | |
46 int64 GetSize(const FilePath& path) { | |
47 int64 size; | |
48 EXPECT_TRUE(file_util::GetFileSize(path, &size)); | |
49 return size; | |
50 } | |
51 | |
52 // After a move, the dest exists and the source doesn't. | |
53 // After a copy, both source and dest exist. | |
54 struct CopyMoveTestCaseRecord { | |
55 bool is_copy_not_move; | |
56 const char source_path[64]; | |
57 const char dest_path[64]; | |
58 bool cause_overwrite; | |
59 }; | |
60 | |
61 const CopyMoveTestCaseRecord kCopyMoveTestCases[] = { | |
62 // This is the combinatoric set of: | |
63 // rename vs. same-name | |
64 // different directory vs. same directory | |
65 // overwrite vs. no-overwrite | |
66 // copy vs. move | |
67 // We can never be called with source and destination paths identical, so | |
68 // those cases are omitted. | |
69 {true, "dir0/file0", "dir0/file1", false}, | |
70 {false, "dir0/file0", "dir0/file1", false}, | |
71 {true, "dir0/file0", "dir0/file1", true}, | |
72 {false, "dir0/file0", "dir0/file1", true}, | |
73 | |
74 {true, "dir0/file0", "dir1/file0", false}, | |
75 {false, "dir0/file0", "dir1/file0", false}, | |
76 {true, "dir0/file0", "dir1/file0", true}, | |
77 {false, "dir0/file0", "dir1/file0", true}, | |
78 {true, "dir0/file0", "dir1/file1", false}, | |
79 {false, "dir0/file0", "dir1/file1", false}, | |
80 {true, "dir0/file0", "dir1/file1", true}, | |
81 {false, "dir0/file0", "dir1/file1", true}, | |
82 }; | |
83 | |
84 struct MigrationTestCaseRecord { | |
85 bool is_directory; | |
86 const FilePath::CharType path[64]; | |
87 int64 data_file_size; | |
88 }; | |
89 | |
90 const MigrationTestCaseRecord kMigrationTestCases[] = { | |
91 {true, FILE_PATH_LITERAL("dir a"), 0}, | |
92 {true, FILE_PATH_LITERAL("dir a/dir a"), 0}, | |
93 {true, FILE_PATH_LITERAL("dir a/dir d"), 0}, | |
94 {true, FILE_PATH_LITERAL("dir a/dir d/dir e"), 0}, | |
95 {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir f"), 0}, | |
96 {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g"), 0}, | |
97 {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir h"), 0}, | |
98 {true, FILE_PATH_LITERAL("dir b"), 0}, | |
99 {true, FILE_PATH_LITERAL("dir b/dir a"), 0}, | |
100 {true, FILE_PATH_LITERAL("dir c"), 0}, | |
101 {false, FILE_PATH_LITERAL("file 0"), 38}, | |
102 {false, FILE_PATH_LITERAL("file 2"), 60}, | |
103 {false, FILE_PATH_LITERAL("file 3"), 0}, | |
104 {false, FILE_PATH_LITERAL("dir a/file 0"), 39}, | |
105 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 0"), 40}, | |
106 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 1"), 41}, | |
107 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 2"), 42}, | |
108 {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 3"), 50}, | |
109 }; | |
110 | |
111 struct OriginEnumerationTestRecord { | |
112 std::string origin_url; | |
113 bool has_temporary; | |
114 bool has_persistent; | |
115 }; | |
116 | |
117 const OriginEnumerationTestRecord kOriginEnumerationTestRecords[] = { | |
118 {"http://example.com", false, true}, | |
119 {"http://example1.com", true, false}, | |
120 {"https://example1.com", true, true}, | |
121 {"file://", false, true}, | |
122 {"http://example.com:8000", false, true}, | |
123 }; | |
124 | |
125 } // namespace (anonymous) | |
126 | |
127 // TODO(ericu): The vast majority of this and the other FSFU subclass tests | |
128 // could theoretically be shared. It would basically be a FSFU interface | |
129 // compliance test, and only the subclass-specific bits that look into the | |
130 // implementation would need to be written per-subclass. | |
131 class ObfuscatedFileSystemFileUtilTest : public testing::Test { | |
132 public: | |
133 ObfuscatedFileSystemFileUtilTest() | |
134 : origin_(GURL("http://www.example.com")), | |
135 type_(kFileSystemTypeTemporary), | |
136 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | |
137 test_helper_(origin_, type_), | |
138 quota_status_(quota::kQuotaStatusUnknown), | |
139 usage_(-1) { | |
140 } | |
141 | |
142 void SetUp() { | |
143 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); | |
144 | |
145 quota_manager_ = new quota::QuotaManager( | |
146 false /* is_incognito */, | |
147 data_dir_.path(), | |
148 base::MessageLoopProxy::current(), | |
149 base::MessageLoopProxy::current(), | |
150 NULL /* special storage policy */); | |
151 | |
152 // Every time we create a new helper, it creates another context, which | |
153 // creates another path manager, another sandbox_mount_point_provider, and | |
154 // another OFSFU. We need to pass in the context to skip all that. | |
155 file_system_context_ = new FileSystemContext( | |
156 base::MessageLoopProxy::current(), | |
157 base::MessageLoopProxy::current(), | |
158 new quota::MockSpecialStoragePolicy(), | |
159 quota_manager_->proxy(), | |
160 data_dir_.path(), | |
161 false /* incognito */, | |
162 true /* allow_file_access_from_files */, | |
163 false /* unlimited_quota */, | |
164 NULL /* path_manager */); | |
165 | |
166 obfuscated_file_system_file_util_ = | |
167 static_cast<ObfuscatedFileSystemFileUtil*>( | |
168 file_system_context_->path_manager()->GetFileSystemFileUtil(type_)); | |
169 | |
170 | |
171 test_helper_.SetUp(file_system_context_.get(), | |
172 obfuscated_file_system_file_util_.get()); | |
173 } | |
174 | |
175 FileSystemOperationContext* NewContext(FileSystemTestOriginHelper* helper) { | |
176 FileSystemOperationContext* context; | |
177 if (helper) | |
178 context = helper->NewOperationContext(); | |
179 else | |
180 context = test_helper_.NewOperationContext(); | |
181 context->set_allowed_bytes_growth(1024 * 1024); // Big enough for all tests. | |
182 return context; | |
183 } | |
184 | |
185 // This can only be used after SetUp has run and created file_system_context_ | |
186 // and obfuscated_file_system_file_util_. | |
187 // Use this for tests which need to run in multiple origins; we need a test | |
188 // helper per origin. | |
189 FileSystemTestOriginHelper* NewHelper( | |
190 const GURL& origin, fileapi::FileSystemType type) { | |
191 FileSystemTestOriginHelper* helper = | |
192 new FileSystemTestOriginHelper(origin, type); | |
193 | |
194 helper->SetUp(file_system_context_.get(), | |
195 obfuscated_file_system_file_util_.get()); | |
196 return helper; | |
197 } | |
198 | |
199 ObfuscatedFileSystemFileUtil* ofsfu() { | |
200 return obfuscated_file_system_file_util_.get(); | |
201 } | |
202 | |
203 const FilePath& test_directory() const { | |
204 return data_dir_.path(); | |
205 } | |
206 | |
207 const GURL& origin() const { | |
208 return origin_; | |
209 } | |
210 | |
211 fileapi::FileSystemType type() const { | |
212 return type_; | |
213 } | |
214 | |
215 void GetUsageFromQuotaManager() { | |
216 quota_manager_->GetUsageAndQuota( | |
217 origin(), test_helper_.storage_type(), | |
218 callback_factory_.NewCallback( | |
219 &ObfuscatedFileSystemFileUtilTest::OnGetUsage)); | |
220 MessageLoop::current()->RunAllPending(); | |
221 EXPECT_EQ(quota::kQuotaStatusOk, quota_status_); | |
222 } | |
223 | |
224 void RevokeUsageCache() { | |
225 quota_manager_->ResetUsageTracker(test_helper_.storage_type()); | |
226 ASSERT_TRUE(test_helper_.RevokeUsageCache()); | |
227 } | |
228 | |
229 int64 SizeInUsageFile() { | |
230 return test_helper_.GetCachedOriginUsage(); | |
231 } | |
232 | |
233 int64 usage() const { return usage_; } | |
234 | |
235 void OnGetUsage(quota::QuotaStatusCode status, int64 usage, int64 unused) { | |
236 EXPECT_EQ(quota::kQuotaStatusOk, status); | |
237 quota_status_ = status; | |
238 usage_ = usage; | |
239 } | |
240 | |
241 void CheckFileAndCloseHandle( | |
242 const FilePath& virtual_path, PlatformFile file_handle) { | |
243 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
244 FilePath local_path; | |
245 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
246 context.get(), virtual_path, &local_path)); | |
247 | |
248 base::PlatformFileInfo file_info0; | |
249 FilePath data_path; | |
250 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
251 context.get(), virtual_path, &file_info0, &data_path)); | |
252 EXPECT_EQ(data_path, local_path); | |
253 EXPECT_TRUE(FileExists(data_path)); | |
254 EXPECT_EQ(0, GetSize(data_path)); | |
255 | |
256 const char data[] = "test data"; | |
257 const int length = arraysize(data) - 1; | |
258 | |
259 if (base::kInvalidPlatformFileValue == file_handle) { | |
260 bool created = true; | |
261 PlatformFileError error; | |
262 file_handle = base::CreatePlatformFile( | |
263 data_path, | |
264 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE, | |
265 &created, | |
266 &error); | |
267 ASSERT_NE(base::kInvalidPlatformFileValue, file_handle); | |
268 ASSERT_EQ(base::PLATFORM_FILE_OK, error); | |
269 EXPECT_FALSE(created); | |
270 } | |
271 ASSERT_EQ(length, base::WritePlatformFile(file_handle, 0, data, length)); | |
272 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); | |
273 | |
274 base::PlatformFileInfo file_info1; | |
275 EXPECT_EQ(length, GetSize(data_path)); | |
276 context.reset(NewContext(NULL)); | |
277 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
278 context.get(), virtual_path, &file_info1, &data_path)); | |
279 EXPECT_EQ(data_path, local_path); | |
280 | |
281 EXPECT_FALSE(file_info0.is_directory); | |
282 EXPECT_FALSE(file_info1.is_directory); | |
283 EXPECT_FALSE(file_info0.is_symbolic_link); | |
284 EXPECT_FALSE(file_info1.is_symbolic_link); | |
285 EXPECT_EQ(0, file_info0.size); | |
286 EXPECT_EQ(length, file_info1.size); | |
287 EXPECT_LE(file_info0.last_modified, file_info1.last_modified); | |
288 | |
289 context.reset(NewContext(NULL)); | |
290 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
291 context.get(), virtual_path, length * 2)); | |
292 EXPECT_EQ(length * 2, GetSize(data_path)); | |
293 | |
294 context.reset(NewContext(NULL)); | |
295 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
296 context.get(), virtual_path, 0)); | |
297 EXPECT_EQ(0, GetSize(data_path)); | |
298 } | |
299 | |
300 void ValidateTestDirectory( | |
301 const FilePath& root_path, | |
302 const std::set<FilePath::StringType>& files, | |
303 const std::set<FilePath::StringType>& directories) { | |
304 scoped_ptr<FileSystemOperationContext> context; | |
305 std::set<FilePath::StringType>::const_iterator iter; | |
306 for (iter = files.begin(); iter != files.end(); ++iter) { | |
307 bool created = true; | |
308 context.reset(NewContext(NULL)); | |
309 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
310 ofsfu()->EnsureFileExists( | |
311 context.get(), root_path.Append(*iter), | |
312 &created)); | |
313 ASSERT_FALSE(created); | |
314 } | |
315 for (iter = directories.begin(); iter != directories.end(); ++iter) { | |
316 context.reset(NewContext(NULL)); | |
317 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), | |
318 root_path.Append(*iter))); | |
319 } | |
320 } | |
321 | |
322 void FillTestDirectory( | |
323 const FilePath& root_path, | |
324 std::set<FilePath::StringType>* files, | |
325 std::set<FilePath::StringType>* directories) { | |
326 scoped_ptr<FileSystemOperationContext> context; | |
327 context.reset(NewContext(NULL)); | |
328 std::vector<base::FileUtilProxy::Entry> entries; | |
329 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
330 ofsfu()->ReadDirectory(context.get(), root_path, &entries)); | |
331 EXPECT_EQ(0UL, entries.size()); | |
332 | |
333 files->clear(); | |
334 files->insert(FILE_PATH_LITERAL("first")); | |
335 files->insert(FILE_PATH_LITERAL("second")); | |
336 files->insert(FILE_PATH_LITERAL("third")); | |
337 directories->clear(); | |
338 directories->insert(FILE_PATH_LITERAL("fourth")); | |
339 directories->insert(FILE_PATH_LITERAL("fifth")); | |
340 directories->insert(FILE_PATH_LITERAL("sixth")); | |
341 std::set<FilePath::StringType>::iterator iter; | |
342 for (iter = files->begin(); iter != files->end(); ++iter) { | |
343 bool created = false; | |
344 context.reset(NewContext(NULL)); | |
345 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
346 ofsfu()->EnsureFileExists( | |
347 context.get(), root_path.Append(*iter), &created)); | |
348 ASSERT_TRUE(created); | |
349 } | |
350 for (iter = directories->begin(); iter != directories->end(); ++iter) { | |
351 bool exclusive = true; | |
352 bool recursive = false; | |
353 context.reset(NewContext(NULL)); | |
354 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
355 ofsfu()->CreateDirectory( | |
356 context.get(), root_path.Append(*iter), exclusive, recursive)); | |
357 } | |
358 ValidateTestDirectory(root_path, *files, *directories); | |
359 } | |
360 | |
361 void TestReadDirectoryHelper(const FilePath& root_path) { | |
362 std::set<FilePath::StringType> files; | |
363 std::set<FilePath::StringType> directories; | |
364 FillTestDirectory(root_path, &files, &directories); | |
365 | |
366 scoped_ptr<FileSystemOperationContext> context; | |
367 std::vector<base::FileUtilProxy::Entry> entries; | |
368 context.reset(NewContext(NULL)); | |
369 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
370 ofsfu()->ReadDirectory(context.get(), root_path, &entries)); | |
371 std::vector<base::FileUtilProxy::Entry>::iterator entry_iter; | |
372 EXPECT_EQ(files.size() + directories.size(), entries.size()); | |
373 for (entry_iter = entries.begin(); entry_iter != entries.end(); | |
374 ++entry_iter) { | |
375 const base::FileUtilProxy::Entry& entry = *entry_iter; | |
376 std::set<FilePath::StringType>::iterator iter = files.find(entry.name); | |
377 if (iter != files.end()) { | |
378 EXPECT_FALSE(entry.is_directory); | |
379 files.erase(iter); | |
380 continue; | |
381 } | |
382 iter = directories.find(entry.name); | |
383 EXPECT_FALSE(directories.end() == iter); | |
384 EXPECT_TRUE(entry.is_directory); | |
385 directories.erase(iter); | |
386 } | |
387 } | |
388 | |
389 void TestTouchHelper(const FilePath& path, bool is_file) { | |
390 base::Time last_access_time = base::Time::Now(); | |
391 base::Time last_modified_time = base::Time::Now(); | |
392 | |
393 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
394 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
395 ofsfu()->Touch( | |
396 context.get(), path, last_access_time, last_modified_time)); | |
397 FilePath local_path; | |
398 base::PlatformFileInfo file_info; | |
399 context.reset(NewContext(NULL)); | |
400 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
401 context.get(), path, &file_info, &local_path)); | |
402 // We compare as time_t here to lower our resolution, to avoid false | |
403 // negatives caused by conversion to the local filesystem's native | |
404 // representation and back. | |
405 EXPECT_EQ(file_info.last_modified.ToTimeT(), last_modified_time.ToTimeT()); | |
406 | |
407 context.reset(NewContext(NULL)); | |
408 last_modified_time += base::TimeDelta::FromHours(1); | |
409 last_access_time += base::TimeDelta::FromHours(14); | |
410 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
411 ofsfu()->Touch( | |
412 context.get(), path, last_access_time, last_modified_time)); | |
413 context.reset(NewContext(NULL)); | |
414 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
415 context.get(), path, &file_info, &local_path)); | |
416 EXPECT_EQ(file_info.last_modified.ToTimeT(), last_modified_time.ToTimeT()); | |
417 if (is_file) // Directories in OFSFU don't support atime. | |
418 EXPECT_EQ(file_info.last_accessed.ToTimeT(), last_access_time.ToTimeT()); | |
419 } | |
420 | |
421 void TestCopyInForeignFileHelper(bool overwrite) { | |
422 ScopedTempDir source_dir; | |
423 ASSERT_TRUE(source_dir.CreateUniqueTempDir()); | |
424 FilePath root_path = source_dir.path(); | |
425 FilePath src_path = root_path.AppendASCII("file_name"); | |
426 FilePath dest_path(FILE_PATH_LITERAL("new file")); | |
427 int64 src_file_length = 87; | |
428 | |
429 base::PlatformFileError error_code; | |
430 bool created = false; | |
431 int file_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE; | |
432 base::PlatformFile file_handle = | |
433 base::CreatePlatformFile( | |
434 src_path, file_flags, &created, &error_code); | |
435 EXPECT_TRUE(created); | |
436 ASSERT_EQ(base::PLATFORM_FILE_OK, error_code); | |
437 ASSERT_NE(base::kInvalidPlatformFileValue, file_handle); | |
438 ASSERT_TRUE(base::TruncatePlatformFile(file_handle, src_file_length)); | |
439 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); | |
440 | |
441 scoped_ptr<FileSystemOperationContext> context; | |
442 | |
443 if (overwrite) { | |
444 context.reset(NewContext(NULL)); | |
445 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
446 ofsfu()->EnsureFileExists(context.get(), dest_path, &created)); | |
447 EXPECT_TRUE(created); | |
448 } | |
449 | |
450 const int64 path_cost = | |
451 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(dest_path); | |
452 if (!overwrite) { | |
453 // Verify that file creation requires sufficient quota for the path. | |
454 context.reset(NewContext(NULL)); | |
455 context->set_allowed_bytes_growth(path_cost + src_file_length - 1); | |
456 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
457 ofsfu()->CopyInForeignFile(context.get(), src_path, dest_path)); | |
458 } | |
459 | |
460 context.reset(NewContext(NULL)); | |
461 context->set_allowed_bytes_growth(path_cost + src_file_length); | |
462 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
463 ofsfu()->CopyInForeignFile(context.get(), src_path, dest_path)); | |
464 | |
465 context.reset(NewContext(NULL)); | |
466 EXPECT_TRUE(ofsfu()->PathExists(context.get(), dest_path)); | |
467 context.reset(NewContext(NULL)); | |
468 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
469 context.reset(NewContext(NULL)); | |
470 base::PlatformFileInfo file_info; | |
471 FilePath data_path; | |
472 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
473 context.get(), dest_path, &file_info, &data_path)); | |
474 EXPECT_NE(data_path, src_path); | |
475 EXPECT_TRUE(FileExists(data_path)); | |
476 EXPECT_EQ(src_file_length, GetSize(data_path)); | |
477 | |
478 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
479 ofsfu()->DeleteFile(context.get(), dest_path)); | |
480 } | |
481 | |
482 private: | |
483 ScopedTempDir data_dir_; | |
484 scoped_refptr<ObfuscatedFileSystemFileUtil> obfuscated_file_system_file_util_; | |
485 scoped_refptr<quota::QuotaManager> quota_manager_; | |
486 scoped_refptr<FileSystemContext> file_system_context_; | |
487 GURL origin_; | |
488 fileapi::FileSystemType type_; | |
489 base::ScopedCallbackFactory<ObfuscatedFileSystemFileUtilTest> | |
490 callback_factory_; | |
491 FileSystemTestOriginHelper test_helper_; | |
492 quota::QuotaStatusCode quota_status_; | |
493 int64 usage_; | |
494 | |
495 DISALLOW_COPY_AND_ASSIGN(ObfuscatedFileSystemFileUtilTest); | |
496 }; | |
497 | |
498 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCreateAndDeleteFile) { | |
499 base::PlatformFile file_handle = base::kInvalidPlatformFileValue; | |
500 bool created; | |
501 FilePath path = UTF8ToFilePath("fake/file"); | |
502 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
503 int file_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE; | |
504 | |
505 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
506 ofsfu()->CreateOrOpen( | |
507 context.get(), path, file_flags, &file_handle, | |
508 &created)); | |
509 | |
510 context.reset(NewContext(NULL)); | |
511 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
512 ofsfu()->DeleteFile(context.get(), path)); | |
513 | |
514 path = UTF8ToFilePath("test file"); | |
515 | |
516 // Verify that file creation requires sufficient quota for the path. | |
517 context.reset(NewContext(NULL)); | |
518 context->set_allowed_bytes_growth( | |
519 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path) - 1); | |
520 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
521 ofsfu()->CreateOrOpen( | |
522 context.get(), path, file_flags, &file_handle, &created)); | |
523 | |
524 context.reset(NewContext(NULL)); | |
525 context->set_allowed_bytes_growth( | |
526 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path)); | |
527 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
528 ofsfu()->CreateOrOpen( | |
529 context.get(), path, file_flags, &file_handle, &created)); | |
530 ASSERT_TRUE(created); | |
531 EXPECT_NE(base::kInvalidPlatformFileValue, file_handle); | |
532 | |
533 CheckFileAndCloseHandle(path, file_handle); | |
534 | |
535 context.reset(NewContext(NULL)); | |
536 FilePath local_path; | |
537 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
538 context.get(), path, &local_path)); | |
539 EXPECT_TRUE(file_util::PathExists(local_path)); | |
540 | |
541 // Verify that deleting a file isn't stopped by zero quota, and that it frees | |
542 // up quote from its path. | |
543 context.reset(NewContext(NULL)); | |
544 context->set_allowed_bytes_growth(0); | |
545 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
546 ofsfu()->DeleteFile(context.get(), path)); | |
547 EXPECT_FALSE(file_util::PathExists(local_path)); | |
548 EXPECT_EQ(ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path), | |
549 context->allowed_bytes_growth()); | |
550 | |
551 context.reset(NewContext(NULL)); | |
552 bool exclusive = true; | |
553 bool recursive = true; | |
554 FilePath directory_path = UTF8ToFilePath("series/of/directories"); | |
555 path = directory_path.AppendASCII("file name"); | |
556 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
557 context.get(), directory_path, exclusive, recursive)); | |
558 | |
559 context.reset(NewContext(NULL)); | |
560 file_handle = base::kInvalidPlatformFileValue; | |
561 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
562 ofsfu()->CreateOrOpen( | |
563 context.get(), path, file_flags, &file_handle, &created)); | |
564 ASSERT_TRUE(created); | |
565 EXPECT_NE(base::kInvalidPlatformFileValue, file_handle); | |
566 | |
567 CheckFileAndCloseHandle(path, file_handle); | |
568 | |
569 context.reset(NewContext(NULL)); | |
570 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
571 context.get(), path, &local_path)); | |
572 EXPECT_TRUE(file_util::PathExists(local_path)); | |
573 | |
574 context.reset(NewContext(NULL)); | |
575 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
576 ofsfu()->DeleteFile(context.get(), path)); | |
577 EXPECT_FALSE(file_util::PathExists(local_path)); | |
578 } | |
579 | |
580 TEST_F(ObfuscatedFileSystemFileUtilTest, TestTruncate) { | |
581 bool created = false; | |
582 FilePath path = UTF8ToFilePath("file"); | |
583 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
584 | |
585 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
586 ofsfu()->Truncate(context.get(), path, 4)); | |
587 | |
588 context.reset(NewContext(NULL)); | |
589 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
590 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
591 ASSERT_TRUE(created); | |
592 | |
593 context.reset(NewContext(NULL)); | |
594 FilePath local_path; | |
595 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetLocalFilePath( | |
596 context.get(), path, &local_path)); | |
597 EXPECT_EQ(0, GetSize(local_path)); | |
598 | |
599 context.reset(NewContext(NULL)); | |
600 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
601 context.get(), path, 10)); | |
602 EXPECT_EQ(10, GetSize(local_path)); | |
603 | |
604 context.reset(NewContext(NULL)); | |
605 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->Truncate( | |
606 context.get(), path, 1)); | |
607 EXPECT_EQ(1, GetSize(local_path)); | |
608 | |
609 context.reset(NewContext(NULL)); | |
610 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
611 context.reset(NewContext(NULL)); | |
612 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
613 } | |
614 | |
615 TEST_F(ObfuscatedFileSystemFileUtilTest, TestEnsureFileExists) { | |
616 FilePath path = UTF8ToFilePath("fake/file"); | |
617 bool created = false; | |
618 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
619 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
620 ofsfu()->EnsureFileExists( | |
621 context.get(), path, &created)); | |
622 | |
623 // Verify that file creation requires sufficient quota for the path. | |
624 context.reset(NewContext(NULL)); | |
625 path = UTF8ToFilePath("test file"); | |
626 created = false; | |
627 context->set_allowed_bytes_growth( | |
628 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path) - 1); | |
629 ASSERT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
630 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
631 ASSERT_FALSE(created); | |
632 | |
633 context.reset(NewContext(NULL)); | |
634 context->set_allowed_bytes_growth( | |
635 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path)); | |
636 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
637 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
638 ASSERT_TRUE(created); | |
639 | |
640 CheckFileAndCloseHandle(path, base::kInvalidPlatformFileValue); | |
641 | |
642 context.reset(NewContext(NULL)); | |
643 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
644 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
645 ASSERT_FALSE(created); | |
646 | |
647 // Also test in a subdirectory. | |
648 path = UTF8ToFilePath("path/to/file.txt"); | |
649 context.reset(NewContext(NULL)); | |
650 bool exclusive = true; | |
651 bool recursive = true; | |
652 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
653 context.get(), path.DirName(), exclusive, recursive)); | |
654 | |
655 context.reset(NewContext(NULL)); | |
656 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
657 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
658 ASSERT_TRUE(created); | |
659 context.reset(NewContext(NULL)); | |
660 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
661 context.reset(NewContext(NULL)); | |
662 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
663 } | |
664 | |
665 TEST_F(ObfuscatedFileSystemFileUtilTest, TestDirectoryOps) { | |
666 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
667 | |
668 bool exclusive = false; | |
669 bool recursive = false; | |
670 FilePath path = UTF8ToFilePath("foo/bar"); | |
671 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, ofsfu()->CreateDirectory( | |
672 context.get(), path, exclusive, recursive)); | |
673 | |
674 context.reset(NewContext(NULL)); | |
675 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
676 ofsfu()->DeleteSingleDirectory(context.get(), path)); | |
677 | |
678 FilePath root = UTF8ToFilePath(""); | |
679 context.reset(NewContext(NULL)); | |
680 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
681 context.reset(NewContext(NULL)); | |
682 EXPECT_FALSE(ofsfu()->PathExists(context.get(), path)); | |
683 context.reset(NewContext(NULL)); | |
684 EXPECT_TRUE(ofsfu()->IsDirectoryEmpty(context.get(), root)); | |
685 | |
686 context.reset(NewContext(NULL)); | |
687 exclusive = false; | |
688 recursive = true; | |
689 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
690 context.get(), path, exclusive, recursive)); | |
691 | |
692 context.reset(NewContext(NULL)); | |
693 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path)); | |
694 context.reset(NewContext(NULL)); | |
695 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
696 context.reset(NewContext(NULL)); | |
697 EXPECT_FALSE(ofsfu()->IsDirectoryEmpty(context.get(), root)); | |
698 context.reset(NewContext(NULL)); | |
699 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path.DirName())); | |
700 context.reset(NewContext(NULL)); | |
701 EXPECT_FALSE(ofsfu()->IsDirectoryEmpty(context.get(), path.DirName())); | |
702 | |
703 // Can't remove a non-empty directory. | |
704 context.reset(NewContext(NULL)); | |
705 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_EMPTY, | |
706 ofsfu()->DeleteSingleDirectory(context.get(), path.DirName())); | |
707 | |
708 base::PlatformFileInfo file_info; | |
709 FilePath local_path; | |
710 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
711 context.get(), path, &file_info, &local_path)); | |
712 EXPECT_TRUE(local_path.empty()); | |
713 EXPECT_TRUE(file_info.is_directory); | |
714 EXPECT_FALSE(file_info.is_symbolic_link); | |
715 | |
716 // Same create again should succeed, since exclusive is false. | |
717 context.reset(NewContext(NULL)); | |
718 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
719 context.get(), path, exclusive, recursive)); | |
720 | |
721 exclusive = true; | |
722 recursive = true; | |
723 context.reset(NewContext(NULL)); | |
724 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
725 context.get(), path, exclusive, recursive)); | |
726 | |
727 // Verify that deleting a directory isn't stopped by zero quota, and that it | |
728 // frees up quota from its path. | |
729 context.reset(NewContext(NULL)); | |
730 context->set_allowed_bytes_growth(0); | |
731 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
732 ofsfu()->DeleteSingleDirectory(context.get(), path)); | |
733 EXPECT_EQ(ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path), | |
734 context->allowed_bytes_growth()); | |
735 | |
736 path = UTF8ToFilePath("foo/bop"); | |
737 | |
738 context.reset(NewContext(NULL)); | |
739 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
740 context.reset(NewContext(NULL)); | |
741 EXPECT_FALSE(ofsfu()->PathExists(context.get(), path)); | |
742 context.reset(NewContext(NULL)); | |
743 EXPECT_TRUE(ofsfu()->IsDirectoryEmpty(context.get(), path)); | |
744 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, ofsfu()->GetFileInfo( | |
745 context.get(), path, &file_info, &local_path)); | |
746 | |
747 // Verify that file creation requires sufficient quota for the path. | |
748 exclusive = true; | |
749 recursive = false; | |
750 context.reset(NewContext(NULL)); | |
751 context->set_allowed_bytes_growth( | |
752 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path) - 1); | |
753 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, ofsfu()->CreateDirectory( | |
754 context.get(), path, exclusive, recursive)); | |
755 | |
756 context.reset(NewContext(NULL)); | |
757 context->set_allowed_bytes_growth( | |
758 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path)); | |
759 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
760 context.get(), path, exclusive, recursive)); | |
761 | |
762 context.reset(NewContext(NULL)); | |
763 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path)); | |
764 context.reset(NewContext(NULL)); | |
765 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
766 | |
767 exclusive = true; | |
768 recursive = false; | |
769 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
770 context.get(), path, exclusive, recursive)); | |
771 | |
772 exclusive = true; | |
773 recursive = false; | |
774 path = UTF8ToFilePath("foo"); | |
775 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
776 context.get(), path, exclusive, recursive)); | |
777 | |
778 path = UTF8ToFilePath("blah"); | |
779 | |
780 context.reset(NewContext(NULL)); | |
781 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), path)); | |
782 context.reset(NewContext(NULL)); | |
783 EXPECT_FALSE(ofsfu()->PathExists(context.get(), path)); | |
784 | |
785 exclusive = true; | |
786 recursive = false; | |
787 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
788 context.get(), path, exclusive, recursive)); | |
789 | |
790 context.reset(NewContext(NULL)); | |
791 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), path)); | |
792 context.reset(NewContext(NULL)); | |
793 EXPECT_TRUE(ofsfu()->PathExists(context.get(), path)); | |
794 | |
795 exclusive = true; | |
796 recursive = false; | |
797 EXPECT_EQ(base::PLATFORM_FILE_ERROR_EXISTS, ofsfu()->CreateDirectory( | |
798 context.get(), path, exclusive, recursive)); | |
799 } | |
800 | |
801 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadDirectory) { | |
802 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
803 bool exclusive = true; | |
804 bool recursive = true; | |
805 FilePath path = UTF8ToFilePath("directory/to/use"); | |
806 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
807 context.get(), path, exclusive, recursive)); | |
808 TestReadDirectoryHelper(path); | |
809 } | |
810 | |
811 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadRootWithSlash) { | |
812 TestReadDirectoryHelper(UTF8ToFilePath("")); | |
813 } | |
814 | |
815 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadRootWithEmptyString) { | |
816 TestReadDirectoryHelper(UTF8ToFilePath("/")); | |
817 } | |
818 | |
819 TEST_F(ObfuscatedFileSystemFileUtilTest, TestReadDirectoryOnFile) { | |
820 FilePath path = UTF8ToFilePath("file"); | |
821 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
822 | |
823 bool created = false; | |
824 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
825 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
826 ASSERT_TRUE(created); | |
827 | |
828 context.reset(NewContext(NULL)); | |
829 std::vector<base::FileUtilProxy::Entry> entries; | |
830 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
831 ofsfu()->ReadDirectory(context.get(), path, &entries)); | |
832 | |
833 EXPECT_TRUE(ofsfu()->IsDirectoryEmpty(context.get(), path)); | |
834 } | |
835 | |
836 TEST_F(ObfuscatedFileSystemFileUtilTest, TestTouch) { | |
837 FilePath path = UTF8ToFilePath("file"); | |
838 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
839 | |
840 base::Time last_access_time = base::Time::Now(); | |
841 base::Time last_modified_time = base::Time::Now(); | |
842 | |
843 // It's not there yet. | |
844 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
845 ofsfu()->Touch( | |
846 context.get(), path, last_access_time, last_modified_time)); | |
847 | |
848 // OK, now create it. | |
849 context.reset(NewContext(NULL)); | |
850 bool created = false; | |
851 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
852 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
853 ASSERT_TRUE(created); | |
854 TestTouchHelper(path, true); | |
855 | |
856 // Now test a directory: | |
857 context.reset(NewContext(NULL)); | |
858 bool exclusive = true; | |
859 bool recursive = false; | |
860 path = UTF8ToFilePath("dir"); | |
861 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory(context.get(), | |
862 path, exclusive, recursive)); | |
863 TestTouchHelper(path, false); | |
864 } | |
865 | |
866 TEST_F(ObfuscatedFileSystemFileUtilTest, TestPathQuotas) { | |
867 FilePath path = UTF8ToFilePath("fake/file"); | |
868 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
869 | |
870 path = UTF8ToFilePath("file name"); | |
871 context->set_allowed_bytes_growth(5); | |
872 bool created = false; | |
873 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
874 ofsfu()->EnsureFileExists( | |
875 context.get(), path, &created)); | |
876 EXPECT_FALSE(created); | |
877 context->set_allowed_bytes_growth(1024); | |
878 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
879 ofsfu()->EnsureFileExists( | |
880 context.get(), path, &created)); | |
881 EXPECT_TRUE(created); | |
882 int64 path_cost = ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path); | |
883 EXPECT_EQ(1024 - path_cost, context->allowed_bytes_growth()); | |
884 | |
885 context->set_allowed_bytes_growth(1024); | |
886 bool exclusive = true; | |
887 bool recursive = true; | |
888 path = UTF8ToFilePath("directory/to/use"); | |
889 std::vector<FilePath::StringType> components; | |
890 path.GetComponents(&components); | |
891 path_cost = 0; | |
892 for (std::vector<FilePath::StringType>::iterator iter = components.begin(); | |
893 iter != components.end(); ++iter) { | |
894 path_cost += ObfuscatedFileSystemFileUtil::ComputeFilePathCost( | |
895 FilePath(*iter)); | |
896 } | |
897 context.reset(NewContext(NULL)); | |
898 context->set_allowed_bytes_growth(1024); | |
899 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
900 context.get(), path, exclusive, recursive)); | |
901 EXPECT_EQ(1024 - path_cost, context->allowed_bytes_growth()); | |
902 } | |
903 | |
904 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyOrMoveFileNotFound) { | |
905 FilePath source_path = UTF8ToFilePath("path0.txt"); | |
906 FilePath dest_path = UTF8ToFilePath("path1.txt"); | |
907 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
908 | |
909 bool is_copy_not_move = false; | |
910 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
911 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
912 is_copy_not_move)); | |
913 context.reset(NewContext(NULL)); | |
914 is_copy_not_move = true; | |
915 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
916 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
917 is_copy_not_move)); | |
918 source_path = UTF8ToFilePath("dir/dir/file"); | |
919 bool exclusive = true; | |
920 bool recursive = true; | |
921 context.reset(NewContext(NULL)); | |
922 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
923 context.get(), source_path.DirName(), exclusive, recursive)); | |
924 is_copy_not_move = false; | |
925 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
926 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
927 is_copy_not_move)); | |
928 context.reset(NewContext(NULL)); | |
929 is_copy_not_move = true; | |
930 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
931 ofsfu()->CopyOrMoveFile(context.get(), source_path, dest_path, | |
932 is_copy_not_move)); | |
933 } | |
934 | |
935 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyOrMoveFileSuccess) { | |
936 const int64 kSourceLength = 5; | |
937 const int64 kDestLength = 50; | |
938 | |
939 for (size_t i = 0; i < arraysize(kCopyMoveTestCases); ++i) { | |
940 SCOPED_TRACE(testing::Message() << "kCopyMoveTestCase " << i); | |
941 const CopyMoveTestCaseRecord& test_case = kCopyMoveTestCases[i]; | |
942 SCOPED_TRACE(testing::Message() << "\t is_copy_not_move " << | |
943 test_case.is_copy_not_move); | |
944 SCOPED_TRACE(testing::Message() << "\t source_path " << | |
945 test_case.source_path); | |
946 SCOPED_TRACE(testing::Message() << "\t dest_path " << | |
947 test_case.dest_path); | |
948 SCOPED_TRACE(testing::Message() << "\t cause_overwrite " << | |
949 test_case.cause_overwrite); | |
950 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
951 | |
952 bool exclusive = false; | |
953 bool recursive = true; | |
954 FilePath source_path = UTF8ToFilePath(test_case.source_path); | |
955 FilePath dest_path = UTF8ToFilePath(test_case.dest_path); | |
956 | |
957 context.reset(NewContext(NULL)); | |
958 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
959 context.get(), source_path.DirName(), exclusive, recursive)); | |
960 context.reset(NewContext(NULL)); | |
961 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
962 context.get(), dest_path.DirName(), exclusive, recursive)); | |
963 | |
964 bool created = false; | |
965 context.reset(NewContext(NULL)); | |
966 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
967 ofsfu()->EnsureFileExists(context.get(), source_path, &created)); | |
968 ASSERT_TRUE(created); | |
969 context.reset(NewContext(NULL)); | |
970 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
971 ofsfu()->Truncate(context.get(), source_path, kSourceLength)); | |
972 | |
973 if (test_case.cause_overwrite) { | |
974 context.reset(NewContext(NULL)); | |
975 created = false; | |
976 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
977 ofsfu()->EnsureFileExists(context.get(), dest_path, &created)); | |
978 ASSERT_TRUE(created); | |
979 context.reset(NewContext(NULL)); | |
980 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
981 ofsfu()->Truncate(context.get(), dest_path, kDestLength)); | |
982 } | |
983 | |
984 context.reset(NewContext(NULL)); | |
985 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CopyOrMoveFile(context.get(), | |
986 source_path, dest_path, test_case.is_copy_not_move)); | |
987 if (test_case.is_copy_not_move) { | |
988 base::PlatformFileInfo file_info; | |
989 FilePath local_path; | |
990 context.reset(NewContext(NULL)); | |
991 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
992 context.get(), source_path, &file_info, &local_path)); | |
993 EXPECT_EQ(kSourceLength, file_info.size); | |
994 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
995 ofsfu()->DeleteFile(context.get(), source_path)); | |
996 } else { | |
997 base::PlatformFileInfo file_info; | |
998 FilePath local_path; | |
999 context.reset(NewContext(NULL)); | |
1000 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, ofsfu()->GetFileInfo( | |
1001 context.get(), source_path, &file_info, &local_path)); | |
1002 } | |
1003 base::PlatformFileInfo file_info; | |
1004 FilePath local_path; | |
1005 EXPECT_EQ(base::PLATFORM_FILE_OK, ofsfu()->GetFileInfo( | |
1006 context.get(), dest_path, &file_info, &local_path)); | |
1007 EXPECT_EQ(kSourceLength, file_info.size); | |
1008 | |
1009 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1010 ofsfu()->DeleteFile(context.get(), dest_path)); | |
1011 } | |
1012 } | |
1013 | |
1014 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyPathQuotas) { | |
1015 FilePath src_path = UTF8ToFilePath("src path"); | |
1016 FilePath dest_path = UTF8ToFilePath("destination path"); | |
1017 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1018 bool created = false; | |
1019 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->EnsureFileExists( | |
1020 context.get(), src_path, &created)); | |
1021 | |
1022 bool is_copy = true; | |
1023 // Copy, no overwrite. | |
1024 context->set_allowed_bytes_growth( | |
1025 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(dest_path) - 1); | |
1026 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
1027 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1028 context.reset(NewContext(NULL)); | |
1029 context->set_allowed_bytes_growth( | |
1030 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(dest_path)); | |
1031 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1032 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1033 | |
1034 // Copy, with overwrite. | |
1035 context.reset(NewContext(NULL)); | |
1036 context->set_allowed_bytes_growth(0); | |
1037 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1038 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1039 } | |
1040 | |
1041 TEST_F(ObfuscatedFileSystemFileUtilTest, TestMovePathQuotasWithRename) { | |
1042 FilePath src_path = UTF8ToFilePath("src path"); | |
1043 FilePath dest_path = UTF8ToFilePath("destination path"); | |
1044 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1045 bool created = false; | |
1046 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->EnsureFileExists( | |
1047 context.get(), src_path, &created)); | |
1048 | |
1049 bool is_copy = false; | |
1050 // Move, rename, no overwrite. | |
1051 context.reset(NewContext(NULL)); | |
1052 context->set_allowed_bytes_growth( | |
1053 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(dest_path) - | |
1054 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(src_path) - 1); | |
1055 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, | |
1056 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1057 context.reset(NewContext(NULL)); | |
1058 context->set_allowed_bytes_growth( | |
1059 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(dest_path) - | |
1060 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(src_path)); | |
1061 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1062 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1063 | |
1064 context.reset(NewContext(NULL)); | |
1065 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->EnsureFileExists( | |
1066 context.get(), src_path, &created)); | |
1067 | |
1068 // Move, rename, with overwrite. | |
1069 context.reset(NewContext(NULL)); | |
1070 context->set_allowed_bytes_growth(0); | |
1071 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1072 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1073 } | |
1074 | |
1075 TEST_F(ObfuscatedFileSystemFileUtilTest, TestMovePathQuotasWithoutRename) { | |
1076 FilePath src_path = UTF8ToFilePath("src path"); | |
1077 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1078 bool created = false; | |
1079 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->EnsureFileExists( | |
1080 context.get(), src_path, &created)); | |
1081 | |
1082 bool exclusive = true; | |
1083 bool recursive = false; | |
1084 FilePath dir_path = UTF8ToFilePath("directory path"); | |
1085 context.reset(NewContext(NULL)); | |
1086 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
1087 context.get(), dir_path, exclusive, recursive)); | |
1088 | |
1089 FilePath dest_path = dir_path.Append(src_path); | |
1090 | |
1091 bool is_copy = false; | |
1092 int64 allowed_bytes_growth = -1000; // Over quota, this should still work. | |
1093 // Move, no rename, no overwrite. | |
1094 context.reset(NewContext(NULL)); | |
1095 context->set_allowed_bytes_growth(allowed_bytes_growth); | |
1096 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1097 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1098 EXPECT_EQ(allowed_bytes_growth, context->allowed_bytes_growth()); | |
1099 | |
1100 // Move, no rename, with overwrite. | |
1101 context.reset(NewContext(NULL)); | |
1102 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->EnsureFileExists( | |
1103 context.get(), src_path, &created)); | |
1104 context.reset(NewContext(NULL)); | |
1105 context->set_allowed_bytes_growth(allowed_bytes_growth); | |
1106 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1107 ofsfu()->CopyOrMoveFile(context.get(), src_path, dest_path, is_copy)); | |
1108 EXPECT_EQ( | |
1109 allowed_bytes_growth + | |
1110 ObfuscatedFileSystemFileUtil::ComputeFilePathCost(src_path), | |
1111 context->allowed_bytes_growth()); | |
1112 } | |
1113 | |
1114 TEST_F(ObfuscatedFileSystemFileUtilTest, TestCopyInForeignFile) { | |
1115 TestCopyInForeignFileHelper(false /* overwrite */); | |
1116 TestCopyInForeignFileHelper(true /* overwrite */); | |
1117 } | |
1118 | |
1119 TEST_F(ObfuscatedFileSystemFileUtilTest, TestEnumerator) { | |
1120 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1121 FilePath src_path = UTF8ToFilePath("source dir"); | |
1122 bool exclusive = true; | |
1123 bool recursive = false; | |
1124 ASSERT_EQ(base::PLATFORM_FILE_OK, ofsfu()->CreateDirectory( | |
1125 context.get(), src_path, exclusive, recursive)); | |
1126 | |
1127 std::set<FilePath::StringType> files; | |
1128 std::set<FilePath::StringType> directories; | |
1129 FillTestDirectory(src_path, &files, &directories); | |
1130 | |
1131 FilePath dest_path = UTF8ToFilePath("destination dir"); | |
1132 | |
1133 context.reset(NewContext(NULL)); | |
1134 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
1135 context.reset(NewContext(NULL)); | |
1136 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1137 ofsfu()->Copy(context.get(), src_path, dest_path)); | |
1138 | |
1139 ValidateTestDirectory(dest_path, files, directories); | |
1140 context.reset(NewContext(NULL)); | |
1141 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), src_path)); | |
1142 context.reset(NewContext(NULL)); | |
1143 EXPECT_TRUE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
1144 context.reset(NewContext(NULL)); | |
1145 recursive = true; | |
1146 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1147 ofsfu()->Delete(context.get(), dest_path, recursive)); | |
1148 context.reset(NewContext(NULL)); | |
1149 EXPECT_FALSE(ofsfu()->DirectoryExists(context.get(), dest_path)); | |
1150 } | |
1151 | |
1152 TEST_F(ObfuscatedFileSystemFileUtilTest, TestMigration) { | |
1153 ScopedTempDir source_dir; | |
1154 ASSERT_TRUE(source_dir.CreateUniqueTempDir()); | |
1155 FilePath root_path = source_dir.path().AppendASCII("chrome-pLmnMWXE7NzTFRsn"); | |
1156 ASSERT_TRUE(file_util::CreateDirectory(root_path)); | |
1157 | |
1158 for (size_t i = 0; i < arraysize(kMigrationTestCases); ++i) { | |
1159 SCOPED_TRACE(testing::Message() << "Creating kMigrationTestPath " << i); | |
1160 const MigrationTestCaseRecord& test_case = kMigrationTestCases[i]; | |
1161 FilePath local_src_path = root_path.Append(test_case.path); | |
1162 if (test_case.is_directory) { | |
1163 ASSERT_TRUE( | |
1164 file_util::CreateDirectory(local_src_path)); | |
1165 } else { | |
1166 base::PlatformFileError error_code; | |
1167 bool created = false; | |
1168 int file_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE; | |
1169 base::PlatformFile file_handle = | |
1170 base::CreatePlatformFile( | |
1171 local_src_path, file_flags, &created, &error_code); | |
1172 EXPECT_TRUE(created); | |
1173 ASSERT_NE(base::kInvalidPlatformFileValue, file_handle); | |
1174 ASSERT_EQ(base::PLATFORM_FILE_OK, error_code); | |
1175 ASSERT_TRUE( | |
1176 base::TruncatePlatformFile(file_handle, test_case.data_file_size)); | |
1177 EXPECT_TRUE(base::ClosePlatformFile(file_handle)); | |
1178 } | |
1179 } | |
1180 | |
1181 EXPECT_TRUE(ofsfu()->MigrateFromOldSandbox(origin(), type(), root_path)); | |
1182 | |
1183 FilePath new_root = | |
1184 test_directory().AppendASCII("File System").AppendASCII("000").Append( | |
1185 ofsfu()->GetDirectoryNameForType(type())).AppendASCII("Legacy"); | |
1186 for (size_t i = 0; i < arraysize(kMigrationTestCases); ++i) { | |
1187 SCOPED_TRACE(testing::Message() << "Validating kMigrationTestPath " << i); | |
1188 const MigrationTestCaseRecord& test_case = kMigrationTestCases[i]; | |
1189 FilePath local_data_path = new_root.Append(test_case.path); | |
1190 #if defined(OS_WIN) | |
1191 local_data_path = local_data_path.NormalizeWindowsPathSeparators(); | |
1192 #endif | |
1193 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1194 base::PlatformFileInfo ofsfu_file_info; | |
1195 FilePath data_path; | |
1196 SCOPED_TRACE(testing::Message() << "Path is " << test_case.path); | |
1197 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1198 ofsfu()->GetFileInfo(context.get(), FilePath(test_case.path), | |
1199 &ofsfu_file_info, &data_path)); | |
1200 if (test_case.is_directory) { | |
1201 EXPECT_TRUE(ofsfu_file_info.is_directory); | |
1202 } else { | |
1203 base::PlatformFileInfo platform_file_info; | |
1204 SCOPED_TRACE(testing::Message() << "local_data_path is " << | |
1205 local_data_path.value()); | |
1206 SCOPED_TRACE(testing::Message() << "data_path is " << data_path.value()); | |
1207 ASSERT_TRUE(file_util::GetFileInfo(local_data_path, &platform_file_info)); | |
1208 EXPECT_EQ(test_case.data_file_size, platform_file_info.size); | |
1209 EXPECT_FALSE(platform_file_info.is_directory); | |
1210 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1211 EXPECT_EQ(local_data_path, data_path); | |
1212 EXPECT_EQ(platform_file_info.size, ofsfu_file_info.size); | |
1213 EXPECT_FALSE(ofsfu_file_info.is_directory); | |
1214 } | |
1215 } | |
1216 } | |
1217 | |
1218 TEST_F(ObfuscatedFileSystemFileUtilTest, TestOriginEnumerator) { | |
1219 scoped_ptr<ObfuscatedFileSystemFileUtil::AbstractOriginEnumerator> | |
1220 enumerator(ofsfu()->CreateOriginEnumerator()); | |
1221 // The test helper starts out with a single filesystem. | |
1222 EXPECT_TRUE(enumerator.get()); | |
1223 EXPECT_EQ(origin(), enumerator->Next()); | |
1224 ASSERT_TRUE(type() == kFileSystemTypeTemporary); | |
1225 EXPECT_TRUE(enumerator->HasFileSystemType(kFileSystemTypeTemporary)); | |
1226 EXPECT_FALSE(enumerator->HasFileSystemType(kFileSystemTypePersistent)); | |
1227 EXPECT_EQ(GURL(), enumerator->Next()); | |
1228 EXPECT_FALSE(enumerator->HasFileSystemType(kFileSystemTypeTemporary)); | |
1229 EXPECT_FALSE(enumerator->HasFileSystemType(kFileSystemTypePersistent)); | |
1230 | |
1231 std::set<GURL> origins_expected; | |
1232 origins_expected.insert(origin()); | |
1233 | |
1234 for (size_t i = 0; i < arraysize(kOriginEnumerationTestRecords); ++i) { | |
1235 SCOPED_TRACE(testing::Message() << | |
1236 "Validating kOriginEnumerationTestRecords " << i); | |
1237 const OriginEnumerationTestRecord& record = | |
1238 kOriginEnumerationTestRecords[i]; | |
1239 GURL origin_url(record.origin_url); | |
1240 origins_expected.insert(origin_url); | |
1241 if (record.has_temporary) { | |
1242 scoped_ptr<FileSystemTestOriginHelper> helper( | |
1243 NewHelper(origin_url, kFileSystemTypeTemporary)); | |
1244 scoped_ptr<FileSystemOperationContext> context(NewContext(helper.get())); | |
1245 context->set_src_origin_url(origin_url); | |
1246 context->set_src_type(kFileSystemTypeTemporary); | |
1247 bool created = false; | |
1248 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1249 ofsfu()->EnsureFileExists(context.get(), | |
1250 FilePath().AppendASCII("file"), &created)); | |
1251 EXPECT_TRUE(created); | |
1252 } | |
1253 if (record.has_persistent) { | |
1254 scoped_ptr<FileSystemTestOriginHelper> helper( | |
1255 NewHelper(origin_url, kFileSystemTypePersistent)); | |
1256 scoped_ptr<FileSystemOperationContext> context(NewContext(helper.get())); | |
1257 context->set_src_origin_url(origin_url); | |
1258 context->set_src_type(kFileSystemTypePersistent); | |
1259 bool created = false; | |
1260 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1261 ofsfu()->EnsureFileExists(context.get(), | |
1262 FilePath().AppendASCII("file"), &created)); | |
1263 EXPECT_TRUE(created); | |
1264 } | |
1265 } | |
1266 enumerator.reset(ofsfu()->CreateOriginEnumerator()); | |
1267 EXPECT_TRUE(enumerator.get()); | |
1268 std::set<GURL> origins_found; | |
1269 GURL origin_url; | |
1270 while (!(origin_url = enumerator->Next()).is_empty()) { | |
1271 origins_found.insert(origin_url); | |
1272 SCOPED_TRACE(testing::Message() << "Handling " << origin_url.spec()); | |
1273 bool found = false; | |
1274 for (size_t i = 0; !found && i < arraysize(kOriginEnumerationTestRecords); | |
1275 ++i) { | |
1276 const OriginEnumerationTestRecord& record = | |
1277 kOriginEnumerationTestRecords[i]; | |
1278 if (GURL(record.origin_url) != origin_url) | |
1279 continue; | |
1280 found = true; | |
1281 EXPECT_EQ(record.has_temporary, | |
1282 enumerator->HasFileSystemType(kFileSystemTypeTemporary)); | |
1283 EXPECT_EQ(record.has_persistent, | |
1284 enumerator->HasFileSystemType(kFileSystemTypePersistent)); | |
1285 } | |
1286 // Deal with the default filesystem created by the test helper. | |
1287 if (!found && origin_url == origin()) { | |
1288 ASSERT_TRUE(type() == kFileSystemTypeTemporary); | |
1289 EXPECT_EQ(true, | |
1290 enumerator->HasFileSystemType(kFileSystemTypeTemporary)); | |
1291 EXPECT_EQ(false, | |
1292 enumerator->HasFileSystemType(kFileSystemTypePersistent)); | |
1293 found = true; | |
1294 } | |
1295 EXPECT_TRUE(found); | |
1296 } | |
1297 | |
1298 std::set<GURL> diff; | |
1299 std::set_symmetric_difference(origins_expected.begin(), | |
1300 origins_expected.end(), origins_found.begin(), origins_found.end(), | |
1301 inserter(diff, diff.begin())); | |
1302 EXPECT_TRUE(diff.empty()); | |
1303 } | |
1304 | |
1305 TEST_F(ObfuscatedFileSystemFileUtilTest, TestRevokeUsageCache) { | |
1306 scoped_ptr<FileSystemOperationContext> context(NewContext(NULL)); | |
1307 | |
1308 int64 expected_quota = 0; | |
1309 | |
1310 for (size_t i = 0; i < arraysize(kMigrationTestCases); ++i) { | |
1311 SCOPED_TRACE(testing::Message() << "Creating kMigrationTestPath " << i); | |
1312 const MigrationTestCaseRecord& test_case = kMigrationTestCases[i]; | |
1313 FilePath path(test_case.path); | |
1314 expected_quota += ObfuscatedFileSystemFileUtil::ComputeFilePathCost(path); | |
1315 if (test_case.is_directory) { | |
1316 bool exclusive = true; | |
1317 bool recursive = false; | |
1318 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1319 ofsfu()->CreateDirectory(context.get(), path, exclusive, recursive)); | |
1320 } else { | |
1321 bool created = false; | |
1322 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1323 ofsfu()->EnsureFileExists(context.get(), path, &created)); | |
1324 ASSERT_TRUE(created); | |
1325 ASSERT_EQ(base::PLATFORM_FILE_OK, | |
1326 ofsfu()->Truncate(context.get(), path, | |
1327 test_case.data_file_size)); | |
1328 expected_quota += test_case.data_file_size; | |
1329 } | |
1330 } | |
1331 EXPECT_EQ(expected_quota, SizeInUsageFile()); | |
1332 RevokeUsageCache(); | |
1333 EXPECT_EQ(-1, SizeInUsageFile()); | |
1334 GetUsageFromQuotaManager(); | |
1335 EXPECT_EQ(expected_quota, SizeInUsageFile()); | |
1336 EXPECT_EQ(expected_quota, usage()); | |
1337 } | |
1338 | |
1339 TEST_F(ObfuscatedFileSystemFileUtilTest, TestInconsistency) { | |
1340 const FilePath kPath1 = FilePath().AppendASCII("hoge"); | |
1341 const FilePath kPath2 = FilePath().AppendASCII("fuga"); | |
1342 | |
1343 scoped_ptr<FileSystemOperationContext> context; | |
1344 base::PlatformFile file; | |
1345 base::PlatformFileInfo file_info; | |
1346 FilePath data_path; | |
1347 bool created = false; | |
1348 | |
1349 // Create a non-empty file. | |
1350 context.reset(NewContext(NULL)); | |
1351 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1352 ofsfu()->EnsureFileExists(context.get(), kPath1, &created)); | |
1353 EXPECT_TRUE(created); | |
1354 context.reset(NewContext(NULL)); | |
1355 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1356 ofsfu()->Truncate(context.get(), kPath1, 10)); | |
1357 context.reset(NewContext(NULL)); | |
1358 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1359 ofsfu()->GetFileInfo( | |
1360 context.get(), kPath1, &file_info, &data_path)); | |
1361 EXPECT_EQ(10, file_info.size); | |
1362 | |
1363 // Destroy database to make inconsistency between database and filesystem. | |
1364 ofsfu()->DestroyDirectoryDatabase(origin(), type()); | |
1365 | |
1366 // Try to get file info of broken file. | |
1367 context.reset(NewContext(NULL)); | |
1368 EXPECT_FALSE(ofsfu()->PathExists(context.get(), kPath1)); | |
1369 context.reset(NewContext(NULL)); | |
1370 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1371 ofsfu()->EnsureFileExists(context.get(), kPath1, &created)); | |
1372 EXPECT_TRUE(created); | |
1373 context.reset(NewContext(NULL)); | |
1374 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1375 ofsfu()->GetFileInfo( | |
1376 context.get(), kPath1, &file_info, &data_path)); | |
1377 EXPECT_EQ(0, file_info.size); | |
1378 | |
1379 // Make another broken file to |kPath2|. | |
1380 context.reset(NewContext(NULL)); | |
1381 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1382 ofsfu()->EnsureFileExists(context.get(), kPath2, &created)); | |
1383 EXPECT_TRUE(created); | |
1384 | |
1385 // Destroy again. | |
1386 ofsfu()->DestroyDirectoryDatabase(origin(), type()); | |
1387 | |
1388 // Repair broken |kPath1|. | |
1389 context.reset(NewContext(NULL)); | |
1390 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, | |
1391 ofsfu()->Touch(context.get(), kPath1, base::Time::Now(), | |
1392 base::Time::Now())); | |
1393 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1394 ofsfu()->EnsureFileExists(context.get(), kPath1, &created)); | |
1395 EXPECT_TRUE(created); | |
1396 | |
1397 // Copy from sound |kPath1| to broken |kPath2|. | |
1398 context.reset(NewContext(NULL)); | |
1399 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1400 ofsfu()->CopyOrMoveFile(context.get(), kPath1, kPath2, | |
1401 true /* copy */)); | |
1402 | |
1403 ofsfu()->DestroyDirectoryDatabase(origin(), type()); | |
1404 context.reset(NewContext(NULL)); | |
1405 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1406 ofsfu()->CreateOrOpen( | |
1407 context.get(), kPath1, | |
1408 base::PLATFORM_FILE_READ | base::PLATFORM_FILE_CREATE, | |
1409 &file, &created)); | |
1410 EXPECT_TRUE(created); | |
1411 EXPECT_TRUE(base::GetPlatformFileInfo(file, &file_info)); | |
1412 EXPECT_EQ(0, file_info.size); | |
1413 EXPECT_TRUE(base::ClosePlatformFile(file)); | |
1414 } | |
1415 | |
1416 TEST_F(ObfuscatedFileSystemFileUtilTest, TestIncompleteDirectoryReading) { | |
1417 const FilePath kPath[] = { | |
1418 FilePath().AppendASCII("foo"), | |
1419 FilePath().AppendASCII("bar"), | |
1420 FilePath().AppendASCII("baz") | |
1421 }; | |
1422 scoped_ptr<FileSystemOperationContext> context; | |
1423 | |
1424 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kPath); ++i) { | |
1425 bool created = false; | |
1426 context.reset(NewContext(NULL)); | |
1427 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1428 ofsfu()->EnsureFileExists(context.get(), kPath[i], &created)); | |
1429 EXPECT_TRUE(created); | |
1430 } | |
1431 | |
1432 context.reset(NewContext(NULL)); | |
1433 std::vector<base::FileUtilProxy::Entry> entries; | |
1434 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1435 ofsfu()->ReadDirectory(context.get(), FilePath(), &entries)); | |
1436 EXPECT_EQ(3u, entries.size()); | |
1437 | |
1438 context.reset(NewContext(NULL)); | |
1439 FilePath local_path; | |
1440 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1441 ofsfu()->GetLocalFilePath(context.get(), kPath[0], &local_path)); | |
1442 EXPECT_TRUE(file_util::Delete(local_path, false)); | |
1443 | |
1444 context.reset(NewContext(NULL)); | |
1445 entries.clear(); | |
1446 EXPECT_EQ(base::PLATFORM_FILE_OK, | |
1447 ofsfu()->ReadDirectory(context.get(), FilePath(), &entries)); | |
1448 EXPECT_EQ(ARRAYSIZE_UNSAFE(kPath) - 1, entries.size()); | |
1449 } | |
OLD | NEW |