blob: 4b8b12bcb098127f77c2dbe0145a9fb21b068089 [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
[email protected]4c2048a2009-03-24 21:02:0114namespace {
15
16const char kTestData[] = "0123456789";
17const int kTestDataSize = arraysize(kTestData) - 1;
[email protected]21da6eb2008-11-03 17:18:1418
19class FileStreamTest : public PlatformTest {
20 public:
21 virtual void SetUp() {
22 PlatformTest::SetUp();
23
24 file_util::CreateTemporaryFileName(&temp_file_path_);
[email protected]07167e8f2009-01-26 21:38:1125 file_util::WriteFile(temp_file_path_.ToWStringHack(),
26 kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1427 }
28 virtual void TearDown() {
29 file_util::Delete(temp_file_path_, false);
30
31 PlatformTest::TearDown();
32 }
[email protected]07167e8f2009-01-26 21:38:1133 const FilePath temp_file_path() const { return temp_file_path_; }
[email protected]21da6eb2008-11-03 17:18:1434 private:
[email protected]07167e8f2009-01-26 21:38:1135 FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1436};
37
38TEST_F(FileStreamTest, BasicOpenClose) {
39 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:3840 int rv = stream.Open(temp_file_path(),
[email protected]21da6eb2008-11-03 17:18:1441 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
42 EXPECT_EQ(net::OK, rv);
43}
44
[email protected]92aad5222009-02-09 22:26:4145// Test the use of FileStream with a file handle provided at construction.
46TEST_F(FileStreamTest, UseFileHandle) {
47 bool created = false;
48
49 // 1. Test reading with a file handle.
50 ASSERT_EQ(kTestDataSize,
51 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
52 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
53 base::PlatformFile file = base::CreatePlatformFile(
54 temp_file_path().ToWStringHack(), flags, &created);
55
56 // Seek to the beginning of the file and read.
57 net::FileStream read_stream(file, flags);
58 ASSERT_EQ(0, read_stream.Seek(net::FROM_BEGIN, 0));
59 ASSERT_EQ(kTestDataSize, read_stream.Available());
60 // Read into buffer and compare.
61 char buffer[kTestDataSize];
62 ASSERT_EQ(kTestDataSize, read_stream.Read(buffer, kTestDataSize, NULL));
63 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
64 read_stream.Close();
65
66 // 2. Test writing with a file handle.
67 file_util::Delete(temp_file_path(), false);
68 flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE;
69 file = base::CreatePlatformFile(temp_file_path().ToWStringHack(),
70 flags, &created);
71
72 net::FileStream write_stream(file, flags);
73 ASSERT_EQ(0, write_stream.Seek(net::FROM_BEGIN, 0));
74 ASSERT_EQ(kTestDataSize, write_stream.Write(kTestData, kTestDataSize, NULL));
75 write_stream.Close();
76
77 // Read into buffer and compare to make sure the handle worked fine.
78 ASSERT_EQ(kTestDataSize,
79 file_util::ReadFile(temp_file_path(), buffer, kTestDataSize));
80 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
81}
82
[email protected]21da6eb2008-11-03 17:18:1483TEST_F(FileStreamTest, UseClosedStream) {
84 net::FileStream stream;
85
86 EXPECT_FALSE(stream.IsOpen());
87
88 // Try seeking...
89 int64 new_offset = stream.Seek(net::FROM_BEGIN, 5);
90 EXPECT_EQ(net::ERR_UNEXPECTED, new_offset);
91
92 // Try available...
93 int64 avail = stream.Available();
94 EXPECT_EQ(net::ERR_UNEXPECTED, avail);
95
96 // Try reading...
97 char buf[10];
[email protected]4c2048a2009-03-24 21:02:0198 int rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:1499 EXPECT_EQ(net::ERR_UNEXPECTED, rv);
100}
101
102TEST_F(FileStreamTest, BasicRead) {
103 int64 file_size;
104 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
105 EXPECT_TRUE(ok);
106
107 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38108 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14109 base::PLATFORM_FILE_READ;
110 int rv = stream.Open(temp_file_path(), flags);
111 EXPECT_EQ(net::OK, rv);
112
113 int64 total_bytes_avail = stream.Available();
114 EXPECT_EQ(file_size, total_bytes_avail);
115
[email protected]4c2048a2009-03-24 21:02:01116 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14117
118 std::string data_read;
119 for (;;) {
120 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01121 rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:14122 EXPECT_LE(0, rv);
123 if (rv <= 0)
124 break;
125 total_bytes_read += rv;
126 data_read.append(buf, rv);
127 }
128 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01129 EXPECT_EQ(kTestData, data_read);
[email protected]21da6eb2008-11-03 17:18:14130}
131
132TEST_F(FileStreamTest, AsyncRead) {
133 int64 file_size;
134 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
135 EXPECT_TRUE(ok);
136
137 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38138 int flags = base::PLATFORM_FILE_OPEN |
139 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14140 base::PLATFORM_FILE_ASYNC;
141 int rv = stream.Open(temp_file_path(), flags);
142 EXPECT_EQ(net::OK, rv);
143
144 int64 total_bytes_avail = stream.Available();
145 EXPECT_EQ(file_size, total_bytes_avail);
146
147 TestCompletionCallback callback;
148
[email protected]4c2048a2009-03-24 21:02:01149 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14150
151 std::string data_read;
152 for (;;) {
153 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01154 rv = stream.Read(buf, arraysize(buf), &callback);
[email protected]21da6eb2008-11-03 17:18:14155 if (rv == net::ERR_IO_PENDING)
156 rv = callback.WaitForResult();
157 EXPECT_LE(0, rv);
158 if (rv <= 0)
159 break;
160 total_bytes_read += rv;
161 data_read.append(buf, rv);
162 }
163 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01164 EXPECT_EQ(kTestData, data_read);
165}
166
167TEST_F(FileStreamTest, AsyncRead_EarlyClose) {
168 int64 file_size;
169 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
170 EXPECT_TRUE(ok);
171
172 net::FileStream stream;
173 int flags = base::PLATFORM_FILE_OPEN |
174 base::PLATFORM_FILE_READ |
175 base::PLATFORM_FILE_ASYNC;
176 int rv = stream.Open(temp_file_path(), flags);
177 EXPECT_EQ(net::OK, rv);
178
179 int64 total_bytes_avail = stream.Available();
180 EXPECT_EQ(file_size, total_bytes_avail);
181
182 TestCompletionCallback callback;
183
184 char buf[4];
185 rv = stream.Read(buf, arraysize(buf), &callback);
186 stream.Close();
[email protected]3828a752009-06-03 23:05:59187 if (rv < 0) {
188 EXPECT_EQ(net::ERR_IO_PENDING, rv);
189 // The callback should not be called if the request is cancelled.
190 MessageLoop::current()->RunAllPending();
191 EXPECT_FALSE(callback.have_result());
192 } else {
193 EXPECT_EQ(std::string(kTestData, rv), std::string(buf, rv));
194 }
[email protected]21da6eb2008-11-03 17:18:14195}
196
197TEST_F(FileStreamTest, BasicRead_FromOffset) {
198 int64 file_size;
199 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
200 EXPECT_TRUE(ok);
201
202 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38203 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14204 base::PLATFORM_FILE_READ;
205 int rv = stream.Open(temp_file_path(), flags);
206 EXPECT_EQ(net::OK, rv);
207
208 const int64 kOffset = 3;
209 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
210 EXPECT_EQ(kOffset, new_offset);
211
212 int64 total_bytes_avail = stream.Available();
213 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
214
215 int64 total_bytes_read = 0;
216
217 std::string data_read;
218 for (;;) {
219 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01220 rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:14221 EXPECT_LE(0, rv);
222 if (rv <= 0)
223 break;
224 total_bytes_read += rv;
225 data_read.append(buf, rv);
226 }
227 EXPECT_EQ(file_size - kOffset, total_bytes_read);
228 EXPECT_TRUE(data_read == kTestData + kOffset);
[email protected]4c2048a2009-03-24 21:02:01229 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14230}
231
232TEST_F(FileStreamTest, AsyncRead_FromOffset) {
233 int64 file_size;
234 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
235 EXPECT_TRUE(ok);
236
237 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38238 int flags = base::PLATFORM_FILE_OPEN |
239 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14240 base::PLATFORM_FILE_ASYNC;
241 int rv = stream.Open(temp_file_path(), flags);
242 EXPECT_EQ(net::OK, rv);
243
244 const int64 kOffset = 3;
245 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
246 EXPECT_EQ(kOffset, new_offset);
247
248 int64 total_bytes_avail = stream.Available();
249 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
250
251 TestCompletionCallback callback;
252
[email protected]4c2048a2009-03-24 21:02:01253 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14254
255 std::string data_read;
256 for (;;) {
257 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01258 rv = stream.Read(buf, arraysize(buf), &callback);
[email protected]21da6eb2008-11-03 17:18:14259 if (rv == net::ERR_IO_PENDING)
260 rv = callback.WaitForResult();
261 EXPECT_LE(0, rv);
262 if (rv <= 0)
263 break;
264 total_bytes_read += rv;
265 data_read.append(buf, rv);
266 }
267 EXPECT_EQ(file_size - kOffset, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01268 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14269}
270
271TEST_F(FileStreamTest, SeekAround) {
272 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38273 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14274 base::PLATFORM_FILE_READ;
275 int rv = stream.Open(temp_file_path(), flags);
276 EXPECT_EQ(net::OK, rv);
277
278 const int64 kOffset = 3;
279 int64 new_offset = stream.Seek(net::FROM_BEGIN, kOffset);
280 EXPECT_EQ(kOffset, new_offset);
281
282 new_offset = stream.Seek(net::FROM_CURRENT, kOffset);
283 EXPECT_EQ(2 * kOffset, new_offset);
284
285 new_offset = stream.Seek(net::FROM_CURRENT, -kOffset);
286 EXPECT_EQ(kOffset, new_offset);
287
288 const int kTestDataLen = arraysize(kTestData) - 1;
289
290 new_offset = stream.Seek(net::FROM_END, -kTestDataLen);
291 EXPECT_EQ(0, new_offset);
292}
293
294TEST_F(FileStreamTest, BasicWrite) {
295 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38296 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
[email protected]21da6eb2008-11-03 17:18:14297 base::PLATFORM_FILE_WRITE;
298 int rv = stream.Open(temp_file_path(), flags);
299 EXPECT_EQ(net::OK, rv);
300
301 int64 file_size;
302 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
303 EXPECT_TRUE(ok);
304 EXPECT_EQ(0, file_size);
305
306 rv = stream.Write(kTestData, kTestDataSize, NULL);
307 EXPECT_EQ(kTestDataSize, rv);
308 stream.Close();
309
310 ok = file_util::GetFileSize(temp_file_path(), &file_size);
311 EXPECT_TRUE(ok);
312 EXPECT_EQ(kTestDataSize, file_size);
313}
314
315TEST_F(FileStreamTest, AsyncWrite) {
316 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38317 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
318 base::PLATFORM_FILE_WRITE |
[email protected]21da6eb2008-11-03 17:18:14319 base::PLATFORM_FILE_ASYNC;
320 int rv = stream.Open(temp_file_path(), flags);
321 EXPECT_EQ(net::OK, rv);
322
323 int64 file_size;
324 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
325 EXPECT_TRUE(ok);
326 EXPECT_EQ(0, file_size);
327
328 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01329 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14330
331 while (total_bytes_written != kTestDataSize) {
[email protected]4c2048a2009-03-24 21:02:01332 rv = stream.Write(kTestData + total_bytes_written,
333 kTestDataSize - total_bytes_written,
334 &callback);
[email protected]21da6eb2008-11-03 17:18:14335 if (rv == net::ERR_IO_PENDING)
336 rv = callback.WaitForResult();
337 EXPECT_LT(0, rv);
338 if (rv <= 0)
339 break;
340 total_bytes_written += rv;
341 }
342 ok = file_util::GetFileSize(temp_file_path(), &file_size);
343 EXPECT_TRUE(ok);
344 EXPECT_EQ(file_size, total_bytes_written);
345}
346
[email protected]4c2048a2009-03-24 21:02:01347TEST_F(FileStreamTest, AsyncWrite_EarlyClose) {
348 net::FileStream stream;
349 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
350 base::PLATFORM_FILE_WRITE |
351 base::PLATFORM_FILE_ASYNC;
352 int rv = stream.Open(temp_file_path(), flags);
353 EXPECT_EQ(net::OK, rv);
354
355 int64 file_size;
356 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
357 EXPECT_TRUE(ok);
358 EXPECT_EQ(0, file_size);
359
360 TestCompletionCallback callback;
361 int total_bytes_written = 0;
362
363 rv = stream.Write(kTestData + total_bytes_written,
364 kTestDataSize - total_bytes_written,
365 &callback);
366 stream.Close();
[email protected]3828a752009-06-03 23:05:59367 if (rv < 0) {
368 EXPECT_EQ(net::ERR_IO_PENDING, rv);
369 // The callback should not be called if the request is cancelled.
370 MessageLoop::current()->RunAllPending();
371 EXPECT_FALSE(callback.have_result());
372 } else {
373 ok = file_util::GetFileSize(temp_file_path(), &file_size);
374 EXPECT_TRUE(ok);
375 EXPECT_EQ(file_size, rv);
376 }
[email protected]4c2048a2009-03-24 21:02:01377}
378
[email protected]21da6eb2008-11-03 17:18:14379TEST_F(FileStreamTest, BasicWrite_FromOffset) {
380 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38381 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14382 base::PLATFORM_FILE_WRITE;
383 int rv = stream.Open(temp_file_path(), flags);
384 EXPECT_EQ(net::OK, rv);
385
386 int64 file_size;
387 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
388 EXPECT_TRUE(ok);
389 EXPECT_EQ(kTestDataSize, file_size);
390
391 const int64 kOffset = 0;
392 int64 new_offset = stream.Seek(net::FROM_END, kOffset);
393 EXPECT_EQ(kTestDataSize, new_offset);
394
395 rv = stream.Write(kTestData, kTestDataSize, NULL);
396 EXPECT_EQ(kTestDataSize, rv);
397 stream.Close();
398
399 ok = file_util::GetFileSize(temp_file_path(), &file_size);
400 EXPECT_TRUE(ok);
401 EXPECT_EQ(kTestDataSize * 2, file_size);
402}
403
404TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
405 int64 file_size;
406 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
407 EXPECT_TRUE(ok);
408
409 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38410 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14411 base::PLATFORM_FILE_WRITE |
412 base::PLATFORM_FILE_ASYNC;
413 int rv = stream.Open(temp_file_path(), flags);
414 EXPECT_EQ(net::OK, rv);
415
416 const int64 kOffset = 0;
417 int64 new_offset = stream.Seek(net::FROM_END, kOffset);
418 EXPECT_EQ(kTestDataSize, new_offset);
419
420 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01421 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14422
423 while (total_bytes_written != kTestDataSize) {
[email protected]4c2048a2009-03-24 21:02:01424 rv = stream.Write(kTestData + total_bytes_written,
425 kTestDataSize - total_bytes_written,
426 &callback);
[email protected]21da6eb2008-11-03 17:18:14427 if (rv == net::ERR_IO_PENDING)
428 rv = callback.WaitForResult();
429 EXPECT_LT(0, rv);
430 if (rv <= 0)
431 break;
432 total_bytes_written += rv;
433 }
434 ok = file_util::GetFileSize(temp_file_path(), &file_size);
435 EXPECT_TRUE(ok);
436 EXPECT_EQ(file_size, kTestDataSize * 2);
437}
438
439TEST_F(FileStreamTest, BasicReadWrite) {
440 int64 file_size;
441 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
442 EXPECT_TRUE(ok);
443
444 net::FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38445 int flags = base::PLATFORM_FILE_OPEN |
446 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14447 base::PLATFORM_FILE_WRITE;
448 int rv = stream.Open(temp_file_path(), flags);
449 EXPECT_EQ(net::OK, rv);
450
451 int64 total_bytes_avail = stream.Available();
452 EXPECT_EQ(file_size, total_bytes_avail);
453
[email protected]4c2048a2009-03-24 21:02:01454 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14455
456 std::string data_read;
457 for (;;) {
458 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01459 rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:14460 EXPECT_LE(0, rv);
461 if (rv <= 0)
462 break;
463 total_bytes_read += rv;
464 data_read.append(buf, rv);
465 }
466 EXPECT_EQ(file_size, total_bytes_read);
467 EXPECT_TRUE(data_read == kTestData);
468
469 rv = stream.Write(kTestData, kTestDataSize, NULL);
470 EXPECT_EQ(kTestDataSize, rv);
471 stream.Close();
472
473 ok = file_util::GetFileSize(temp_file_path(), &file_size);
474 EXPECT_TRUE(ok);
475 EXPECT_EQ(kTestDataSize * 2, file_size);
476}
477
[email protected]4c2048a2009-03-24 21:02:01478TEST_F(FileStreamTest, BasicWriteRead) {
479 int64 file_size;
480 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
481 EXPECT_TRUE(ok);
482
483 net::FileStream stream;
484 int flags = base::PLATFORM_FILE_OPEN |
485 base::PLATFORM_FILE_READ |
486 base::PLATFORM_FILE_WRITE;
487 int rv = stream.Open(temp_file_path(), flags);
488 EXPECT_EQ(net::OK, rv);
489
490 int64 total_bytes_avail = stream.Available();
491 EXPECT_EQ(file_size, total_bytes_avail);
492
493 int64 offset = stream.Seek(net::FROM_END, 0);
494 EXPECT_EQ(offset, file_size);
495
496 rv = stream.Write(kTestData, kTestDataSize, NULL);
497 EXPECT_EQ(kTestDataSize, rv);
498
499 offset = stream.Seek(net::FROM_BEGIN, 0);
500 EXPECT_EQ(0, offset);
501
502 int64 total_bytes_read = 0;
503
504 std::string data_read;
505 for (;;) {
506 char buf[4];
507 rv = stream.Read(buf, arraysize(buf), NULL);
508 EXPECT_LE(0, rv);
509 if (rv <= 0)
510 break;
511 total_bytes_read += rv;
512 data_read.append(buf, rv);
513 }
514 stream.Close();
515
516 ok = file_util::GetFileSize(temp_file_path(), &file_size);
517 EXPECT_TRUE(ok);
518 EXPECT_EQ(kTestDataSize * 2, file_size);
519 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
520
521 const std::string kExpectedFileData =
522 std::string(kTestData) + std::string(kTestData);
523 EXPECT_EQ(kExpectedFileData, data_read);
524}
525
526TEST_F(FileStreamTest, BasicAsyncReadWrite) {
527 int64 file_size;
528 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
529 EXPECT_TRUE(ok);
530
531 net::FileStream stream;
532 int flags = base::PLATFORM_FILE_OPEN |
533 base::PLATFORM_FILE_READ |
534 base::PLATFORM_FILE_WRITE |
535 base::PLATFORM_FILE_ASYNC;
536 int rv = stream.Open(temp_file_path(), flags);
537 EXPECT_EQ(net::OK, rv);
538
539 int64 total_bytes_avail = stream.Available();
540 EXPECT_EQ(file_size, total_bytes_avail);
541
542 TestCompletionCallback callback;
543 int64 total_bytes_read = 0;
544
545 std::string data_read;
546 for (;;) {
547 char buf[4];
548 rv = stream.Read(buf, arraysize(buf), &callback);
549 if (rv == net::ERR_IO_PENDING)
550 rv = callback.WaitForResult();
551 EXPECT_LE(0, rv);
552 if (rv <= 0)
553 break;
554 total_bytes_read += rv;
555 data_read.append(buf, rv);
556 }
557 EXPECT_EQ(file_size, total_bytes_read);
558 EXPECT_TRUE(data_read == kTestData);
559
560 int total_bytes_written = 0;
561
562 while (total_bytes_written != kTestDataSize) {
563 rv = stream.Write(kTestData + total_bytes_written,
564 kTestDataSize - total_bytes_written,
565 &callback);
566 if (rv == net::ERR_IO_PENDING)
567 rv = callback.WaitForResult();
568 EXPECT_LT(0, rv);
569 if (rv <= 0)
570 break;
571 total_bytes_written += rv;
572 }
573
574 stream.Close();
575
576 ok = file_util::GetFileSize(temp_file_path(), &file_size);
577 EXPECT_TRUE(ok);
578 EXPECT_EQ(kTestDataSize * 2, file_size);
579}
580
581TEST_F(FileStreamTest, BasicAsyncWriteRead) {
582 int64 file_size;
583 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
584 EXPECT_TRUE(ok);
585
586 net::FileStream stream;
587 int flags = base::PLATFORM_FILE_OPEN |
588 base::PLATFORM_FILE_READ |
589 base::PLATFORM_FILE_WRITE |
590 base::PLATFORM_FILE_ASYNC;
591 int rv = stream.Open(temp_file_path(), flags);
592 EXPECT_EQ(net::OK, rv);
593
594 int64 total_bytes_avail = stream.Available();
595 EXPECT_EQ(file_size, total_bytes_avail);
596
597 int64 offset = stream.Seek(net::FROM_END, 0);
598 EXPECT_EQ(offset, file_size);
599
600 TestCompletionCallback callback;
601 int total_bytes_written = 0;
602
603 while (total_bytes_written != kTestDataSize) {
604 rv = stream.Write(kTestData + total_bytes_written,
605 kTestDataSize - total_bytes_written,
606 &callback);
607 if (rv == net::ERR_IO_PENDING)
608 rv = callback.WaitForResult();
609 EXPECT_LT(0, rv);
610 if (rv <= 0)
611 break;
612 total_bytes_written += rv;
613 }
614
615 EXPECT_EQ(kTestDataSize, total_bytes_written);
616
617 offset = stream.Seek(net::FROM_BEGIN, 0);
618 EXPECT_EQ(0, offset);
619
620 int total_bytes_read = 0;
621
622 std::string data_read;
623 for (;;) {
624 char buf[4];
625 rv = stream.Read(buf, arraysize(buf), &callback);
626 if (rv == net::ERR_IO_PENDING)
627 rv = callback.WaitForResult();
628 EXPECT_LE(0, rv);
629 if (rv <= 0)
630 break;
631 total_bytes_read += rv;
632 data_read.append(buf, rv);
633 }
634 stream.Close();
635
636 ok = file_util::GetFileSize(temp_file_path(), &file_size);
637 EXPECT_TRUE(ok);
638 EXPECT_EQ(kTestDataSize * 2, file_size);
639
640 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
641 const std::string kExpectedFileData =
642 std::string(kTestData) + std::string(kTestData);
643 EXPECT_EQ(kExpectedFileData, data_read);
644}
645
646class TestWriteReadCompletionCallback : public Callback1<int>::Type {
647 public:
648 explicit TestWriteReadCompletionCallback(
649 net::FileStream* stream,
650 int* total_bytes_written,
651 int* total_bytes_read,
652 std::string* data_read)
653 : result_(0),
654 have_result_(false),
655 waiting_for_result_(false),
656 stream_(stream),
657 total_bytes_written_(total_bytes_written),
658 total_bytes_read_(total_bytes_read),
659 data_read_(data_read) {}
660
661 int WaitForResult() {
662 DCHECK(!waiting_for_result_);
663 while (!have_result_) {
664 waiting_for_result_ = true;
665 MessageLoop::current()->Run();
666 waiting_for_result_ = false;
667 }
668 have_result_ = false; // auto-reset for next callback
669 return result_;
670 }
671
672 private:
673 virtual void RunWithParams(const Tuple1<int>& params) {
674 DCHECK_LT(0, params.a);
675 *total_bytes_written_ += params.a;
676
677 int rv;
678
679 if (*total_bytes_written_ != kTestDataSize) {
680 // Recurse to finish writing all data.
681 int total_bytes_written = 0, total_bytes_read = 0;
682 std::string data_read;
683 TestWriteReadCompletionCallback callback(
684 stream_, &total_bytes_written, &total_bytes_read, &data_read);
685 rv = stream_->Write(kTestData + *total_bytes_written_,
686 kTestDataSize - *total_bytes_written_,
687 &callback);
688 DCHECK_EQ(net::ERR_IO_PENDING, rv);
689 rv = callback.WaitForResult();
690 *total_bytes_written_ += total_bytes_written;
691 *total_bytes_read_ += total_bytes_read;
692 *data_read_ += data_read;
693 } else { // We're done writing all data. Start reading the data.
694 stream_->Seek(net::FROM_BEGIN, 0);
695
696 TestCompletionCallback callback;
697 for (;;) {
698 char buf[4];
699 rv = stream_->Read(buf, arraysize(buf), &callback);
700 if (rv == net::ERR_IO_PENDING) {
701 bool old_state = MessageLoop::current()->NestableTasksAllowed();
702 MessageLoop::current()->SetNestableTasksAllowed(true);
703 rv = callback.WaitForResult();
704 MessageLoop::current()->SetNestableTasksAllowed(old_state);
705 }
706 EXPECT_LE(0, rv);
707 if (rv <= 0)
708 break;
709 *total_bytes_read_ += rv;
710 data_read_->append(buf, rv);
711 }
712 }
713
714 result_ = *total_bytes_written_;
715 have_result_ = true;
716 if (waiting_for_result_)
717 MessageLoop::current()->Quit();
718 }
719
720 int result_;
721 bool have_result_;
722 bool waiting_for_result_;
723 net::FileStream* stream_;
724 int* total_bytes_written_;
725 int* total_bytes_read_;
726 std::string* data_read_;
727
728 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback);
729};
730
731TEST_F(FileStreamTest, AsyncWriteRead) {
732 int64 file_size;
733 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
734 EXPECT_TRUE(ok);
735
736 net::FileStream stream;
737 int flags = base::PLATFORM_FILE_OPEN |
738 base::PLATFORM_FILE_READ |
739 base::PLATFORM_FILE_WRITE |
740 base::PLATFORM_FILE_ASYNC;
741 int rv = stream.Open(temp_file_path(), flags);
742 EXPECT_EQ(net::OK, rv);
743
744 int64 total_bytes_avail = stream.Available();
745 EXPECT_EQ(file_size, total_bytes_avail);
746
747 int64 offset = stream.Seek(net::FROM_END, 0);
748 EXPECT_EQ(offset, file_size);
749
750 int total_bytes_written = 0;
751 int total_bytes_read = 0;
752 std::string data_read;
753 TestWriteReadCompletionCallback callback(&stream, &total_bytes_written,
754 &total_bytes_read, &data_read);
755
756 rv = stream.Write(kTestData + total_bytes_written,
757 kTestDataSize - static_cast<int>(total_bytes_written),
758 &callback);
759 if (rv == net::ERR_IO_PENDING)
760 rv = callback.WaitForResult();
761 EXPECT_LT(0, rv);
762 EXPECT_EQ(kTestDataSize, total_bytes_written);
763
764 stream.Close();
765
766 ok = file_util::GetFileSize(temp_file_path(), &file_size);
767 EXPECT_TRUE(ok);
768 EXPECT_EQ(kTestDataSize * 2, file_size);
769
770 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
771 const std::string kExpectedFileData =
772 std::string(kTestData) + std::string(kTestData);
773 EXPECT_EQ(kExpectedFileData, data_read);
774}
775
776class TestWriteCloseCompletionCallback : public Callback1<int>::Type {
777 public:
778 explicit TestWriteCloseCompletionCallback(net::FileStream* stream,
779 int* total_bytes_written)
780 : result_(0),
781 have_result_(false),
782 waiting_for_result_(false),
783 stream_(stream),
784 total_bytes_written_(total_bytes_written) {}
785
786 int WaitForResult() {
787 DCHECK(!waiting_for_result_);
788 while (!have_result_) {
789 waiting_for_result_ = true;
790 MessageLoop::current()->Run();
791 waiting_for_result_ = false;
792 }
793 have_result_ = false; // auto-reset for next callback
794 return result_;
795 }
796
797 private:
798 virtual void RunWithParams(const Tuple1<int>& params) {
799 DCHECK_LT(0, params.a);
800 *total_bytes_written_ += params.a;
801
802 int rv;
803
804 if (*total_bytes_written_ != kTestDataSize) {
805 // Recurse to finish writing all data.
806 int total_bytes_written = 0;
807 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written);
808 rv = stream_->Write(kTestData + *total_bytes_written_,
809 kTestDataSize - *total_bytes_written_,
810 &callback);
811 DCHECK_EQ(net::ERR_IO_PENDING, rv);
812 rv = callback.WaitForResult();
813 *total_bytes_written_ += total_bytes_written;
814 } else { // We're done writing all data. Close the file.
815 stream_->Close();
816 }
817
818 result_ = *total_bytes_written_;
819 have_result_ = true;
820 if (waiting_for_result_)
821 MessageLoop::current()->Quit();
822 }
823
824 int result_;
825 bool have_result_;
826 bool waiting_for_result_;
827 net::FileStream* stream_;
828 int* total_bytes_written_;
829
830 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback);
831};
832
833TEST_F(FileStreamTest, AsyncWriteClose) {
834 int64 file_size;
835 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
836 EXPECT_TRUE(ok);
837
838 net::FileStream stream;
839 int flags = base::PLATFORM_FILE_OPEN |
840 base::PLATFORM_FILE_READ |
841 base::PLATFORM_FILE_WRITE |
842 base::PLATFORM_FILE_ASYNC;
843 int rv = stream.Open(temp_file_path(), flags);
844 EXPECT_EQ(net::OK, rv);
845
846 int64 total_bytes_avail = stream.Available();
847 EXPECT_EQ(file_size, total_bytes_avail);
848
849 int64 offset = stream.Seek(net::FROM_END, 0);
850 EXPECT_EQ(offset, file_size);
851
852 int total_bytes_written = 0;
853 TestWriteCloseCompletionCallback callback(&stream, &total_bytes_written);
854
855 rv = stream.Write(kTestData, kTestDataSize, &callback);
856 if (rv == net::ERR_IO_PENDING)
857 total_bytes_written = callback.WaitForResult();
858 EXPECT_LT(0, total_bytes_written);
859 EXPECT_EQ(kTestDataSize, total_bytes_written);
860
861 ok = file_util::GetFileSize(temp_file_path(), &file_size);
862 EXPECT_TRUE(ok);
863 EXPECT_EQ(kTestDataSize * 2, file_size);
864}
865
[email protected]0643a492009-03-09 15:49:20866// Tests truncating a file.
867TEST_F(FileStreamTest, Truncate) {
868 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_WRITE;
869
870 net::FileStream write_stream;
871 ASSERT_EQ(net::OK, write_stream.Open(temp_file_path(), flags));
872
873 // Write some data to the file.
874 const char test_data[] = "0123456789";
875 write_stream.Write(test_data, arraysize(test_data), NULL);
876
877 // Truncate the file.
878 ASSERT_EQ(4, write_stream.Truncate(4));
879
880 // Write again.
881 write_stream.Write(test_data, 4, NULL);
882
883 // Close the stream.
884 write_stream.Close();
885
886 // Read in the contents and make sure we get back what we expected.
887 std::string read_contents;
888 file_util::ReadFileToString(temp_file_path(), &read_contents);
889
[email protected]4c2048a2009-03-24 21:02:01890 EXPECT_EQ("01230123", read_contents);
[email protected]0643a492009-03-09 15:49:20891}
892
[email protected]4c2048a2009-03-24 21:02:01893} // namespace