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.
7 #include "base/file_path.h"
8 #include "base/memory/scoped_callback_factory.h"
9 #include "base/message_loop_proxy.h"
10 #include "base/platform_file.h"
11 #include "base/scoped_temp_dir.h"
12 #include "base/sys_string_conversions.h"
13 #include "base/utf_string_conversions.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webkit/fileapi/file_system_context.h"
16 #include "webkit/fileapi/file_system_file_util.h"
17 #include "webkit/fileapi/file_system_operation_context.h"
18 #include "webkit/fileapi/file_system_path_manager.h"
19 #include "webkit/fileapi/file_system_test_helper.h"
20 #include "webkit/fileapi/file_system_types.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 : local_file_util_(new LocalFileUtil(new NativeFileUtil())),
31 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
35 ASSERT_TRUE(data_dir_
.CreateUniqueTempDir());
36 test_helper_
.SetUp(data_dir_
.path(), FileUtil());
40 test_helper_
.TearDown();
44 FileSystemOperationContext
* NewContext() {
45 FileSystemOperationContext
* context
= test_helper_
.NewOperationContext();
49 LocalFileUtil
* FileUtil() {
50 return local_file_util_
.get();
53 static FilePath
Path(const std::string
& file_name
) {
54 return FilePath().AppendASCII(file_name
);
57 FilePath
LocalPath(const char *file_name
) {
58 return test_helper_
.GetLocalPathFromASCII(file_name
);
61 bool FileExists(const char *file_name
) {
62 return file_util::PathExists(LocalPath(file_name
)) &&
63 !file_util::DirectoryExists(LocalPath(file_name
));
66 bool DirectoryExists(const char *file_name
) {
67 return file_util::DirectoryExists(LocalPath(file_name
));
70 int64
GetSize(const char *file_name
) {
71 base::PlatformFileInfo info
;
72 file_util::GetFileInfo(LocalPath(file_name
), &info
);
76 base::PlatformFileError
CreateFile(const char* file_name
,
77 base::PlatformFile
* file_handle
, bool* created
) {
78 int file_flags
= base::PLATFORM_FILE_CREATE
|
79 base::PLATFORM_FILE_WRITE
| base::PLATFORM_FILE_ASYNC
;
81 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
82 return FileUtil()->CreateOrOpen(
85 file_flags
, file_handle
, created
);
88 base::PlatformFileError
EnsureFileExists(const char* file_name
,
90 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
91 return FileUtil()->EnsureFileExists(
93 Path(file_name
), created
);
97 scoped_ptr
<LocalFileUtil
> local_file_util_
;
98 ScopedTempDir data_dir_
;
99 FileSystemTestOriginHelper test_helper_
;
101 base::ScopedCallbackFactory
<LocalFileUtilTest
> callback_factory_
;
103 DISALLOW_COPY_AND_ASSIGN(LocalFileUtilTest
);
106 TEST_F(LocalFileUtilTest
, CreateAndClose
) {
107 const char *file_name
= "test_file";
108 base::PlatformFile file_handle
;
110 ASSERT_EQ(base::PLATFORM_FILE_OK
,
111 CreateFile(file_name
, &file_handle
, &created
));
112 ASSERT_TRUE(created
);
114 EXPECT_TRUE(FileExists(file_name
));
115 EXPECT_EQ(0, GetSize(file_name
));
117 scoped_ptr
<FileSystemOperationContext
> context(NewContext());
118 EXPECT_EQ(base::PLATFORM_FILE_OK
,
119 FileUtil()->Close(context
.get(), file_handle
));
122 TEST_F(LocalFileUtilTest
, EnsureFileExists
) {
123 const char *file_name
= "foobar";
125 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(file_name
, &created
));
126 ASSERT_TRUE(created
);
128 EXPECT_TRUE(FileExists(file_name
));
129 EXPECT_EQ(0, GetSize(file_name
));
131 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(file_name
, &created
));
132 EXPECT_FALSE(created
);
135 TEST_F(LocalFileUtilTest
, Truncate
) {
136 const char *file_name
= "truncated";
138 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(file_name
, &created
));
139 ASSERT_TRUE(created
);
141 scoped_ptr
<FileSystemOperationContext
> context
;
143 context
.reset(NewContext());
144 ASSERT_EQ(base::PLATFORM_FILE_OK
,
145 FileUtil()->Truncate(context
.get(), Path(file_name
), 1020));
147 EXPECT_TRUE(FileExists(file_name
));
148 EXPECT_EQ(1020, GetSize(file_name
));
151 TEST_F(LocalFileUtilTest
, CopyFile
) {
152 const char *from_file
= "fromfile";
153 const char *to_file1
= "tofile1";
154 const char *to_file2
= "tofile2";
156 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
157 ASSERT_TRUE(created
);
158 scoped_ptr
<FileSystemOperationContext
> context
;
160 context
.reset(NewContext());
161 ASSERT_EQ(base::PLATFORM_FILE_OK
,
162 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
164 EXPECT_TRUE(FileExists(from_file
));
165 EXPECT_EQ(1020, GetSize(from_file
));
167 context
.reset(NewContext());
168 ASSERT_EQ(base::PLATFORM_FILE_OK
,
169 FileUtil()->Copy(context
.get(), Path(from_file
), Path(to_file1
)));
171 context
.reset(NewContext());
172 ASSERT_EQ(base::PLATFORM_FILE_OK
,
173 FileUtil()->Copy(context
.get(), Path(from_file
), Path(to_file2
)));
175 EXPECT_TRUE(FileExists(from_file
));
176 EXPECT_EQ(1020, GetSize(from_file
));
177 EXPECT_TRUE(FileExists(to_file1
));
178 EXPECT_EQ(1020, GetSize(to_file1
));
179 EXPECT_TRUE(FileExists(to_file2
));
180 EXPECT_EQ(1020, GetSize(to_file2
));
183 TEST_F(LocalFileUtilTest
, CopyDirectory
) {
184 const char *from_dir
= "fromdir";
185 const char *from_file
= "fromdir/fromfile";
186 const char *to_dir
= "todir";
187 const char *to_file
= "todir/fromfile";
189 scoped_ptr
<FileSystemOperationContext
> context
;
191 context
.reset(NewContext());
192 ASSERT_EQ(base::PLATFORM_FILE_OK
,
193 FileUtil()->CreateDirectory(context
.get(), Path(from_dir
), false, false));
194 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
195 ASSERT_TRUE(created
);
197 context
.reset(NewContext());
198 ASSERT_EQ(base::PLATFORM_FILE_OK
,
199 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
201 EXPECT_TRUE(DirectoryExists(from_dir
));
202 EXPECT_TRUE(FileExists(from_file
));
203 EXPECT_EQ(1020, GetSize(from_file
));
204 EXPECT_FALSE(DirectoryExists(to_dir
));
206 context
.reset(NewContext());
207 ASSERT_EQ(base::PLATFORM_FILE_OK
,
208 FileUtil()->Copy(context
.get(), Path(from_dir
), Path(to_dir
)));
210 EXPECT_TRUE(DirectoryExists(from_dir
));
211 EXPECT_TRUE(FileExists(from_file
));
212 EXPECT_EQ(1020, GetSize(from_file
));
213 EXPECT_TRUE(DirectoryExists(to_dir
));
214 EXPECT_TRUE(FileExists(to_file
));
215 EXPECT_EQ(1020, GetSize(to_file
));
218 TEST_F(LocalFileUtilTest
, MoveFile
) {
219 const char *from_file
= "fromfile";
220 const char *to_file
= "tofile";
222 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
223 ASSERT_TRUE(created
);
224 scoped_ptr
<FileSystemOperationContext
> context
;
226 context
.reset(NewContext());
227 ASSERT_EQ(base::PLATFORM_FILE_OK
,
228 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
230 EXPECT_TRUE(FileExists(from_file
));
231 EXPECT_EQ(1020, GetSize(from_file
));
233 context
.reset(NewContext());
234 ASSERT_EQ(base::PLATFORM_FILE_OK
,
235 FileUtil()->Move(context
.get(), Path(from_file
), Path(to_file
)));
237 EXPECT_FALSE(FileExists(from_file
));
238 EXPECT_TRUE(FileExists(to_file
));
239 EXPECT_EQ(1020, GetSize(to_file
));
242 TEST_F(LocalFileUtilTest
, MoveDirectory
) {
243 const char *from_dir
= "fromdir";
244 const char *from_file
= "fromdir/fromfile";
245 const char *to_dir
= "todir";
246 const char *to_file
= "todir/fromfile";
248 scoped_ptr
<FileSystemOperationContext
> context
;
250 context
.reset(NewContext());
251 ASSERT_EQ(base::PLATFORM_FILE_OK
,
252 FileUtil()->CreateDirectory(context
.get(), Path(from_dir
), false, false));
253 ASSERT_EQ(base::PLATFORM_FILE_OK
, EnsureFileExists(from_file
, &created
));
254 ASSERT_TRUE(created
);
256 context
.reset(NewContext());
257 ASSERT_EQ(base::PLATFORM_FILE_OK
,
258 FileUtil()->Truncate(context
.get(), Path(from_file
), 1020));
260 EXPECT_TRUE(DirectoryExists(from_dir
));
261 EXPECT_TRUE(FileExists(from_file
));
262 EXPECT_EQ(1020, GetSize(from_file
));
263 EXPECT_FALSE(DirectoryExists(to_dir
));
265 context
.reset(NewContext());
266 ASSERT_EQ(base::PLATFORM_FILE_OK
,
267 FileUtil()->Move(context
.get(), Path(from_dir
), Path(to_dir
)));
269 EXPECT_FALSE(DirectoryExists(from_dir
));
270 EXPECT_TRUE(DirectoryExists(to_dir
));
271 EXPECT_TRUE(FileExists(to_file
));
272 EXPECT_EQ(1020, GetSize(to_file
));
275 } // namespace fileapi