OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <set> | |
6 | |
7 #include "base/file_util.h" | |
8 #include "base/files/file.h" | |
9 #include "base/files/file_path.h" | |
10 #include "base/files/scoped_temp_dir.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 #include "webkit/browser/fileapi/native_file_util.h" | |
13 | |
14 namespace fileapi { | |
15 | |
16 class NativeFileUtilTest : public testing::Test { | |
17 public: | |
18 NativeFileUtilTest() {} | |
19 | |
20 virtual void SetUp() { | |
21 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); | |
22 } | |
23 | |
24 protected: | |
25 base::FilePath Path() { | |
26 return data_dir_.path(); | |
27 } | |
28 | |
29 base::FilePath Path(const char* file_name) { | |
30 return data_dir_.path().AppendASCII(file_name); | |
31 } | |
32 | |
33 bool FileExists(const base::FilePath& path) { | |
34 return base::PathExists(path) && | |
35 !base::DirectoryExists(path); | |
36 } | |
37 | |
38 int64 GetSize(const base::FilePath& path) { | |
39 base::File::Info info; | |
40 base::GetFileInfo(path, &info); | |
41 return info.size; | |
42 } | |
43 | |
44 private: | |
45 base::ScopedTempDir data_dir_; | |
46 | |
47 DISALLOW_COPY_AND_ASSIGN(NativeFileUtilTest); | |
48 }; | |
49 | |
50 TEST_F(NativeFileUtilTest, CreateCloseAndDeleteFile) { | |
51 base::FilePath file_name = Path("test_file"); | |
52 int flags = base::File::FLAG_WRITE | base::File::FLAG_ASYNC; | |
53 base::File file = | |
54 NativeFileUtil::CreateOrOpen(file_name, base::File::FLAG_CREATE | flags); | |
55 ASSERT_TRUE(file.IsValid()); | |
56 ASSERT_TRUE(file.created()); | |
57 | |
58 EXPECT_TRUE(base::PathExists(file_name)); | |
59 EXPECT_TRUE(NativeFileUtil::PathExists(file_name)); | |
60 EXPECT_EQ(0, GetSize(file_name)); | |
61 file.Close(); | |
62 | |
63 file = NativeFileUtil::CreateOrOpen(file_name, base::File::FLAG_OPEN | flags); | |
64 ASSERT_TRUE(file.IsValid()); | |
65 ASSERT_FALSE(file.created()); | |
66 file.Close(); | |
67 | |
68 ASSERT_EQ(base::File::FILE_OK, | |
69 NativeFileUtil::DeleteFile(file_name)); | |
70 EXPECT_FALSE(base::PathExists(file_name)); | |
71 EXPECT_FALSE(NativeFileUtil::PathExists(file_name)); | |
72 } | |
73 | |
74 TEST_F(NativeFileUtilTest, EnsureFileExists) { | |
75 base::FilePath file_name = Path("foobar"); | |
76 bool created = false; | |
77 ASSERT_EQ(base::File::FILE_OK, | |
78 NativeFileUtil::EnsureFileExists(file_name, &created)); | |
79 ASSERT_TRUE(created); | |
80 | |
81 EXPECT_TRUE(FileExists(file_name)); | |
82 EXPECT_EQ(0, GetSize(file_name)); | |
83 | |
84 ASSERT_EQ(base::File::FILE_OK, | |
85 NativeFileUtil::EnsureFileExists(file_name, &created)); | |
86 EXPECT_FALSE(created); | |
87 } | |
88 | |
89 TEST_F(NativeFileUtilTest, CreateAndDeleteDirectory) { | |
90 base::FilePath dir_name = Path("test_dir"); | |
91 ASSERT_EQ(base::File::FILE_OK, | |
92 NativeFileUtil::CreateDirectory(dir_name, | |
93 false /* exclusive */, | |
94 false /* recursive */)); | |
95 | |
96 EXPECT_TRUE(NativeFileUtil::DirectoryExists(dir_name)); | |
97 EXPECT_TRUE(base::DirectoryExists(dir_name)); | |
98 | |
99 ASSERT_EQ(base::File::FILE_ERROR_EXISTS, | |
100 NativeFileUtil::CreateDirectory(dir_name, | |
101 true /* exclusive */, | |
102 false /* recursive */)); | |
103 | |
104 ASSERT_EQ(base::File::FILE_OK, | |
105 NativeFileUtil::DeleteDirectory(dir_name)); | |
106 EXPECT_FALSE(base::DirectoryExists(dir_name)); | |
107 EXPECT_FALSE(NativeFileUtil::DirectoryExists(dir_name)); | |
108 } | |
109 | |
110 TEST_F(NativeFileUtilTest, TouchFileAndGetFileInfo) { | |
111 base::FilePath file_name = Path("test_file"); | |
112 base::File::Info native_info; | |
113 ASSERT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
114 NativeFileUtil::GetFileInfo(file_name, &native_info)); | |
115 | |
116 bool created = false; | |
117 ASSERT_EQ(base::File::FILE_OK, | |
118 NativeFileUtil::EnsureFileExists(file_name, &created)); | |
119 ASSERT_TRUE(created); | |
120 | |
121 base::File::Info info; | |
122 ASSERT_TRUE(base::GetFileInfo(file_name, &info)); | |
123 ASSERT_EQ(base::File::FILE_OK, | |
124 NativeFileUtil::GetFileInfo(file_name, &native_info)); | |
125 ASSERT_EQ(info.size, native_info.size); | |
126 ASSERT_EQ(info.is_directory, native_info.is_directory); | |
127 ASSERT_EQ(info.is_symbolic_link, native_info.is_symbolic_link); | |
128 ASSERT_EQ(info.last_modified, native_info.last_modified); | |
129 ASSERT_EQ(info.last_accessed, native_info.last_accessed); | |
130 ASSERT_EQ(info.creation_time, native_info.creation_time); | |
131 | |
132 const base::Time new_accessed = | |
133 info.last_accessed + base::TimeDelta::FromHours(10); | |
134 const base::Time new_modified = | |
135 info.last_modified + base::TimeDelta::FromHours(5); | |
136 | |
137 EXPECT_EQ(base::File::FILE_OK, | |
138 NativeFileUtil::Touch(file_name, | |
139 new_accessed, new_modified)); | |
140 | |
141 ASSERT_TRUE(base::GetFileInfo(file_name, &info)); | |
142 EXPECT_EQ(new_accessed, info.last_accessed); | |
143 EXPECT_EQ(new_modified, info.last_modified); | |
144 } | |
145 | |
146 TEST_F(NativeFileUtilTest, CreateFileEnumerator) { | |
147 base::FilePath path_1 = Path("dir1"); | |
148 base::FilePath path_2 = Path("file1"); | |
149 base::FilePath path_11 = Path("dir1").AppendASCII("file11"); | |
150 base::FilePath path_12 = Path("dir1").AppendASCII("dir12"); | |
151 base::FilePath path_121 = | |
152 Path("dir1").AppendASCII("dir12").AppendASCII("file121"); | |
153 ASSERT_EQ(base::File::FILE_OK, | |
154 NativeFileUtil::CreateDirectory(path_1, false, false)); | |
155 bool created = false; | |
156 ASSERT_EQ(base::File::FILE_OK, | |
157 NativeFileUtil::EnsureFileExists(path_2, &created)); | |
158 ASSERT_EQ(base::File::FILE_OK, | |
159 NativeFileUtil::EnsureFileExists(path_11, &created)); | |
160 ASSERT_EQ(base::File::FILE_OK, | |
161 NativeFileUtil::CreateDirectory(path_12, false, false)); | |
162 ASSERT_EQ(base::File::FILE_OK, | |
163 NativeFileUtil::EnsureFileExists(path_121, &created)); | |
164 | |
165 { | |
166 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator = | |
167 NativeFileUtil::CreateFileEnumerator(Path(), false); | |
168 std::set<base::FilePath> set; | |
169 set.insert(path_1); | |
170 set.insert(path_2); | |
171 for (base::FilePath path = enumerator->Next(); !path.empty(); | |
172 path = enumerator->Next()) | |
173 EXPECT_EQ(1U, set.erase(path)); | |
174 EXPECT_TRUE(set.empty()); | |
175 } | |
176 | |
177 { | |
178 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator = | |
179 NativeFileUtil::CreateFileEnumerator(Path(), true); | |
180 std::set<base::FilePath> set; | |
181 set.insert(path_1); | |
182 set.insert(path_2); | |
183 set.insert(path_11); | |
184 set.insert(path_12); | |
185 set.insert(path_121); | |
186 for (base::FilePath path = enumerator->Next(); !path.empty(); | |
187 path = enumerator->Next()) | |
188 EXPECT_EQ(1U, set.erase(path)); | |
189 EXPECT_TRUE(set.empty()); | |
190 } | |
191 } | |
192 | |
193 TEST_F(NativeFileUtilTest, Truncate) { | |
194 base::FilePath file_name = Path("truncated"); | |
195 bool created = false; | |
196 ASSERT_EQ(base::File::FILE_OK, | |
197 NativeFileUtil::EnsureFileExists(file_name, &created)); | |
198 ASSERT_TRUE(created); | |
199 | |
200 ASSERT_EQ(base::File::FILE_OK, | |
201 NativeFileUtil::Truncate(file_name, 1020)); | |
202 | |
203 EXPECT_TRUE(FileExists(file_name)); | |
204 EXPECT_EQ(1020, GetSize(file_name)); | |
205 } | |
206 | |
207 TEST_F(NativeFileUtilTest, CopyFile) { | |
208 base::FilePath from_file = Path("fromfile"); | |
209 base::FilePath to_file1 = Path("tofile1"); | |
210 base::FilePath to_file2 = Path("tofile2"); | |
211 const NativeFileUtil::CopyOrMoveMode nosync = NativeFileUtil::COPY_NOSYNC; | |
212 const NativeFileUtil::CopyOrMoveMode sync = NativeFileUtil::COPY_SYNC; | |
213 bool created = false; | |
214 ASSERT_EQ(base::File::FILE_OK, | |
215 NativeFileUtil::EnsureFileExists(from_file, &created)); | |
216 ASSERT_TRUE(created); | |
217 | |
218 ASSERT_EQ(base::File::FILE_OK, | |
219 NativeFileUtil::Truncate(from_file, 1020)); | |
220 | |
221 EXPECT_TRUE(FileExists(from_file)); | |
222 EXPECT_EQ(1020, GetSize(from_file)); | |
223 | |
224 ASSERT_EQ(base::File::FILE_OK, | |
225 NativeFileUtil::CopyOrMoveFile( | |
226 from_file, to_file1, FileSystemOperation::OPTION_NONE, nosync)); | |
227 | |
228 ASSERT_EQ(base::File::FILE_OK, | |
229 NativeFileUtil::CopyOrMoveFile( | |
230 from_file, to_file2, FileSystemOperation::OPTION_NONE, sync)); | |
231 | |
232 EXPECT_TRUE(FileExists(from_file)); | |
233 EXPECT_EQ(1020, GetSize(from_file)); | |
234 EXPECT_TRUE(FileExists(to_file1)); | |
235 EXPECT_EQ(1020, GetSize(to_file1)); | |
236 EXPECT_TRUE(FileExists(to_file2)); | |
237 EXPECT_EQ(1020, GetSize(to_file2)); | |
238 | |
239 base::FilePath dir = Path("dir"); | |
240 ASSERT_EQ(base::File::FILE_OK, | |
241 NativeFileUtil::CreateDirectory(dir, false, false)); | |
242 ASSERT_TRUE(base::DirectoryExists(dir)); | |
243 base::FilePath to_dir_file = dir.AppendASCII("file"); | |
244 ASSERT_EQ(base::File::FILE_OK, | |
245 NativeFileUtil::CopyOrMoveFile( | |
246 from_file, to_dir_file, | |
247 FileSystemOperation::OPTION_NONE, nosync)); | |
248 EXPECT_TRUE(FileExists(to_dir_file)); | |
249 EXPECT_EQ(1020, GetSize(to_dir_file)); | |
250 | |
251 // Following tests are error checking. | |
252 // Source doesn't exist. | |
253 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
254 NativeFileUtil::CopyOrMoveFile( | |
255 Path("nonexists"), Path("file"), | |
256 FileSystemOperation::OPTION_NONE, nosync)); | |
257 | |
258 // Source is not a file. | |
259 EXPECT_EQ(base::File::FILE_ERROR_NOT_A_FILE, | |
260 NativeFileUtil::CopyOrMoveFile( | |
261 dir, Path("file"), FileSystemOperation::OPTION_NONE, nosync)); | |
262 // Destination is not a file. | |
263 EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, | |
264 NativeFileUtil::CopyOrMoveFile( | |
265 from_file, dir, FileSystemOperation::OPTION_NONE, nosync)); | |
266 // Destination's parent doesn't exist. | |
267 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
268 NativeFileUtil::CopyOrMoveFile( | |
269 from_file, Path("nodir").AppendASCII("file"), | |
270 FileSystemOperation::OPTION_NONE, nosync)); | |
271 // Destination's parent is a file. | |
272 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
273 NativeFileUtil::CopyOrMoveFile( | |
274 from_file, Path("tofile1").AppendASCII("file"), | |
275 FileSystemOperation::OPTION_NONE, nosync)); | |
276 } | |
277 | |
278 TEST_F(NativeFileUtilTest, MoveFile) { | |
279 base::FilePath from_file = Path("fromfile"); | |
280 base::FilePath to_file = Path("tofile"); | |
281 const NativeFileUtil::CopyOrMoveMode move = NativeFileUtil::MOVE; | |
282 bool created = false; | |
283 ASSERT_EQ(base::File::FILE_OK, | |
284 NativeFileUtil::EnsureFileExists(from_file, &created)); | |
285 ASSERT_TRUE(created); | |
286 | |
287 ASSERT_EQ(base::File::FILE_OK, NativeFileUtil::Truncate(from_file, 1020)); | |
288 | |
289 EXPECT_TRUE(FileExists(from_file)); | |
290 EXPECT_EQ(1020, GetSize(from_file)); | |
291 | |
292 ASSERT_EQ(base::File::FILE_OK, | |
293 NativeFileUtil::CopyOrMoveFile( | |
294 from_file, to_file, FileSystemOperation::OPTION_NONE, move)); | |
295 | |
296 EXPECT_FALSE(FileExists(from_file)); | |
297 EXPECT_TRUE(FileExists(to_file)); | |
298 EXPECT_EQ(1020, GetSize(to_file)); | |
299 | |
300 ASSERT_EQ(base::File::FILE_OK, | |
301 NativeFileUtil::EnsureFileExists(from_file, &created)); | |
302 ASSERT_TRUE(FileExists(from_file)); | |
303 ASSERT_EQ(base::File::FILE_OK, NativeFileUtil::Truncate(from_file, 1020)); | |
304 | |
305 base::FilePath dir = Path("dir"); | |
306 ASSERT_EQ(base::File::FILE_OK, | |
307 NativeFileUtil::CreateDirectory(dir, false, false)); | |
308 ASSERT_TRUE(base::DirectoryExists(dir)); | |
309 base::FilePath to_dir_file = dir.AppendASCII("file"); | |
310 ASSERT_EQ(base::File::FILE_OK, | |
311 NativeFileUtil::CopyOrMoveFile( | |
312 from_file, to_dir_file, | |
313 FileSystemOperation::OPTION_NONE, move)); | |
314 EXPECT_FALSE(FileExists(from_file)); | |
315 EXPECT_TRUE(FileExists(to_dir_file)); | |
316 EXPECT_EQ(1020, GetSize(to_dir_file)); | |
317 | |
318 // Following is error checking. | |
319 // Source doesn't exist. | |
320 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
321 NativeFileUtil::CopyOrMoveFile( | |
322 Path("nonexists"), Path("file"), | |
323 FileSystemOperation::OPTION_NONE, move)); | |
324 | |
325 // Source is not a file. | |
326 EXPECT_EQ(base::File::FILE_ERROR_NOT_A_FILE, | |
327 NativeFileUtil::CopyOrMoveFile( | |
328 dir, Path("file"), FileSystemOperation::OPTION_NONE, move)); | |
329 ASSERT_EQ(base::File::FILE_OK, | |
330 NativeFileUtil::EnsureFileExists(from_file, &created)); | |
331 ASSERT_TRUE(FileExists(from_file)); | |
332 // Destination is not a file. | |
333 EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, | |
334 NativeFileUtil::CopyOrMoveFile( | |
335 from_file, dir, FileSystemOperation::OPTION_NONE, move)); | |
336 | |
337 ASSERT_EQ(base::File::FILE_OK, | |
338 NativeFileUtil::EnsureFileExists(from_file, &created)); | |
339 ASSERT_TRUE(FileExists(from_file)); | |
340 // Destination's parent doesn't exist. | |
341 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
342 NativeFileUtil::CopyOrMoveFile( | |
343 from_file, Path("nodir").AppendASCII("file"), | |
344 FileSystemOperation::OPTION_NONE, move)); | |
345 // Destination's parent is a file. | |
346 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, | |
347 NativeFileUtil::CopyOrMoveFile( | |
348 from_file, Path("tofile1").AppendASCII("file"), | |
349 FileSystemOperation::OPTION_NONE, move)); | |
350 } | |
351 | |
352 TEST_F(NativeFileUtilTest, PreserveLastModified) { | |
353 base::FilePath from_file = Path("fromfile"); | |
354 base::FilePath to_file1 = Path("tofile1"); | |
355 base::FilePath to_file2 = Path("tofile2"); | |
356 base::FilePath to_file3 = Path("tofile3"); | |
357 bool created = false; | |
358 ASSERT_EQ(base::File::FILE_OK, | |
359 NativeFileUtil::EnsureFileExists(from_file, &created)); | |
360 ASSERT_TRUE(created); | |
361 EXPECT_TRUE(FileExists(from_file)); | |
362 | |
363 base::File::Info file_info1; | |
364 ASSERT_EQ(base::File::FILE_OK, | |
365 NativeFileUtil::GetFileInfo(from_file, &file_info1)); | |
366 | |
367 // Test for copy (nosync). | |
368 ASSERT_EQ(base::File::FILE_OK, | |
369 NativeFileUtil::CopyOrMoveFile( | |
370 from_file, to_file1, | |
371 FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, | |
372 NativeFileUtil::COPY_NOSYNC)); | |
373 | |
374 base::File::Info file_info2; | |
375 ASSERT_TRUE(FileExists(to_file1)); | |
376 ASSERT_EQ(base::File::FILE_OK, | |
377 NativeFileUtil::GetFileInfo(to_file1, &file_info2)); | |
378 EXPECT_EQ(file_info1.last_modified, file_info2.last_modified); | |
379 | |
380 // Test for copy (sync). | |
381 ASSERT_EQ(base::File::FILE_OK, | |
382 NativeFileUtil::CopyOrMoveFile( | |
383 from_file, to_file2, | |
384 FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, | |
385 NativeFileUtil::COPY_SYNC)); | |
386 | |
387 ASSERT_TRUE(FileExists(to_file2)); | |
388 ASSERT_EQ(base::File::FILE_OK, | |
389 NativeFileUtil::GetFileInfo(to_file1, &file_info2)); | |
390 EXPECT_EQ(file_info1.last_modified, file_info2.last_modified); | |
391 | |
392 // Test for move. | |
393 ASSERT_EQ(base::File::FILE_OK, | |
394 NativeFileUtil::CopyOrMoveFile( | |
395 from_file, to_file3, | |
396 FileSystemOperation::OPTION_PRESERVE_LAST_MODIFIED, | |
397 NativeFileUtil::MOVE)); | |
398 | |
399 ASSERT_TRUE(FileExists(to_file3)); | |
400 ASSERT_EQ(base::File::FILE_OK, | |
401 NativeFileUtil::GetFileInfo(to_file2, &file_info2)); | |
402 EXPECT_EQ(file_info1.last_modified, file_info2.last_modified); | |
403 } | |
404 | |
405 } // namespace fileapi | |
OLD | NEW |