blob: 895bb65a23f922e5a0d9201cacaec0ee4b06516f [file] [log] [blame]
[email protected]8effd3f62011-03-25 16:29:071// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]2041cf342010-02-19 03:15:592// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
[email protected]21da6eb2008-11-03 17:18:144
[email protected]2041cf342010-02-19 03:15:595#include "base/callback.h"
[email protected]21da6eb2008-11-03 17:18:146#include "base/file_util.h"
[email protected]ad74a592011-01-21 18:40:557#include "base/message_loop.h"
[email protected]21da6eb2008-11-03 17:18:148#include "base/path_service.h"
[email protected]92aad5222009-02-09 22:26:419#include "base/platform_file.h"
[email protected]21da6eb2008-11-03 17:18:1410#include "net/base/file_stream.h"
11#include "net/base/net_errors.h"
12#include "net/base/test_completion_callback.h"
13#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1514#include "testing/platform_test.h"
[email protected]21da6eb2008-11-03 17:18:1415
[email protected]8effd3f62011-03-25 16:29:0716namespace net {
[email protected]4c2048a2009-03-24 21:02:0117namespace {
18
19const char kTestData[] = "0123456789";
20const int kTestDataSize = arraysize(kTestData) - 1;
[email protected]21da6eb2008-11-03 17:18:1421
22class FileStreamTest : public PlatformTest {
23 public:
24 virtual void SetUp() {
25 PlatformTest::SetUp();
26
[email protected]33edeab2009-08-18 16:07:5527 file_util::CreateTemporaryFile(&temp_file_path_);
[email protected]7ff3f632009-10-13 18:43:3528 file_util::WriteFile(temp_file_path_, kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1429 }
30 virtual void TearDown() {
31 file_util::Delete(temp_file_path_, false);
32
33 PlatformTest::TearDown();
34 }
[email protected]07167e8f2009-01-26 21:38:1135 const FilePath temp_file_path() const { return temp_file_path_; }
[email protected]21da6eb2008-11-03 17:18:1436 private:
[email protected]07167e8f2009-01-26 21:38:1137 FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1438};
39
40TEST_F(FileStreamTest, BasicOpenClose) {
[email protected]8effd3f62011-03-25 16:29:0741 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:3842 int rv = stream.Open(temp_file_path(),
[email protected]21da6eb2008-11-03 17:18:1443 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
[email protected]8effd3f62011-03-25 16:29:0744 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:1445}
46
[email protected]92aad5222009-02-09 22:26:4147// Test the use of FileStream with a file handle provided at construction.
48TEST_F(FileStreamTest, UseFileHandle) {
49 bool created = false;
50
51 // 1. Test reading with a file handle.
52 ASSERT_EQ(kTestDataSize,
53 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
54 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
55 base::PlatformFile file = base::CreatePlatformFile(
[email protected]ed65fec2010-08-31 19:30:2756 temp_file_path(), flags, &created, NULL);
[email protected]92aad5222009-02-09 22:26:4157
58 // Seek to the beginning of the file and read.
[email protected]8effd3f62011-03-25 16:29:0759 FileStream read_stream(file, flags);
60 ASSERT_EQ(0, read_stream.Seek(FROM_BEGIN, 0));
[email protected]92aad5222009-02-09 22:26:4161 ASSERT_EQ(kTestDataSize, read_stream.Available());
62 // Read into buffer and compare.
63 char buffer[kTestDataSize];
64 ASSERT_EQ(kTestDataSize, read_stream.Read(buffer, kTestDataSize, NULL));
65 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
66 read_stream.Close();
67
68 // 2. Test writing with a file handle.
69 file_util::Delete(temp_file_path(), false);
70 flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE;
[email protected]ed65fec2010-08-31 19:30:2771 file = base::CreatePlatformFile(temp_file_path(), flags, &created, NULL);
[email protected]92aad5222009-02-09 22:26:4172
[email protected]8effd3f62011-03-25 16:29:0773 FileStream write_stream(file, flags);
74 ASSERT_EQ(0, write_stream.Seek(FROM_BEGIN, 0));
[email protected]92aad5222009-02-09 22:26:4175 ASSERT_EQ(kTestDataSize, write_stream.Write(kTestData, kTestDataSize, NULL));
76 write_stream.Close();
77
78 // Read into buffer and compare to make sure the handle worked fine.
79 ASSERT_EQ(kTestDataSize,
80 file_util::ReadFile(temp_file_path(), buffer, kTestDataSize));
81 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
82}
83
[email protected]21da6eb2008-11-03 17:18:1484TEST_F(FileStreamTest, UseClosedStream) {
[email protected]8effd3f62011-03-25 16:29:0785 FileStream stream;
[email protected]21da6eb2008-11-03 17:18:1486
87 EXPECT_FALSE(stream.IsOpen());
88
89 // Try seeking...
[email protected]8effd3f62011-03-25 16:29:0790 int64 new_offset = stream.Seek(FROM_BEGIN, 5);
91 EXPECT_EQ(ERR_UNEXPECTED, new_offset);
[email protected]21da6eb2008-11-03 17:18:1492
93 // Try available...
94 int64 avail = stream.Available();
[email protected]8effd3f62011-03-25 16:29:0795 EXPECT_EQ(ERR_UNEXPECTED, avail);
[email protected]21da6eb2008-11-03 17:18:1496
97 // Try reading...
98 char buf[10];
[email protected]4c2048a2009-03-24 21:02:0199 int rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]8effd3f62011-03-25 16:29:07100 EXPECT_EQ(ERR_UNEXPECTED, rv);
[email protected]21da6eb2008-11-03 17:18:14101}
102
103TEST_F(FileStreamTest, BasicRead) {
104 int64 file_size;
105 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
106 EXPECT_TRUE(ok);
107
[email protected]8effd3f62011-03-25 16:29:07108 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38109 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14110 base::PLATFORM_FILE_READ;
111 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07112 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14113
114 int64 total_bytes_avail = stream.Available();
115 EXPECT_EQ(file_size, total_bytes_avail);
116
[email protected]4c2048a2009-03-24 21:02:01117 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14118
119 std::string data_read;
120 for (;;) {
121 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01122 rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:14123 EXPECT_LE(0, rv);
124 if (rv <= 0)
125 break;
126 total_bytes_read += rv;
127 data_read.append(buf, rv);
128 }
129 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01130 EXPECT_EQ(kTestData, data_read);
[email protected]21da6eb2008-11-03 17:18:14131}
132
133TEST_F(FileStreamTest, AsyncRead) {
134 int64 file_size;
135 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
136 EXPECT_TRUE(ok);
137
[email protected]8effd3f62011-03-25 16:29:07138 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38139 int flags = base::PLATFORM_FILE_OPEN |
140 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14141 base::PLATFORM_FILE_ASYNC;
142 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07143 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14144
145 int64 total_bytes_avail = stream.Available();
146 EXPECT_EQ(file_size, total_bytes_avail);
147
[email protected]f1f3f0f82011-10-01 20:38:10148 TestOldCompletionCallback callback;
[email protected]21da6eb2008-11-03 17:18:14149
[email protected]4c2048a2009-03-24 21:02:01150 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14151
152 std::string data_read;
153 for (;;) {
154 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01155 rv = stream.Read(buf, arraysize(buf), &callback);
[email protected]8effd3f62011-03-25 16:29:07156 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14157 rv = callback.WaitForResult();
158 EXPECT_LE(0, rv);
159 if (rv <= 0)
160 break;
161 total_bytes_read += rv;
162 data_read.append(buf, rv);
163 }
164 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01165 EXPECT_EQ(kTestData, data_read);
166}
167
168TEST_F(FileStreamTest, AsyncRead_EarlyClose) {
169 int64 file_size;
170 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
171 EXPECT_TRUE(ok);
172
[email protected]8effd3f62011-03-25 16:29:07173 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01174 int flags = base::PLATFORM_FILE_OPEN |
175 base::PLATFORM_FILE_READ |
176 base::PLATFORM_FILE_ASYNC;
177 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07178 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01179
180 int64 total_bytes_avail = stream.Available();
181 EXPECT_EQ(file_size, total_bytes_avail);
182
[email protected]f1f3f0f82011-10-01 20:38:10183 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01184
185 char buf[4];
186 rv = stream.Read(buf, arraysize(buf), &callback);
187 stream.Close();
[email protected]3828a752009-06-03 23:05:59188 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07189 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59190 // The callback should not be called if the request is cancelled.
191 MessageLoop::current()->RunAllPending();
192 EXPECT_FALSE(callback.have_result());
193 } else {
194 EXPECT_EQ(std::string(kTestData, rv), std::string(buf, rv));
195 }
[email protected]21da6eb2008-11-03 17:18:14196}
197
198TEST_F(FileStreamTest, BasicRead_FromOffset) {
199 int64 file_size;
200 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
201 EXPECT_TRUE(ok);
202
[email protected]8effd3f62011-03-25 16:29:07203 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38204 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14205 base::PLATFORM_FILE_READ;
206 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07207 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14208
209 const int64 kOffset = 3;
[email protected]8effd3f62011-03-25 16:29:07210 int64 new_offset = stream.Seek(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14211 EXPECT_EQ(kOffset, new_offset);
212
213 int64 total_bytes_avail = stream.Available();
214 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
215
216 int64 total_bytes_read = 0;
217
218 std::string data_read;
219 for (;;) {
220 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01221 rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:14222 EXPECT_LE(0, rv);
223 if (rv <= 0)
224 break;
225 total_bytes_read += rv;
226 data_read.append(buf, rv);
227 }
228 EXPECT_EQ(file_size - kOffset, total_bytes_read);
229 EXPECT_TRUE(data_read == kTestData + kOffset);
[email protected]4c2048a2009-03-24 21:02:01230 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14231}
232
233TEST_F(FileStreamTest, AsyncRead_FromOffset) {
234 int64 file_size;
235 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
236 EXPECT_TRUE(ok);
237
[email protected]8effd3f62011-03-25 16:29:07238 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38239 int flags = base::PLATFORM_FILE_OPEN |
240 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14241 base::PLATFORM_FILE_ASYNC;
242 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07243 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14244
245 const int64 kOffset = 3;
[email protected]8effd3f62011-03-25 16:29:07246 int64 new_offset = stream.Seek(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14247 EXPECT_EQ(kOffset, new_offset);
248
249 int64 total_bytes_avail = stream.Available();
250 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
251
[email protected]f1f3f0f82011-10-01 20:38:10252 TestOldCompletionCallback callback;
[email protected]21da6eb2008-11-03 17:18:14253
[email protected]4c2048a2009-03-24 21:02:01254 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14255
256 std::string data_read;
257 for (;;) {
258 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01259 rv = stream.Read(buf, arraysize(buf), &callback);
[email protected]8effd3f62011-03-25 16:29:07260 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14261 rv = callback.WaitForResult();
262 EXPECT_LE(0, rv);
263 if (rv <= 0)
264 break;
265 total_bytes_read += rv;
266 data_read.append(buf, rv);
267 }
268 EXPECT_EQ(file_size - kOffset, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01269 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14270}
271
272TEST_F(FileStreamTest, SeekAround) {
[email protected]8effd3f62011-03-25 16:29:07273 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38274 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14275 base::PLATFORM_FILE_READ;
276 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07277 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14278
279 const int64 kOffset = 3;
[email protected]8effd3f62011-03-25 16:29:07280 int64 new_offset = stream.Seek(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14281 EXPECT_EQ(kOffset, new_offset);
282
[email protected]8effd3f62011-03-25 16:29:07283 new_offset = stream.Seek(FROM_CURRENT, kOffset);
[email protected]21da6eb2008-11-03 17:18:14284 EXPECT_EQ(2 * kOffset, new_offset);
285
[email protected]8effd3f62011-03-25 16:29:07286 new_offset = stream.Seek(FROM_CURRENT, -kOffset);
[email protected]21da6eb2008-11-03 17:18:14287 EXPECT_EQ(kOffset, new_offset);
288
289 const int kTestDataLen = arraysize(kTestData) - 1;
290
[email protected]8effd3f62011-03-25 16:29:07291 new_offset = stream.Seek(FROM_END, -kTestDataLen);
[email protected]21da6eb2008-11-03 17:18:14292 EXPECT_EQ(0, new_offset);
293}
294
295TEST_F(FileStreamTest, BasicWrite) {
[email protected]8effd3f62011-03-25 16:29:07296 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38297 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
[email protected]21da6eb2008-11-03 17:18:14298 base::PLATFORM_FILE_WRITE;
299 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07300 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14301
302 int64 file_size;
303 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
304 EXPECT_TRUE(ok);
305 EXPECT_EQ(0, file_size);
306
307 rv = stream.Write(kTestData, kTestDataSize, NULL);
308 EXPECT_EQ(kTestDataSize, rv);
309 stream.Close();
310
311 ok = file_util::GetFileSize(temp_file_path(), &file_size);
312 EXPECT_TRUE(ok);
313 EXPECT_EQ(kTestDataSize, file_size);
314}
315
316TEST_F(FileStreamTest, AsyncWrite) {
[email protected]8effd3f62011-03-25 16:29:07317 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38318 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
319 base::PLATFORM_FILE_WRITE |
[email protected]21da6eb2008-11-03 17:18:14320 base::PLATFORM_FILE_ASYNC;
321 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07322 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14323
324 int64 file_size;
325 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
326 EXPECT_TRUE(ok);
327 EXPECT_EQ(0, file_size);
328
[email protected]f1f3f0f82011-10-01 20:38:10329 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01330 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14331
332 while (total_bytes_written != kTestDataSize) {
[email protected]4c2048a2009-03-24 21:02:01333 rv = stream.Write(kTestData + total_bytes_written,
334 kTestDataSize - total_bytes_written,
335 &callback);
[email protected]8effd3f62011-03-25 16:29:07336 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14337 rv = callback.WaitForResult();
338 EXPECT_LT(0, rv);
339 if (rv <= 0)
340 break;
341 total_bytes_written += rv;
342 }
343 ok = file_util::GetFileSize(temp_file_path(), &file_size);
344 EXPECT_TRUE(ok);
345 EXPECT_EQ(file_size, total_bytes_written);
346}
347
[email protected]4c2048a2009-03-24 21:02:01348TEST_F(FileStreamTest, AsyncWrite_EarlyClose) {
[email protected]8effd3f62011-03-25 16:29:07349 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01350 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
351 base::PLATFORM_FILE_WRITE |
352 base::PLATFORM_FILE_ASYNC;
353 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07354 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01355
356 int64 file_size;
357 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
358 EXPECT_TRUE(ok);
359 EXPECT_EQ(0, file_size);
360
[email protected]f1f3f0f82011-10-01 20:38:10361 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01362 int total_bytes_written = 0;
363
364 rv = stream.Write(kTestData + total_bytes_written,
365 kTestDataSize - total_bytes_written,
366 &callback);
367 stream.Close();
[email protected]3828a752009-06-03 23:05:59368 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07369 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59370 // The callback should not be called if the request is cancelled.
371 MessageLoop::current()->RunAllPending();
372 EXPECT_FALSE(callback.have_result());
373 } else {
374 ok = file_util::GetFileSize(temp_file_path(), &file_size);
375 EXPECT_TRUE(ok);
376 EXPECT_EQ(file_size, rv);
377 }
[email protected]4c2048a2009-03-24 21:02:01378}
379
[email protected]21da6eb2008-11-03 17:18:14380TEST_F(FileStreamTest, BasicWrite_FromOffset) {
[email protected]8effd3f62011-03-25 16:29:07381 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38382 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14383 base::PLATFORM_FILE_WRITE;
384 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07385 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14386
387 int64 file_size;
388 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
389 EXPECT_TRUE(ok);
390 EXPECT_EQ(kTestDataSize, file_size);
391
392 const int64 kOffset = 0;
[email protected]8effd3f62011-03-25 16:29:07393 int64 new_offset = stream.Seek(FROM_END, kOffset);
[email protected]21da6eb2008-11-03 17:18:14394 EXPECT_EQ(kTestDataSize, new_offset);
395
396 rv = stream.Write(kTestData, kTestDataSize, NULL);
397 EXPECT_EQ(kTestDataSize, rv);
398 stream.Close();
399
400 ok = file_util::GetFileSize(temp_file_path(), &file_size);
401 EXPECT_TRUE(ok);
402 EXPECT_EQ(kTestDataSize * 2, file_size);
403}
404
405TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
406 int64 file_size;
407 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
408 EXPECT_TRUE(ok);
409
[email protected]8effd3f62011-03-25 16:29:07410 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38411 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14412 base::PLATFORM_FILE_WRITE |
413 base::PLATFORM_FILE_ASYNC;
414 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07415 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14416
417 const int64 kOffset = 0;
[email protected]8effd3f62011-03-25 16:29:07418 int64 new_offset = stream.Seek(FROM_END, kOffset);
[email protected]21da6eb2008-11-03 17:18:14419 EXPECT_EQ(kTestDataSize, new_offset);
420
[email protected]f1f3f0f82011-10-01 20:38:10421 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01422 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14423
424 while (total_bytes_written != kTestDataSize) {
[email protected]4c2048a2009-03-24 21:02:01425 rv = stream.Write(kTestData + total_bytes_written,
426 kTestDataSize - total_bytes_written,
427 &callback);
[email protected]8effd3f62011-03-25 16:29:07428 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14429 rv = callback.WaitForResult();
430 EXPECT_LT(0, rv);
431 if (rv <= 0)
432 break;
433 total_bytes_written += rv;
434 }
435 ok = file_util::GetFileSize(temp_file_path(), &file_size);
436 EXPECT_TRUE(ok);
437 EXPECT_EQ(file_size, kTestDataSize * 2);
438}
439
440TEST_F(FileStreamTest, BasicReadWrite) {
441 int64 file_size;
442 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
443 EXPECT_TRUE(ok);
444
[email protected]8effd3f62011-03-25 16:29:07445 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38446 int flags = base::PLATFORM_FILE_OPEN |
447 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14448 base::PLATFORM_FILE_WRITE;
449 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07450 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14451
452 int64 total_bytes_avail = stream.Available();
453 EXPECT_EQ(file_size, total_bytes_avail);
454
[email protected]4c2048a2009-03-24 21:02:01455 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14456
457 std::string data_read;
458 for (;;) {
459 char buf[4];
[email protected]4c2048a2009-03-24 21:02:01460 rv = stream.Read(buf, arraysize(buf), NULL);
[email protected]21da6eb2008-11-03 17:18:14461 EXPECT_LE(0, rv);
462 if (rv <= 0)
463 break;
464 total_bytes_read += rv;
465 data_read.append(buf, rv);
466 }
467 EXPECT_EQ(file_size, total_bytes_read);
468 EXPECT_TRUE(data_read == kTestData);
469
470 rv = stream.Write(kTestData, kTestDataSize, NULL);
471 EXPECT_EQ(kTestDataSize, rv);
472 stream.Close();
473
474 ok = file_util::GetFileSize(temp_file_path(), &file_size);
475 EXPECT_TRUE(ok);
476 EXPECT_EQ(kTestDataSize * 2, file_size);
477}
478
[email protected]4c2048a2009-03-24 21:02:01479TEST_F(FileStreamTest, BasicWriteRead) {
480 int64 file_size;
481 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
482 EXPECT_TRUE(ok);
483
[email protected]8effd3f62011-03-25 16:29:07484 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01485 int flags = base::PLATFORM_FILE_OPEN |
486 base::PLATFORM_FILE_READ |
487 base::PLATFORM_FILE_WRITE;
488 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07489 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01490
491 int64 total_bytes_avail = stream.Available();
492 EXPECT_EQ(file_size, total_bytes_avail);
493
[email protected]8effd3f62011-03-25 16:29:07494 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01495 EXPECT_EQ(offset, file_size);
496
497 rv = stream.Write(kTestData, kTestDataSize, NULL);
498 EXPECT_EQ(kTestDataSize, rv);
499
[email protected]8effd3f62011-03-25 16:29:07500 offset = stream.Seek(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01501 EXPECT_EQ(0, offset);
502
503 int64 total_bytes_read = 0;
504
505 std::string data_read;
506 for (;;) {
507 char buf[4];
508 rv = stream.Read(buf, arraysize(buf), NULL);
509 EXPECT_LE(0, rv);
510 if (rv <= 0)
511 break;
512 total_bytes_read += rv;
513 data_read.append(buf, rv);
514 }
515 stream.Close();
516
517 ok = file_util::GetFileSize(temp_file_path(), &file_size);
518 EXPECT_TRUE(ok);
519 EXPECT_EQ(kTestDataSize * 2, file_size);
520 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
521
522 const std::string kExpectedFileData =
523 std::string(kTestData) + std::string(kTestData);
524 EXPECT_EQ(kExpectedFileData, data_read);
525}
526
527TEST_F(FileStreamTest, BasicAsyncReadWrite) {
528 int64 file_size;
529 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
530 EXPECT_TRUE(ok);
531
[email protected]8effd3f62011-03-25 16:29:07532 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01533 int flags = base::PLATFORM_FILE_OPEN |
534 base::PLATFORM_FILE_READ |
535 base::PLATFORM_FILE_WRITE |
536 base::PLATFORM_FILE_ASYNC;
537 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07538 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01539
540 int64 total_bytes_avail = stream.Available();
541 EXPECT_EQ(file_size, total_bytes_avail);
542
[email protected]f1f3f0f82011-10-01 20:38:10543 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01544 int64 total_bytes_read = 0;
545
546 std::string data_read;
547 for (;;) {
548 char buf[4];
549 rv = stream.Read(buf, arraysize(buf), &callback);
[email protected]8effd3f62011-03-25 16:29:07550 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01551 rv = callback.WaitForResult();
552 EXPECT_LE(0, rv);
553 if (rv <= 0)
554 break;
555 total_bytes_read += rv;
556 data_read.append(buf, rv);
557 }
558 EXPECT_EQ(file_size, total_bytes_read);
559 EXPECT_TRUE(data_read == kTestData);
560
561 int total_bytes_written = 0;
562
563 while (total_bytes_written != kTestDataSize) {
564 rv = stream.Write(kTestData + total_bytes_written,
565 kTestDataSize - total_bytes_written,
566 &callback);
[email protected]8effd3f62011-03-25 16:29:07567 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01568 rv = callback.WaitForResult();
569 EXPECT_LT(0, rv);
570 if (rv <= 0)
571 break;
572 total_bytes_written += rv;
573 }
574
575 stream.Close();
576
577 ok = file_util::GetFileSize(temp_file_path(), &file_size);
578 EXPECT_TRUE(ok);
579 EXPECT_EQ(kTestDataSize * 2, file_size);
580}
581
582TEST_F(FileStreamTest, BasicAsyncWriteRead) {
583 int64 file_size;
584 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
585 EXPECT_TRUE(ok);
586
[email protected]8effd3f62011-03-25 16:29:07587 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01588 int flags = base::PLATFORM_FILE_OPEN |
589 base::PLATFORM_FILE_READ |
590 base::PLATFORM_FILE_WRITE |
591 base::PLATFORM_FILE_ASYNC;
592 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07593 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01594
595 int64 total_bytes_avail = stream.Available();
596 EXPECT_EQ(file_size, total_bytes_avail);
597
[email protected]8effd3f62011-03-25 16:29:07598 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01599 EXPECT_EQ(offset, file_size);
600
[email protected]f1f3f0f82011-10-01 20:38:10601 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01602 int total_bytes_written = 0;
603
604 while (total_bytes_written != kTestDataSize) {
605 rv = stream.Write(kTestData + total_bytes_written,
606 kTestDataSize - total_bytes_written,
607 &callback);
[email protected]8effd3f62011-03-25 16:29:07608 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01609 rv = callback.WaitForResult();
610 EXPECT_LT(0, rv);
611 if (rv <= 0)
612 break;
613 total_bytes_written += rv;
614 }
615
616 EXPECT_EQ(kTestDataSize, total_bytes_written);
617
[email protected]8effd3f62011-03-25 16:29:07618 offset = stream.Seek(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01619 EXPECT_EQ(0, offset);
620
621 int total_bytes_read = 0;
622
623 std::string data_read;
624 for (;;) {
625 char buf[4];
626 rv = stream.Read(buf, arraysize(buf), &callback);
[email protected]8effd3f62011-03-25 16:29:07627 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01628 rv = callback.WaitForResult();
629 EXPECT_LE(0, rv);
630 if (rv <= 0)
631 break;
632 total_bytes_read += rv;
633 data_read.append(buf, rv);
634 }
635 stream.Close();
636
637 ok = file_util::GetFileSize(temp_file_path(), &file_size);
638 EXPECT_TRUE(ok);
639 EXPECT_EQ(kTestDataSize * 2, file_size);
640
641 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
642 const std::string kExpectedFileData =
643 std::string(kTestData) + std::string(kTestData);
644 EXPECT_EQ(kExpectedFileData, data_read);
645}
646
[email protected]f1f3f0f82011-10-01 20:38:10647class TestWriteReadOldCompletionCallback : public Callback1<int>::Type {
[email protected]4c2048a2009-03-24 21:02:01648 public:
[email protected]f1f3f0f82011-10-01 20:38:10649 TestWriteReadOldCompletionCallback(
[email protected]8effd3f62011-03-25 16:29:07650 FileStream* stream,
[email protected]4c2048a2009-03-24 21:02:01651 int* total_bytes_written,
652 int* total_bytes_read,
653 std::string* data_read)
654 : result_(0),
655 have_result_(false),
656 waiting_for_result_(false),
657 stream_(stream),
658 total_bytes_written_(total_bytes_written),
659 total_bytes_read_(total_bytes_read),
660 data_read_(data_read) {}
661
662 int WaitForResult() {
663 DCHECK(!waiting_for_result_);
664 while (!have_result_) {
665 waiting_for_result_ = true;
666 MessageLoop::current()->Run();
667 waiting_for_result_ = false;
668 }
669 have_result_ = false; // auto-reset for next callback
670 return result_;
671 }
672
673 private:
674 virtual void RunWithParams(const Tuple1<int>& params) {
675 DCHECK_LT(0, params.a);
676 *total_bytes_written_ += params.a;
677
678 int rv;
679
680 if (*total_bytes_written_ != kTestDataSize) {
681 // Recurse to finish writing all data.
682 int total_bytes_written = 0, total_bytes_read = 0;
683 std::string data_read;
[email protected]f1f3f0f82011-10-01 20:38:10684 TestWriteReadOldCompletionCallback callback(
[email protected]4c2048a2009-03-24 21:02:01685 stream_, &total_bytes_written, &total_bytes_read, &data_read);
686 rv = stream_->Write(kTestData + *total_bytes_written_,
687 kTestDataSize - *total_bytes_written_,
688 &callback);
[email protected]8effd3f62011-03-25 16:29:07689 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01690 rv = callback.WaitForResult();
691 *total_bytes_written_ += total_bytes_written;
692 *total_bytes_read_ += total_bytes_read;
693 *data_read_ += data_read;
694 } else { // We're done writing all data. Start reading the data.
[email protected]8effd3f62011-03-25 16:29:07695 stream_->Seek(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01696
[email protected]f1f3f0f82011-10-01 20:38:10697 TestOldCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01698 for (;;) {
699 char buf[4];
700 rv = stream_->Read(buf, arraysize(buf), &callback);
[email protected]8effd3f62011-03-25 16:29:07701 if (rv == ERR_IO_PENDING) {
[email protected]4c2048a2009-03-24 21:02:01702 bool old_state = MessageLoop::current()->NestableTasksAllowed();
703 MessageLoop::current()->SetNestableTasksAllowed(true);
704 rv = callback.WaitForResult();
705 MessageLoop::current()->SetNestableTasksAllowed(old_state);
706 }
707 EXPECT_LE(0, rv);
708 if (rv <= 0)
709 break;
710 *total_bytes_read_ += rv;
711 data_read_->append(buf, rv);
712 }
713 }
714
715 result_ = *total_bytes_written_;
716 have_result_ = true;
717 if (waiting_for_result_)
718 MessageLoop::current()->Quit();
719 }
720
721 int result_;
722 bool have_result_;
723 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07724 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01725 int* total_bytes_written_;
726 int* total_bytes_read_;
727 std::string* data_read_;
728
[email protected]f1f3f0f82011-10-01 20:38:10729 DISALLOW_COPY_AND_ASSIGN(TestWriteReadOldCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01730};
731
732TEST_F(FileStreamTest, AsyncWriteRead) {
733 int64 file_size;
734 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
735 EXPECT_TRUE(ok);
736
[email protected]8effd3f62011-03-25 16:29:07737 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01738 int flags = base::PLATFORM_FILE_OPEN |
739 base::PLATFORM_FILE_READ |
740 base::PLATFORM_FILE_WRITE |
741 base::PLATFORM_FILE_ASYNC;
742 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07743 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01744
745 int64 total_bytes_avail = stream.Available();
746 EXPECT_EQ(file_size, total_bytes_avail);
747
[email protected]8effd3f62011-03-25 16:29:07748 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01749 EXPECT_EQ(offset, file_size);
750
751 int total_bytes_written = 0;
752 int total_bytes_read = 0;
753 std::string data_read;
[email protected]f1f3f0f82011-10-01 20:38:10754 TestWriteReadOldCompletionCallback callback(&stream, &total_bytes_written,
[email protected]4c2048a2009-03-24 21:02:01755 &total_bytes_read, &data_read);
756
757 rv = stream.Write(kTestData + total_bytes_written,
758 kTestDataSize - static_cast<int>(total_bytes_written),
759 &callback);
[email protected]8effd3f62011-03-25 16:29:07760 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01761 rv = callback.WaitForResult();
762 EXPECT_LT(0, rv);
763 EXPECT_EQ(kTestDataSize, total_bytes_written);
764
765 stream.Close();
766
767 ok = file_util::GetFileSize(temp_file_path(), &file_size);
768 EXPECT_TRUE(ok);
769 EXPECT_EQ(kTestDataSize * 2, file_size);
770
771 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
772 const std::string kExpectedFileData =
773 std::string(kTestData) + std::string(kTestData);
774 EXPECT_EQ(kExpectedFileData, data_read);
775}
776
[email protected]f1f3f0f82011-10-01 20:38:10777class TestWriteCloseOldCompletionCallback : public Callback1<int>::Type {
[email protected]4c2048a2009-03-24 21:02:01778 public:
[email protected]f1f3f0f82011-10-01 20:38:10779 TestWriteCloseOldCompletionCallback(FileStream* stream, int* total_bytes_written)
[email protected]4c2048a2009-03-24 21:02:01780 : 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;
[email protected]f1f3f0f82011-10-01 20:38:10807 TestWriteCloseOldCompletionCallback callback(stream_, &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01808 rv = stream_->Write(kTestData + *total_bytes_written_,
809 kTestDataSize - *total_bytes_written_,
810 &callback);
[email protected]8effd3f62011-03-25 16:29:07811 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01812 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_;
[email protected]8effd3f62011-03-25 16:29:07827 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01828 int* total_bytes_written_;
829
[email protected]f1f3f0f82011-10-01 20:38:10830 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseOldCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01831};
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
[email protected]8effd3f62011-03-25 16:29:07838 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01839 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);
[email protected]8effd3f62011-03-25 16:29:07844 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01845
846 int64 total_bytes_avail = stream.Available();
847 EXPECT_EQ(file_size, total_bytes_avail);
848
[email protected]8effd3f62011-03-25 16:29:07849 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01850 EXPECT_EQ(offset, file_size);
851
852 int total_bytes_written = 0;
[email protected]f1f3f0f82011-10-01 20:38:10853 TestWriteCloseOldCompletionCallback callback(&stream, &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01854
855 rv = stream.Write(kTestData, kTestDataSize, &callback);
[email protected]8effd3f62011-03-25 16:29:07856 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01857 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
[email protected]8effd3f62011-03-25 16:29:07870 FileStream write_stream;
871 ASSERT_EQ(OK, write_stream.Open(temp_file_path(), flags));
[email protected]0643a492009-03-09 15:49:20872
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;
[email protected]3fc364f92009-08-06 22:35:13888 EXPECT_TRUE(file_util::ReadFileToString(temp_file_path(), &read_contents));
[email protected]0643a492009-03-09 15:49:20889
[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
[email protected]8effd3f62011-03-25 16:29:07894} // namespace net