blob: 59cba31f0351a8987a1dc0ba7e15bfaf000b08ba [file] [log] [blame]
rvargas@google.comb1ae3192013-11-28 10:31:31 +09001// 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.
4
5#include "base/file_util.h"
rvargas@chromium.org12938d72013-12-04 09:46:32 +09006#include "base/files/file.h"
rvargas@google.comb1ae3192013-11-28 10:31:31 +09007#include "base/files/scoped_temp_dir.h"
rvargas@google.comb1ae3192013-11-28 10:31:31 +09008#include "base/time/time.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
rvargas@chromium.org12938d72013-12-04 09:46:32 +090011using base::File;
rvargas@google.comb1ae3192013-11-28 10:31:31 +090012using base::FilePath;
13
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +090014TEST(FileTest, Create) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +090015 base::ScopedTempDir temp_dir;
16 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
17 FilePath file_path = temp_dir.path().AppendASCII("create_file_1");
18
rvargas@chromium.org12938d72013-12-04 09:46:32 +090019 {
20 // Open a file that doesn't exist.
21 File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
22 EXPECT_FALSE(file.IsValid());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090023 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, file.error_details());
rvargas@chromium.org12938d72013-12-04 09:46:32 +090024 }
rvargas@google.comb1ae3192013-11-28 10:31:31 +090025
rvargas@chromium.org12938d72013-12-04 09:46:32 +090026 {
27 // Open or create a file.
28 File file(file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ);
29 EXPECT_TRUE(file.IsValid());
30 EXPECT_TRUE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090031 EXPECT_EQ(base::File::FILE_OK, file.error_details());
rvargas@chromium.org12938d72013-12-04 09:46:32 +090032 }
rvargas@google.comb1ae3192013-11-28 10:31:31 +090033
rvargas@chromium.org12938d72013-12-04 09:46:32 +090034 {
35 // Open an existing file.
36 File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
37 EXPECT_TRUE(file.IsValid());
38 EXPECT_FALSE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090039 EXPECT_EQ(base::File::FILE_OK, file.error_details());
rvargas@google.comb1ae3192013-11-28 10:31:31 +090040
rvargas@chromium.org12938d72013-12-04 09:46:32 +090041 // This time verify closing the file.
42 file.Close();
43 EXPECT_FALSE(file.IsValid());
44 }
rvargas@google.comb1ae3192013-11-28 10:31:31 +090045
rvargas@chromium.org12938d72013-12-04 09:46:32 +090046 {
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090047 // Open an existing file through Initialize
48 File file;
49 file.Initialize(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
50 EXPECT_TRUE(file.IsValid());
51 EXPECT_FALSE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090052 EXPECT_EQ(base::File::FILE_OK, file.error_details());
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090053
54 // This time verify closing the file.
55 file.Close();
56 EXPECT_FALSE(file.IsValid());
57 }
58
59 {
rvargas@chromium.org12938d72013-12-04 09:46:32 +090060 // Create a file that exists.
61 File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_READ);
62 EXPECT_FALSE(file.IsValid());
63 EXPECT_FALSE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090064 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, file.error_details());
rvargas@chromium.org12938d72013-12-04 09:46:32 +090065 }
rvargas@google.comb1ae3192013-11-28 10:31:31 +090066
rvargas@chromium.org12938d72013-12-04 09:46:32 +090067 {
68 // Create or overwrite a file.
69 File file(file_path,
70 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ);
71 EXPECT_TRUE(file.IsValid());
72 EXPECT_TRUE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090073 EXPECT_EQ(base::File::FILE_OK, file.error_details());
rvargas@chromium.org12938d72013-12-04 09:46:32 +090074 }
rvargas@google.comb1ae3192013-11-28 10:31:31 +090075
rvargas@chromium.org12938d72013-12-04 09:46:32 +090076 {
77 // Create a delete-on-close file.
78 file_path = temp_dir.path().AppendASCII("create_file_2");
79 File file(file_path,
80 base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
81 base::File::FLAG_DELETE_ON_CLOSE);
82 EXPECT_TRUE(file.IsValid());
83 EXPECT_TRUE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090084 EXPECT_EQ(base::File::FILE_OK, file.error_details());
rvargas@chromium.org12938d72013-12-04 09:46:32 +090085 }
86
rvargas@google.comb1ae3192013-11-28 10:31:31 +090087 EXPECT_FALSE(base::PathExists(file_path));
88}
89
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +090090TEST(FileTest, Async) {
91 base::ScopedTempDir temp_dir;
92 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
93 FilePath file_path = temp_dir.path().AppendASCII("create_file");
94
95 {
96 File file(file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_ASYNC);
97 EXPECT_TRUE(file.IsValid());
98 EXPECT_TRUE(file.async());
99 }
100
101 {
102 File file(file_path, base::File::FLAG_OPEN_ALWAYS);
103 EXPECT_TRUE(file.IsValid());
104 EXPECT_FALSE(file.async());
105 }
106}
107
108TEST(FileTest, DeleteOpenFile) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900109 base::ScopedTempDir temp_dir;
110 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
111 FilePath file_path = temp_dir.path().AppendASCII("create_file_1");
112
113 // Create a file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900114 File file(file_path,
115 base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
116 base::File::FLAG_SHARE_DELETE);
117 EXPECT_TRUE(file.IsValid());
118 EXPECT_TRUE(file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +0900119 EXPECT_EQ(base::File::FILE_OK, file.error_details());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900120
121 // Open an existing file and mark it as delete on close.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900122 File same_file(file_path,
123 base::File::FLAG_OPEN | base::File::FLAG_DELETE_ON_CLOSE |
124 base::File::FLAG_READ);
125 EXPECT_TRUE(file.IsValid());
126 EXPECT_FALSE(same_file.created());
rvargas@chromium.org9cce0322014-01-09 07:30:21 +0900127 EXPECT_EQ(base::File::FILE_OK, same_file.error_details());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900128
129 // Close both handles and check that the file is gone.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900130 file.Close();
131 same_file.Close();
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900132 EXPECT_FALSE(base::PathExists(file_path));
133}
134
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900135TEST(FileTest, ReadWrite) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900136 base::ScopedTempDir temp_dir;
137 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
138 FilePath file_path = temp_dir.path().AppendASCII("read_write_file");
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900139 File file(file_path,
140 base::File::FLAG_CREATE | base::File::FLAG_READ |
141 base::File::FLAG_WRITE);
142 ASSERT_TRUE(file.IsValid());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900143
144 char data_to_write[] = "test";
145 const int kTestDataSize = 4;
146
147 // Write 0 bytes to the file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900148 int bytes_written = file.Write(0, data_to_write, 0);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900149 EXPECT_EQ(0, bytes_written);
150
151 // Write "test" to the file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900152 bytes_written = file.Write(0, data_to_write, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900153 EXPECT_EQ(kTestDataSize, bytes_written);
154
155 // Read from EOF.
156 char data_read_1[32];
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900157 int bytes_read = file.Read(kTestDataSize, data_read_1, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900158 EXPECT_EQ(0, bytes_read);
159
160 // Read from somewhere in the middle of the file.
161 const int kPartialReadOffset = 1;
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900162 bytes_read = file.Read(kPartialReadOffset, data_read_1, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900163 EXPECT_EQ(kTestDataSize - kPartialReadOffset, bytes_read);
164 for (int i = 0; i < bytes_read; i++)
165 EXPECT_EQ(data_to_write[i + kPartialReadOffset], data_read_1[i]);
166
167 // Read 0 bytes.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900168 bytes_read = file.Read(0, data_read_1, 0);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900169 EXPECT_EQ(0, bytes_read);
170
171 // Read the entire file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900172 bytes_read = file.Read(0, data_read_1, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900173 EXPECT_EQ(kTestDataSize, bytes_read);
174 for (int i = 0; i < bytes_read; i++)
175 EXPECT_EQ(data_to_write[i], data_read_1[i]);
176
177 // Read again, but using the trivial native wrapper.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900178 bytes_read = file.ReadNoBestEffort(0, data_read_1, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900179 EXPECT_LE(bytes_read, kTestDataSize);
180 for (int i = 0; i < bytes_read; i++)
181 EXPECT_EQ(data_to_write[i], data_read_1[i]);
182
183 // Write past the end of the file.
184 const int kOffsetBeyondEndOfFile = 10;
185 const int kPartialWriteLength = 2;
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900186 bytes_written = file.Write(kOffsetBeyondEndOfFile,
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900187 data_to_write, kPartialWriteLength);
188 EXPECT_EQ(kPartialWriteLength, bytes_written);
189
190 // Make sure the file was extended.
191 int64 file_size = 0;
brettw@chromium.org70684242013-12-05 03:22:49 +0900192 EXPECT_TRUE(GetFileSize(file_path, &file_size));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900193 EXPECT_EQ(kOffsetBeyondEndOfFile + kPartialWriteLength, file_size);
194
195 // Make sure the file was zero-padded.
196 char data_read_2[32];
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900197 bytes_read = file.Read(0, data_read_2, static_cast<int>(file_size));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900198 EXPECT_EQ(file_size, bytes_read);
199 for (int i = 0; i < kTestDataSize; i++)
200 EXPECT_EQ(data_to_write[i], data_read_2[i]);
201 for (int i = kTestDataSize; i < kOffsetBeyondEndOfFile; i++)
202 EXPECT_EQ(0, data_read_2[i]);
203 for (int i = kOffsetBeyondEndOfFile; i < file_size; i++)
204 EXPECT_EQ(data_to_write[i - kOffsetBeyondEndOfFile], data_read_2[i]);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900205}
206
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900207TEST(FileTest, Append) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900208 base::ScopedTempDir temp_dir;
209 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
210 FilePath file_path = temp_dir.path().AppendASCII("append_file");
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900211 File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_APPEND);
212 ASSERT_TRUE(file.IsValid());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900213
214 char data_to_write[] = "test";
215 const int kTestDataSize = 4;
216
217 // Write 0 bytes to the file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900218 int bytes_written = file.Write(0, data_to_write, 0);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900219 EXPECT_EQ(0, bytes_written);
220
221 // Write "test" to the file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900222 bytes_written = file.Write(0, data_to_write, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900223 EXPECT_EQ(kTestDataSize, bytes_written);
224
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900225 file.Close();
226 File file2(file_path,
227 base::File::FLAG_OPEN | base::File::FLAG_READ |
228 base::File::FLAG_APPEND);
229 ASSERT_TRUE(file2.IsValid());
230
231 // Test passing the file around.
232 file = file2.Pass();
233 EXPECT_FALSE(file2.IsValid());
234 ASSERT_TRUE(file.IsValid());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900235
236 char append_data_to_write[] = "78";
237 const int kAppendDataSize = 2;
238
239 // Append "78" to the file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900240 bytes_written = file.Write(0, append_data_to_write, kAppendDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900241 EXPECT_EQ(kAppendDataSize, bytes_written);
242
243 // Read the entire file.
244 char data_read_1[32];
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900245 int bytes_read = file.Read(0, data_read_1,
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900246 kTestDataSize + kAppendDataSize);
247 EXPECT_EQ(kTestDataSize + kAppendDataSize, bytes_read);
248 for (int i = 0; i < kTestDataSize; i++)
249 EXPECT_EQ(data_to_write[i], data_read_1[i]);
250 for (int i = 0; i < kAppendDataSize; i++)
251 EXPECT_EQ(append_data_to_write[i], data_read_1[kTestDataSize + i]);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900252}
253
254
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900255TEST(FileTest, Length) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900256 base::ScopedTempDir temp_dir;
257 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
258 FilePath file_path = temp_dir.path().AppendASCII("truncate_file");
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900259 File file(file_path,
260 base::File::FLAG_CREATE | base::File::FLAG_READ |
261 base::File::FLAG_WRITE);
262 ASSERT_TRUE(file.IsValid());
rvargas@chromium.orge207eae2014-01-04 07:14:15 +0900263 EXPECT_EQ(0, file.GetLength());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900264
265 // Write "test" to the file.
266 char data_to_write[] = "test";
267 int kTestDataSize = 4;
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900268 int bytes_written = file.Write(0, data_to_write, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900269 EXPECT_EQ(kTestDataSize, bytes_written);
270
271 // Extend the file.
272 const int kExtendedFileLength = 10;
273 int64 file_size = 0;
rvargas@chromium.orge207eae2014-01-04 07:14:15 +0900274 EXPECT_TRUE(file.SetLength(kExtendedFileLength));
275 EXPECT_EQ(kExtendedFileLength, file.GetLength());
brettw@chromium.org70684242013-12-05 03:22:49 +0900276 EXPECT_TRUE(GetFileSize(file_path, &file_size));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900277 EXPECT_EQ(kExtendedFileLength, file_size);
278
279 // Make sure the file was zero-padded.
280 char data_read[32];
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900281 int bytes_read = file.Read(0, data_read, static_cast<int>(file_size));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900282 EXPECT_EQ(file_size, bytes_read);
283 for (int i = 0; i < kTestDataSize; i++)
284 EXPECT_EQ(data_to_write[i], data_read[i]);
285 for (int i = kTestDataSize; i < file_size; i++)
286 EXPECT_EQ(0, data_read[i]);
287
288 // Truncate the file.
289 const int kTruncatedFileLength = 2;
rvargas@chromium.orge207eae2014-01-04 07:14:15 +0900290 EXPECT_TRUE(file.SetLength(kTruncatedFileLength));
291 EXPECT_EQ(kTruncatedFileLength, file.GetLength());
brettw@chromium.org70684242013-12-05 03:22:49 +0900292 EXPECT_TRUE(GetFileSize(file_path, &file_size));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900293 EXPECT_EQ(kTruncatedFileLength, file_size);
294
295 // Make sure the file was truncated.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900296 bytes_read = file.Read(0, data_read, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900297 EXPECT_EQ(file_size, bytes_read);
298 for (int i = 0; i < file_size; i++)
299 EXPECT_EQ(data_to_write[i], data_read[i]);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900300}
301
302// Flakily fails: http://crbug.com/86494
303#if defined(OS_ANDROID)
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900304TEST(FileTest, TouchGetInfo) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900305#else
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900306TEST(FileTest, DISABLED_TouchGetInfo) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900307#endif
308 base::ScopedTempDir temp_dir;
309 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900310 File file(temp_dir.path().AppendASCII("touch_get_info_file"),
311 base::File::FLAG_CREATE | base::File::FLAG_WRITE |
312 base::File::FLAG_WRITE_ATTRIBUTES);
313 ASSERT_TRUE(file.IsValid());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900314
315 // Get info for a newly created file.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900316 base::File::Info info;
317 EXPECT_TRUE(file.GetInfo(&info));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900318
319 // Add 2 seconds to account for possible rounding errors on
320 // filesystems that use a 1s or 2s timestamp granularity.
321 base::Time now = base::Time::Now() + base::TimeDelta::FromSeconds(2);
322 EXPECT_EQ(0, info.size);
323 EXPECT_FALSE(info.is_directory);
324 EXPECT_FALSE(info.is_symbolic_link);
325 EXPECT_LE(info.last_accessed.ToInternalValue(), now.ToInternalValue());
326 EXPECT_LE(info.last_modified.ToInternalValue(), now.ToInternalValue());
327 EXPECT_LE(info.creation_time.ToInternalValue(), now.ToInternalValue());
328 base::Time creation_time = info.creation_time;
329
330 // Write "test" to the file.
331 char data[] = "test";
332 const int kTestDataSize = 4;
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900333 int bytes_written = file.Write(0, data, kTestDataSize);
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900334 EXPECT_EQ(kTestDataSize, bytes_written);
335
336 // Change the last_accessed and last_modified dates.
337 // It's best to add values that are multiples of 2 (in seconds)
338 // to the current last_accessed and last_modified times, because
339 // FATxx uses a 2s timestamp granularity.
340 base::Time new_last_accessed =
341 info.last_accessed + base::TimeDelta::FromSeconds(234);
342 base::Time new_last_modified =
343 info.last_modified + base::TimeDelta::FromMinutes(567);
344
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900345 EXPECT_TRUE(file.SetTimes(new_last_accessed, new_last_modified));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900346
347 // Make sure the file info was updated accordingly.
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900348 EXPECT_TRUE(file.GetInfo(&info));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900349 EXPECT_EQ(info.size, kTestDataSize);
350 EXPECT_FALSE(info.is_directory);
351 EXPECT_FALSE(info.is_symbolic_link);
352
353 // ext2/ext3 and HPS/HPS+ seem to have a timestamp granularity of 1s.
354#if defined(OS_POSIX)
355 EXPECT_EQ(info.last_accessed.ToTimeVal().tv_sec,
356 new_last_accessed.ToTimeVal().tv_sec);
357 EXPECT_EQ(info.last_modified.ToTimeVal().tv_sec,
358 new_last_modified.ToTimeVal().tv_sec);
359#else
360 EXPECT_EQ(info.last_accessed.ToInternalValue(),
361 new_last_accessed.ToInternalValue());
362 EXPECT_EQ(info.last_modified.ToInternalValue(),
363 new_last_modified.ToInternalValue());
364#endif
365
366 EXPECT_EQ(info.creation_time.ToInternalValue(),
367 creation_time.ToInternalValue());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900368}
369
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900370TEST(FileTest, ReadAtCurrentPosition) {
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900371 base::ScopedTempDir temp_dir;
372 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
rvargas@chromium.orgcb69d092014-03-08 00:35:26 +0900373 FilePath file_path = temp_dir.path().AppendASCII("read_at_current_position");
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900374 File file(file_path,
375 base::File::FLAG_CREATE | base::File::FLAG_READ |
376 base::File::FLAG_WRITE);
377 EXPECT_TRUE(file.IsValid());
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900378
379 const char kData[] = "test";
rvargas@chromium.orgcb69d092014-03-08 00:35:26 +0900380 const int kDataSize = sizeof(kData) - 1;
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900381 EXPECT_EQ(kDataSize, file.Write(0, kData, kDataSize));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900382
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900383 EXPECT_EQ(0, file.Seek(base::File::FROM_BEGIN, 0));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900384
385 char buffer[kDataSize];
386 int first_chunk_size = kDataSize / 2;
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900387 EXPECT_EQ(first_chunk_size, file.ReadAtCurrentPos(buffer, first_chunk_size));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900388 EXPECT_EQ(kDataSize - first_chunk_size,
rvargas@chromium.org12938d72013-12-04 09:46:32 +0900389 file.ReadAtCurrentPos(buffer + first_chunk_size,
390 kDataSize - first_chunk_size));
rvargas@chromium.orgcb69d092014-03-08 00:35:26 +0900391 EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData));
392}
393
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900394TEST(FileTest, WriteAtCurrentPosition) {
rvargas@chromium.orgcb69d092014-03-08 00:35:26 +0900395 base::ScopedTempDir temp_dir;
396 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
397 FilePath file_path = temp_dir.path().AppendASCII("write_at_current_position");
398 File file(file_path,
399 base::File::FLAG_CREATE | base::File::FLAG_READ |
400 base::File::FLAG_WRITE);
401 EXPECT_TRUE(file.IsValid());
402
403 const char kData[] = "test";
404 const int kDataSize = sizeof(kData) - 1;
405
406 int first_chunk_size = kDataSize / 2;
407 EXPECT_EQ(first_chunk_size, file.WriteAtCurrentPos(kData, first_chunk_size));
408 EXPECT_EQ(kDataSize - first_chunk_size,
409 file.WriteAtCurrentPos(kData + first_chunk_size,
410 kDataSize - first_chunk_size));
411
412 char buffer[kDataSize];
413 EXPECT_EQ(kDataSize, file.Read(0, buffer, kDataSize));
414 EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData));
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900415}
rvargas@chromium.orgb005b382014-01-07 19:06:58 +0900416
417#if defined(OS_WIN)
rvargas@chromium.org799ba6c2014-03-21 09:41:15 +0900418TEST(FileTest, GetInfoForDirectory) {
rvargas@chromium.orgb005b382014-01-07 19:06:58 +0900419 base::ScopedTempDir temp_dir;
420 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
421 FilePath empty_dir = temp_dir.path().Append(FILE_PATH_LITERAL("gpfi_test"));
422 ASSERT_TRUE(CreateDirectory(empty_dir));
423
424 base::File dir(
425 ::CreateFile(empty_dir.value().c_str(),
426 FILE_ALL_ACCESS,
427 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
428 NULL,
429 OPEN_EXISTING,
430 FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
431 NULL));
432 ASSERT_TRUE(dir.IsValid());
433
434 base::File::Info info;
435 EXPECT_TRUE(dir.GetInfo(&info));
436 EXPECT_TRUE(info.is_directory);
437 EXPECT_FALSE(info.is_symbolic_link);
438 EXPECT_EQ(0, info.size);
439}
440#endif // defined(OS_WIN)