blob: 966a829b1ae068ca7a8f64c7f8c90602988c5129 [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]5eb431e22011-10-12 08:51:385#include "net/base/file_stream.h"
6
7#include "base/bind.h"
[email protected]2041cf342010-02-19 03:15:598#include "base/callback.h"
[email protected]21da6eb2008-11-03 17:18:149#include "base/file_util.h"
[email protected]ad74a592011-01-21 18:40:5510#include "base/message_loop.h"
[email protected]21da6eb2008-11-03 17:18:1411#include "base/path_service.h"
[email protected]92aad5222009-02-09 22:26:4112#include "base/platform_file.h"
[email protected]21da6eb2008-11-03 17:18:1413#include "net/base/net_errors.h"
14#include "net/base/test_completion_callback.h"
15#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1516#include "testing/platform_test.h"
[email protected]21da6eb2008-11-03 17:18:1417
[email protected]8effd3f62011-03-25 16:29:0718namespace net {
[email protected]96d73822011-10-10 02:11:2419
[email protected]4c2048a2009-03-24 21:02:0120namespace {
21
22const char kTestData[] = "0123456789";
23const int kTestDataSize = arraysize(kTestData) - 1;
[email protected]21da6eb2008-11-03 17:18:1424
[email protected]96d73822011-10-10 02:11:2425} // namespace
26
[email protected]21da6eb2008-11-03 17:18:1427class FileStreamTest : public PlatformTest {
28 public:
29 virtual void SetUp() {
30 PlatformTest::SetUp();
31
[email protected]33edeab2009-08-18 16:07:5532 file_util::CreateTemporaryFile(&temp_file_path_);
[email protected]7ff3f632009-10-13 18:43:3533 file_util::WriteFile(temp_file_path_, kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1434 }
35 virtual void TearDown() {
36 file_util::Delete(temp_file_path_, false);
37
38 PlatformTest::TearDown();
39 }
[email protected]96d73822011-10-10 02:11:2440
[email protected]07167e8f2009-01-26 21:38:1141 const FilePath temp_file_path() const { return temp_file_path_; }
[email protected]96d73822011-10-10 02:11:2442
43 static base::PlatformFile GetFile(const FileStream& stream) {
44 return stream.file_;
45 }
46
[email protected]21da6eb2008-11-03 17:18:1447 private:
[email protected]07167e8f2009-01-26 21:38:1148 FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1449};
50
[email protected]96d73822011-10-10 02:11:2451namespace {
52
[email protected]21da6eb2008-11-03 17:18:1453TEST_F(FileStreamTest, BasicOpenClose) {
[email protected]96d73822011-10-10 02:11:2454 base::PlatformFile file = base::kInvalidPlatformFileValue;
55 {
56 FileStream stream;
57 int rv = stream.Open(temp_file_path(),
58 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
59 EXPECT_EQ(OK, rv);
60 EXPECT_TRUE(stream.IsOpen());
61 file = GetFile(stream);
62 }
63 EXPECT_NE(base::kInvalidPlatformFileValue, file);
64 base::PlatformFileInfo info;
65 // The file should be closed.
66 EXPECT_FALSE(base::GetPlatformFileInfo(file, &info));
67}
68
69TEST_F(FileStreamTest, FileHandleLeftOpen) {
70 bool created = false;
71 ASSERT_EQ(kTestDataSize,
72 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
73 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
74 base::PlatformFile file = base::CreatePlatformFile(
75 temp_file_path(), flags, &created, NULL);
76
77 {
78 // Seek to the beginning of the file and read.
79 FileStream read_stream(file, flags);
80 EXPECT_TRUE(read_stream.IsOpen());
81 }
82
83 EXPECT_NE(base::kInvalidPlatformFileValue, file);
84 base::PlatformFileInfo info;
85 // The file should still be open.
86 EXPECT_TRUE(base::GetPlatformFileInfo(file, &info));
87 // Clean up.
88 EXPECT_TRUE(base::ClosePlatformFile(file));
[email protected]21da6eb2008-11-03 17:18:1489}
90
[email protected]92aad5222009-02-09 22:26:4191// Test the use of FileStream with a file handle provided at construction.
92TEST_F(FileStreamTest, UseFileHandle) {
93 bool created = false;
94
95 // 1. Test reading with a file handle.
96 ASSERT_EQ(kTestDataSize,
97 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
98 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
99 base::PlatformFile file = base::CreatePlatformFile(
[email protected]ed65fec2010-08-31 19:30:27100 temp_file_path(), flags, &created, NULL);
[email protected]92aad5222009-02-09 22:26:41101
102 // Seek to the beginning of the file and read.
[email protected]8effd3f62011-03-25 16:29:07103 FileStream read_stream(file, flags);
104 ASSERT_EQ(0, read_stream.Seek(FROM_BEGIN, 0));
[email protected]92aad5222009-02-09 22:26:41105 ASSERT_EQ(kTestDataSize, read_stream.Available());
106 // Read into buffer and compare.
107 char buffer[kTestDataSize];
[email protected]5eb431e22011-10-12 08:51:38108 ASSERT_EQ(kTestDataSize,
109 read_stream.Read(buffer, kTestDataSize, CompletionCallback()));
[email protected]92aad5222009-02-09 22:26:41110 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
111 read_stream.Close();
112
113 // 2. Test writing with a file handle.
114 file_util::Delete(temp_file_path(), false);
115 flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE;
[email protected]ed65fec2010-08-31 19:30:27116 file = base::CreatePlatformFile(temp_file_path(), flags, &created, NULL);
[email protected]92aad5222009-02-09 22:26:41117
[email protected]8effd3f62011-03-25 16:29:07118 FileStream write_stream(file, flags);
119 ASSERT_EQ(0, write_stream.Seek(FROM_BEGIN, 0));
[email protected]5eb431e22011-10-12 08:51:38120 ASSERT_EQ(kTestDataSize,
121 write_stream.Write(kTestData, kTestDataSize, CompletionCallback()));
[email protected]92aad5222009-02-09 22:26:41122 write_stream.Close();
123
124 // Read into buffer and compare to make sure the handle worked fine.
125 ASSERT_EQ(kTestDataSize,
126 file_util::ReadFile(temp_file_path(), buffer, kTestDataSize));
127 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
128}
129
[email protected]21da6eb2008-11-03 17:18:14130TEST_F(FileStreamTest, UseClosedStream) {
[email protected]8effd3f62011-03-25 16:29:07131 FileStream stream;
[email protected]21da6eb2008-11-03 17:18:14132
133 EXPECT_FALSE(stream.IsOpen());
134
135 // Try seeking...
[email protected]8effd3f62011-03-25 16:29:07136 int64 new_offset = stream.Seek(FROM_BEGIN, 5);
137 EXPECT_EQ(ERR_UNEXPECTED, new_offset);
[email protected]21da6eb2008-11-03 17:18:14138
139 // Try available...
140 int64 avail = stream.Available();
[email protected]8effd3f62011-03-25 16:29:07141 EXPECT_EQ(ERR_UNEXPECTED, avail);
[email protected]21da6eb2008-11-03 17:18:14142
143 // Try reading...
144 char buf[10];
[email protected]5eb431e22011-10-12 08:51:38145 int rv = stream.Read(buf, arraysize(buf), CompletionCallback());
[email protected]8effd3f62011-03-25 16:29:07146 EXPECT_EQ(ERR_UNEXPECTED, rv);
[email protected]21da6eb2008-11-03 17:18:14147}
148
149TEST_F(FileStreamTest, BasicRead) {
150 int64 file_size;
151 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
152 EXPECT_TRUE(ok);
153
[email protected]8effd3f62011-03-25 16:29:07154 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38155 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14156 base::PLATFORM_FILE_READ;
157 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07158 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14159
160 int64 total_bytes_avail = stream.Available();
161 EXPECT_EQ(file_size, total_bytes_avail);
162
[email protected]4c2048a2009-03-24 21:02:01163 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14164
165 std::string data_read;
166 for (;;) {
167 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38168 rv = stream.Read(buf, arraysize(buf), CompletionCallback());
[email protected]21da6eb2008-11-03 17:18:14169 EXPECT_LE(0, rv);
170 if (rv <= 0)
171 break;
172 total_bytes_read += rv;
173 data_read.append(buf, rv);
174 }
175 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01176 EXPECT_EQ(kTestData, data_read);
[email protected]21da6eb2008-11-03 17:18:14177}
178
179TEST_F(FileStreamTest, AsyncRead) {
180 int64 file_size;
181 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
182 EXPECT_TRUE(ok);
183
[email protected]8effd3f62011-03-25 16:29:07184 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38185 int flags = base::PLATFORM_FILE_OPEN |
186 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14187 base::PLATFORM_FILE_ASYNC;
188 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07189 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14190
191 int64 total_bytes_avail = stream.Available();
192 EXPECT_EQ(file_size, total_bytes_avail);
193
[email protected]5eb431e22011-10-12 08:51:38194 TestCompletionCallback callback;
[email protected]21da6eb2008-11-03 17:18:14195
[email protected]4c2048a2009-03-24 21:02:01196 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14197
198 std::string data_read;
199 for (;;) {
200 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38201 rv = stream.Read(buf, arraysize(buf), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07202 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14203 rv = callback.WaitForResult();
204 EXPECT_LE(0, rv);
205 if (rv <= 0)
206 break;
207 total_bytes_read += rv;
208 data_read.append(buf, rv);
209 }
210 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01211 EXPECT_EQ(kTestData, data_read);
212}
213
214TEST_F(FileStreamTest, AsyncRead_EarlyClose) {
215 int64 file_size;
216 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
217 EXPECT_TRUE(ok);
218
[email protected]8effd3f62011-03-25 16:29:07219 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01220 int flags = base::PLATFORM_FILE_OPEN |
221 base::PLATFORM_FILE_READ |
222 base::PLATFORM_FILE_ASYNC;
223 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07224 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01225
226 int64 total_bytes_avail = stream.Available();
227 EXPECT_EQ(file_size, total_bytes_avail);
228
[email protected]5eb431e22011-10-12 08:51:38229 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01230
231 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38232 rv = stream.Read(buf, arraysize(buf), callback.callback());
[email protected]4c2048a2009-03-24 21:02:01233 stream.Close();
[email protected]3828a752009-06-03 23:05:59234 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07235 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59236 // The callback should not be called if the request is cancelled.
237 MessageLoop::current()->RunAllPending();
238 EXPECT_FALSE(callback.have_result());
239 } else {
240 EXPECT_EQ(std::string(kTestData, rv), std::string(buf, rv));
241 }
[email protected]21da6eb2008-11-03 17:18:14242}
243
244TEST_F(FileStreamTest, BasicRead_FromOffset) {
245 int64 file_size;
246 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
247 EXPECT_TRUE(ok);
248
[email protected]8effd3f62011-03-25 16:29:07249 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38250 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14251 base::PLATFORM_FILE_READ;
252 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07253 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14254
255 const int64 kOffset = 3;
[email protected]8effd3f62011-03-25 16:29:07256 int64 new_offset = stream.Seek(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14257 EXPECT_EQ(kOffset, new_offset);
258
259 int64 total_bytes_avail = stream.Available();
260 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
261
262 int64 total_bytes_read = 0;
263
264 std::string data_read;
265 for (;;) {
266 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38267 rv = stream.Read(buf, arraysize(buf), CompletionCallback());
[email protected]21da6eb2008-11-03 17:18:14268 EXPECT_LE(0, rv);
269 if (rv <= 0)
270 break;
271 total_bytes_read += rv;
272 data_read.append(buf, rv);
273 }
274 EXPECT_EQ(file_size - kOffset, total_bytes_read);
275 EXPECT_TRUE(data_read == kTestData + kOffset);
[email protected]4c2048a2009-03-24 21:02:01276 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14277}
278
279TEST_F(FileStreamTest, AsyncRead_FromOffset) {
280 int64 file_size;
281 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
282 EXPECT_TRUE(ok);
283
[email protected]8effd3f62011-03-25 16:29:07284 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38285 int flags = base::PLATFORM_FILE_OPEN |
286 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14287 base::PLATFORM_FILE_ASYNC;
288 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07289 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14290
291 const int64 kOffset = 3;
[email protected]8effd3f62011-03-25 16:29:07292 int64 new_offset = stream.Seek(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14293 EXPECT_EQ(kOffset, new_offset);
294
295 int64 total_bytes_avail = stream.Available();
296 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
297
[email protected]5eb431e22011-10-12 08:51:38298 TestCompletionCallback callback;
[email protected]21da6eb2008-11-03 17:18:14299
[email protected]4c2048a2009-03-24 21:02:01300 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14301
302 std::string data_read;
303 for (;;) {
304 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38305 rv = stream.Read(buf, arraysize(buf), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07306 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14307 rv = callback.WaitForResult();
308 EXPECT_LE(0, rv);
309 if (rv <= 0)
310 break;
311 total_bytes_read += rv;
312 data_read.append(buf, rv);
313 }
314 EXPECT_EQ(file_size - kOffset, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01315 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14316}
317
318TEST_F(FileStreamTest, SeekAround) {
[email protected]8effd3f62011-03-25 16:29:07319 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38320 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14321 base::PLATFORM_FILE_READ;
322 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07323 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14324
325 const int64 kOffset = 3;
[email protected]8effd3f62011-03-25 16:29:07326 int64 new_offset = stream.Seek(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14327 EXPECT_EQ(kOffset, new_offset);
328
[email protected]8effd3f62011-03-25 16:29:07329 new_offset = stream.Seek(FROM_CURRENT, kOffset);
[email protected]21da6eb2008-11-03 17:18:14330 EXPECT_EQ(2 * kOffset, new_offset);
331
[email protected]8effd3f62011-03-25 16:29:07332 new_offset = stream.Seek(FROM_CURRENT, -kOffset);
[email protected]21da6eb2008-11-03 17:18:14333 EXPECT_EQ(kOffset, new_offset);
334
335 const int kTestDataLen = arraysize(kTestData) - 1;
336
[email protected]8effd3f62011-03-25 16:29:07337 new_offset = stream.Seek(FROM_END, -kTestDataLen);
[email protected]21da6eb2008-11-03 17:18:14338 EXPECT_EQ(0, new_offset);
339}
340
341TEST_F(FileStreamTest, BasicWrite) {
[email protected]8effd3f62011-03-25 16:29:07342 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38343 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
[email protected]21da6eb2008-11-03 17:18:14344 base::PLATFORM_FILE_WRITE;
345 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07346 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14347
348 int64 file_size;
349 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
350 EXPECT_TRUE(ok);
351 EXPECT_EQ(0, file_size);
352
[email protected]5eb431e22011-10-12 08:51:38353 rv = stream.Write(kTestData, kTestDataSize, CompletionCallback());
[email protected]21da6eb2008-11-03 17:18:14354 EXPECT_EQ(kTestDataSize, rv);
355 stream.Close();
356
357 ok = file_util::GetFileSize(temp_file_path(), &file_size);
358 EXPECT_TRUE(ok);
359 EXPECT_EQ(kTestDataSize, file_size);
360}
361
362TEST_F(FileStreamTest, AsyncWrite) {
[email protected]8effd3f62011-03-25 16:29:07363 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38364 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
365 base::PLATFORM_FILE_WRITE |
[email protected]21da6eb2008-11-03 17:18:14366 base::PLATFORM_FILE_ASYNC;
367 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07368 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14369
370 int64 file_size;
371 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
372 EXPECT_TRUE(ok);
373 EXPECT_EQ(0, file_size);
374
[email protected]5eb431e22011-10-12 08:51:38375 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01376 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14377
378 while (total_bytes_written != kTestDataSize) {
[email protected]4c2048a2009-03-24 21:02:01379 rv = stream.Write(kTestData + total_bytes_written,
380 kTestDataSize - total_bytes_written,
[email protected]5eb431e22011-10-12 08:51:38381 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07382 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14383 rv = callback.WaitForResult();
384 EXPECT_LT(0, rv);
385 if (rv <= 0)
386 break;
387 total_bytes_written += rv;
388 }
389 ok = file_util::GetFileSize(temp_file_path(), &file_size);
390 EXPECT_TRUE(ok);
391 EXPECT_EQ(file_size, total_bytes_written);
392}
393
[email protected]4c2048a2009-03-24 21:02:01394TEST_F(FileStreamTest, AsyncWrite_EarlyClose) {
[email protected]8effd3f62011-03-25 16:29:07395 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01396 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
397 base::PLATFORM_FILE_WRITE |
398 base::PLATFORM_FILE_ASYNC;
399 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07400 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01401
402 int64 file_size;
403 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
404 EXPECT_TRUE(ok);
405 EXPECT_EQ(0, file_size);
406
[email protected]5eb431e22011-10-12 08:51:38407 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01408 int total_bytes_written = 0;
409
410 rv = stream.Write(kTestData + total_bytes_written,
411 kTestDataSize - total_bytes_written,
[email protected]5eb431e22011-10-12 08:51:38412 callback.callback());
[email protected]4c2048a2009-03-24 21:02:01413 stream.Close();
[email protected]3828a752009-06-03 23:05:59414 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07415 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59416 // The callback should not be called if the request is cancelled.
417 MessageLoop::current()->RunAllPending();
418 EXPECT_FALSE(callback.have_result());
419 } else {
420 ok = file_util::GetFileSize(temp_file_path(), &file_size);
421 EXPECT_TRUE(ok);
422 EXPECT_EQ(file_size, rv);
423 }
[email protected]4c2048a2009-03-24 21:02:01424}
425
[email protected]21da6eb2008-11-03 17:18:14426TEST_F(FileStreamTest, BasicWrite_FromOffset) {
[email protected]8effd3f62011-03-25 16:29:07427 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38428 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14429 base::PLATFORM_FILE_WRITE;
430 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07431 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14432
433 int64 file_size;
434 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
435 EXPECT_TRUE(ok);
436 EXPECT_EQ(kTestDataSize, file_size);
437
438 const int64 kOffset = 0;
[email protected]8effd3f62011-03-25 16:29:07439 int64 new_offset = stream.Seek(FROM_END, kOffset);
[email protected]21da6eb2008-11-03 17:18:14440 EXPECT_EQ(kTestDataSize, new_offset);
441
[email protected]5eb431e22011-10-12 08:51:38442 rv = stream.Write(kTestData, kTestDataSize, CompletionCallback());
[email protected]21da6eb2008-11-03 17:18:14443 EXPECT_EQ(kTestDataSize, rv);
444 stream.Close();
445
446 ok = file_util::GetFileSize(temp_file_path(), &file_size);
447 EXPECT_TRUE(ok);
448 EXPECT_EQ(kTestDataSize * 2, file_size);
449}
450
451TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
452 int64 file_size;
453 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
454 EXPECT_TRUE(ok);
455
[email protected]8effd3f62011-03-25 16:29:07456 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38457 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14458 base::PLATFORM_FILE_WRITE |
459 base::PLATFORM_FILE_ASYNC;
460 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07461 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14462
463 const int64 kOffset = 0;
[email protected]8effd3f62011-03-25 16:29:07464 int64 new_offset = stream.Seek(FROM_END, kOffset);
[email protected]21da6eb2008-11-03 17:18:14465 EXPECT_EQ(kTestDataSize, new_offset);
466
[email protected]5eb431e22011-10-12 08:51:38467 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01468 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14469
470 while (total_bytes_written != kTestDataSize) {
[email protected]4c2048a2009-03-24 21:02:01471 rv = stream.Write(kTestData + total_bytes_written,
472 kTestDataSize - total_bytes_written,
[email protected]5eb431e22011-10-12 08:51:38473 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07474 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14475 rv = callback.WaitForResult();
476 EXPECT_LT(0, rv);
477 if (rv <= 0)
478 break;
479 total_bytes_written += rv;
480 }
481 ok = file_util::GetFileSize(temp_file_path(), &file_size);
482 EXPECT_TRUE(ok);
483 EXPECT_EQ(file_size, kTestDataSize * 2);
484}
485
486TEST_F(FileStreamTest, BasicReadWrite) {
487 int64 file_size;
488 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
489 EXPECT_TRUE(ok);
490
[email protected]8effd3f62011-03-25 16:29:07491 FileStream stream;
[email protected]f0a51fb52009-03-05 12:46:38492 int flags = base::PLATFORM_FILE_OPEN |
493 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14494 base::PLATFORM_FILE_WRITE;
495 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07496 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14497
498 int64 total_bytes_avail = stream.Available();
499 EXPECT_EQ(file_size, total_bytes_avail);
500
[email protected]4c2048a2009-03-24 21:02:01501 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14502
503 std::string data_read;
504 for (;;) {
505 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38506 rv = stream.Read(buf, arraysize(buf), CompletionCallback());
[email protected]21da6eb2008-11-03 17:18:14507 EXPECT_LE(0, rv);
508 if (rv <= 0)
509 break;
510 total_bytes_read += rv;
511 data_read.append(buf, rv);
512 }
513 EXPECT_EQ(file_size, total_bytes_read);
514 EXPECT_TRUE(data_read == kTestData);
515
[email protected]5eb431e22011-10-12 08:51:38516 rv = stream.Write(kTestData, kTestDataSize, CompletionCallback());
[email protected]21da6eb2008-11-03 17:18:14517 EXPECT_EQ(kTestDataSize, rv);
518 stream.Close();
519
520 ok = file_util::GetFileSize(temp_file_path(), &file_size);
521 EXPECT_TRUE(ok);
522 EXPECT_EQ(kTestDataSize * 2, file_size);
523}
524
[email protected]4c2048a2009-03-24 21:02:01525TEST_F(FileStreamTest, BasicWriteRead) {
526 int64 file_size;
527 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
528 EXPECT_TRUE(ok);
529
[email protected]8effd3f62011-03-25 16:29:07530 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01531 int flags = base::PLATFORM_FILE_OPEN |
532 base::PLATFORM_FILE_READ |
533 base::PLATFORM_FILE_WRITE;
534 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07535 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01536
537 int64 total_bytes_avail = stream.Available();
538 EXPECT_EQ(file_size, total_bytes_avail);
539
[email protected]8effd3f62011-03-25 16:29:07540 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01541 EXPECT_EQ(offset, file_size);
542
[email protected]5eb431e22011-10-12 08:51:38543 rv = stream.Write(kTestData, kTestDataSize, CompletionCallback());
[email protected]4c2048a2009-03-24 21:02:01544 EXPECT_EQ(kTestDataSize, rv);
545
[email protected]8effd3f62011-03-25 16:29:07546 offset = stream.Seek(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01547 EXPECT_EQ(0, offset);
548
549 int64 total_bytes_read = 0;
550
551 std::string data_read;
552 for (;;) {
553 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38554 rv = stream.Read(buf, arraysize(buf), CompletionCallback());
[email protected]4c2048a2009-03-24 21:02:01555 EXPECT_LE(0, rv);
556 if (rv <= 0)
557 break;
558 total_bytes_read += rv;
559 data_read.append(buf, rv);
560 }
561 stream.Close();
562
563 ok = file_util::GetFileSize(temp_file_path(), &file_size);
564 EXPECT_TRUE(ok);
565 EXPECT_EQ(kTestDataSize * 2, file_size);
566 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
567
568 const std::string kExpectedFileData =
569 std::string(kTestData) + std::string(kTestData);
570 EXPECT_EQ(kExpectedFileData, data_read);
571}
572
573TEST_F(FileStreamTest, BasicAsyncReadWrite) {
574 int64 file_size;
575 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
576 EXPECT_TRUE(ok);
577
[email protected]8effd3f62011-03-25 16:29:07578 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01579 int flags = base::PLATFORM_FILE_OPEN |
580 base::PLATFORM_FILE_READ |
581 base::PLATFORM_FILE_WRITE |
582 base::PLATFORM_FILE_ASYNC;
583 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07584 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01585
586 int64 total_bytes_avail = stream.Available();
587 EXPECT_EQ(file_size, total_bytes_avail);
588
[email protected]5eb431e22011-10-12 08:51:38589 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01590 int64 total_bytes_read = 0;
591
592 std::string data_read;
593 for (;;) {
594 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38595 rv = stream.Read(buf, arraysize(buf), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07596 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01597 rv = callback.WaitForResult();
598 EXPECT_LE(0, rv);
599 if (rv <= 0)
600 break;
601 total_bytes_read += rv;
602 data_read.append(buf, rv);
603 }
604 EXPECT_EQ(file_size, total_bytes_read);
605 EXPECT_TRUE(data_read == kTestData);
606
607 int total_bytes_written = 0;
608
609 while (total_bytes_written != kTestDataSize) {
610 rv = stream.Write(kTestData + total_bytes_written,
611 kTestDataSize - total_bytes_written,
[email protected]5eb431e22011-10-12 08:51:38612 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07613 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01614 rv = callback.WaitForResult();
615 EXPECT_LT(0, rv);
616 if (rv <= 0)
617 break;
618 total_bytes_written += rv;
619 }
620
621 stream.Close();
622
623 ok = file_util::GetFileSize(temp_file_path(), &file_size);
624 EXPECT_TRUE(ok);
625 EXPECT_EQ(kTestDataSize * 2, file_size);
626}
627
628TEST_F(FileStreamTest, BasicAsyncWriteRead) {
629 int64 file_size;
630 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
631 EXPECT_TRUE(ok);
632
[email protected]8effd3f62011-03-25 16:29:07633 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01634 int flags = base::PLATFORM_FILE_OPEN |
635 base::PLATFORM_FILE_READ |
636 base::PLATFORM_FILE_WRITE |
637 base::PLATFORM_FILE_ASYNC;
638 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07639 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01640
641 int64 total_bytes_avail = stream.Available();
642 EXPECT_EQ(file_size, total_bytes_avail);
643
[email protected]8effd3f62011-03-25 16:29:07644 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01645 EXPECT_EQ(offset, file_size);
646
[email protected]5eb431e22011-10-12 08:51:38647 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01648 int total_bytes_written = 0;
649
650 while (total_bytes_written != kTestDataSize) {
651 rv = stream.Write(kTestData + total_bytes_written,
652 kTestDataSize - total_bytes_written,
[email protected]5eb431e22011-10-12 08:51:38653 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07654 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01655 rv = callback.WaitForResult();
656 EXPECT_LT(0, rv);
657 if (rv <= 0)
658 break;
659 total_bytes_written += rv;
660 }
661
662 EXPECT_EQ(kTestDataSize, total_bytes_written);
663
[email protected]8effd3f62011-03-25 16:29:07664 offset = stream.Seek(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01665 EXPECT_EQ(0, offset);
666
667 int total_bytes_read = 0;
668
669 std::string data_read;
670 for (;;) {
671 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38672 rv = stream.Read(buf, arraysize(buf), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07673 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01674 rv = callback.WaitForResult();
675 EXPECT_LE(0, rv);
676 if (rv <= 0)
677 break;
678 total_bytes_read += rv;
679 data_read.append(buf, rv);
680 }
681 stream.Close();
682
683 ok = file_util::GetFileSize(temp_file_path(), &file_size);
684 EXPECT_TRUE(ok);
685 EXPECT_EQ(kTestDataSize * 2, file_size);
686
687 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
688 const std::string kExpectedFileData =
689 std::string(kTestData) + std::string(kTestData);
690 EXPECT_EQ(kExpectedFileData, data_read);
691}
692
[email protected]5eb431e22011-10-12 08:51:38693class TestWriteReadCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01694 public:
[email protected]5eb431e22011-10-12 08:51:38695 TestWriteReadCompletionCallback(
[email protected]8effd3f62011-03-25 16:29:07696 FileStream* stream,
[email protected]4c2048a2009-03-24 21:02:01697 int* total_bytes_written,
698 int* total_bytes_read,
699 std::string* data_read)
700 : result_(0),
701 have_result_(false),
702 waiting_for_result_(false),
703 stream_(stream),
704 total_bytes_written_(total_bytes_written),
705 total_bytes_read_(total_bytes_read),
[email protected]5eb431e22011-10-12 08:51:38706 data_read_(data_read),
707 callback_(base::Bind(&TestWriteReadCompletionCallback::OnComplete,
708 base::Unretained(this))) {}
[email protected]4c2048a2009-03-24 21:02:01709
710 int WaitForResult() {
711 DCHECK(!waiting_for_result_);
712 while (!have_result_) {
713 waiting_for_result_ = true;
714 MessageLoop::current()->Run();
715 waiting_for_result_ = false;
716 }
717 have_result_ = false; // auto-reset for next callback
718 return result_;
719 }
720
[email protected]5eb431e22011-10-12 08:51:38721 const CompletionCallback& callback() const { return callback_; }
722
[email protected]4c2048a2009-03-24 21:02:01723 private:
[email protected]5eb431e22011-10-12 08:51:38724 void OnComplete(int result) {
725 DCHECK_LT(0, result);
726 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01727
728 int rv;
729
730 if (*total_bytes_written_ != kTestDataSize) {
731 // Recurse to finish writing all data.
732 int total_bytes_written = 0, total_bytes_read = 0;
733 std::string data_read;
[email protected]5eb431e22011-10-12 08:51:38734 TestWriteReadCompletionCallback callback(
[email protected]4c2048a2009-03-24 21:02:01735 stream_, &total_bytes_written, &total_bytes_read, &data_read);
736 rv = stream_->Write(kTestData + *total_bytes_written_,
737 kTestDataSize - *total_bytes_written_,
[email protected]5eb431e22011-10-12 08:51:38738 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07739 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01740 rv = callback.WaitForResult();
741 *total_bytes_written_ += total_bytes_written;
742 *total_bytes_read_ += total_bytes_read;
743 *data_read_ += data_read;
744 } else { // We're done writing all data. Start reading the data.
[email protected]8effd3f62011-03-25 16:29:07745 stream_->Seek(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01746
[email protected]5eb431e22011-10-12 08:51:38747 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01748 for (;;) {
749 char buf[4];
[email protected]5eb431e22011-10-12 08:51:38750 rv = stream_->Read(buf, arraysize(buf), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07751 if (rv == ERR_IO_PENDING) {
[email protected]4c2048a2009-03-24 21:02:01752 bool old_state = MessageLoop::current()->NestableTasksAllowed();
753 MessageLoop::current()->SetNestableTasksAllowed(true);
754 rv = callback.WaitForResult();
755 MessageLoop::current()->SetNestableTasksAllowed(old_state);
756 }
757 EXPECT_LE(0, rv);
758 if (rv <= 0)
759 break;
760 *total_bytes_read_ += rv;
761 data_read_->append(buf, rv);
762 }
763 }
764
765 result_ = *total_bytes_written_;
766 have_result_ = true;
767 if (waiting_for_result_)
768 MessageLoop::current()->Quit();
769 }
770
771 int result_;
772 bool have_result_;
773 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07774 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01775 int* total_bytes_written_;
776 int* total_bytes_read_;
777 std::string* data_read_;
[email protected]5eb431e22011-10-12 08:51:38778 const CompletionCallback callback_;
[email protected]4c2048a2009-03-24 21:02:01779
[email protected]5eb431e22011-10-12 08:51:38780 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01781};
782
783TEST_F(FileStreamTest, AsyncWriteRead) {
784 int64 file_size;
785 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
786 EXPECT_TRUE(ok);
787
[email protected]8effd3f62011-03-25 16:29:07788 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01789 int flags = base::PLATFORM_FILE_OPEN |
790 base::PLATFORM_FILE_READ |
791 base::PLATFORM_FILE_WRITE |
792 base::PLATFORM_FILE_ASYNC;
793 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07794 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01795
796 int64 total_bytes_avail = stream.Available();
797 EXPECT_EQ(file_size, total_bytes_avail);
798
[email protected]8effd3f62011-03-25 16:29:07799 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01800 EXPECT_EQ(offset, file_size);
801
802 int total_bytes_written = 0;
803 int total_bytes_read = 0;
804 std::string data_read;
[email protected]5eb431e22011-10-12 08:51:38805 TestWriteReadCompletionCallback callback(&stream, &total_bytes_written,
[email protected]4c2048a2009-03-24 21:02:01806 &total_bytes_read, &data_read);
807
808 rv = stream.Write(kTestData + total_bytes_written,
809 kTestDataSize - static_cast<int>(total_bytes_written),
[email protected]5eb431e22011-10-12 08:51:38810 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07811 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01812 rv = callback.WaitForResult();
813 EXPECT_LT(0, rv);
814 EXPECT_EQ(kTestDataSize, total_bytes_written);
815
816 stream.Close();
817
818 ok = file_util::GetFileSize(temp_file_path(), &file_size);
819 EXPECT_TRUE(ok);
820 EXPECT_EQ(kTestDataSize * 2, file_size);
821
822 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
823 const std::string kExpectedFileData =
824 std::string(kTestData) + std::string(kTestData);
825 EXPECT_EQ(kExpectedFileData, data_read);
826}
827
[email protected]5eb431e22011-10-12 08:51:38828class TestWriteCloseCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01829 public:
[email protected]5eb431e22011-10-12 08:51:38830 TestWriteCloseCompletionCallback(FileStream* stream, int* total_bytes_written)
[email protected]4c2048a2009-03-24 21:02:01831 : result_(0),
832 have_result_(false),
833 waiting_for_result_(false),
834 stream_(stream),
[email protected]5eb431e22011-10-12 08:51:38835 total_bytes_written_(total_bytes_written),
836 callback_(base::Bind(&TestWriteCloseCompletionCallback::OnComplete,
837 base::Unretained(this))) {}
[email protected]4c2048a2009-03-24 21:02:01838
839 int WaitForResult() {
840 DCHECK(!waiting_for_result_);
841 while (!have_result_) {
842 waiting_for_result_ = true;
843 MessageLoop::current()->Run();
844 waiting_for_result_ = false;
845 }
846 have_result_ = false; // auto-reset for next callback
847 return result_;
848 }
849
[email protected]5eb431e22011-10-12 08:51:38850 const CompletionCallback& callback() const { return callback_; }
851
[email protected]4c2048a2009-03-24 21:02:01852 private:
[email protected]5eb431e22011-10-12 08:51:38853 void OnComplete(int result) {
854 DCHECK_LT(0, result);
855 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01856
857 int rv;
858
859 if (*total_bytes_written_ != kTestDataSize) {
860 // Recurse to finish writing all data.
861 int total_bytes_written = 0;
[email protected]5eb431e22011-10-12 08:51:38862 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01863 rv = stream_->Write(kTestData + *total_bytes_written_,
864 kTestDataSize - *total_bytes_written_,
[email protected]5eb431e22011-10-12 08:51:38865 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07866 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01867 rv = callback.WaitForResult();
868 *total_bytes_written_ += total_bytes_written;
869 } else { // We're done writing all data. Close the file.
870 stream_->Close();
871 }
872
873 result_ = *total_bytes_written_;
874 have_result_ = true;
875 if (waiting_for_result_)
876 MessageLoop::current()->Quit();
877 }
878
879 int result_;
880 bool have_result_;
881 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07882 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01883 int* total_bytes_written_;
[email protected]5eb431e22011-10-12 08:51:38884 const CompletionCallback callback_;
[email protected]4c2048a2009-03-24 21:02:01885
[email protected]5eb431e22011-10-12 08:51:38886 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01887};
888
889TEST_F(FileStreamTest, AsyncWriteClose) {
890 int64 file_size;
891 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
892 EXPECT_TRUE(ok);
893
[email protected]8effd3f62011-03-25 16:29:07894 FileStream stream;
[email protected]4c2048a2009-03-24 21:02:01895 int flags = base::PLATFORM_FILE_OPEN |
896 base::PLATFORM_FILE_READ |
897 base::PLATFORM_FILE_WRITE |
898 base::PLATFORM_FILE_ASYNC;
899 int rv = stream.Open(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07900 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01901
902 int64 total_bytes_avail = stream.Available();
903 EXPECT_EQ(file_size, total_bytes_avail);
904
[email protected]8effd3f62011-03-25 16:29:07905 int64 offset = stream.Seek(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01906 EXPECT_EQ(offset, file_size);
907
908 int total_bytes_written = 0;
[email protected]5eb431e22011-10-12 08:51:38909 TestWriteCloseCompletionCallback callback(&stream, &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01910
[email protected]5eb431e22011-10-12 08:51:38911 rv = stream.Write(kTestData, kTestDataSize, callback.callback());
[email protected]8effd3f62011-03-25 16:29:07912 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01913 total_bytes_written = callback.WaitForResult();
914 EXPECT_LT(0, total_bytes_written);
915 EXPECT_EQ(kTestDataSize, total_bytes_written);
916
917 ok = file_util::GetFileSize(temp_file_path(), &file_size);
918 EXPECT_TRUE(ok);
919 EXPECT_EQ(kTestDataSize * 2, file_size);
920}
921
[email protected]0643a492009-03-09 15:49:20922// Tests truncating a file.
923TEST_F(FileStreamTest, Truncate) {
924 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_WRITE;
925
[email protected]8effd3f62011-03-25 16:29:07926 FileStream write_stream;
927 ASSERT_EQ(OK, write_stream.Open(temp_file_path(), flags));
[email protected]0643a492009-03-09 15:49:20928
929 // Write some data to the file.
930 const char test_data[] = "0123456789";
[email protected]5eb431e22011-10-12 08:51:38931 write_stream.Write(test_data, arraysize(test_data), CompletionCallback());
[email protected]0643a492009-03-09 15:49:20932
933 // Truncate the file.
934 ASSERT_EQ(4, write_stream.Truncate(4));
935
936 // Write again.
[email protected]5eb431e22011-10-12 08:51:38937 write_stream.Write(test_data, 4, CompletionCallback());
[email protected]0643a492009-03-09 15:49:20938
939 // Close the stream.
940 write_stream.Close();
941
942 // Read in the contents and make sure we get back what we expected.
943 std::string read_contents;
[email protected]3fc364f92009-08-06 22:35:13944 EXPECT_TRUE(file_util::ReadFileToString(temp_file_path(), &read_contents));
[email protected]0643a492009-03-09 15:49:20945
[email protected]4c2048a2009-03-24 21:02:01946 EXPECT_EQ("01230123", read_contents);
[email protected]0643a492009-03-09 15:49:20947}
948
[email protected]4c2048a2009-03-24 21:02:01949} // namespace
[email protected]96d73822011-10-10 02:11:24950
[email protected]8effd3f62011-03-25 16:29:07951} // namespace net