blob: f96d57f0f3ea9e0460b0db70a38f5b14f222d9f1 [file] [log] [blame]
[email protected]21da6eb2008-11-03 17:18:141// Copyright (c) 2008 The Chromium Authors. All rights reserved. Use of this
2// source code is governed by a BSD-style license that can be found in the
3// LICENSE file.
4
5#include "base/file_util.h"
6#include "base/path_service.h"
[email protected]92aad5222009-02-09 22:26:417#include "base/platform_file.h"
[email protected]21da6eb2008-11-03 17:18:148#include "net/base/file_stream.h"
9#include "net/base/net_errors.h"
10#include "net/base/test_completion_callback.h"
11#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1512#include "testing/platform_test.h"
[email protected]21da6eb2008-11-03 17:18:1413
14static const char kTestData[] = "0123456789";
15static const int kTestDataSize = arraysize(kTestData) - 1;
16
17class FileStreamTest : public PlatformTest {
18 public:
19 virtual void SetUp() {
20 PlatformTest::SetUp();
21
22 file_util::CreateTemporaryFileName(&temp_file_path_);
[email protected]07167e8f2009-01-26 21:38:1123 file_util::WriteFile(temp_file_path_.ToWStringHack(),
24 kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1425 }
26 virtual void TearDown() {
27 file_util::Delete(temp_file_path_, false);
28
29 PlatformTest::TearDown();
30 }
[email protected]07167e8f2009-01-26 21:38:1131 const FilePath temp_file_path() const { return temp_file_path_; }
[email protected]21da6eb2008-11-03 17:18:1432 private:
[email protected]07167e8f2009-01-26 21:38:1133 FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1434};
35
36TEST_F(FileStreamTest, BasicOpenClose) {
37 net::FileStream stream;
38 int rv = stream.Open(temp_file_path(),
39 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
40 EXPECT_EQ(net::OK, rv);
41}
42
[email protected]92aad5222009-02-09 22:26:4143// Test the use of FileStream with a file handle provided at construction.
44TEST_F(FileStreamTest, UseFileHandle) {
45 bool created = false;
46
47 // 1. Test reading with a file handle.
48 ASSERT_EQ(kTestDataSize,
49 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
50 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
51 base::PlatformFile file = base::CreatePlatformFile(
52 temp_file_path().ToWStringHack(), flags, &created);
53
54 // Seek to the beginning of the file and read.
55 net::FileStream read_stream(file, flags);
56 ASSERT_EQ(0, read_stream.Seek(net::FROM_BEGIN, 0));
57 ASSERT_EQ(kTestDataSize, read_stream.Available());
58 // Read into buffer and compare.
59 char buffer[kTestDataSize];
60 ASSERT_EQ(kTestDataSize, read_stream.Read(buffer, kTestDataSize, NULL));
61 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
62 read_stream.Close();
63
64 // 2. Test writing with a file handle.
65 file_util::Delete(temp_file_path(), false);
66 flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE;
67 file = base::CreatePlatformFile(temp_file_path().ToWStringHack(),
68 flags, &created);
69
70 net::FileStream write_stream(file, flags);
71 ASSERT_EQ(0, write_stream.Seek(net::FROM_BEGIN, 0));
72 ASSERT_EQ(kTestDataSize, write_stream.Write(kTestData, kTestDataSize, NULL));
73 write_stream.Close();
74
75 // Read into buffer and compare to make sure the handle worked fine.
76 ASSERT_EQ(kTestDataSize,
77 file_util::ReadFile(temp_file_path(), buffer, kTestDataSize));
78 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
79}
80
[email protected]21da6eb2008-11-03 17:18:1481TEST_F(FileStreamTest, UseClosedStream) {
82 net::FileStream stream;
83
84 EXPECT_FALSE(stream.IsOpen());
85
86 // Try seeking...
87 int64 new_offset = stream.Seek(net::FROM_BEGIN, 5);
88 EXPECT_EQ(net::ERR_UNEXPECTED, new_offset);
89
90 // Try available...
91 int64 avail = stream.Available();
92 EXPECT_EQ(net::ERR_UNEXPECTED, avail);
93
94 // Try reading...
95 char buf[10];
96 int rv = stream.Read(buf, sizeof(buf), NULL);
97 EXPECT_EQ(net::ERR_UNEXPECTED, rv);
98}
99
100TEST_F(FileStreamTest, BasicRead) {
101 int64 file_size;
102 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
103 EXPECT_TRUE(ok);
104
105 net::FileStream stream;
106 int flags = base::PLATFORM_FILE_OPEN |
107 base::PLATFORM_FILE_READ;
108 int rv = stream.Open(temp_file_path(), flags);
109 EXPECT_EQ(net::OK, rv);
110
111 int64 total_bytes_avail = stream.Available();
112 EXPECT_EQ(file_size, total_bytes_avail);
113
114 int64 total_bytes_read = 0;
115
116 std::string data_read;
117 for (;;) {
118 char buf[4];
119 rv = stream.Read(buf, sizeof(buf), NULL);
120 EXPECT_LE(0, rv);
121 if (rv <= 0)
122 break;
123 total_bytes_read += rv;
124 data_read.append(buf, rv);
125 }
126 EXPECT_EQ(file_size, total_bytes_read);
127 EXPECT_TRUE(data_read == kTestData);
128}
129
130TEST_F(FileStreamTest, AsyncRead) {
131 int64 file_size;
132 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
133 EXPECT_TRUE(ok);
134
135 net::FileStream stream;
136 int flags = base::PLATFORM_FILE_OPEN |
137 base::PLATFORM_FILE_READ |
138 base::PLATFORM_FILE_ASYNC;
139 int rv = stream.Open(temp_file_path(), flags);
140 EXPECT_EQ(net::OK, rv);
141
142 int64 total_bytes_avail = stream.Available();
143 EXPECT_EQ(file_size, total_bytes_avail);
144
145 TestCompletionCallback callback;
146
147 int64 total_bytes_read = 0;
148
149 std::string data_read;
150 for (;;) {
151 char buf[4];
152 rv = stream.Read(buf, sizeof(buf), &callback);
153 if (rv == net::ERR_IO_PENDING)
154 rv = callback.WaitForResult();
155 EXPECT_LE(0, rv);
156 if (rv <= 0)
157 break;
158 total_bytes_read += rv;
159 data_read.append(buf, rv);
160 }
161 EXPECT_EQ(file_size, total_bytes_read);
162 EXPECT_TRUE(data_read == kTestData);
163}
164
165TEST_F(FileStreamTest, BasicRead_FromOffset) {
166 int64 file_size;
167 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
168 EXPECT_TRUE(ok);
169
170 net::FileStream stream;
171 int flags = base::PLATFORM_FILE_OPEN |
172 base::PLATFORM_FILE_READ;
173 int rv = stream.Open(temp_file_path(), flags);
174 EXPECT_EQ(net::OK, rv);
175
176 const int64 kOffset = 3;
177 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
178 EXPECT_EQ(kOffset, new_offset);
179
180 int64 total_bytes_avail = stream.Available();
181 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
182
183 int64 total_bytes_read = 0;
184
185 std::string data_read;
186 for (;;) {
187 char buf[4];
188 rv = stream.Read(buf, sizeof(buf), NULL);
189 EXPECT_LE(0, rv);
190 if (rv <= 0)
191 break;
192 total_bytes_read += rv;
193 data_read.append(buf, rv);
194 }
195 EXPECT_EQ(file_size - kOffset, total_bytes_read);
196 EXPECT_TRUE(data_read == kTestData + kOffset);
197}
198
199TEST_F(FileStreamTest, AsyncRead_FromOffset) {
200 int64 file_size;
201 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
202 EXPECT_TRUE(ok);
203
204 net::FileStream stream;
205 int flags = base::PLATFORM_FILE_OPEN |
206 base::PLATFORM_FILE_READ |
207 base::PLATFORM_FILE_ASYNC;
208 int rv = stream.Open(temp_file_path(), flags);
209 EXPECT_EQ(net::OK, rv);
210
211 const int64 kOffset = 3;
212 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
213 EXPECT_EQ(kOffset, new_offset);
214
215 int64 total_bytes_avail = stream.Available();
216 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
217
218 TestCompletionCallback callback;
219
220 int64 total_bytes_read = 0;
221
222 std::string data_read;
223 for (;;) {
224 char buf[4];
225 rv = stream.Read(buf, sizeof(buf), &callback);
226 if (rv == net::ERR_IO_PENDING)
227 rv = callback.WaitForResult();
228 EXPECT_LE(0, rv);
229 if (rv <= 0)
230 break;
231 total_bytes_read += rv;
232 data_read.append(buf, rv);
233 }
234 EXPECT_EQ(file_size - kOffset, total_bytes_read);
235 EXPECT_TRUE(data_read == kTestData + kOffset);
236}
237
238TEST_F(FileStreamTest, SeekAround) {
239 net::FileStream stream;
240 int flags = base::PLATFORM_FILE_OPEN |
241 base::PLATFORM_FILE_READ;
242 int rv = stream.Open(temp_file_path(), flags);
243 EXPECT_EQ(net::OK, rv);
244
245 const int64 kOffset = 3;
246 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
247 EXPECT_EQ(kOffset, new_offset);
248
249 new_offset = stream.Seek(net::FROM_CURRENT, kOffset);
250 EXPECT_EQ(2 * kOffset, new_offset);
251
252 new_offset = stream.Seek(net::FROM_CURRENT, -kOffset);
253 EXPECT_EQ(kOffset, new_offset);
254
255 const int kTestDataLen = arraysize(kTestData) - 1;
256
257 new_offset = stream.Seek(net::FROM_END, -kTestDataLen);
258 EXPECT_EQ(0, new_offset);
259}
260
261TEST_F(FileStreamTest, BasicWrite) {
262 net::FileStream stream;
263 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
264 base::PLATFORM_FILE_WRITE;
265 int rv = stream.Open(temp_file_path(), flags);
266 EXPECT_EQ(net::OK, rv);
267
268 int64 file_size;
269 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
270 EXPECT_TRUE(ok);
271 EXPECT_EQ(0, file_size);
272
273 rv = stream.Write(kTestData, kTestDataSize, NULL);
274 EXPECT_EQ(kTestDataSize, rv);
275 stream.Close();
276
277 ok = file_util::GetFileSize(temp_file_path(), &file_size);
278 EXPECT_TRUE(ok);
279 EXPECT_EQ(kTestDataSize, file_size);
280}
281
282TEST_F(FileStreamTest, AsyncWrite) {
283 net::FileStream stream;
284 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
285 base::PLATFORM_FILE_WRITE |
286 base::PLATFORM_FILE_ASYNC;
287 int rv = stream.Open(temp_file_path(), flags);
288 EXPECT_EQ(net::OK, rv);
289
290 int64 file_size;
291 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
292 EXPECT_TRUE(ok);
293 EXPECT_EQ(0, file_size);
294
295 TestCompletionCallback callback;
296 int64 total_bytes_written = 0;
297
298 while (total_bytes_written != kTestDataSize) {
299 rv = stream.Write(kTestData, kTestDataSize, &callback);
300 if (rv == net::ERR_IO_PENDING)
301 rv = callback.WaitForResult();
302 EXPECT_LT(0, rv);
303 if (rv <= 0)
304 break;
305 total_bytes_written += rv;
306 }
307 ok = file_util::GetFileSize(temp_file_path(), &file_size);
308 EXPECT_TRUE(ok);
309 EXPECT_EQ(file_size, total_bytes_written);
310}
311
312TEST_F(FileStreamTest, BasicWrite_FromOffset) {
313 net::FileStream stream;
314 int flags = base::PLATFORM_FILE_OPEN |
315 base::PLATFORM_FILE_WRITE;
316 int rv = stream.Open(temp_file_path(), flags);
317 EXPECT_EQ(net::OK, rv);
318
319 int64 file_size;
320 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
321 EXPECT_TRUE(ok);
322 EXPECT_EQ(kTestDataSize, file_size);
323
324 const int64 kOffset = 0;
325 int64 new_offset = stream.Seek(net::FROM_END, kOffset);
326 EXPECT_EQ(kTestDataSize, new_offset);
327
328 rv = stream.Write(kTestData, kTestDataSize, NULL);
329 EXPECT_EQ(kTestDataSize, rv);
330 stream.Close();
331
332 ok = file_util::GetFileSize(temp_file_path(), &file_size);
333 EXPECT_TRUE(ok);
334 EXPECT_EQ(kTestDataSize * 2, file_size);
335}
336
337TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
338 int64 file_size;
339 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
340 EXPECT_TRUE(ok);
341
342 net::FileStream stream;
343 int flags = base::PLATFORM_FILE_OPEN |
344 base::PLATFORM_FILE_WRITE |
345 base::PLATFORM_FILE_ASYNC;
346 int rv = stream.Open(temp_file_path(), flags);
347 EXPECT_EQ(net::OK, rv);
348
349 const int64 kOffset = 0;
350 int64 new_offset = stream.Seek(net::FROM_END, kOffset);
351 EXPECT_EQ(kTestDataSize, new_offset);
352
353 TestCompletionCallback callback;
354 int64 total_bytes_written = 0;
355
356 while (total_bytes_written != kTestDataSize) {
357 rv = stream.Write(kTestData, kTestDataSize, &callback);
358 if (rv == net::ERR_IO_PENDING)
359 rv = callback.WaitForResult();
360 EXPECT_LT(0, rv);
361 if (rv <= 0)
362 break;
363 total_bytes_written += rv;
364 }
365 ok = file_util::GetFileSize(temp_file_path(), &file_size);
366 EXPECT_TRUE(ok);
367 EXPECT_EQ(file_size, kTestDataSize * 2);
368}
369
370TEST_F(FileStreamTest, BasicReadWrite) {
371 int64 file_size;
372 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
373 EXPECT_TRUE(ok);
374
375 net::FileStream stream;
376 int flags = base::PLATFORM_FILE_OPEN |
377 base::PLATFORM_FILE_READ |
378 base::PLATFORM_FILE_WRITE;
379 int rv = stream.Open(temp_file_path(), flags);
380 EXPECT_EQ(net::OK, rv);
381
382 int64 total_bytes_avail = stream.Available();
383 EXPECT_EQ(file_size, total_bytes_avail);
384
385 int64 total_bytes_read = 0;
386
387 std::string data_read;
388 for (;;) {
389 char buf[4];
390 rv = stream.Read(buf, sizeof(buf), NULL);
391 EXPECT_LE(0, rv);
392 if (rv <= 0)
393 break;
394 total_bytes_read += rv;
395 data_read.append(buf, rv);
396 }
397 EXPECT_EQ(file_size, total_bytes_read);
398 EXPECT_TRUE(data_read == kTestData);
399
400 rv = stream.Write(kTestData, kTestDataSize, NULL);
401 EXPECT_EQ(kTestDataSize, rv);
402 stream.Close();
403
404 ok = file_util::GetFileSize(temp_file_path(), &file_size);
405 EXPECT_TRUE(ok);
406 EXPECT_EQ(kTestDataSize * 2, file_size);
407}
408
409// TODO(erikkay): more READ_WRITE tests?