blob: 95e9ebd9d39f6a0bcb8ce596200086da17c051cc [file] [log] [blame]
[email protected]10342992012-02-02 18:49:431// Copyright (c) 2012 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]5ee20982013-07-17 21:51:1810#include "base/message_loop/message_loop.h"
[email protected]dd2c4382013-09-07 16:01:4711#include "base/message_loop/message_loop_proxy.h"
[email protected]21da6eb2008-11-03 17:18:1412#include "base/path_service.h"
[email protected]92aad5222009-02-09 22:26:4113#include "base/platform_file.h"
[email protected]dd2c4382013-09-07 16:01:4714#include "base/run_loop.h"
[email protected]e3d66fde2012-02-17 22:10:3415#include "base/synchronization/waitable_event.h"
16#include "base/test/test_timeouts.h"
17#include "net/base/capturing_net_log.h"
[email protected]9f49afb2012-02-16 09:59:2018#include "net/base/io_buffer.h"
[email protected]21da6eb2008-11-03 17:18:1419#include "net/base/net_errors.h"
20#include "net/base/test_completion_callback.h"
21#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1522#include "testing/platform_test.h"
[email protected]21da6eb2008-11-03 17:18:1423
[email protected]f12d1e12013-11-20 07:04:5524#if defined(OS_ANDROID)
25#include "base/test/test_file_util.h"
26#endif
27
[email protected]8effd3f62011-03-25 16:29:0728namespace net {
[email protected]96d73822011-10-10 02:11:2429
[email protected]4c2048a2009-03-24 21:02:0130namespace {
31
32const char kTestData[] = "0123456789";
33const int kTestDataSize = arraysize(kTestData) - 1;
[email protected]21da6eb2008-11-03 17:18:1434
[email protected]9f49afb2012-02-16 09:59:2035// Creates an IOBufferWithSize that contains the kTestDataSize.
36IOBufferWithSize* CreateTestDataBuffer() {
37 IOBufferWithSize* buf = new IOBufferWithSize(kTestDataSize);
38 memcpy(buf->data(), kTestData, kTestDataSize);
39 return buf;
40}
41
[email protected]96d73822011-10-10 02:11:2442} // namespace
43
[email protected]21da6eb2008-11-03 17:18:1444class FileStreamTest : public PlatformTest {
45 public:
46 virtual void SetUp() {
47 PlatformTest::SetUp();
48
[email protected]03d9afc02013-12-03 17:55:5249 base::CreateTemporaryFile(&temp_file_path_);
[email protected]7ff3f632009-10-13 18:43:3550 file_util::WriteFile(temp_file_path_, kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1451 }
52 virtual void TearDown() {
[email protected]dd3aa792013-07-16 19:10:2353 EXPECT_TRUE(base::DeleteFile(temp_file_path_, false));
[email protected]21da6eb2008-11-03 17:18:1454
[email protected]dd2c4382013-09-07 16:01:4755 // FileStreamContexts must be asynchronously closed on the file task runner
56 // before they can be deleted. Pump the RunLoop to avoid leaks.
57 base::RunLoop().RunUntilIdle();
[email protected]21da6eb2008-11-03 17:18:1458 PlatformTest::TearDown();
59 }
[email protected]96d73822011-10-10 02:11:2460
[email protected]6cdfd7f2013-02-08 20:40:1561 const base::FilePath temp_file_path() const { return temp_file_path_; }
[email protected]96d73822011-10-10 02:11:2462
[email protected]21da6eb2008-11-03 17:18:1463 private:
[email protected]6cdfd7f2013-02-08 20:40:1564 base::FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1465};
66
[email protected]96d73822011-10-10 02:11:2467namespace {
68
[email protected]21da6eb2008-11-03 17:18:1469TEST_F(FileStreamTest, BasicOpenClose) {
[email protected]96d73822011-10-10 02:11:2470 base::PlatformFile file = base::kInvalidPlatformFileValue;
71 {
[email protected]dd2c4382013-09-07 16:01:4772 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]fe57eb22012-02-09 05:59:4073 int rv = stream.OpenSync(temp_file_path(),
[email protected]96d73822011-10-10 02:11:2474 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
75 EXPECT_EQ(OK, rv);
76 EXPECT_TRUE(stream.IsOpen());
[email protected]84e0309f2012-02-24 01:56:5977 file = stream.GetPlatformFileForTesting();
[email protected]96d73822011-10-10 02:11:2478 }
79 EXPECT_NE(base::kInvalidPlatformFileValue, file);
80 base::PlatformFileInfo info;
81 // The file should be closed.
82 EXPECT_FALSE(base::GetPlatformFileInfo(file, &info));
83}
84
[email protected]c1d9cf742013-09-12 06:37:1985TEST_F(FileStreamTest, BasicOpenExplicitClose) {
86 base::PlatformFile file = base::kInvalidPlatformFileValue;
87 FileStream stream(NULL);
88 int rv = stream.OpenSync(temp_file_path(),
89 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ);
90 EXPECT_EQ(OK, rv);
91 EXPECT_TRUE(stream.IsOpen());
92 file = stream.GetPlatformFileForTesting();
93 EXPECT_NE(base::kInvalidPlatformFileValue, file);
94 EXPECT_EQ(OK, stream.CloseSync());
95 EXPECT_FALSE(stream.IsOpen());
96 base::PlatformFileInfo info;
97 // The file should be closed.
98 EXPECT_FALSE(base::GetPlatformFileInfo(file, &info));
99}
100
101TEST_F(FileStreamTest, AsyncOpenExplicitClose) {
102 base::PlatformFile file = base::kInvalidPlatformFileValue;
103 TestCompletionCallback callback;
104 FileStream stream(NULL);
105 int flags = base::PLATFORM_FILE_OPEN |
106 base::PLATFORM_FILE_READ |
107 base::PLATFORM_FILE_ASYNC;
108 int rv = stream.Open(temp_file_path(), flags, callback.callback());
109 EXPECT_EQ(ERR_IO_PENDING, rv);
110 EXPECT_EQ(OK, callback.WaitForResult());
111 EXPECT_TRUE(stream.IsOpen());
112 file = stream.GetPlatformFileForTesting();
113 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback()));
114 EXPECT_EQ(OK, callback.WaitForResult());
115 EXPECT_FALSE(stream.IsOpen());
116 base::PlatformFileInfo info;
117 // The file should be closed.
118 EXPECT_FALSE(base::GetPlatformFileInfo(file, &info));
119}
120
121TEST_F(FileStreamTest, AsyncOpenExplicitCloseOrphaned) {
122 base::PlatformFile file = base::kInvalidPlatformFileValue;
123 TestCompletionCallback callback;
124 base::PlatformFileInfo info;
125 scoped_ptr<FileStream> stream(new FileStream(
126 NULL, base::MessageLoopProxy::current()));
127 int flags = base::PLATFORM_FILE_OPEN |
128 base::PLATFORM_FILE_READ |
129 base::PLATFORM_FILE_ASYNC;
130 int rv = stream->Open(temp_file_path(), flags, callback.callback());
131 EXPECT_EQ(ERR_IO_PENDING, rv);
132 EXPECT_EQ(OK, callback.WaitForResult());
133 EXPECT_TRUE(stream->IsOpen());
134 file = stream->GetPlatformFileForTesting();
135 EXPECT_EQ(ERR_IO_PENDING, stream->Close(callback.callback()));
136 stream.reset();
137 // File isn't actually closed yet.
138 EXPECT_TRUE(base::GetPlatformFileInfo(file, &info));
139 base::RunLoop runloop;
140 runloop.RunUntilIdle();
141 // The file should now be closed, though the callback has not been called.
142 EXPECT_FALSE(base::GetPlatformFileInfo(file, &info));
143}
144
[email protected]aab1b9e2012-11-06 00:29:51145TEST_F(FileStreamTest, FileHandleNotLeftOpen) {
[email protected]96d73822011-10-10 02:11:24146 bool created = false;
147 ASSERT_EQ(kTestDataSize,
148 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
149 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
150 base::PlatformFile file = base::CreatePlatformFile(
151 temp_file_path(), flags, &created, NULL);
152
153 {
154 // Seek to the beginning of the file and read.
[email protected]dd2c4382013-09-07 16:01:47155 FileStream read_stream(file, flags, NULL,
156 base::MessageLoopProxy::current());
[email protected]96d73822011-10-10 02:11:24157 EXPECT_TRUE(read_stream.IsOpen());
158 }
159
160 EXPECT_NE(base::kInvalidPlatformFileValue, file);
161 base::PlatformFileInfo info;
[email protected]aab1b9e2012-11-06 00:29:51162 // The file should be closed.
163 EXPECT_FALSE(base::GetPlatformFileInfo(file, &info));
[email protected]21da6eb2008-11-03 17:18:14164}
165
[email protected]92aad5222009-02-09 22:26:41166// Test the use of FileStream with a file handle provided at construction.
167TEST_F(FileStreamTest, UseFileHandle) {
168 bool created = false;
169
170 // 1. Test reading with a file handle.
171 ASSERT_EQ(kTestDataSize,
172 file_util::WriteFile(temp_file_path(), kTestData, kTestDataSize));
173 int flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_READ;
174 base::PlatformFile file = base::CreatePlatformFile(
[email protected]ed65fec2010-08-31 19:30:27175 temp_file_path(), flags, &created, NULL);
[email protected]92aad5222009-02-09 22:26:41176
177 // Seek to the beginning of the file and read.
[email protected]dd2c4382013-09-07 16:01:47178 scoped_ptr<FileStream> read_stream(
179 new FileStream(file, flags, NULL, base::MessageLoopProxy::current()));
[email protected]aab1b9e2012-11-06 00:29:51180 ASSERT_EQ(0, read_stream->SeekSync(FROM_BEGIN, 0));
181 ASSERT_EQ(kTestDataSize, read_stream->Available());
[email protected]92aad5222009-02-09 22:26:41182 // Read into buffer and compare.
183 char buffer[kTestDataSize];
[email protected]5eb431e22011-10-12 08:51:38184 ASSERT_EQ(kTestDataSize,
[email protected]aab1b9e2012-11-06 00:29:51185 read_stream->ReadSync(buffer, kTestDataSize));
[email protected]92aad5222009-02-09 22:26:41186 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
[email protected]aab1b9e2012-11-06 00:29:51187 read_stream.reset();
[email protected]92aad5222009-02-09 22:26:41188
189 // 2. Test writing with a file handle.
[email protected]dd3aa792013-07-16 19:10:23190 base::DeleteFile(temp_file_path(), false);
[email protected]92aad5222009-02-09 22:26:41191 flags = base::PLATFORM_FILE_OPEN_ALWAYS | base::PLATFORM_FILE_WRITE;
[email protected]ed65fec2010-08-31 19:30:27192 file = base::CreatePlatformFile(temp_file_path(), flags, &created, NULL);
[email protected]92aad5222009-02-09 22:26:41193
[email protected]dd2c4382013-09-07 16:01:47194 scoped_ptr<FileStream> write_stream(
195 new FileStream(file, flags, NULL, base::MessageLoopProxy::current()));
[email protected]aab1b9e2012-11-06 00:29:51196 ASSERT_EQ(0, write_stream->SeekSync(FROM_BEGIN, 0));
[email protected]5eb431e22011-10-12 08:51:38197 ASSERT_EQ(kTestDataSize,
[email protected]aab1b9e2012-11-06 00:29:51198 write_stream->WriteSync(kTestData, kTestDataSize));
199 write_stream.reset();
[email protected]92aad5222009-02-09 22:26:41200
201 // Read into buffer and compare to make sure the handle worked fine.
202 ASSERT_EQ(kTestDataSize,
203 file_util::ReadFile(temp_file_path(), buffer, kTestDataSize));
204 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
205}
206
[email protected]21da6eb2008-11-03 17:18:14207TEST_F(FileStreamTest, UseClosedStream) {
[email protected]dd2c4382013-09-07 16:01:47208 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]21da6eb2008-11-03 17:18:14209
210 EXPECT_FALSE(stream.IsOpen());
211
212 // Try seeking...
[email protected]cf02541b2012-04-11 08:02:17213 int64 new_offset = stream.SeekSync(FROM_BEGIN, 5);
[email protected]8effd3f62011-03-25 16:29:07214 EXPECT_EQ(ERR_UNEXPECTED, new_offset);
[email protected]21da6eb2008-11-03 17:18:14215
216 // Try available...
217 int64 avail = stream.Available();
[email protected]8effd3f62011-03-25 16:29:07218 EXPECT_EQ(ERR_UNEXPECTED, avail);
[email protected]21da6eb2008-11-03 17:18:14219
220 // Try reading...
221 char buf[10];
[email protected]6b230f42012-02-15 04:08:41222 int rv = stream.ReadSync(buf, arraysize(buf));
[email protected]8effd3f62011-03-25 16:29:07223 EXPECT_EQ(ERR_UNEXPECTED, rv);
[email protected]21da6eb2008-11-03 17:18:14224}
225
226TEST_F(FileStreamTest, BasicRead) {
227 int64 file_size;
228 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
229 EXPECT_TRUE(ok);
230
[email protected]dd2c4382013-09-07 16:01:47231 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38232 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14233 base::PLATFORM_FILE_READ;
[email protected]fe57eb22012-02-09 05:59:40234 int rv = stream.OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07235 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14236
237 int64 total_bytes_avail = stream.Available();
238 EXPECT_EQ(file_size, total_bytes_avail);
239
[email protected]4c2048a2009-03-24 21:02:01240 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14241
242 std::string data_read;
243 for (;;) {
244 char buf[4];
[email protected]6b230f42012-02-15 04:08:41245 rv = stream.ReadSync(buf, arraysize(buf));
[email protected]21da6eb2008-11-03 17:18:14246 EXPECT_LE(0, rv);
247 if (rv <= 0)
248 break;
249 total_bytes_read += rv;
250 data_read.append(buf, rv);
251 }
252 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01253 EXPECT_EQ(kTestData, data_read);
[email protected]21da6eb2008-11-03 17:18:14254}
255
256TEST_F(FileStreamTest, AsyncRead) {
257 int64 file_size;
258 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
259 EXPECT_TRUE(ok);
260
[email protected]dd2c4382013-09-07 16:01:47261 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38262 int flags = base::PLATFORM_FILE_OPEN |
263 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14264 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20265 TestCompletionCallback callback;
266 int rv = stream.Open(temp_file_path(), flags, callback.callback());
267 EXPECT_EQ(ERR_IO_PENDING, rv);
268 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14269
270 int64 total_bytes_avail = stream.Available();
271 EXPECT_EQ(file_size, total_bytes_avail);
272
[email protected]4c2048a2009-03-24 21:02:01273 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14274
275 std::string data_read;
276 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20277 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50278 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07279 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14280 rv = callback.WaitForResult();
281 EXPECT_LE(0, rv);
282 if (rv <= 0)
283 break;
284 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20285 data_read.append(buf->data(), rv);
[email protected]21da6eb2008-11-03 17:18:14286 }
287 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01288 EXPECT_EQ(kTestData, data_read);
289}
290
[email protected]06b802b2012-02-22 03:34:54291TEST_F(FileStreamTest, AsyncRead_EarlyDelete) {
292 int64 file_size;
293 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
294 EXPECT_TRUE(ok);
295
[email protected]dd2c4382013-09-07 16:01:47296 scoped_ptr<FileStream> stream(
297 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]06b802b2012-02-22 03:34:54298 int flags = base::PLATFORM_FILE_OPEN |
299 base::PLATFORM_FILE_READ |
300 base::PLATFORM_FILE_ASYNC;
301 TestCompletionCallback callback;
302 int rv = stream->Open(temp_file_path(), flags, callback.callback());
303 EXPECT_EQ(ERR_IO_PENDING, rv);
304 EXPECT_EQ(OK, callback.WaitForResult());
305
306 int64 total_bytes_avail = stream->Available();
307 EXPECT_EQ(file_size, total_bytes_avail);
308
309 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50310 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]06b802b2012-02-22 03:34:54311 stream.reset(); // Delete instead of closing it.
312 if (rv < 0) {
313 EXPECT_EQ(ERR_IO_PENDING, rv);
314 // The callback should not be called if the request is cancelled.
[email protected]dd2c4382013-09-07 16:01:47315 base::RunLoop().RunUntilIdle();
[email protected]06b802b2012-02-22 03:34:54316 EXPECT_FALSE(callback.have_result());
317 } else {
318 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv));
319 }
320}
321
[email protected]21da6eb2008-11-03 17:18:14322TEST_F(FileStreamTest, BasicRead_FromOffset) {
323 int64 file_size;
324 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
325 EXPECT_TRUE(ok);
326
[email protected]dd2c4382013-09-07 16:01:47327 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38328 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14329 base::PLATFORM_FILE_READ;
[email protected]fe57eb22012-02-09 05:59:40330 int rv = stream.OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07331 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14332
333 const int64 kOffset = 3;
[email protected]cf02541b2012-04-11 08:02:17334 int64 new_offset = stream.SeekSync(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14335 EXPECT_EQ(kOffset, new_offset);
336
337 int64 total_bytes_avail = stream.Available();
338 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
339
340 int64 total_bytes_read = 0;
341
342 std::string data_read;
343 for (;;) {
344 char buf[4];
[email protected]6b230f42012-02-15 04:08:41345 rv = stream.ReadSync(buf, arraysize(buf));
[email protected]21da6eb2008-11-03 17:18:14346 EXPECT_LE(0, rv);
347 if (rv <= 0)
348 break;
349 total_bytes_read += rv;
350 data_read.append(buf, rv);
351 }
352 EXPECT_EQ(file_size - kOffset, total_bytes_read);
353 EXPECT_TRUE(data_read == kTestData + kOffset);
[email protected]4c2048a2009-03-24 21:02:01354 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14355}
356
357TEST_F(FileStreamTest, AsyncRead_FromOffset) {
358 int64 file_size;
359 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
360 EXPECT_TRUE(ok);
361
[email protected]dd2c4382013-09-07 16:01:47362 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38363 int flags = base::PLATFORM_FILE_OPEN |
364 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14365 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20366 TestCompletionCallback callback;
367 int rv = stream.Open(temp_file_path(), flags, callback.callback());
368 EXPECT_EQ(ERR_IO_PENDING, rv);
369 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14370
[email protected]cf02541b2012-04-11 08:02:17371 TestInt64CompletionCallback callback64;
[email protected]21da6eb2008-11-03 17:18:14372 const int64 kOffset = 3;
[email protected]cf02541b2012-04-11 08:02:17373 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback());
374 ASSERT_EQ(ERR_IO_PENDING, rv);
375 int64 new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14376 EXPECT_EQ(kOffset, new_offset);
377
378 int64 total_bytes_avail = stream.Available();
379 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
380
[email protected]4c2048a2009-03-24 21:02:01381 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14382
383 std::string data_read;
384 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20385 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50386 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07387 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14388 rv = callback.WaitForResult();
389 EXPECT_LE(0, rv);
390 if (rv <= 0)
391 break;
392 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20393 data_read.append(buf->data(), rv);
[email protected]21da6eb2008-11-03 17:18:14394 }
395 EXPECT_EQ(file_size - kOffset, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01396 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14397}
398
399TEST_F(FileStreamTest, SeekAround) {
[email protected]dd2c4382013-09-07 16:01:47400 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38401 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14402 base::PLATFORM_FILE_READ;
[email protected]fe57eb22012-02-09 05:59:40403 int rv = stream.OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07404 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14405
406 const int64 kOffset = 3;
[email protected]cf02541b2012-04-11 08:02:17407 int64 new_offset = stream.SeekSync(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14408 EXPECT_EQ(kOffset, new_offset);
409
[email protected]cf02541b2012-04-11 08:02:17410 new_offset = stream.SeekSync(FROM_CURRENT, kOffset);
[email protected]21da6eb2008-11-03 17:18:14411 EXPECT_EQ(2 * kOffset, new_offset);
412
[email protected]cf02541b2012-04-11 08:02:17413 new_offset = stream.SeekSync(FROM_CURRENT, -kOffset);
[email protected]21da6eb2008-11-03 17:18:14414 EXPECT_EQ(kOffset, new_offset);
415
416 const int kTestDataLen = arraysize(kTestData) - 1;
417
[email protected]cf02541b2012-04-11 08:02:17418 new_offset = stream.SeekSync(FROM_END, -kTestDataLen);
419 EXPECT_EQ(0, new_offset);
420}
421
422TEST_F(FileStreamTest, AsyncSeekAround) {
[email protected]dd2c4382013-09-07 16:01:47423 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]cf02541b2012-04-11 08:02:17424 int flags = base::PLATFORM_FILE_OPEN |
425 base::PLATFORM_FILE_ASYNC |
426 base::PLATFORM_FILE_READ;
[email protected]66af1d62013-03-06 23:13:20427 TestCompletionCallback callback;
428 int rv = stream.Open(temp_file_path(), flags, callback.callback());
429 EXPECT_EQ(ERR_IO_PENDING, rv);
430 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]cf02541b2012-04-11 08:02:17431
[email protected]66af1d62013-03-06 23:13:20432 TestInt64CompletionCallback callback64;
[email protected]cf02541b2012-04-11 08:02:17433
434 const int64 kOffset = 3;
[email protected]66af1d62013-03-06 23:13:20435 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17436 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20437 int64 new_offset = callback64.WaitForResult();
[email protected]cf02541b2012-04-11 08:02:17438 EXPECT_EQ(kOffset, new_offset);
439
[email protected]66af1d62013-03-06 23:13:20440 rv = stream.Seek(FROM_CURRENT, kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17441 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20442 new_offset = callback64.WaitForResult();
[email protected]cf02541b2012-04-11 08:02:17443 EXPECT_EQ(2 * kOffset, new_offset);
444
[email protected]66af1d62013-03-06 23:13:20445 rv = stream.Seek(FROM_CURRENT, -kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17446 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20447 new_offset = callback64.WaitForResult();
[email protected]cf02541b2012-04-11 08:02:17448 EXPECT_EQ(kOffset, new_offset);
449
450 const int kTestDataLen = arraysize(kTestData) - 1;
451
[email protected]66af1d62013-03-06 23:13:20452 rv = stream.Seek(FROM_END, -kTestDataLen, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17453 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20454 new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14455 EXPECT_EQ(0, new_offset);
456}
457
458TEST_F(FileStreamTest, BasicWrite) {
[email protected]dd2c4382013-09-07 16:01:47459 scoped_ptr<FileStream> stream(
460 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]f0a51fb52009-03-05 12:46:38461 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
[email protected]21da6eb2008-11-03 17:18:14462 base::PLATFORM_FILE_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51463 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07464 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14465
466 int64 file_size;
467 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
468 EXPECT_TRUE(ok);
469 EXPECT_EQ(0, file_size);
470
[email protected]aab1b9e2012-11-06 00:29:51471 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:14472 EXPECT_EQ(kTestDataSize, rv);
[email protected]aab1b9e2012-11-06 00:29:51473 stream.reset();
[email protected]21da6eb2008-11-03 17:18:14474
475 ok = file_util::GetFileSize(temp_file_path(), &file_size);
476 EXPECT_TRUE(ok);
477 EXPECT_EQ(kTestDataSize, file_size);
478}
479
480TEST_F(FileStreamTest, AsyncWrite) {
[email protected]dd2c4382013-09-07 16:01:47481 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38482 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
483 base::PLATFORM_FILE_WRITE |
[email protected]21da6eb2008-11-03 17:18:14484 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20485 TestCompletionCallback callback;
486 int rv = stream.Open(temp_file_path(), flags, callback.callback());
487 EXPECT_EQ(ERR_IO_PENDING, rv);
488 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14489
490 int64 file_size;
491 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
492 EXPECT_TRUE(ok);
493 EXPECT_EQ(0, file_size);
494
[email protected]4c2048a2009-03-24 21:02:01495 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14496
[email protected]9f49afb2012-02-16 09:59:20497 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
498 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50499 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]21da6eb2008-11-03 17:18:14500 while (total_bytes_written != kTestDataSize) {
[email protected]90499482013-06-01 00:39:50501 rv = stream.Write(
502 drainable.get(), drainable->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07503 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14504 rv = callback.WaitForResult();
505 EXPECT_LT(0, rv);
506 if (rv <= 0)
507 break;
[email protected]9f49afb2012-02-16 09:59:20508 drainable->DidConsume(rv);
[email protected]21da6eb2008-11-03 17:18:14509 total_bytes_written += rv;
510 }
511 ok = file_util::GetFileSize(temp_file_path(), &file_size);
512 EXPECT_TRUE(ok);
513 EXPECT_EQ(file_size, total_bytes_written);
514}
515
[email protected]aab1b9e2012-11-06 00:29:51516TEST_F(FileStreamTest, AsyncWrite_EarlyDelete) {
[email protected]dd2c4382013-09-07 16:01:47517 scoped_ptr<FileStream> stream(
518 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]4c2048a2009-03-24 21:02:01519 int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
520 base::PLATFORM_FILE_WRITE |
521 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20522 TestCompletionCallback callback;
523 int rv = stream->Open(temp_file_path(), flags, callback.callback());
524 EXPECT_EQ(ERR_IO_PENDING, rv);
525 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01526
527 int64 file_size;
528 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
529 EXPECT_TRUE(ok);
530 EXPECT_EQ(0, file_size);
531
[email protected]9f49afb2012-02-16 09:59:20532 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50533 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]aab1b9e2012-11-06 00:29:51534 stream.reset();
[email protected]3828a752009-06-03 23:05:59535 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07536 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59537 // The callback should not be called if the request is cancelled.
[email protected]dd2c4382013-09-07 16:01:47538 base::RunLoop().RunUntilIdle();
[email protected]3828a752009-06-03 23:05:59539 EXPECT_FALSE(callback.have_result());
540 } else {
541 ok = file_util::GetFileSize(temp_file_path(), &file_size);
542 EXPECT_TRUE(ok);
543 EXPECT_EQ(file_size, rv);
544 }
[email protected]4c2048a2009-03-24 21:02:01545}
546
[email protected]21da6eb2008-11-03 17:18:14547TEST_F(FileStreamTest, BasicWrite_FromOffset) {
[email protected]dd2c4382013-09-07 16:01:47548 scoped_ptr<FileStream> stream(
549 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]f0a51fb52009-03-05 12:46:38550 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14551 base::PLATFORM_FILE_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51552 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07553 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14554
555 int64 file_size;
556 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
557 EXPECT_TRUE(ok);
558 EXPECT_EQ(kTestDataSize, file_size);
559
560 const int64 kOffset = 0;
[email protected]aab1b9e2012-11-06 00:29:51561 int64 new_offset = stream->SeekSync(FROM_END, kOffset);
[email protected]21da6eb2008-11-03 17:18:14562 EXPECT_EQ(kTestDataSize, new_offset);
563
[email protected]aab1b9e2012-11-06 00:29:51564 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:14565 EXPECT_EQ(kTestDataSize, rv);
[email protected]aab1b9e2012-11-06 00:29:51566 stream.reset();
[email protected]21da6eb2008-11-03 17:18:14567
568 ok = file_util::GetFileSize(temp_file_path(), &file_size);
569 EXPECT_TRUE(ok);
570 EXPECT_EQ(kTestDataSize * 2, file_size);
571}
572
573TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
574 int64 file_size;
575 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
576 EXPECT_TRUE(ok);
577
[email protected]dd2c4382013-09-07 16:01:47578 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]f0a51fb52009-03-05 12:46:38579 int flags = base::PLATFORM_FILE_OPEN |
[email protected]21da6eb2008-11-03 17:18:14580 base::PLATFORM_FILE_WRITE |
581 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20582 TestCompletionCallback callback;
583 int rv = stream.Open(temp_file_path(), flags, callback.callback());
584 EXPECT_EQ(ERR_IO_PENDING, rv);
585 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14586
[email protected]cf02541b2012-04-11 08:02:17587 TestInt64CompletionCallback callback64;
[email protected]21da6eb2008-11-03 17:18:14588 const int64 kOffset = 0;
[email protected]cf02541b2012-04-11 08:02:17589 rv = stream.Seek(FROM_END, kOffset, callback64.callback());
590 ASSERT_EQ(ERR_IO_PENDING, rv);
591 int64 new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14592 EXPECT_EQ(kTestDataSize, new_offset);
593
[email protected]4c2048a2009-03-24 21:02:01594 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14595
[email protected]9f49afb2012-02-16 09:59:20596 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
597 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50598 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]21da6eb2008-11-03 17:18:14599 while (total_bytes_written != kTestDataSize) {
[email protected]90499482013-06-01 00:39:50600 rv = stream.Write(
601 drainable.get(), drainable->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07602 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14603 rv = callback.WaitForResult();
604 EXPECT_LT(0, rv);
605 if (rv <= 0)
606 break;
[email protected]9f49afb2012-02-16 09:59:20607 drainable->DidConsume(rv);
[email protected]21da6eb2008-11-03 17:18:14608 total_bytes_written += rv;
609 }
610 ok = file_util::GetFileSize(temp_file_path(), &file_size);
611 EXPECT_TRUE(ok);
612 EXPECT_EQ(file_size, kTestDataSize * 2);
613}
614
615TEST_F(FileStreamTest, BasicReadWrite) {
616 int64 file_size;
617 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
618 EXPECT_TRUE(ok);
619
[email protected]dd2c4382013-09-07 16:01:47620 scoped_ptr<FileStream> stream(
621 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]f0a51fb52009-03-05 12:46:38622 int flags = base::PLATFORM_FILE_OPEN |
623 base::PLATFORM_FILE_READ |
[email protected]21da6eb2008-11-03 17:18:14624 base::PLATFORM_FILE_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51625 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07626 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14627
[email protected]aab1b9e2012-11-06 00:29:51628 int64 total_bytes_avail = stream->Available();
[email protected]21da6eb2008-11-03 17:18:14629 EXPECT_EQ(file_size, total_bytes_avail);
630
[email protected]4c2048a2009-03-24 21:02:01631 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14632
633 std::string data_read;
634 for (;;) {
635 char buf[4];
[email protected]aab1b9e2012-11-06 00:29:51636 rv = stream->ReadSync(buf, arraysize(buf));
[email protected]21da6eb2008-11-03 17:18:14637 EXPECT_LE(0, rv);
638 if (rv <= 0)
639 break;
640 total_bytes_read += rv;
641 data_read.append(buf, rv);
642 }
643 EXPECT_EQ(file_size, total_bytes_read);
644 EXPECT_TRUE(data_read == kTestData);
645
[email protected]aab1b9e2012-11-06 00:29:51646 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:14647 EXPECT_EQ(kTestDataSize, rv);
[email protected]aab1b9e2012-11-06 00:29:51648 stream.reset();
[email protected]21da6eb2008-11-03 17:18:14649
650 ok = file_util::GetFileSize(temp_file_path(), &file_size);
651 EXPECT_TRUE(ok);
652 EXPECT_EQ(kTestDataSize * 2, file_size);
653}
654
[email protected]4c2048a2009-03-24 21:02:01655TEST_F(FileStreamTest, BasicWriteRead) {
656 int64 file_size;
657 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
658 EXPECT_TRUE(ok);
659
[email protected]dd2c4382013-09-07 16:01:47660 scoped_ptr<FileStream> stream(
661 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]4c2048a2009-03-24 21:02:01662 int flags = base::PLATFORM_FILE_OPEN |
663 base::PLATFORM_FILE_READ |
664 base::PLATFORM_FILE_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51665 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07666 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01667
[email protected]aab1b9e2012-11-06 00:29:51668 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01669 EXPECT_EQ(file_size, total_bytes_avail);
670
[email protected]aab1b9e2012-11-06 00:29:51671 int64 offset = stream->SeekSync(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01672 EXPECT_EQ(offset, file_size);
673
[email protected]aab1b9e2012-11-06 00:29:51674 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]4c2048a2009-03-24 21:02:01675 EXPECT_EQ(kTestDataSize, rv);
676
[email protected]aab1b9e2012-11-06 00:29:51677 offset = stream->SeekSync(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01678 EXPECT_EQ(0, offset);
679
680 int64 total_bytes_read = 0;
681
682 std::string data_read;
683 for (;;) {
684 char buf[4];
[email protected]aab1b9e2012-11-06 00:29:51685 rv = stream->ReadSync(buf, arraysize(buf));
[email protected]4c2048a2009-03-24 21:02:01686 EXPECT_LE(0, rv);
687 if (rv <= 0)
688 break;
689 total_bytes_read += rv;
690 data_read.append(buf, rv);
691 }
[email protected]aab1b9e2012-11-06 00:29:51692 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01693
694 ok = file_util::GetFileSize(temp_file_path(), &file_size);
695 EXPECT_TRUE(ok);
696 EXPECT_EQ(kTestDataSize * 2, file_size);
697 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
698
699 const std::string kExpectedFileData =
700 std::string(kTestData) + std::string(kTestData);
701 EXPECT_EQ(kExpectedFileData, data_read);
702}
703
704TEST_F(FileStreamTest, BasicAsyncReadWrite) {
705 int64 file_size;
706 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
707 EXPECT_TRUE(ok);
708
[email protected]dd2c4382013-09-07 16:01:47709 scoped_ptr<FileStream> stream(
710 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]4c2048a2009-03-24 21:02:01711 int flags = base::PLATFORM_FILE_OPEN |
712 base::PLATFORM_FILE_READ |
713 base::PLATFORM_FILE_WRITE |
714 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20715 TestCompletionCallback callback;
716 int rv = stream->Open(temp_file_path(), flags, callback.callback());
717 EXPECT_EQ(ERR_IO_PENDING, rv);
718 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01719
[email protected]aab1b9e2012-11-06 00:29:51720 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01721 EXPECT_EQ(file_size, total_bytes_avail);
722
[email protected]4c2048a2009-03-24 21:02:01723 int64 total_bytes_read = 0;
724
725 std::string data_read;
726 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20727 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50728 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07729 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01730 rv = callback.WaitForResult();
731 EXPECT_LE(0, rv);
732 if (rv <= 0)
733 break;
734 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20735 data_read.append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01736 }
737 EXPECT_EQ(file_size, total_bytes_read);
738 EXPECT_TRUE(data_read == kTestData);
739
740 int total_bytes_written = 0;
741
[email protected]9f49afb2012-02-16 09:59:20742 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
743 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50744 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]4c2048a2009-03-24 21:02:01745 while (total_bytes_written != kTestDataSize) {
[email protected]90499482013-06-01 00:39:50746 rv = stream->Write(
747 drainable.get(), drainable->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07748 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01749 rv = callback.WaitForResult();
750 EXPECT_LT(0, rv);
751 if (rv <= 0)
752 break;
[email protected]9f49afb2012-02-16 09:59:20753 drainable->DidConsume(rv);
[email protected]4c2048a2009-03-24 21:02:01754 total_bytes_written += rv;
755 }
756
[email protected]aab1b9e2012-11-06 00:29:51757 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01758
759 ok = file_util::GetFileSize(temp_file_path(), &file_size);
760 EXPECT_TRUE(ok);
761 EXPECT_EQ(kTestDataSize * 2, file_size);
762}
763
764TEST_F(FileStreamTest, BasicAsyncWriteRead) {
765 int64 file_size;
766 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
767 EXPECT_TRUE(ok);
768
[email protected]dd2c4382013-09-07 16:01:47769 scoped_ptr<FileStream> stream(
770 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]4c2048a2009-03-24 21:02:01771 int flags = base::PLATFORM_FILE_OPEN |
772 base::PLATFORM_FILE_READ |
773 base::PLATFORM_FILE_WRITE |
774 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20775 TestCompletionCallback callback;
776 int rv = stream->Open(temp_file_path(), flags, callback.callback());
777 EXPECT_EQ(ERR_IO_PENDING, rv);
778 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01779
[email protected]aab1b9e2012-11-06 00:29:51780 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01781 EXPECT_EQ(file_size, total_bytes_avail);
782
[email protected]cf02541b2012-04-11 08:02:17783 TestInt64CompletionCallback callback64;
[email protected]aab1b9e2012-11-06 00:29:51784 rv = stream->Seek(FROM_END, 0, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17785 ASSERT_EQ(ERR_IO_PENDING, rv);
786 int64 offset = callback64.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01787 EXPECT_EQ(offset, file_size);
788
[email protected]4c2048a2009-03-24 21:02:01789 int total_bytes_written = 0;
790
[email protected]9f49afb2012-02-16 09:59:20791 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
792 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50793 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]4c2048a2009-03-24 21:02:01794 while (total_bytes_written != kTestDataSize) {
[email protected]90499482013-06-01 00:39:50795 rv = stream->Write(
796 drainable.get(), drainable->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07797 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01798 rv = callback.WaitForResult();
799 EXPECT_LT(0, rv);
800 if (rv <= 0)
801 break;
[email protected]9f49afb2012-02-16 09:59:20802 drainable->DidConsume(rv);
[email protected]4c2048a2009-03-24 21:02:01803 total_bytes_written += rv;
804 }
805
806 EXPECT_EQ(kTestDataSize, total_bytes_written);
807
[email protected]aab1b9e2012-11-06 00:29:51808 rv = stream->Seek(FROM_BEGIN, 0, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17809 ASSERT_EQ(ERR_IO_PENDING, rv);
810 offset = callback64.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01811 EXPECT_EQ(0, offset);
812
813 int total_bytes_read = 0;
814
815 std::string data_read;
816 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20817 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50818 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07819 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01820 rv = callback.WaitForResult();
821 EXPECT_LE(0, rv);
822 if (rv <= 0)
823 break;
824 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20825 data_read.append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01826 }
[email protected]aab1b9e2012-11-06 00:29:51827 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01828
829 ok = file_util::GetFileSize(temp_file_path(), &file_size);
830 EXPECT_TRUE(ok);
831 EXPECT_EQ(kTestDataSize * 2, file_size);
832
833 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
834 const std::string kExpectedFileData =
835 std::string(kTestData) + std::string(kTestData);
836 EXPECT_EQ(kExpectedFileData, data_read);
837}
838
[email protected]5eb431e22011-10-12 08:51:38839class TestWriteReadCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01840 public:
[email protected]90499482013-06-01 00:39:50841 TestWriteReadCompletionCallback(FileStream* stream,
842 int* total_bytes_written,
843 int* total_bytes_read,
844 std::string* data_read)
[email protected]4c2048a2009-03-24 21:02:01845 : result_(0),
846 have_result_(false),
847 waiting_for_result_(false),
848 stream_(stream),
849 total_bytes_written_(total_bytes_written),
850 total_bytes_read_(total_bytes_read),
[email protected]5eb431e22011-10-12 08:51:38851 data_read_(data_read),
852 callback_(base::Bind(&TestWriteReadCompletionCallback::OnComplete,
[email protected]9f49afb2012-02-16 09:59:20853 base::Unretained(this))),
854 test_data_(CreateTestDataBuffer()),
[email protected]90499482013-06-01 00:39:50855 drainable_(new DrainableIOBuffer(test_data_.get(), kTestDataSize)) {}
[email protected]4c2048a2009-03-24 21:02:01856
857 int WaitForResult() {
858 DCHECK(!waiting_for_result_);
859 while (!have_result_) {
860 waiting_for_result_ = true;
[email protected]dd2c4382013-09-07 16:01:47861 base::RunLoop().Run();
[email protected]4c2048a2009-03-24 21:02:01862 waiting_for_result_ = false;
863 }
864 have_result_ = false; // auto-reset for next callback
865 return result_;
866 }
867
[email protected]5eb431e22011-10-12 08:51:38868 const CompletionCallback& callback() const { return callback_; }
869
[email protected]4c2048a2009-03-24 21:02:01870 private:
[email protected]5eb431e22011-10-12 08:51:38871 void OnComplete(int result) {
872 DCHECK_LT(0, result);
873 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01874
875 int rv;
876
877 if (*total_bytes_written_ != kTestDataSize) {
878 // Recurse to finish writing all data.
879 int total_bytes_written = 0, total_bytes_read = 0;
880 std::string data_read;
[email protected]5eb431e22011-10-12 08:51:38881 TestWriteReadCompletionCallback callback(
[email protected]4c2048a2009-03-24 21:02:01882 stream_, &total_bytes_written, &total_bytes_read, &data_read);
[email protected]90499482013-06-01 00:39:50883 rv = stream_->Write(
884 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07885 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01886 rv = callback.WaitForResult();
[email protected]9f49afb2012-02-16 09:59:20887 drainable_->DidConsume(total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01888 *total_bytes_written_ += total_bytes_written;
889 *total_bytes_read_ += total_bytes_read;
890 *data_read_ += data_read;
891 } else { // We're done writing all data. Start reading the data.
[email protected]cf02541b2012-04-11 08:02:17892 stream_->SeekSync(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01893
[email protected]5eb431e22011-10-12 08:51:38894 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01895 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20896 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50897 rv = stream_->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07898 if (rv == ERR_IO_PENDING) {
[email protected]2da659e2013-05-23 20:51:34899 base::MessageLoop::ScopedNestableTaskAllower allow(
900 base::MessageLoop::current());
[email protected]4c2048a2009-03-24 21:02:01901 rv = callback.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01902 }
903 EXPECT_LE(0, rv);
904 if (rv <= 0)
905 break;
906 *total_bytes_read_ += rv;
[email protected]9f49afb2012-02-16 09:59:20907 data_read_->append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01908 }
909 }
910
911 result_ = *total_bytes_written_;
912 have_result_ = true;
913 if (waiting_for_result_)
[email protected]2da659e2013-05-23 20:51:34914 base::MessageLoop::current()->Quit();
[email protected]4c2048a2009-03-24 21:02:01915 }
916
917 int result_;
918 bool have_result_;
919 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07920 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01921 int* total_bytes_written_;
922 int* total_bytes_read_;
923 std::string* data_read_;
[email protected]5eb431e22011-10-12 08:51:38924 const CompletionCallback callback_;
[email protected]9f49afb2012-02-16 09:59:20925 scoped_refptr<IOBufferWithSize> test_data_;
926 scoped_refptr<DrainableIOBuffer> drainable_;
[email protected]4c2048a2009-03-24 21:02:01927
[email protected]5eb431e22011-10-12 08:51:38928 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01929};
930
931TEST_F(FileStreamTest, AsyncWriteRead) {
932 int64 file_size;
933 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
934 EXPECT_TRUE(ok);
935
[email protected]dd2c4382013-09-07 16:01:47936 scoped_ptr<FileStream> stream(
937 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]4c2048a2009-03-24 21:02:01938 int flags = base::PLATFORM_FILE_OPEN |
939 base::PLATFORM_FILE_READ |
940 base::PLATFORM_FILE_WRITE |
941 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:20942 TestCompletionCallback open_callback;
943 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
944 EXPECT_EQ(ERR_IO_PENDING, rv);
945 EXPECT_EQ(OK, open_callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01946
[email protected]aab1b9e2012-11-06 00:29:51947 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01948 EXPECT_EQ(file_size, total_bytes_avail);
949
[email protected]aab1b9e2012-11-06 00:29:51950 int64 offset = stream->SeekSync(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01951 EXPECT_EQ(offset, file_size);
952
953 int total_bytes_written = 0;
954 int total_bytes_read = 0;
955 std::string data_read;
[email protected]aab1b9e2012-11-06 00:29:51956 TestWriteReadCompletionCallback callback(stream.get(), &total_bytes_written,
[email protected]4c2048a2009-03-24 21:02:01957 &total_bytes_read, &data_read);
958
[email protected]9f49afb2012-02-16 09:59:20959 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50960 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07961 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01962 rv = callback.WaitForResult();
963 EXPECT_LT(0, rv);
964 EXPECT_EQ(kTestDataSize, total_bytes_written);
965
[email protected]aab1b9e2012-11-06 00:29:51966 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01967
968 ok = file_util::GetFileSize(temp_file_path(), &file_size);
969 EXPECT_TRUE(ok);
970 EXPECT_EQ(kTestDataSize * 2, file_size);
971
972 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
973 const std::string kExpectedFileData =
974 std::string(kTestData) + std::string(kTestData);
975 EXPECT_EQ(kExpectedFileData, data_read);
976}
977
[email protected]5eb431e22011-10-12 08:51:38978class TestWriteCloseCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01979 public:
[email protected]5eb431e22011-10-12 08:51:38980 TestWriteCloseCompletionCallback(FileStream* stream, int* total_bytes_written)
[email protected]4c2048a2009-03-24 21:02:01981 : result_(0),
982 have_result_(false),
983 waiting_for_result_(false),
984 stream_(stream),
[email protected]5eb431e22011-10-12 08:51:38985 total_bytes_written_(total_bytes_written),
986 callback_(base::Bind(&TestWriteCloseCompletionCallback::OnComplete,
[email protected]9f49afb2012-02-16 09:59:20987 base::Unretained(this))),
988 test_data_(CreateTestDataBuffer()),
[email protected]90499482013-06-01 00:39:50989 drainable_(new DrainableIOBuffer(test_data_.get(), kTestDataSize)) {}
[email protected]4c2048a2009-03-24 21:02:01990
991 int WaitForResult() {
992 DCHECK(!waiting_for_result_);
993 while (!have_result_) {
994 waiting_for_result_ = true;
[email protected]dd2c4382013-09-07 16:01:47995 base::RunLoop().Run();
[email protected]4c2048a2009-03-24 21:02:01996 waiting_for_result_ = false;
997 }
998 have_result_ = false; // auto-reset for next callback
999 return result_;
1000 }
1001
[email protected]5eb431e22011-10-12 08:51:381002 const CompletionCallback& callback() const { return callback_; }
1003
[email protected]4c2048a2009-03-24 21:02:011004 private:
[email protected]5eb431e22011-10-12 08:51:381005 void OnComplete(int result) {
1006 DCHECK_LT(0, result);
1007 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:011008
1009 int rv;
1010
1011 if (*total_bytes_written_ != kTestDataSize) {
1012 // Recurse to finish writing all data.
1013 int total_bytes_written = 0;
[email protected]5eb431e22011-10-12 08:51:381014 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written);
[email protected]90499482013-06-01 00:39:501015 rv = stream_->Write(
1016 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:071017 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:011018 rv = callback.WaitForResult();
[email protected]9f49afb2012-02-16 09:59:201019 drainable_->DidConsume(total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:011020 *total_bytes_written_ += total_bytes_written;
[email protected]4c2048a2009-03-24 21:02:011021 }
1022
1023 result_ = *total_bytes_written_;
1024 have_result_ = true;
1025 if (waiting_for_result_)
[email protected]2da659e2013-05-23 20:51:341026 base::MessageLoop::current()->Quit();
[email protected]4c2048a2009-03-24 21:02:011027 }
1028
1029 int result_;
1030 bool have_result_;
1031 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:071032 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:011033 int* total_bytes_written_;
[email protected]5eb431e22011-10-12 08:51:381034 const CompletionCallback callback_;
[email protected]9f49afb2012-02-16 09:59:201035 scoped_refptr<IOBufferWithSize> test_data_;
1036 scoped_refptr<DrainableIOBuffer> drainable_;
[email protected]4c2048a2009-03-24 21:02:011037
[email protected]5eb431e22011-10-12 08:51:381038 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:011039};
1040
1041TEST_F(FileStreamTest, AsyncWriteClose) {
1042 int64 file_size;
1043 bool ok = file_util::GetFileSize(temp_file_path(), &file_size);
1044 EXPECT_TRUE(ok);
1045
[email protected]dd2c4382013-09-07 16:01:471046 scoped_ptr<FileStream> stream(
1047 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]4c2048a2009-03-24 21:02:011048 int flags = base::PLATFORM_FILE_OPEN |
1049 base::PLATFORM_FILE_READ |
1050 base::PLATFORM_FILE_WRITE |
1051 base::PLATFORM_FILE_ASYNC;
[email protected]66af1d62013-03-06 23:13:201052 TestCompletionCallback open_callback;
1053 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
1054 EXPECT_EQ(ERR_IO_PENDING, rv);
1055 EXPECT_EQ(OK, open_callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:011056
[email protected]aab1b9e2012-11-06 00:29:511057 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:011058 EXPECT_EQ(file_size, total_bytes_avail);
1059
[email protected]aab1b9e2012-11-06 00:29:511060 int64 offset = stream->SeekSync(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:011061 EXPECT_EQ(offset, file_size);
1062
1063 int total_bytes_written = 0;
[email protected]aab1b9e2012-11-06 00:29:511064 TestWriteCloseCompletionCallback callback(stream.get(), &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:011065
[email protected]9f49afb2012-02-16 09:59:201066 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:501067 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:071068 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:011069 total_bytes_written = callback.WaitForResult();
1070 EXPECT_LT(0, total_bytes_written);
1071 EXPECT_EQ(kTestDataSize, total_bytes_written);
1072
[email protected]aab1b9e2012-11-06 00:29:511073 stream.reset();
1074
[email protected]4c2048a2009-03-24 21:02:011075 ok = file_util::GetFileSize(temp_file_path(), &file_size);
1076 EXPECT_TRUE(ok);
1077 EXPECT_EQ(kTestDataSize * 2, file_size);
1078}
1079
[email protected]0643a492009-03-09 15:49:201080// Tests truncating a file.
1081TEST_F(FileStreamTest, Truncate) {
1082 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_WRITE;
1083
[email protected]dd2c4382013-09-07 16:01:471084 scoped_ptr<FileStream> write_stream(
1085 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]aab1b9e2012-11-06 00:29:511086 ASSERT_EQ(OK, write_stream->OpenSync(temp_file_path(), flags));
[email protected]0643a492009-03-09 15:49:201087
1088 // Write some data to the file.
1089 const char test_data[] = "0123456789";
[email protected]aab1b9e2012-11-06 00:29:511090 write_stream->WriteSync(test_data, arraysize(test_data));
[email protected]0643a492009-03-09 15:49:201091
1092 // Truncate the file.
[email protected]aab1b9e2012-11-06 00:29:511093 ASSERT_EQ(4, write_stream->Truncate(4));
[email protected]0643a492009-03-09 15:49:201094
1095 // Write again.
[email protected]aab1b9e2012-11-06 00:29:511096 write_stream->WriteSync(test_data, 4);
[email protected]0643a492009-03-09 15:49:201097
1098 // Close the stream.
[email protected]aab1b9e2012-11-06 00:29:511099 write_stream.reset();
[email protected]0643a492009-03-09 15:49:201100
1101 // Read in the contents and make sure we get back what we expected.
1102 std::string read_contents;
[email protected]82f84b92013-08-30 18:23:501103 EXPECT_TRUE(base::ReadFileToString(temp_file_path(), &read_contents));
[email protected]0643a492009-03-09 15:49:201104
[email protected]4c2048a2009-03-24 21:02:011105 EXPECT_EQ("01230123", read_contents);
[email protected]0643a492009-03-09 15:49:201106}
1107
[email protected]dbb747c2012-02-29 19:29:471108TEST_F(FileStreamTest, AsyncOpenAndDelete) {
[email protected]dd2c4382013-09-07 16:01:471109 scoped_ptr<FileStream> stream(
1110 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]dbb747c2012-02-29 19:29:471111 int flags = base::PLATFORM_FILE_OPEN |
1112 base::PLATFORM_FILE_WRITE |
1113 base::PLATFORM_FILE_ASYNC;
1114 TestCompletionCallback open_callback;
1115 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
1116 EXPECT_EQ(ERR_IO_PENDING, rv);
1117
1118 // Delete the stream without waiting for the open operation to be
1119 // complete. Should be safe.
1120 stream.reset();
1121 // open_callback won't be called.
[email protected]dd2c4382013-09-07 16:01:471122 base::RunLoop().RunUntilIdle();
[email protected]dbb747c2012-02-29 19:29:471123 EXPECT_FALSE(open_callback.have_result());
1124}
1125
[email protected]bfb88ec2013-02-27 20:21:351126// Verify that async Write() errors are mapped correctly.
1127TEST_F(FileStreamTest, AsyncWriteError) {
[email protected]7f00ad62013-09-14 00:56:211128 // Try opening file as read-only and then writing to it using FileStream.
1129 base::PlatformFile file = base::CreatePlatformFile(
1130 temp_file_path(),
1131 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ |
1132 base::PLATFORM_FILE_ASYNC,
1133 NULL,
1134 NULL);
1135 ASSERT_NE(base::kInvalidPlatformFileValue, file);
[email protected]bfb88ec2013-02-27 20:21:351136
[email protected]7f00ad62013-09-14 00:56:211137 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_WRITE |
1138 base::PLATFORM_FILE_ASYNC;
1139 scoped_ptr<FileStream> stream(
1140 new FileStream(file, flags, NULL, base::MessageLoopProxy::current()));
1141
1142 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
[email protected]1a00d082013-09-14 19:57:161143 buf->data()[0] = 0;
1144
[email protected]7f00ad62013-09-14 00:56:211145 TestCompletionCallback callback;
1146 int rv = stream->Write(buf.get(), 1, callback.callback());
[email protected]bfb88ec2013-02-27 20:21:351147 if (rv == ERR_IO_PENDING)
1148 rv = callback.WaitForResult();
1149 EXPECT_LT(rv, 0);
[email protected]7f00ad62013-09-14 00:56:211150
1151 base::ClosePlatformFile(file);
[email protected]bfb88ec2013-02-27 20:21:351152}
1153
1154// Verify that async Read() errors are mapped correctly.
1155TEST_F(FileStreamTest, AsyncReadError) {
[email protected]7f00ad62013-09-14 00:56:211156 // Try opening file for write and then reading from it using FileStream.
1157 base::PlatformFile file = base::CreatePlatformFile(
1158 temp_file_path(),
1159 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE |
1160 base::PLATFORM_FILE_ASYNC,
1161 NULL,
1162 NULL);
1163 ASSERT_NE(base::kInvalidPlatformFileValue, file);
[email protected]bfb88ec2013-02-27 20:21:351164
[email protected]7f00ad62013-09-14 00:56:211165 int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ |
1166 base::PLATFORM_FILE_ASYNC;
1167 scoped_ptr<FileStream> stream(
1168 new FileStream(file, flags, NULL, base::MessageLoopProxy::current()));
1169
1170 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
1171 TestCompletionCallback callback;
1172 int rv = stream->Read(buf.get(), 1, callback.callback());
[email protected]bfb88ec2013-02-27 20:21:351173 if (rv == ERR_IO_PENDING)
1174 rv = callback.WaitForResult();
1175 EXPECT_LT(rv, 0);
[email protected]7f00ad62013-09-14 00:56:211176
1177 base::ClosePlatformFile(file);
[email protected]bfb88ec2013-02-27 20:21:351178}
1179
[email protected]f12d1e12013-11-20 07:04:551180#if defined(OS_ANDROID)
1181TEST_F(FileStreamTest, ContentUriAsyncRead) {
1182 base::FilePath test_dir;
1183 PathService::Get(base::DIR_SOURCE_ROOT, &test_dir);
1184 test_dir = test_dir.AppendASCII("net");
1185 test_dir = test_dir.AppendASCII("data");
1186 test_dir = test_dir.AppendASCII("file_stream_unittest");
1187 ASSERT_TRUE(base::PathExists(test_dir));
1188 base::FilePath image_file = test_dir.Append(FILE_PATH_LITERAL("red.png"));
1189
1190 // Insert the image into MediaStore. MediaStore will do some conversions, and
1191 // return the content URI.
1192 base::FilePath path = file_util::InsertImageIntoMediaStore(image_file);
1193 EXPECT_TRUE(path.IsContentUri());
1194 EXPECT_TRUE(base::PathExists(path));
1195 int64 file_size;
1196 EXPECT_TRUE(file_util::GetFileSize(path, &file_size));
1197 EXPECT_LT(0, file_size);
1198
1199 FileStream stream(NULL, base::MessageLoopProxy::current());
1200 int flags = base::PLATFORM_FILE_OPEN |
1201 base::PLATFORM_FILE_READ |
1202 base::PLATFORM_FILE_ASYNC;
1203 TestCompletionCallback callback;
1204 int rv = stream.Open(path, flags, callback.callback());
1205 EXPECT_EQ(ERR_IO_PENDING, rv);
1206 EXPECT_EQ(OK, callback.WaitForResult());
1207
1208 int64 total_bytes_avail = stream.Available();
1209 EXPECT_EQ(file_size, total_bytes_avail);
1210
1211 int total_bytes_read = 0;
1212
1213 std::string data_read;
1214 for (;;) {
1215 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
1216 rv = stream.Read(buf.get(), buf->size(), callback.callback());
1217 if (rv == ERR_IO_PENDING)
1218 rv = callback.WaitForResult();
1219 EXPECT_LE(0, rv);
1220 if (rv <= 0)
1221 break;
1222 total_bytes_read += rv;
1223 data_read.append(buf->data(), rv);
1224 }
1225 EXPECT_EQ(file_size, total_bytes_read);
1226}
1227#endif
1228
[email protected]4c2048a2009-03-24 21:02:011229} // namespace
[email protected]96d73822011-10-10 02:11:241230
[email protected]8effd3f62011-03-25 16:29:071231} // namespace net