1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/files/file_path.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/message_loop.h"
10 #include "base/message_loop_proxy.h"
11 #include "base/platform_file.h"
12 #include "base/strings/sys_string_conversions.h"
13 #include "base/utf_string_conversions.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webkit/fileapi/async_file_test_helper.h"
16 #include "webkit/fileapi/file_system_context.h"
17 #include "webkit/fileapi/file_system_file_util.h"
18 #include "webkit/fileapi/file_system_operation_context.h"
19 #include "webkit/fileapi/file_system_types.h"
20 #include "webkit/fileapi/local_file_system_test_helper.h"
21 #include "webkit/fileapi/local_file_util.h"
22 #include "webkit/fileapi/native_file_util.h"
26 // TODO(dmikurube): Cover all public methods in LocalFileUtil.
27 class LocalFileUtilTest
: public testing::Test
{
30 : test_helper_(GURL("http://foo/"), kFileSystemTypeTest
) {}
32 virtual void SetUp() {
33 ASSERT_TRUE(data_dir_
.CreateUniqueTempDir());
34 test_helper_
.SetUp(data_dir_
.path());
37 virtual void TearDown() {
38 test_helper_
.TearDown();
42 FileSystemOperationContext
* NewContext() {
43 FileSystemOperationContext
* context
= test_helper_
.NewOperationContext();
47 LocalFileUtil
* FileUtil() {
48 return static_cast<LocalFileUtil
*>(test_helper_
.file_util());
51 FileSystemURL
Path(const std::string
& file_name
) {
52 return test_helper_
.CreateURLFromUTF8(file_name
);
55 base::FilePath
LocalPath(const char *file_name
) {
56 return test_helper_
.GetLocalPathFromASCII(file_name
);
59 bool FileExists(const char *file_name
) {
60 return file_util::PathExists(LocalPath(file_name
)) &&
61 !file_util::DirectoryExists(LocalPath(file_name
));
64 bool DirectoryExists(const char *file_name
) {
65 return file_util::DirectoryExists(LocalPath(file_name
));
68 int64
GetSize(const char *file_name
) {
69 base::PlatformFileInfo info
;
70 file_util::GetFileInfo(LocalPath(file_name
), &info
);
74 base::PlatformFileError
CreateFile(const char* file_name
,
75 base::PlatformFile
* file_handle
, bool* created
) {
76 int file_flags
= base::PLATFORM_FILE_CREATE
|
77 base::PLATFORM_FILE_WRITE
| base::PLATFORM_FILE_ASYNC
;
79 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
80 return FileUtil()->CreateOrOpen(
83 file_flags
, file_handle
, created
);
86 base::PlatformFileError
EnsureFileExists(const char* file_name
,
88 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
89 return FileUtil()->EnsureFileExists(
91 Path(file_name
), created
);
94 const LocalFileSystemTestOriginHelper
& test_helper() const {
98 FileSystemContext
* file_system_context() {
99 return test_helper_
.file_system_context();
103 scoped_ptr
<LocalFileUtil
> local_file_util_
;
104 base::ScopedTempDir data_dir_
;
105 MessageLoop message_loop_
;
106 LocalFileSystemTestOriginHelper test_helper_
;
108 DISALLOW_COPY_AND_ASSIGN(LocalFileUtilTest
);
111 TEST_F(LocalFileUtilTest
, CreateAndClose
) {
112 const char *file_name
= "test_file";
113 base::PlatformFile file_handle
;
115 ASSERT_EQ(base::PLATFORM_FILE_OK
,
116 CreateFile(file_name
, &file_handle
, &created
));
117 ASSERT_TRUE(created
);
119 EXPECT_TRUE(FileExists(file_name
));
120 EXPECT_EQ(0, GetSize(file_name
));
122 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
123 EXPECT_EQ(base::PLATFORM_FILE_OK
,
124 FileUtil()->Close(context
.get(), file_handle
));
127 TEST_F(LocalFileUtilTest
, EnsureFileExists
) {
128 const char *file_name
= "foobar";
130 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(file_name
, &created
));
131 ASSERT_TRUE(created
);
133 EXPECT_TRUE(FileExists(file_name
));
134 EXPECT_EQ(0, GetSize(file_name
));
136 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(file_name
, &created
));
137 EXPECT_FALSE(created
);
140 TEST_F(LocalFileUtilTest
, TouchFile
) {
141 const char *file_name
= "test_file";
142 base::PlatformFile file_handle
;
144 ASSERT_EQ(base::PLATFORM_FILE_OK
,
145 CreateFile(file_name
, &file_handle
, &created
));
146 ASSERT_TRUE(created
);
148 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
150 base::PlatformFileInfo info
;
151 ASSERT_TRUE(file_util::GetFileInfo(LocalPath(file_name
), &info
));
152 const base::Time new_accessed
=
153 info
.last_accessed
+ base::TimeDelta::FromHours(10);
154 const base::Time new_modified
=
155 info
.last_modified
+ base::TimeDelta::FromHours(5);
157 EXPECT_EQ(base::PLATFORM_FILE_OK
,
158 FileUtil()->Touch(context
.get(), Path(file_name
),
159 new_accessed
, new_modified
));
161 ASSERT_TRUE(file_util::GetFileInfo(LocalPath(file_name
), &info
));
162 EXPECT_EQ(new_accessed
, info
.last_accessed
);
163 EXPECT_EQ(new_modified
, info
.last_modified
);
165 EXPECT_EQ(base::PLATFORM_FILE_OK
,
166 FileUtil()->Close(context
.get(), file_handle
));
169 TEST_F(LocalFileUtilTest
, TouchDirectory
) {
170 const char *dir_name
= "test_dir";
171 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
172 ASSERT_EQ(base::PLATFORM_FILE_OK
,
173 FileUtil()->CreateDirectory(context
.get(),
175 false /* exclusive */,
176 false /* recursive */));
178 base::PlatformFileInfo info
;
179 ASSERT_TRUE(file_util::GetFileInfo(LocalPath(dir_name
), &info
));
180 const base::Time new_accessed
=
181 info
.last_accessed
+ base::TimeDelta::FromHours(10);
182 const base::Time new_modified
=
183 info
.last_modified
+ base::TimeDelta::FromHours(5);
185 EXPECT_EQ(base::PLATFORM_FILE_OK
,
186 FileUtil()->Touch(context
.get(), Path(dir_name
),
187 new_accessed
, new_modified
));
189 ASSERT_TRUE(file_util::GetFileInfo(LocalPath(dir_name
), &info
));
190 EXPECT_EQ(new_accessed
, info
.last_accessed
);
191 EXPECT_EQ(new_modified
, info
.last_modified
);
194 TEST_F(LocalFileUtilTest
, Truncate
) {
195 const char *file_name
= "truncated";
197 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(file_name
, &created
));
198 ASSERT_TRUE(created
);
200 scoped_ptr
<FileSystemOperationContext
> context
;
202 context
.reset(NewContext());
203 ASSERT_EQ(base::PLATFORM_FILE_OK
,
204 FileUtil()->Truncate(context
.get(), Path(file_name
), 1020));
206 EXPECT_TRUE(FileExists(file_name
));
207 EXPECT_EQ(1020, GetSize(file_name
));
210 TEST_F(LocalFileUtilTest
, CopyFile
) {
211 const char *from_file
= "fromfile";
212 const char *to_file1
= "tofile1";
213 const char *to_file2
= "tofile2";
215 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
216 ASSERT_TRUE(created
);
218 scoped_ptr
<FileSystemOperationContext
> context
;
219 context
.reset(NewContext());
220 ASSERT_EQ(base::PLATFORM_FILE_OK
,
221 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
223 EXPECT_TRUE(FileExists(from_file
));
224 EXPECT_EQ(1020, GetSize(from_file
));
226 ASSERT_EQ(base::PLATFORM_FILE_OK
,
227 AsyncFileTestHelper::Copy(file_system_context(),
228 Path(from_file
), Path(to_file1
)));
230 context
.reset(NewContext());
231 ASSERT_EQ(base::PLATFORM_FILE_OK
,
232 AsyncFileTestHelper::Copy(file_system_context(),
233 Path(from_file
), Path(to_file2
)));
235 EXPECT_TRUE(FileExists(from_file
));
236 EXPECT_EQ(1020, GetSize(from_file
));
237 EXPECT_TRUE(FileExists(to_file1
));
238 EXPECT_EQ(1020, GetSize(to_file1
));
239 EXPECT_TRUE(FileExists(to_file2
));
240 EXPECT_EQ(1020, GetSize(to_file2
));
243 TEST_F(LocalFileUtilTest
, CopyDirectory
) {
244 const char *from_dir
= "fromdir";
245 const char *from_file
= "fromdir/fromfile";
246 const char *to_dir
= "todir";
247 const char *to_file
= "todir/fromfile";
249 scoped_ptr
<FileSystemOperationContext
> context
;
251 context
.reset(NewContext());
252 ASSERT_EQ(base::PLATFORM_FILE_OK
,
253 FileUtil()->CreateDirectory(context
.get(), Path(from_dir
), false, false));
254 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
255 ASSERT_TRUE(created
);
257 context
.reset(NewContext());
258 ASSERT_EQ(base::PLATFORM_FILE_OK
,
259 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
261 EXPECT_TRUE(DirectoryExists(from_dir
));
262 EXPECT_TRUE(FileExists(from_file
));
263 EXPECT_EQ(1020, GetSize(from_file
));
264 EXPECT_FALSE(DirectoryExists(to_dir
));
266 context
.reset(NewContext());
267 ASSERT_EQ(base::PLATFORM_FILE_OK
,
268 AsyncFileTestHelper::Copy(file_system_context(),
269 Path(from_dir
), Path(to_dir
)));
271 EXPECT_TRUE(DirectoryExists(from_dir
));
272 EXPECT_TRUE(FileExists(from_file
));
273 EXPECT_EQ(1020, GetSize(from_file
));
274 EXPECT_TRUE(DirectoryExists(to_dir
));
275 EXPECT_TRUE(FileExists(to_file
));
276 EXPECT_EQ(1020, GetSize(to_file
));
279 TEST_F(LocalFileUtilTest
, MoveFile
) {
280 const char *from_file
= "fromfile";
281 const char *to_file
= "tofile";
283 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
284 ASSERT_TRUE(created
);
285 scoped_ptr
<FileSystemOperationContext
> context
;
287 context
.reset(NewContext());
288 ASSERT_EQ(base::PLATFORM_FILE_OK
,
289 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
291 EXPECT_TRUE(FileExists(from_file
));
292 EXPECT_EQ(1020, GetSize(from_file
));
294 context
.reset(NewContext());
295 ASSERT_EQ(base::PLATFORM_FILE_OK
,
296 AsyncFileTestHelper::Move(file_system_context(),
297 Path(from_file
), Path(to_file
)));
299 EXPECT_FALSE(FileExists(from_file
));
300 EXPECT_TRUE(FileExists(to_file
));
301 EXPECT_EQ(1020, GetSize(to_file
));
304 TEST_F(LocalFileUtilTest
, MoveDirectory
) {
305 const char *from_dir
= "fromdir";
306 const char *from_file
= "fromdir/fromfile";
307 const char *to_dir
= "todir";
308 const char *to_file
= "todir/fromfile";
310 scoped_ptr
<FileSystemOperationContext
> context
;
312 context
.reset(NewContext());
313 ASSERT_EQ(base::PLATFORM_FILE_OK
,
314 FileUtil()->CreateDirectory(context
.get(), Path(from_dir
), false, false));
315 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
316 ASSERT_TRUE(created
);
318 context
.reset(NewContext());
319 ASSERT_EQ(base::PLATFORM_FILE_OK
,
320 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
322 EXPECT_TRUE(DirectoryExists(from_dir
));
323 EXPECT_TRUE(FileExists(from_file
));
324 EXPECT_EQ(1020, GetSize(from_file
));
325 EXPECT_FALSE(DirectoryExists(to_dir
));
327 context
.reset(NewContext());
328 ASSERT_EQ(base::PLATFORM_FILE_OK
,
329 AsyncFileTestHelper::Move(file_system_context(),
330 Path(from_dir
), Path(to_dir
)));
332 EXPECT_FALSE(DirectoryExists(from_dir
));
333 EXPECT_TRUE(DirectoryExists(to_dir
));
334 EXPECT_TRUE(FileExists(to_file
));
335 EXPECT_EQ(1020, GetSize(to_file
));
338 } // namespace fileapi