blob: 4252c51cb0105c7852140b42c8f7ef3884264af8 [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]a08305912014-03-21 00:41:1510#include "base/files/file.h"
[email protected]5ee20982013-07-17 21:51:1811#include "base/message_loop/message_loop.h"
[email protected]dd2c4382013-09-07 16:01:4712#include "base/message_loop/message_loop_proxy.h"
[email protected]21da6eb2008-11-03 17:18:1413#include "base/path_service.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]e5c2a22e2014-03-06 20:42:3050 base::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]c1d9cf742013-09-12 06:37:1969TEST_F(FileStreamTest, BasicOpenExplicitClose) {
[email protected]c1d9cf742013-09-12 06:37:1970 FileStream stream(NULL);
71 int rv = stream.OpenSync(temp_file_path(),
[email protected]a08305912014-03-21 00:41:1572 base::File::FLAG_OPEN | base::File::FLAG_READ);
[email protected]c1d9cf742013-09-12 06:37:1973 EXPECT_EQ(OK, rv);
74 EXPECT_TRUE(stream.IsOpen());
[email protected]a08305912014-03-21 00:41:1575 EXPECT_TRUE(stream.GetFileForTesting().IsValid());
[email protected]c1d9cf742013-09-12 06:37:1976 EXPECT_EQ(OK, stream.CloseSync());
77 EXPECT_FALSE(stream.IsOpen());
[email protected]a08305912014-03-21 00:41:1578 EXPECT_FALSE(stream.GetFileForTesting().IsValid());
[email protected]c1d9cf742013-09-12 06:37:1979}
80
81TEST_F(FileStreamTest, AsyncOpenExplicitClose) {
[email protected]c1d9cf742013-09-12 06:37:1982 TestCompletionCallback callback;
83 FileStream stream(NULL);
[email protected]a08305912014-03-21 00:41:1584 int flags = base::File::FLAG_OPEN |
85 base::File::FLAG_READ |
86 base::File::FLAG_ASYNC;
[email protected]c1d9cf742013-09-12 06:37:1987 int rv = stream.Open(temp_file_path(), flags, callback.callback());
88 EXPECT_EQ(ERR_IO_PENDING, rv);
89 EXPECT_EQ(OK, callback.WaitForResult());
90 EXPECT_TRUE(stream.IsOpen());
[email protected]a08305912014-03-21 00:41:1591 EXPECT_TRUE(stream.GetFileForTesting().IsValid());
[email protected]c1d9cf742013-09-12 06:37:1992 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback()));
93 EXPECT_EQ(OK, callback.WaitForResult());
94 EXPECT_FALSE(stream.IsOpen());
[email protected]a08305912014-03-21 00:41:1595 EXPECT_FALSE(stream.GetFileForTesting().IsValid());
[email protected]c1d9cf742013-09-12 06:37:1996}
97
98TEST_F(FileStreamTest, AsyncOpenExplicitCloseOrphaned) {
[email protected]c1d9cf742013-09-12 06:37:1999 TestCompletionCallback callback;
[email protected]c1d9cf742013-09-12 06:37:19100 scoped_ptr<FileStream> stream(new FileStream(
101 NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15102 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
103 base::File::FLAG_ASYNC;
[email protected]c1d9cf742013-09-12 06:37:19104 int rv = stream->Open(temp_file_path(), flags, callback.callback());
105 EXPECT_EQ(ERR_IO_PENDING, rv);
106 EXPECT_EQ(OK, callback.WaitForResult());
107 EXPECT_TRUE(stream->IsOpen());
[email protected]a08305912014-03-21 00:41:15108 EXPECT_TRUE(stream->GetFileForTesting().IsValid());
[email protected]c1d9cf742013-09-12 06:37:19109 EXPECT_EQ(ERR_IO_PENDING, stream->Close(callback.callback()));
110 stream.reset();
111 // File isn't actually closed yet.
[email protected]c1d9cf742013-09-12 06:37:19112 base::RunLoop runloop;
113 runloop.RunUntilIdle();
114 // The file should now be closed, though the callback has not been called.
[email protected]21da6eb2008-11-03 17:18:14115}
116
[email protected]92aad5222009-02-09 22:26:41117// Test the use of FileStream with a file handle provided at construction.
118TEST_F(FileStreamTest, UseFileHandle) {
[email protected]92aad5222009-02-09 22:26:41119 // 1. Test reading with a file handle.
120 ASSERT_EQ(kTestDataSize,
[email protected]a08305912014-03-21 00:41:15121 base::WriteFile(temp_file_path(), kTestData, kTestDataSize));
122 int flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ;
123 base::File file(temp_file_path(), flags);
[email protected]92aad5222009-02-09 22:26:41124
125 // Seek to the beginning of the file and read.
[email protected]dd2c4382013-09-07 16:01:47126 scoped_ptr<FileStream> read_stream(
[email protected]a08305912014-03-21 00:41:15127 new FileStream(file.Pass(), NULL, base::MessageLoopProxy::current()));
[email protected]aab1b9e2012-11-06 00:29:51128 ASSERT_EQ(0, read_stream->SeekSync(FROM_BEGIN, 0));
129 ASSERT_EQ(kTestDataSize, read_stream->Available());
[email protected]92aad5222009-02-09 22:26:41130 // Read into buffer and compare.
131 char buffer[kTestDataSize];
[email protected]5eb431e22011-10-12 08:51:38132 ASSERT_EQ(kTestDataSize,
[email protected]aab1b9e2012-11-06 00:29:51133 read_stream->ReadSync(buffer, kTestDataSize));
[email protected]92aad5222009-02-09 22:26:41134 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
[email protected]aab1b9e2012-11-06 00:29:51135 read_stream.reset();
[email protected]92aad5222009-02-09 22:26:41136
137 // 2. Test writing with a file handle.
[email protected]dd3aa792013-07-16 19:10:23138 base::DeleteFile(temp_file_path(), false);
[email protected]a08305912014-03-21 00:41:15139 flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE;
140 file.Initialize(temp_file_path(), flags);
[email protected]92aad5222009-02-09 22:26:41141
[email protected]dd2c4382013-09-07 16:01:47142 scoped_ptr<FileStream> write_stream(
[email protected]a08305912014-03-21 00:41:15143 new FileStream(file.Pass(), NULL, base::MessageLoopProxy::current()));
[email protected]aab1b9e2012-11-06 00:29:51144 ASSERT_EQ(0, write_stream->SeekSync(FROM_BEGIN, 0));
[email protected]5eb431e22011-10-12 08:51:38145 ASSERT_EQ(kTestDataSize,
[email protected]aab1b9e2012-11-06 00:29:51146 write_stream->WriteSync(kTestData, kTestDataSize));
147 write_stream.reset();
[email protected]92aad5222009-02-09 22:26:41148
149 // Read into buffer and compare to make sure the handle worked fine.
150 ASSERT_EQ(kTestDataSize,
[email protected]7600d0b2013-12-08 21:43:30151 base::ReadFile(temp_file_path(), buffer, kTestDataSize));
[email protected]92aad5222009-02-09 22:26:41152 ASSERT_EQ(0, memcmp(kTestData, buffer, kTestDataSize));
153}
154
[email protected]21da6eb2008-11-03 17:18:14155TEST_F(FileStreamTest, UseClosedStream) {
[email protected]dd2c4382013-09-07 16:01:47156 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]21da6eb2008-11-03 17:18:14157
158 EXPECT_FALSE(stream.IsOpen());
159
160 // Try seeking...
[email protected]cf02541b2012-04-11 08:02:17161 int64 new_offset = stream.SeekSync(FROM_BEGIN, 5);
[email protected]8effd3f62011-03-25 16:29:07162 EXPECT_EQ(ERR_UNEXPECTED, new_offset);
[email protected]21da6eb2008-11-03 17:18:14163
164 // Try available...
165 int64 avail = stream.Available();
[email protected]8effd3f62011-03-25 16:29:07166 EXPECT_EQ(ERR_UNEXPECTED, avail);
[email protected]21da6eb2008-11-03 17:18:14167
168 // Try reading...
169 char buf[10];
[email protected]6b230f42012-02-15 04:08:41170 int rv = stream.ReadSync(buf, arraysize(buf));
[email protected]8effd3f62011-03-25 16:29:07171 EXPECT_EQ(ERR_UNEXPECTED, rv);
[email protected]21da6eb2008-11-03 17:18:14172}
173
174TEST_F(FileStreamTest, BasicRead) {
175 int64 file_size;
[email protected]a08305912014-03-21 00:41:15176 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14177
[email protected]dd2c4382013-09-07 16:01:47178 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15179 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
[email protected]fe57eb22012-02-09 05:59:40180 int rv = stream.OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07181 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14182
183 int64 total_bytes_avail = stream.Available();
184 EXPECT_EQ(file_size, total_bytes_avail);
185
[email protected]4c2048a2009-03-24 21:02:01186 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14187
188 std::string data_read;
189 for (;;) {
190 char buf[4];
[email protected]6b230f42012-02-15 04:08:41191 rv = stream.ReadSync(buf, arraysize(buf));
[email protected]21da6eb2008-11-03 17:18:14192 EXPECT_LE(0, rv);
193 if (rv <= 0)
194 break;
195 total_bytes_read += rv;
196 data_read.append(buf, rv);
197 }
198 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01199 EXPECT_EQ(kTestData, data_read);
[email protected]21da6eb2008-11-03 17:18:14200}
201
202TEST_F(FileStreamTest, AsyncRead) {
203 int64 file_size;
[email protected]a08305912014-03-21 00:41:15204 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14205
[email protected]dd2c4382013-09-07 16:01:47206 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15207 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
208 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20209 TestCompletionCallback callback;
210 int rv = stream.Open(temp_file_path(), flags, callback.callback());
211 EXPECT_EQ(ERR_IO_PENDING, rv);
212 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14213
214 int64 total_bytes_avail = stream.Available();
215 EXPECT_EQ(file_size, total_bytes_avail);
216
[email protected]4c2048a2009-03-24 21:02:01217 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14218
219 std::string data_read;
220 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20221 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50222 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07223 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14224 rv = callback.WaitForResult();
225 EXPECT_LE(0, rv);
226 if (rv <= 0)
227 break;
228 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20229 data_read.append(buf->data(), rv);
[email protected]21da6eb2008-11-03 17:18:14230 }
231 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01232 EXPECT_EQ(kTestData, data_read);
233}
234
[email protected]06b802b2012-02-22 03:34:54235TEST_F(FileStreamTest, AsyncRead_EarlyDelete) {
236 int64 file_size;
[email protected]a08305912014-03-21 00:41:15237 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]06b802b2012-02-22 03:34:54238
[email protected]dd2c4382013-09-07 16:01:47239 scoped_ptr<FileStream> stream(
240 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15241 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
242 base::File::FLAG_ASYNC;
[email protected]06b802b2012-02-22 03:34:54243 TestCompletionCallback callback;
244 int rv = stream->Open(temp_file_path(), flags, callback.callback());
245 EXPECT_EQ(ERR_IO_PENDING, rv);
246 EXPECT_EQ(OK, callback.WaitForResult());
247
248 int64 total_bytes_avail = stream->Available();
249 EXPECT_EQ(file_size, total_bytes_avail);
250
251 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50252 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]06b802b2012-02-22 03:34:54253 stream.reset(); // Delete instead of closing it.
254 if (rv < 0) {
255 EXPECT_EQ(ERR_IO_PENDING, rv);
256 // The callback should not be called if the request is cancelled.
[email protected]dd2c4382013-09-07 16:01:47257 base::RunLoop().RunUntilIdle();
[email protected]06b802b2012-02-22 03:34:54258 EXPECT_FALSE(callback.have_result());
259 } else {
260 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv));
261 }
262}
263
[email protected]21da6eb2008-11-03 17:18:14264TEST_F(FileStreamTest, BasicRead_FromOffset) {
265 int64 file_size;
[email protected]a08305912014-03-21 00:41:15266 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14267
[email protected]dd2c4382013-09-07 16:01:47268 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15269 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
[email protected]fe57eb22012-02-09 05:59:40270 int rv = stream.OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07271 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14272
273 const int64 kOffset = 3;
[email protected]cf02541b2012-04-11 08:02:17274 int64 new_offset = stream.SeekSync(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14275 EXPECT_EQ(kOffset, new_offset);
276
277 int64 total_bytes_avail = stream.Available();
278 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
279
280 int64 total_bytes_read = 0;
281
282 std::string data_read;
283 for (;;) {
284 char buf[4];
[email protected]6b230f42012-02-15 04:08:41285 rv = stream.ReadSync(buf, arraysize(buf));
[email protected]21da6eb2008-11-03 17:18:14286 EXPECT_LE(0, rv);
287 if (rv <= 0)
288 break;
289 total_bytes_read += rv;
290 data_read.append(buf, rv);
291 }
292 EXPECT_EQ(file_size - kOffset, total_bytes_read);
293 EXPECT_TRUE(data_read == kTestData + kOffset);
[email protected]4c2048a2009-03-24 21:02:01294 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14295}
296
297TEST_F(FileStreamTest, AsyncRead_FromOffset) {
298 int64 file_size;
[email protected]a08305912014-03-21 00:41:15299 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14300
[email protected]dd2c4382013-09-07 16:01:47301 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15302 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
303 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20304 TestCompletionCallback callback;
305 int rv = stream.Open(temp_file_path(), flags, callback.callback());
306 EXPECT_EQ(ERR_IO_PENDING, rv);
307 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14308
[email protected]cf02541b2012-04-11 08:02:17309 TestInt64CompletionCallback callback64;
[email protected]21da6eb2008-11-03 17:18:14310 const int64 kOffset = 3;
[email protected]cf02541b2012-04-11 08:02:17311 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback());
312 ASSERT_EQ(ERR_IO_PENDING, rv);
313 int64 new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14314 EXPECT_EQ(kOffset, new_offset);
315
316 int64 total_bytes_avail = stream.Available();
317 EXPECT_EQ(file_size - kOffset, total_bytes_avail);
318
[email protected]4c2048a2009-03-24 21:02:01319 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14320
321 std::string data_read;
322 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20323 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50324 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07325 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14326 rv = callback.WaitForResult();
327 EXPECT_LE(0, rv);
328 if (rv <= 0)
329 break;
330 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20331 data_read.append(buf->data(), rv);
[email protected]21da6eb2008-11-03 17:18:14332 }
333 EXPECT_EQ(file_size - kOffset, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01334 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14335}
336
337TEST_F(FileStreamTest, SeekAround) {
[email protected]dd2c4382013-09-07 16:01:47338 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15339 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ;
[email protected]fe57eb22012-02-09 05:59:40340 int rv = stream.OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07341 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14342
343 const int64 kOffset = 3;
[email protected]cf02541b2012-04-11 08:02:17344 int64 new_offset = stream.SeekSync(FROM_BEGIN, kOffset);
[email protected]21da6eb2008-11-03 17:18:14345 EXPECT_EQ(kOffset, new_offset);
346
[email protected]cf02541b2012-04-11 08:02:17347 new_offset = stream.SeekSync(FROM_CURRENT, kOffset);
[email protected]21da6eb2008-11-03 17:18:14348 EXPECT_EQ(2 * kOffset, new_offset);
349
[email protected]cf02541b2012-04-11 08:02:17350 new_offset = stream.SeekSync(FROM_CURRENT, -kOffset);
[email protected]21da6eb2008-11-03 17:18:14351 EXPECT_EQ(kOffset, new_offset);
352
353 const int kTestDataLen = arraysize(kTestData) - 1;
354
[email protected]cf02541b2012-04-11 08:02:17355 new_offset = stream.SeekSync(FROM_END, -kTestDataLen);
356 EXPECT_EQ(0, new_offset);
357}
358
359TEST_F(FileStreamTest, AsyncSeekAround) {
[email protected]dd2c4382013-09-07 16:01:47360 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15361 int flags = base::File::FLAG_OPEN | base::File::FLAG_ASYNC |
362 base::File::FLAG_READ;
[email protected]66af1d62013-03-06 23:13:20363 TestCompletionCallback callback;
364 int rv = stream.Open(temp_file_path(), flags, callback.callback());
365 EXPECT_EQ(ERR_IO_PENDING, rv);
366 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]cf02541b2012-04-11 08:02:17367
[email protected]66af1d62013-03-06 23:13:20368 TestInt64CompletionCallback callback64;
[email protected]cf02541b2012-04-11 08:02:17369
370 const int64 kOffset = 3;
[email protected]66af1d62013-03-06 23:13:20371 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17372 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20373 int64 new_offset = callback64.WaitForResult();
[email protected]cf02541b2012-04-11 08:02:17374 EXPECT_EQ(kOffset, new_offset);
375
[email protected]66af1d62013-03-06 23:13:20376 rv = stream.Seek(FROM_CURRENT, kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17377 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20378 new_offset = callback64.WaitForResult();
[email protected]cf02541b2012-04-11 08:02:17379 EXPECT_EQ(2 * kOffset, new_offset);
380
[email protected]66af1d62013-03-06 23:13:20381 rv = stream.Seek(FROM_CURRENT, -kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17382 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20383 new_offset = callback64.WaitForResult();
[email protected]cf02541b2012-04-11 08:02:17384 EXPECT_EQ(kOffset, new_offset);
385
386 const int kTestDataLen = arraysize(kTestData) - 1;
387
[email protected]66af1d62013-03-06 23:13:20388 rv = stream.Seek(FROM_END, -kTestDataLen, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17389 ASSERT_EQ(ERR_IO_PENDING, rv);
[email protected]66af1d62013-03-06 23:13:20390 new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14391 EXPECT_EQ(0, new_offset);
392}
393
394TEST_F(FileStreamTest, BasicWrite) {
[email protected]dd2c4382013-09-07 16:01:47395 scoped_ptr<FileStream> stream(
396 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15397 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51398 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07399 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14400
401 int64 file_size;
[email protected]a08305912014-03-21 00:41:15402 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14403 EXPECT_EQ(0, file_size);
404
[email protected]aab1b9e2012-11-06 00:29:51405 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:14406 EXPECT_EQ(kTestDataSize, rv);
[email protected]aab1b9e2012-11-06 00:29:51407 stream.reset();
[email protected]21da6eb2008-11-03 17:18:14408
[email protected]a08305912014-03-21 00:41:15409 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14410 EXPECT_EQ(kTestDataSize, file_size);
411}
412
413TEST_F(FileStreamTest, AsyncWrite) {
[email protected]dd2c4382013-09-07 16:01:47414 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15415 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
416 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20417 TestCompletionCallback callback;
418 int rv = stream.Open(temp_file_path(), flags, callback.callback());
419 EXPECT_EQ(ERR_IO_PENDING, rv);
420 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14421
422 int64 file_size;
[email protected]a08305912014-03-21 00:41:15423 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14424 EXPECT_EQ(0, file_size);
425
[email protected]4c2048a2009-03-24 21:02:01426 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14427
[email protected]9f49afb2012-02-16 09:59:20428 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
429 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50430 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]21da6eb2008-11-03 17:18:14431 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15432 rv = stream.Write(drainable.get(), drainable->BytesRemaining(),
433 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07434 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14435 rv = callback.WaitForResult();
436 EXPECT_LT(0, rv);
437 if (rv <= 0)
438 break;
[email protected]9f49afb2012-02-16 09:59:20439 drainable->DidConsume(rv);
[email protected]21da6eb2008-11-03 17:18:14440 total_bytes_written += rv;
441 }
[email protected]a08305912014-03-21 00:41:15442 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14443 EXPECT_EQ(file_size, total_bytes_written);
444}
445
[email protected]aab1b9e2012-11-06 00:29:51446TEST_F(FileStreamTest, AsyncWrite_EarlyDelete) {
[email protected]dd2c4382013-09-07 16:01:47447 scoped_ptr<FileStream> stream(
448 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15449 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
450 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20451 TestCompletionCallback callback;
452 int rv = stream->Open(temp_file_path(), flags, callback.callback());
453 EXPECT_EQ(ERR_IO_PENDING, rv);
454 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01455
456 int64 file_size;
[email protected]a08305912014-03-21 00:41:15457 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01458 EXPECT_EQ(0, file_size);
459
[email protected]9f49afb2012-02-16 09:59:20460 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50461 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]aab1b9e2012-11-06 00:29:51462 stream.reset();
[email protected]3828a752009-06-03 23:05:59463 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07464 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59465 // The callback should not be called if the request is cancelled.
[email protected]dd2c4382013-09-07 16:01:47466 base::RunLoop().RunUntilIdle();
[email protected]3828a752009-06-03 23:05:59467 EXPECT_FALSE(callback.have_result());
468 } else {
[email protected]a08305912014-03-21 00:41:15469 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]3828a752009-06-03 23:05:59470 EXPECT_EQ(file_size, rv);
471 }
[email protected]4c2048a2009-03-24 21:02:01472}
473
[email protected]21da6eb2008-11-03 17:18:14474TEST_F(FileStreamTest, BasicWrite_FromOffset) {
[email protected]dd2c4382013-09-07 16:01:47475 scoped_ptr<FileStream> stream(
476 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15477 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51478 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07479 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14480
481 int64 file_size;
[email protected]a08305912014-03-21 00:41:15482 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14483 EXPECT_EQ(kTestDataSize, file_size);
484
485 const int64 kOffset = 0;
[email protected]aab1b9e2012-11-06 00:29:51486 int64 new_offset = stream->SeekSync(FROM_END, kOffset);
[email protected]21da6eb2008-11-03 17:18:14487 EXPECT_EQ(kTestDataSize, new_offset);
488
[email protected]aab1b9e2012-11-06 00:29:51489 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:14490 EXPECT_EQ(kTestDataSize, rv);
[email protected]aab1b9e2012-11-06 00:29:51491 stream.reset();
[email protected]21da6eb2008-11-03 17:18:14492
[email protected]a08305912014-03-21 00:41:15493 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14494 EXPECT_EQ(kTestDataSize * 2, file_size);
495}
496
497TEST_F(FileStreamTest, AsyncWrite_FromOffset) {
498 int64 file_size;
[email protected]a08305912014-03-21 00:41:15499 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14500
[email protected]dd2c4382013-09-07 16:01:47501 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:15502 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
503 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20504 TestCompletionCallback callback;
505 int rv = stream.Open(temp_file_path(), flags, callback.callback());
506 EXPECT_EQ(ERR_IO_PENDING, rv);
507 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14508
[email protected]cf02541b2012-04-11 08:02:17509 TestInt64CompletionCallback callback64;
[email protected]21da6eb2008-11-03 17:18:14510 const int64 kOffset = 0;
[email protected]cf02541b2012-04-11 08:02:17511 rv = stream.Seek(FROM_END, kOffset, callback64.callback());
512 ASSERT_EQ(ERR_IO_PENDING, rv);
513 int64 new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14514 EXPECT_EQ(kTestDataSize, new_offset);
515
[email protected]4c2048a2009-03-24 21:02:01516 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14517
[email protected]9f49afb2012-02-16 09:59:20518 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
519 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50520 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]21da6eb2008-11-03 17:18:14521 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15522 rv = stream.Write(drainable.get(), drainable->BytesRemaining(),
523 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07524 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14525 rv = callback.WaitForResult();
526 EXPECT_LT(0, rv);
527 if (rv <= 0)
528 break;
[email protected]9f49afb2012-02-16 09:59:20529 drainable->DidConsume(rv);
[email protected]21da6eb2008-11-03 17:18:14530 total_bytes_written += rv;
531 }
[email protected]a08305912014-03-21 00:41:15532 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14533 EXPECT_EQ(file_size, kTestDataSize * 2);
534}
535
536TEST_F(FileStreamTest, BasicReadWrite) {
537 int64 file_size;
[email protected]a08305912014-03-21 00:41:15538 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14539
[email protected]dd2c4382013-09-07 16:01:47540 scoped_ptr<FileStream> stream(
541 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15542 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
543 base::File::FLAG_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51544 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07545 EXPECT_EQ(OK, rv);
[email protected]21da6eb2008-11-03 17:18:14546
[email protected]aab1b9e2012-11-06 00:29:51547 int64 total_bytes_avail = stream->Available();
[email protected]21da6eb2008-11-03 17:18:14548 EXPECT_EQ(file_size, total_bytes_avail);
549
[email protected]4c2048a2009-03-24 21:02:01550 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14551
552 std::string data_read;
553 for (;;) {
554 char buf[4];
[email protected]aab1b9e2012-11-06 00:29:51555 rv = stream->ReadSync(buf, arraysize(buf));
[email protected]21da6eb2008-11-03 17:18:14556 EXPECT_LE(0, rv);
557 if (rv <= 0)
558 break;
559 total_bytes_read += rv;
560 data_read.append(buf, rv);
561 }
562 EXPECT_EQ(file_size, total_bytes_read);
563 EXPECT_TRUE(data_read == kTestData);
564
[email protected]aab1b9e2012-11-06 00:29:51565 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:14566 EXPECT_EQ(kTestDataSize, rv);
[email protected]aab1b9e2012-11-06 00:29:51567 stream.reset();
[email protected]21da6eb2008-11-03 17:18:14568
[email protected]a08305912014-03-21 00:41:15569 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14570 EXPECT_EQ(kTestDataSize * 2, file_size);
571}
572
[email protected]4c2048a2009-03-24 21:02:01573TEST_F(FileStreamTest, BasicWriteRead) {
574 int64 file_size;
[email protected]a08305912014-03-21 00:41:15575 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01576
[email protected]dd2c4382013-09-07 16:01:47577 scoped_ptr<FileStream> stream(
578 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15579 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
580 base::File::FLAG_WRITE;
[email protected]aab1b9e2012-11-06 00:29:51581 int rv = stream->OpenSync(temp_file_path(), flags);
[email protected]8effd3f62011-03-25 16:29:07582 EXPECT_EQ(OK, rv);
[email protected]4c2048a2009-03-24 21:02:01583
[email protected]aab1b9e2012-11-06 00:29:51584 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01585 EXPECT_EQ(file_size, total_bytes_avail);
586
[email protected]aab1b9e2012-11-06 00:29:51587 int64 offset = stream->SeekSync(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01588 EXPECT_EQ(offset, file_size);
589
[email protected]aab1b9e2012-11-06 00:29:51590 rv = stream->WriteSync(kTestData, kTestDataSize);
[email protected]4c2048a2009-03-24 21:02:01591 EXPECT_EQ(kTestDataSize, rv);
592
[email protected]aab1b9e2012-11-06 00:29:51593 offset = stream->SeekSync(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01594 EXPECT_EQ(0, offset);
595
596 int64 total_bytes_read = 0;
597
598 std::string data_read;
599 for (;;) {
600 char buf[4];
[email protected]aab1b9e2012-11-06 00:29:51601 rv = stream->ReadSync(buf, arraysize(buf));
[email protected]4c2048a2009-03-24 21:02:01602 EXPECT_LE(0, rv);
603 if (rv <= 0)
604 break;
605 total_bytes_read += rv;
606 data_read.append(buf, rv);
607 }
[email protected]aab1b9e2012-11-06 00:29:51608 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01609
[email protected]a08305912014-03-21 00:41:15610 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01611 EXPECT_EQ(kTestDataSize * 2, file_size);
612 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
613
614 const std::string kExpectedFileData =
615 std::string(kTestData) + std::string(kTestData);
616 EXPECT_EQ(kExpectedFileData, data_read);
617}
618
619TEST_F(FileStreamTest, BasicAsyncReadWrite) {
620 int64 file_size;
[email protected]a08305912014-03-21 00:41:15621 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01622
[email protected]dd2c4382013-09-07 16:01:47623 scoped_ptr<FileStream> stream(
624 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15625 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
626 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20627 TestCompletionCallback callback;
628 int rv = stream->Open(temp_file_path(), flags, callback.callback());
629 EXPECT_EQ(ERR_IO_PENDING, rv);
630 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01631
[email protected]aab1b9e2012-11-06 00:29:51632 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01633 EXPECT_EQ(file_size, total_bytes_avail);
634
[email protected]4c2048a2009-03-24 21:02:01635 int64 total_bytes_read = 0;
636
637 std::string data_read;
638 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20639 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50640 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07641 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01642 rv = callback.WaitForResult();
643 EXPECT_LE(0, rv);
644 if (rv <= 0)
645 break;
646 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20647 data_read.append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01648 }
649 EXPECT_EQ(file_size, total_bytes_read);
650 EXPECT_TRUE(data_read == kTestData);
651
652 int total_bytes_written = 0;
653
[email protected]9f49afb2012-02-16 09:59:20654 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
655 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50656 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]4c2048a2009-03-24 21:02:01657 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15658 rv = stream->Write(drainable.get(), drainable->BytesRemaining(),
659 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07660 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01661 rv = callback.WaitForResult();
662 EXPECT_LT(0, rv);
663 if (rv <= 0)
664 break;
[email protected]9f49afb2012-02-16 09:59:20665 drainable->DidConsume(rv);
[email protected]4c2048a2009-03-24 21:02:01666 total_bytes_written += rv;
667 }
668
[email protected]aab1b9e2012-11-06 00:29:51669 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01670
[email protected]a08305912014-03-21 00:41:15671 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01672 EXPECT_EQ(kTestDataSize * 2, file_size);
673}
674
675TEST_F(FileStreamTest, BasicAsyncWriteRead) {
676 int64 file_size;
[email protected]a08305912014-03-21 00:41:15677 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01678
[email protected]dd2c4382013-09-07 16:01:47679 scoped_ptr<FileStream> stream(
680 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15681 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
682 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20683 TestCompletionCallback callback;
684 int rv = stream->Open(temp_file_path(), flags, callback.callback());
685 EXPECT_EQ(ERR_IO_PENDING, rv);
686 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01687
[email protected]aab1b9e2012-11-06 00:29:51688 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01689 EXPECT_EQ(file_size, total_bytes_avail);
690
[email protected]cf02541b2012-04-11 08:02:17691 TestInt64CompletionCallback callback64;
[email protected]aab1b9e2012-11-06 00:29:51692 rv = stream->Seek(FROM_END, 0, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17693 ASSERT_EQ(ERR_IO_PENDING, rv);
694 int64 offset = callback64.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01695 EXPECT_EQ(offset, file_size);
696
[email protected]4c2048a2009-03-24 21:02:01697 int total_bytes_written = 0;
698
[email protected]9f49afb2012-02-16 09:59:20699 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
700 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50701 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]4c2048a2009-03-24 21:02:01702 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15703 rv = stream->Write(drainable.get(), drainable->BytesRemaining(),
704 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07705 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01706 rv = callback.WaitForResult();
707 EXPECT_LT(0, rv);
708 if (rv <= 0)
709 break;
[email protected]9f49afb2012-02-16 09:59:20710 drainable->DidConsume(rv);
[email protected]4c2048a2009-03-24 21:02:01711 total_bytes_written += rv;
712 }
713
714 EXPECT_EQ(kTestDataSize, total_bytes_written);
715
[email protected]aab1b9e2012-11-06 00:29:51716 rv = stream->Seek(FROM_BEGIN, 0, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17717 ASSERT_EQ(ERR_IO_PENDING, rv);
718 offset = callback64.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01719 EXPECT_EQ(0, offset);
720
721 int total_bytes_read = 0;
722
723 std::string data_read;
724 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20725 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50726 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07727 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01728 rv = callback.WaitForResult();
729 EXPECT_LE(0, rv);
730 if (rv <= 0)
731 break;
732 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20733 data_read.append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01734 }
[email protected]aab1b9e2012-11-06 00:29:51735 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01736
[email protected]a08305912014-03-21 00:41:15737 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01738 EXPECT_EQ(kTestDataSize * 2, file_size);
739
740 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
741 const std::string kExpectedFileData =
742 std::string(kTestData) + std::string(kTestData);
743 EXPECT_EQ(kExpectedFileData, data_read);
744}
745
[email protected]5eb431e22011-10-12 08:51:38746class TestWriteReadCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01747 public:
[email protected]90499482013-06-01 00:39:50748 TestWriteReadCompletionCallback(FileStream* stream,
749 int* total_bytes_written,
750 int* total_bytes_read,
751 std::string* data_read)
[email protected]4c2048a2009-03-24 21:02:01752 : result_(0),
753 have_result_(false),
754 waiting_for_result_(false),
755 stream_(stream),
756 total_bytes_written_(total_bytes_written),
757 total_bytes_read_(total_bytes_read),
[email protected]5eb431e22011-10-12 08:51:38758 data_read_(data_read),
759 callback_(base::Bind(&TestWriteReadCompletionCallback::OnComplete,
[email protected]9f49afb2012-02-16 09:59:20760 base::Unretained(this))),
761 test_data_(CreateTestDataBuffer()),
[email protected]90499482013-06-01 00:39:50762 drainable_(new DrainableIOBuffer(test_data_.get(), kTestDataSize)) {}
[email protected]4c2048a2009-03-24 21:02:01763
764 int WaitForResult() {
765 DCHECK(!waiting_for_result_);
766 while (!have_result_) {
767 waiting_for_result_ = true;
[email protected]dd2c4382013-09-07 16:01:47768 base::RunLoop().Run();
[email protected]4c2048a2009-03-24 21:02:01769 waiting_for_result_ = false;
770 }
771 have_result_ = false; // auto-reset for next callback
772 return result_;
773 }
774
[email protected]5eb431e22011-10-12 08:51:38775 const CompletionCallback& callback() const { return callback_; }
776
[email protected]4c2048a2009-03-24 21:02:01777 private:
[email protected]5eb431e22011-10-12 08:51:38778 void OnComplete(int result) {
779 DCHECK_LT(0, result);
780 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01781
782 int rv;
783
784 if (*total_bytes_written_ != kTestDataSize) {
785 // Recurse to finish writing all data.
786 int total_bytes_written = 0, total_bytes_read = 0;
787 std::string data_read;
[email protected]5eb431e22011-10-12 08:51:38788 TestWriteReadCompletionCallback callback(
[email protected]4c2048a2009-03-24 21:02:01789 stream_, &total_bytes_written, &total_bytes_read, &data_read);
[email protected]90499482013-06-01 00:39:50790 rv = stream_->Write(
791 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07792 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01793 rv = callback.WaitForResult();
[email protected]9f49afb2012-02-16 09:59:20794 drainable_->DidConsume(total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01795 *total_bytes_written_ += total_bytes_written;
796 *total_bytes_read_ += total_bytes_read;
797 *data_read_ += data_read;
798 } else { // We're done writing all data. Start reading the data.
[email protected]cf02541b2012-04-11 08:02:17799 stream_->SeekSync(FROM_BEGIN, 0);
[email protected]4c2048a2009-03-24 21:02:01800
[email protected]5eb431e22011-10-12 08:51:38801 TestCompletionCallback callback;
[email protected]4c2048a2009-03-24 21:02:01802 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20803 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50804 rv = stream_->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07805 if (rv == ERR_IO_PENDING) {
[email protected]2da659e2013-05-23 20:51:34806 base::MessageLoop::ScopedNestableTaskAllower allow(
807 base::MessageLoop::current());
[email protected]4c2048a2009-03-24 21:02:01808 rv = callback.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01809 }
810 EXPECT_LE(0, rv);
811 if (rv <= 0)
812 break;
813 *total_bytes_read_ += rv;
[email protected]9f49afb2012-02-16 09:59:20814 data_read_->append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01815 }
816 }
817
818 result_ = *total_bytes_written_;
819 have_result_ = true;
820 if (waiting_for_result_)
[email protected]2da659e2013-05-23 20:51:34821 base::MessageLoop::current()->Quit();
[email protected]4c2048a2009-03-24 21:02:01822 }
823
824 int result_;
825 bool have_result_;
826 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07827 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01828 int* total_bytes_written_;
829 int* total_bytes_read_;
830 std::string* data_read_;
[email protected]5eb431e22011-10-12 08:51:38831 const CompletionCallback callback_;
[email protected]9f49afb2012-02-16 09:59:20832 scoped_refptr<IOBufferWithSize> test_data_;
833 scoped_refptr<DrainableIOBuffer> drainable_;
[email protected]4c2048a2009-03-24 21:02:01834
[email protected]5eb431e22011-10-12 08:51:38835 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01836};
837
838TEST_F(FileStreamTest, AsyncWriteRead) {
839 int64 file_size;
[email protected]a08305912014-03-21 00:41:15840 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01841
[email protected]dd2c4382013-09-07 16:01:47842 scoped_ptr<FileStream> stream(
843 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15844 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
845 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20846 TestCompletionCallback open_callback;
847 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
848 EXPECT_EQ(ERR_IO_PENDING, rv);
849 EXPECT_EQ(OK, open_callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01850
[email protected]aab1b9e2012-11-06 00:29:51851 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01852 EXPECT_EQ(file_size, total_bytes_avail);
853
[email protected]aab1b9e2012-11-06 00:29:51854 int64 offset = stream->SeekSync(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01855 EXPECT_EQ(offset, file_size);
856
857 int total_bytes_written = 0;
858 int total_bytes_read = 0;
859 std::string data_read;
[email protected]aab1b9e2012-11-06 00:29:51860 TestWriteReadCompletionCallback callback(stream.get(), &total_bytes_written,
[email protected]4c2048a2009-03-24 21:02:01861 &total_bytes_read, &data_read);
862
[email protected]9f49afb2012-02-16 09:59:20863 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50864 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07865 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01866 rv = callback.WaitForResult();
867 EXPECT_LT(0, rv);
868 EXPECT_EQ(kTestDataSize, total_bytes_written);
869
[email protected]aab1b9e2012-11-06 00:29:51870 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01871
[email protected]a08305912014-03-21 00:41:15872 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01873 EXPECT_EQ(kTestDataSize * 2, file_size);
874
875 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
876 const std::string kExpectedFileData =
877 std::string(kTestData) + std::string(kTestData);
878 EXPECT_EQ(kExpectedFileData, data_read);
879}
880
[email protected]5eb431e22011-10-12 08:51:38881class TestWriteCloseCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01882 public:
[email protected]5eb431e22011-10-12 08:51:38883 TestWriteCloseCompletionCallback(FileStream* stream, int* total_bytes_written)
[email protected]4c2048a2009-03-24 21:02:01884 : result_(0),
885 have_result_(false),
886 waiting_for_result_(false),
887 stream_(stream),
[email protected]5eb431e22011-10-12 08:51:38888 total_bytes_written_(total_bytes_written),
889 callback_(base::Bind(&TestWriteCloseCompletionCallback::OnComplete,
[email protected]9f49afb2012-02-16 09:59:20890 base::Unretained(this))),
891 test_data_(CreateTestDataBuffer()),
[email protected]90499482013-06-01 00:39:50892 drainable_(new DrainableIOBuffer(test_data_.get(), kTestDataSize)) {}
[email protected]4c2048a2009-03-24 21:02:01893
894 int WaitForResult() {
895 DCHECK(!waiting_for_result_);
896 while (!have_result_) {
897 waiting_for_result_ = true;
[email protected]dd2c4382013-09-07 16:01:47898 base::RunLoop().Run();
[email protected]4c2048a2009-03-24 21:02:01899 waiting_for_result_ = false;
900 }
901 have_result_ = false; // auto-reset for next callback
902 return result_;
903 }
904
[email protected]5eb431e22011-10-12 08:51:38905 const CompletionCallback& callback() const { return callback_; }
906
[email protected]4c2048a2009-03-24 21:02:01907 private:
[email protected]5eb431e22011-10-12 08:51:38908 void OnComplete(int result) {
909 DCHECK_LT(0, result);
910 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01911
912 int rv;
913
914 if (*total_bytes_written_ != kTestDataSize) {
915 // Recurse to finish writing all data.
916 int total_bytes_written = 0;
[email protected]5eb431e22011-10-12 08:51:38917 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written);
[email protected]90499482013-06-01 00:39:50918 rv = stream_->Write(
919 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07920 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01921 rv = callback.WaitForResult();
[email protected]9f49afb2012-02-16 09:59:20922 drainable_->DidConsume(total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01923 *total_bytes_written_ += total_bytes_written;
[email protected]4c2048a2009-03-24 21:02:01924 }
925
926 result_ = *total_bytes_written_;
927 have_result_ = true;
928 if (waiting_for_result_)
[email protected]2da659e2013-05-23 20:51:34929 base::MessageLoop::current()->Quit();
[email protected]4c2048a2009-03-24 21:02:01930 }
931
932 int result_;
933 bool have_result_;
934 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07935 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01936 int* total_bytes_written_;
[email protected]5eb431e22011-10-12 08:51:38937 const CompletionCallback callback_;
[email protected]9f49afb2012-02-16 09:59:20938 scoped_refptr<IOBufferWithSize> test_data_;
939 scoped_refptr<DrainableIOBuffer> drainable_;
[email protected]4c2048a2009-03-24 21:02:01940
[email protected]5eb431e22011-10-12 08:51:38941 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01942};
943
944TEST_F(FileStreamTest, AsyncWriteClose) {
945 int64 file_size;
[email protected]a08305912014-03-21 00:41:15946 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01947
[email protected]dd2c4382013-09-07 16:01:47948 scoped_ptr<FileStream> stream(
949 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:15950 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
951 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20952 TestCompletionCallback open_callback;
953 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
954 EXPECT_EQ(ERR_IO_PENDING, rv);
955 EXPECT_EQ(OK, open_callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01956
[email protected]aab1b9e2012-11-06 00:29:51957 int64 total_bytes_avail = stream->Available();
[email protected]4c2048a2009-03-24 21:02:01958 EXPECT_EQ(file_size, total_bytes_avail);
959
[email protected]aab1b9e2012-11-06 00:29:51960 int64 offset = stream->SeekSync(FROM_END, 0);
[email protected]4c2048a2009-03-24 21:02:01961 EXPECT_EQ(offset, file_size);
962
963 int total_bytes_written = 0;
[email protected]aab1b9e2012-11-06 00:29:51964 TestWriteCloseCompletionCallback callback(stream.get(), &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01965
[email protected]9f49afb2012-02-16 09:59:20966 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50967 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07968 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01969 total_bytes_written = callback.WaitForResult();
970 EXPECT_LT(0, total_bytes_written);
971 EXPECT_EQ(kTestDataSize, total_bytes_written);
972
[email protected]aab1b9e2012-11-06 00:29:51973 stream.reset();
974
[email protected]a08305912014-03-21 00:41:15975 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01976 EXPECT_EQ(kTestDataSize * 2, file_size);
977}
978
[email protected]0643a492009-03-09 15:49:20979// Tests truncating a file.
980TEST_F(FileStreamTest, Truncate) {
[email protected]a08305912014-03-21 00:41:15981 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE;
[email protected]0643a492009-03-09 15:49:20982
[email protected]dd2c4382013-09-07 16:01:47983 scoped_ptr<FileStream> write_stream(
984 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]aab1b9e2012-11-06 00:29:51985 ASSERT_EQ(OK, write_stream->OpenSync(temp_file_path(), flags));
[email protected]0643a492009-03-09 15:49:20986
987 // Write some data to the file.
988 const char test_data[] = "0123456789";
[email protected]aab1b9e2012-11-06 00:29:51989 write_stream->WriteSync(test_data, arraysize(test_data));
[email protected]0643a492009-03-09 15:49:20990
991 // Truncate the file.
[email protected]aab1b9e2012-11-06 00:29:51992 ASSERT_EQ(4, write_stream->Truncate(4));
[email protected]0643a492009-03-09 15:49:20993
994 // Write again.
[email protected]aab1b9e2012-11-06 00:29:51995 write_stream->WriteSync(test_data, 4);
[email protected]0643a492009-03-09 15:49:20996
997 // Close the stream.
[email protected]aab1b9e2012-11-06 00:29:51998 write_stream.reset();
[email protected]0643a492009-03-09 15:49:20999
1000 // Read in the contents and make sure we get back what we expected.
1001 std::string read_contents;
[email protected]82f84b92013-08-30 18:23:501002 EXPECT_TRUE(base::ReadFileToString(temp_file_path(), &read_contents));
[email protected]0643a492009-03-09 15:49:201003
[email protected]4c2048a2009-03-24 21:02:011004 EXPECT_EQ("01230123", read_contents);
[email protected]0643a492009-03-09 15:49:201005}
1006
[email protected]dbb747c2012-02-29 19:29:471007TEST_F(FileStreamTest, AsyncOpenAndDelete) {
[email protected]dd2c4382013-09-07 16:01:471008 scoped_ptr<FileStream> stream(
1009 new FileStream(NULL, base::MessageLoopProxy::current()));
[email protected]a08305912014-03-21 00:41:151010 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
1011 base::File::FLAG_ASYNC;
[email protected]dbb747c2012-02-29 19:29:471012 TestCompletionCallback open_callback;
1013 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
1014 EXPECT_EQ(ERR_IO_PENDING, rv);
1015
1016 // Delete the stream without waiting for the open operation to be
1017 // complete. Should be safe.
1018 stream.reset();
1019 // open_callback won't be called.
[email protected]dd2c4382013-09-07 16:01:471020 base::RunLoop().RunUntilIdle();
[email protected]dbb747c2012-02-29 19:29:471021 EXPECT_FALSE(open_callback.have_result());
1022}
1023
[email protected]bfb88ec2013-02-27 20:21:351024// Verify that async Write() errors are mapped correctly.
1025TEST_F(FileStreamTest, AsyncWriteError) {
[email protected]7f00ad62013-09-14 00:56:211026 // Try opening file as read-only and then writing to it using FileStream.
[email protected]a08305912014-03-21 00:41:151027 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
1028 base::File::FLAG_ASYNC;
[email protected]bfb88ec2013-02-27 20:21:351029
[email protected]a08305912014-03-21 00:41:151030 base::File file(temp_file_path(), flags);
1031 ASSERT_TRUE(file.IsValid());
1032
[email protected]7f00ad62013-09-14 00:56:211033 scoped_ptr<FileStream> stream(
[email protected]a08305912014-03-21 00:41:151034 new FileStream(file.Pass(), NULL, base::MessageLoopProxy::current()));
[email protected]7f00ad62013-09-14 00:56:211035
1036 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
[email protected]1a00d082013-09-14 19:57:161037 buf->data()[0] = 0;
1038
[email protected]7f00ad62013-09-14 00:56:211039 TestCompletionCallback callback;
1040 int rv = stream->Write(buf.get(), 1, callback.callback());
[email protected]bfb88ec2013-02-27 20:21:351041 if (rv == ERR_IO_PENDING)
1042 rv = callback.WaitForResult();
1043 EXPECT_LT(rv, 0);
[email protected]7f00ad62013-09-14 00:56:211044
[email protected]a08305912014-03-21 00:41:151045 stream.reset();
1046 base::RunLoop().RunUntilIdle();
[email protected]bfb88ec2013-02-27 20:21:351047}
1048
1049// Verify that async Read() errors are mapped correctly.
1050TEST_F(FileStreamTest, AsyncReadError) {
[email protected]7f00ad62013-09-14 00:56:211051 // Try opening file for write and then reading from it using FileStream.
[email protected]a08305912014-03-21 00:41:151052 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
1053 base::File::FLAG_ASYNC;
[email protected]bfb88ec2013-02-27 20:21:351054
[email protected]a08305912014-03-21 00:41:151055 base::File file(temp_file_path(), flags);
1056 ASSERT_TRUE(file.IsValid());
1057
[email protected]7f00ad62013-09-14 00:56:211058 scoped_ptr<FileStream> stream(
[email protected]a08305912014-03-21 00:41:151059 new FileStream(file.Pass(), NULL, base::MessageLoopProxy::current()));
[email protected]7f00ad62013-09-14 00:56:211060
1061 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
1062 TestCompletionCallback callback;
1063 int rv = stream->Read(buf.get(), 1, callback.callback());
[email protected]bfb88ec2013-02-27 20:21:351064 if (rv == ERR_IO_PENDING)
1065 rv = callback.WaitForResult();
1066 EXPECT_LT(rv, 0);
[email protected]7f00ad62013-09-14 00:56:211067
[email protected]a08305912014-03-21 00:41:151068 stream.reset();
1069 base::RunLoop().RunUntilIdle();
[email protected]bfb88ec2013-02-27 20:21:351070}
1071
[email protected]f12d1e12013-11-20 07:04:551072#if defined(OS_ANDROID)
1073TEST_F(FileStreamTest, ContentUriAsyncRead) {
1074 base::FilePath test_dir;
1075 PathService::Get(base::DIR_SOURCE_ROOT, &test_dir);
1076 test_dir = test_dir.AppendASCII("net");
1077 test_dir = test_dir.AppendASCII("data");
1078 test_dir = test_dir.AppendASCII("file_stream_unittest");
1079 ASSERT_TRUE(base::PathExists(test_dir));
1080 base::FilePath image_file = test_dir.Append(FILE_PATH_LITERAL("red.png"));
1081
1082 // Insert the image into MediaStore. MediaStore will do some conversions, and
1083 // return the content URI.
1084 base::FilePath path = file_util::InsertImageIntoMediaStore(image_file);
1085 EXPECT_TRUE(path.IsContentUri());
1086 EXPECT_TRUE(base::PathExists(path));
1087 int64 file_size;
[email protected]56285702013-12-04 18:22:491088 EXPECT_TRUE(base::GetFileSize(path, &file_size));
[email protected]f12d1e12013-11-20 07:04:551089 EXPECT_LT(0, file_size);
1090
1091 FileStream stream(NULL, base::MessageLoopProxy::current());
[email protected]a08305912014-03-21 00:41:151092 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
1093 base::File::FLAG_ASYNC;
[email protected]f12d1e12013-11-20 07:04:551094 TestCompletionCallback callback;
1095 int rv = stream.Open(path, flags, callback.callback());
1096 EXPECT_EQ(ERR_IO_PENDING, rv);
1097 EXPECT_EQ(OK, callback.WaitForResult());
1098
1099 int64 total_bytes_avail = stream.Available();
1100 EXPECT_EQ(file_size, total_bytes_avail);
1101
1102 int total_bytes_read = 0;
1103
1104 std::string data_read;
1105 for (;;) {
1106 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
1107 rv = stream.Read(buf.get(), buf->size(), callback.callback());
1108 if (rv == ERR_IO_PENDING)
1109 rv = callback.WaitForResult();
1110 EXPECT_LE(0, rv);
1111 if (rv <= 0)
1112 break;
1113 total_bytes_read += rv;
1114 data_read.append(buf->data(), rv);
1115 }
1116 EXPECT_EQ(file_size, total_bytes_read);
1117}
1118#endif
1119
[email protected]4c2048a2009-03-24 21:02:011120} // namespace
[email protected]96d73822011-10-10 02:11:241121
[email protected]8effd3f62011-03-25 16:29:071122} // namespace net