blob: 4304668f59e3e8ab24aa8f39f555d75f2b1d0031 [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]a08305912014-03-21 00:41:159#include "base/files/file.h"
thestigd8df0332014-09-04 06:33:2910#include "base/files/file_util.h"
Avi Drissman13fc8932015-12-20 04:40:4611#include "base/macros.h"
[email protected]5ee20982013-07-17 21:51:1812#include "base/message_loop/message_loop.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]633ff3b12014-06-20 23:30:1815#include "base/strings/string_util.h"
[email protected]e3d66fde2012-02-17 22:10:3416#include "base/synchronization/waitable_event.h"
tapted012326b2015-12-03 04:43:0517#include "base/test/sequenced_worker_pool_owner.h"
[email protected]e3d66fde2012-02-17 22:10:3418#include "base/test/test_timeouts.h"
skyostil4891b25b2015-06-11 11:43:4519#include "base/thread_task_runner_handle.h"
[email protected]e3ec0625d2014-05-02 23:58:5420#include "base/threading/thread_restrictions.h"
[email protected]9f49afb2012-02-16 09:59:2021#include "net/base/io_buffer.h"
[email protected]21da6eb2008-11-03 17:18:1422#include "net/base/net_errors.h"
23#include "net/base/test_completion_callback.h"
vishal.b62985ca92015-04-17 08:45:5124#include "net/log/test_net_log.h"
[email protected]21da6eb2008-11-03 17:18:1425#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1526#include "testing/platform_test.h"
[email protected]21da6eb2008-11-03 17:18:1427
[email protected]f12d1e12013-11-20 07:04:5528#if defined(OS_ANDROID)
29#include "base/test/test_file_util.h"
30#endif
31
[email protected]8effd3f62011-03-25 16:29:0732namespace net {
[email protected]96d73822011-10-10 02:11:2433
[email protected]4c2048a2009-03-24 21:02:0134namespace {
35
36const char kTestData[] = "0123456789";
37const int kTestDataSize = arraysize(kTestData) - 1;
[email protected]21da6eb2008-11-03 17:18:1438
[email protected]9f49afb2012-02-16 09:59:2039// Creates an IOBufferWithSize that contains the kTestDataSize.
40IOBufferWithSize* CreateTestDataBuffer() {
41 IOBufferWithSize* buf = new IOBufferWithSize(kTestDataSize);
42 memcpy(buf->data(), kTestData, kTestDataSize);
43 return buf;
44}
45
[email protected]96d73822011-10-10 02:11:2446} // namespace
47
[email protected]21da6eb2008-11-03 17:18:1448class FileStreamTest : public PlatformTest {
49 public:
dcheng67be2b1f2014-10-27 21:47:2950 void SetUp() override {
[email protected]21da6eb2008-11-03 17:18:1451 PlatformTest::SetUp();
52
[email protected]03d9afc02013-12-03 17:55:5253 base::CreateTemporaryFile(&temp_file_path_);
[email protected]e5c2a22e2014-03-06 20:42:3054 base::WriteFile(temp_file_path_, kTestData, kTestDataSize);
[email protected]21da6eb2008-11-03 17:18:1455 }
dcheng67be2b1f2014-10-27 21:47:2956 void TearDown() override {
[email protected]dd2c4382013-09-07 16:01:4757 // FileStreamContexts must be asynchronously closed on the file task runner
58 // before they can be deleted. Pump the RunLoop to avoid leaks.
59 base::RunLoop().RunUntilIdle();
[email protected]50f91af2014-04-09 17:28:5660 EXPECT_TRUE(base::DeleteFile(temp_file_path_, false));
61
[email protected]21da6eb2008-11-03 17:18:1462 PlatformTest::TearDown();
63 }
[email protected]96d73822011-10-10 02:11:2464
[email protected]6cdfd7f2013-02-08 20:40:1565 const base::FilePath temp_file_path() const { return temp_file_path_; }
[email protected]96d73822011-10-10 02:11:2466
[email protected]21da6eb2008-11-03 17:18:1467 private:
[email protected]6cdfd7f2013-02-08 20:40:1568 base::FilePath temp_file_path_;
[email protected]21da6eb2008-11-03 17:18:1469};
70
[email protected]96d73822011-10-10 02:11:2471namespace {
72
[email protected]633ff3b12014-06-20 23:30:1873TEST_F(FileStreamTest, OpenExplicitClose) {
[email protected]c1d9cf742013-09-12 06:37:1974 TestCompletionCallback callback;
skyostil4891b25b2015-06-11 11:43:4575 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]a08305912014-03-21 00:41:1576 int flags = base::File::FLAG_OPEN |
77 base::File::FLAG_READ |
78 base::File::FLAG_ASYNC;
[email protected]c1d9cf742013-09-12 06:37:1979 int rv = stream.Open(temp_file_path(), flags, callback.callback());
80 EXPECT_EQ(ERR_IO_PENDING, rv);
81 EXPECT_EQ(OK, callback.WaitForResult());
82 EXPECT_TRUE(stream.IsOpen());
[email protected]c1d9cf742013-09-12 06:37:1983 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback()));
84 EXPECT_EQ(OK, callback.WaitForResult());
85 EXPECT_FALSE(stream.IsOpen());
[email protected]c1d9cf742013-09-12 06:37:1986}
87
[email protected]633ff3b12014-06-20 23:30:1888TEST_F(FileStreamTest, OpenExplicitCloseOrphaned) {
[email protected]c1d9cf742013-09-12 06:37:1989 TestCompletionCallback callback;
skyostil4891b25b2015-06-11 11:43:4590 scoped_ptr<FileStream> stream(
91 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[email protected]a08305912014-03-21 00:41:1592 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
93 base::File::FLAG_ASYNC;
[email protected]c1d9cf742013-09-12 06:37:1994 int rv = stream->Open(temp_file_path(), flags, callback.callback());
95 EXPECT_EQ(ERR_IO_PENDING, rv);
96 EXPECT_EQ(OK, callback.WaitForResult());
97 EXPECT_TRUE(stream->IsOpen());
[email protected]c1d9cf742013-09-12 06:37:1998 EXPECT_EQ(ERR_IO_PENDING, stream->Close(callback.callback()));
99 stream.reset();
100 // File isn't actually closed yet.
[email protected]c1d9cf742013-09-12 06:37:19101 base::RunLoop runloop;
102 runloop.RunUntilIdle();
103 // The file should now be closed, though the callback has not been called.
[email protected]21da6eb2008-11-03 17:18:14104}
105
[email protected]92aad5222009-02-09 22:26:41106// Test the use of FileStream with a file handle provided at construction.
107TEST_F(FileStreamTest, UseFileHandle) {
[email protected]50f91af2014-04-09 17:28:56108 int rv = 0;
109 TestCompletionCallback callback;
110 TestInt64CompletionCallback callback64;
[email protected]92aad5222009-02-09 22:26:41111 // 1. Test reading with a file handle.
112 ASSERT_EQ(kTestDataSize,
[email protected]a08305912014-03-21 00:41:15113 base::WriteFile(temp_file_path(), kTestData, kTestDataSize));
[email protected]50f91af2014-04-09 17:28:56114 int flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
115 base::File::FLAG_ASYNC;
[email protected]a08305912014-03-21 00:41:15116 base::File file(temp_file_path(), flags);
[email protected]92aad5222009-02-09 22:26:41117
118 // Seek to the beginning of the file and read.
[email protected]dd2c4382013-09-07 16:01:47119 scoped_ptr<FileStream> read_stream(
skyostil4891b25b2015-06-11 11:43:45120 new FileStream(file.Pass(), base::ThreadTaskRunnerHandle::Get()));
reillygaa435e72015-06-16 00:48:48121 ASSERT_EQ(ERR_IO_PENDING, read_stream->Seek(0, callback64.callback()));
[email protected]50f91af2014-04-09 17:28:56122 ASSERT_EQ(0, callback64.WaitForResult());
[email protected]92aad5222009-02-09 22:26:41123 // Read into buffer and compare.
[email protected]50f91af2014-04-09 17:28:56124 scoped_refptr<IOBufferWithSize> read_buffer =
125 new IOBufferWithSize(kTestDataSize);
126 rv = read_stream->Read(read_buffer.get(), kTestDataSize, callback.callback());
127 ASSERT_EQ(kTestDataSize, callback.GetResult(rv));
128 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize));
[email protected]aab1b9e2012-11-06 00:29:51129 read_stream.reset();
[email protected]92aad5222009-02-09 22:26:41130
131 // 2. Test writing with a file handle.
[email protected]dd3aa792013-07-16 19:10:23132 base::DeleteFile(temp_file_path(), false);
[email protected]50f91af2014-04-09 17:28:56133 flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE |
134 base::File::FLAG_ASYNC;
[email protected]a08305912014-03-21 00:41:15135 file.Initialize(temp_file_path(), flags);
[email protected]92aad5222009-02-09 22:26:41136
[email protected]dd2c4382013-09-07 16:01:47137 scoped_ptr<FileStream> write_stream(
skyostil4891b25b2015-06-11 11:43:45138 new FileStream(file.Pass(), base::ThreadTaskRunnerHandle::Get()));
reillygaa435e72015-06-16 00:48:48139 ASSERT_EQ(ERR_IO_PENDING, write_stream->Seek(0, callback64.callback()));
[email protected]50f91af2014-04-09 17:28:56140 ASSERT_EQ(0, callback64.WaitForResult());
141 scoped_refptr<IOBufferWithSize> write_buffer = CreateTestDataBuffer();
142 rv = write_stream->Write(write_buffer.get(), kTestDataSize,
143 callback.callback());
144 ASSERT_EQ(kTestDataSize, callback.GetResult(rv));
[email protected]aab1b9e2012-11-06 00:29:51145 write_stream.reset();
[email protected]92aad5222009-02-09 22:26:41146
147 // Read into buffer and compare to make sure the handle worked fine.
148 ASSERT_EQ(kTestDataSize,
[email protected]50f91af2014-04-09 17:28:56149 base::ReadFile(temp_file_path(), read_buffer->data(),
150 kTestDataSize));
151 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize));
[email protected]92aad5222009-02-09 22:26:41152}
153
[email protected]21da6eb2008-11-03 17:18:14154TEST_F(FileStreamTest, UseClosedStream) {
[email protected]50f91af2014-04-09 17:28:56155 int rv = 0;
156 TestCompletionCallback callback;
157 TestInt64CompletionCallback callback64;
158
skyostil4891b25b2015-06-11 11:43:45159 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]21da6eb2008-11-03 17:18:14160
161 EXPECT_FALSE(stream.IsOpen());
162
163 // Try seeking...
reillygaa435e72015-06-16 00:48:48164 rv = stream.Seek(5, callback64.callback());
[email protected]50f91af2014-04-09 17:28:56165 EXPECT_EQ(ERR_UNEXPECTED, callback64.GetResult(rv));
[email protected]21da6eb2008-11-03 17:18:14166
167 // Try reading...
[email protected]50f91af2014-04-09 17:28:56168 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(10);
dchengc80fed2a2014-08-27 21:47:36169 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]50f91af2014-04-09 17:28:56170 EXPECT_EQ(ERR_UNEXPECTED, callback.GetResult(rv));
[email protected]21da6eb2008-11-03 17:18:14171}
172
[email protected]633ff3b12014-06-20 23:30:18173TEST_F(FileStreamTest, Read) {
wtc69f8ea82015-06-04 00:08:13174 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15175 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14176
skyostil4891b25b2015-06-11 11:43:45177 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]a08305912014-03-21 00:41:15178 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
179 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20180 TestCompletionCallback callback;
181 int rv = stream.Open(temp_file_path(), flags, callback.callback());
[email protected]633ff3b12014-06-20 23:30:18182 EXPECT_EQ(OK, callback.GetResult(rv));
[email protected]21da6eb2008-11-03 17:18:14183
[email protected]4c2048a2009-03-24 21:02:01184 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14185
186 std::string data_read;
187 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20188 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50189 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]633ff3b12014-06-20 23:30:18190 rv = callback.GetResult(rv);
[email protected]21da6eb2008-11-03 17:18:14191 EXPECT_LE(0, rv);
192 if (rv <= 0)
193 break;
194 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20195 data_read.append(buf->data(), rv);
[email protected]21da6eb2008-11-03 17:18:14196 }
197 EXPECT_EQ(file_size, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01198 EXPECT_EQ(kTestData, data_read);
199}
200
[email protected]633ff3b12014-06-20 23:30:18201TEST_F(FileStreamTest, Read_EarlyDelete) {
wtc69f8ea82015-06-04 00:08:13202 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15203 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]06b802b2012-02-22 03:34:54204
[email protected]dd2c4382013-09-07 16:01:47205 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45206 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[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]06b802b2012-02-22 03:34:54209 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());
213
[email protected]06b802b2012-02-22 03:34:54214 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50215 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]06b802b2012-02-22 03:34:54216 stream.reset(); // Delete instead of closing it.
217 if (rv < 0) {
218 EXPECT_EQ(ERR_IO_PENDING, rv);
219 // The callback should not be called if the request is cancelled.
[email protected]dd2c4382013-09-07 16:01:47220 base::RunLoop().RunUntilIdle();
[email protected]06b802b2012-02-22 03:34:54221 EXPECT_FALSE(callback.have_result());
222 } else {
223 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv));
224 }
225}
226
[email protected]633ff3b12014-06-20 23:30:18227TEST_F(FileStreamTest, Read_FromOffset) {
wtc69f8ea82015-06-04 00:08:13228 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15229 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14230
skyostil4891b25b2015-06-11 11:43:45231 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]a08305912014-03-21 00:41:15232 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
233 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20234 TestCompletionCallback callback;
235 int rv = stream.Open(temp_file_path(), flags, callback.callback());
236 EXPECT_EQ(ERR_IO_PENDING, rv);
237 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14238
[email protected]cf02541b2012-04-11 08:02:17239 TestInt64CompletionCallback callback64;
wtc69f8ea82015-06-04 00:08:13240 const int64_t kOffset = 3;
reillygaa435e72015-06-16 00:48:48241 rv = stream.Seek(kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17242 ASSERT_EQ(ERR_IO_PENDING, rv);
wtc69f8ea82015-06-04 00:08:13243 int64_t new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14244 EXPECT_EQ(kOffset, new_offset);
245
[email protected]4c2048a2009-03-24 21:02:01246 int total_bytes_read = 0;
[email protected]21da6eb2008-11-03 17:18:14247
248 std::string data_read;
249 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20250 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50251 rv = stream.Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07252 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14253 rv = callback.WaitForResult();
254 EXPECT_LE(0, rv);
255 if (rv <= 0)
256 break;
257 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20258 data_read.append(buf->data(), rv);
[email protected]21da6eb2008-11-03 17:18:14259 }
260 EXPECT_EQ(file_size - kOffset, total_bytes_read);
[email protected]4c2048a2009-03-24 21:02:01261 EXPECT_EQ(kTestData + kOffset, data_read);
[email protected]21da6eb2008-11-03 17:18:14262}
263
[email protected]633ff3b12014-06-20 23:30:18264TEST_F(FileStreamTest, Write) {
skyostil4891b25b2015-06-11 11:43:45265 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]a08305912014-03-21 00:41:15266 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
267 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20268 TestCompletionCallback callback;
269 int rv = stream.Open(temp_file_path(), flags, callback.callback());
[email protected]633ff3b12014-06-20 23:30:18270 EXPECT_EQ(OK, callback.GetResult(rv));
[email protected]21da6eb2008-11-03 17:18:14271
wtc69f8ea82015-06-04 00:08:13272 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15273 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14274 EXPECT_EQ(0, file_size);
275
[email protected]633ff3b12014-06-20 23:30:18276 scoped_refptr<IOBuffer> buf = CreateTestDataBuffer();
277 rv = stream.Write(buf.get(), kTestDataSize, callback.callback());
278 rv = callback.GetResult(rv);
279 EXPECT_EQ(kTestDataSize, rv);
[email protected]21da6eb2008-11-03 17:18:14280
[email protected]a08305912014-03-21 00:41:15281 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]633ff3b12014-06-20 23:30:18282 EXPECT_EQ(kTestDataSize, file_size);
283
284 std::string data_read;
285 EXPECT_TRUE(base::ReadFileToString(temp_file_path(), &data_read));
286 EXPECT_EQ(kTestData, data_read);
[email protected]21da6eb2008-11-03 17:18:14287}
288
[email protected]633ff3b12014-06-20 23:30:18289TEST_F(FileStreamTest, Write_EarlyDelete) {
[email protected]dd2c4382013-09-07 16:01:47290 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45291 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[email protected]a08305912014-03-21 00:41:15292 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
293 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20294 TestCompletionCallback callback;
295 int rv = stream->Open(temp_file_path(), flags, callback.callback());
296 EXPECT_EQ(ERR_IO_PENDING, rv);
297 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01298
wtc69f8ea82015-06-04 00:08:13299 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15300 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01301 EXPECT_EQ(0, file_size);
302
[email protected]9f49afb2012-02-16 09:59:20303 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50304 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]aab1b9e2012-11-06 00:29:51305 stream.reset();
[email protected]3828a752009-06-03 23:05:59306 if (rv < 0) {
[email protected]8effd3f62011-03-25 16:29:07307 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]3828a752009-06-03 23:05:59308 // The callback should not be called if the request is cancelled.
[email protected]dd2c4382013-09-07 16:01:47309 base::RunLoop().RunUntilIdle();
[email protected]3828a752009-06-03 23:05:59310 EXPECT_FALSE(callback.have_result());
311 } else {
[email protected]a08305912014-03-21 00:41:15312 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]3828a752009-06-03 23:05:59313 EXPECT_EQ(file_size, rv);
314 }
[email protected]4c2048a2009-03-24 21:02:01315}
316
[email protected]633ff3b12014-06-20 23:30:18317TEST_F(FileStreamTest, Write_FromOffset) {
wtc69f8ea82015-06-04 00:08:13318 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15319 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14320
skyostil4891b25b2015-06-11 11:43:45321 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]a08305912014-03-21 00:41:15322 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
323 base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20324 TestCompletionCallback callback;
325 int rv = stream.Open(temp_file_path(), flags, callback.callback());
326 EXPECT_EQ(ERR_IO_PENDING, rv);
327 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]21da6eb2008-11-03 17:18:14328
[email protected]cf02541b2012-04-11 08:02:17329 TestInt64CompletionCallback callback64;
reillygaa435e72015-06-16 00:48:48330 const int64_t kOffset = kTestDataSize;
331 rv = stream.Seek(kOffset, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17332 ASSERT_EQ(ERR_IO_PENDING, rv);
wtc69f8ea82015-06-04 00:08:13333 int64_t new_offset = callback64.WaitForResult();
[email protected]21da6eb2008-11-03 17:18:14334 EXPECT_EQ(kTestDataSize, new_offset);
335
[email protected]4c2048a2009-03-24 21:02:01336 int total_bytes_written = 0;
[email protected]21da6eb2008-11-03 17:18:14337
[email protected]9f49afb2012-02-16 09:59:20338 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
339 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50340 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]21da6eb2008-11-03 17:18:14341 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15342 rv = stream.Write(drainable.get(), drainable->BytesRemaining(),
343 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07344 if (rv == ERR_IO_PENDING)
[email protected]21da6eb2008-11-03 17:18:14345 rv = callback.WaitForResult();
346 EXPECT_LT(0, rv);
347 if (rv <= 0)
348 break;
[email protected]9f49afb2012-02-16 09:59:20349 drainable->DidConsume(rv);
[email protected]21da6eb2008-11-03 17:18:14350 total_bytes_written += rv;
351 }
[email protected]a08305912014-03-21 00:41:15352 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]21da6eb2008-11-03 17:18:14353 EXPECT_EQ(file_size, kTestDataSize * 2);
354}
355
[email protected]633ff3b12014-06-20 23:30:18356TEST_F(FileStreamTest, BasicReadWrite) {
wtc69f8ea82015-06-04 00:08:13357 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15358 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01359
[email protected]dd2c4382013-09-07 16:01:47360 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45361 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[email protected]a08305912014-03-21 00:41:15362 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
363 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20364 TestCompletionCallback callback;
365 int rv = stream->Open(temp_file_path(), flags, callback.callback());
366 EXPECT_EQ(ERR_IO_PENDING, rv);
367 EXPECT_EQ(OK, callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01368
wtc69f8ea82015-06-04 00:08:13369 int64_t total_bytes_read = 0;
[email protected]4c2048a2009-03-24 21:02:01370
371 std::string data_read;
372 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20373 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50374 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07375 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01376 rv = callback.WaitForResult();
377 EXPECT_LE(0, rv);
378 if (rv <= 0)
379 break;
380 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20381 data_read.append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01382 }
383 EXPECT_EQ(file_size, total_bytes_read);
384 EXPECT_TRUE(data_read == kTestData);
385
386 int total_bytes_written = 0;
387
[email protected]9f49afb2012-02-16 09:59:20388 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
389 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50390 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]4c2048a2009-03-24 21:02:01391 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15392 rv = stream->Write(drainable.get(), drainable->BytesRemaining(),
393 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07394 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01395 rv = callback.WaitForResult();
396 EXPECT_LT(0, rv);
397 if (rv <= 0)
398 break;
[email protected]9f49afb2012-02-16 09:59:20399 drainable->DidConsume(rv);
[email protected]4c2048a2009-03-24 21:02:01400 total_bytes_written += rv;
401 }
402
[email protected]aab1b9e2012-11-06 00:29:51403 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01404
[email protected]a08305912014-03-21 00:41:15405 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01406 EXPECT_EQ(kTestDataSize * 2, file_size);
407}
408
[email protected]633ff3b12014-06-20 23:30:18409TEST_F(FileStreamTest, BasicWriteRead) {
wtc69f8ea82015-06-04 00:08:13410 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15411 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01412
[email protected]dd2c4382013-09-07 16:01:47413 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45414 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[email protected]a08305912014-03-21 00:41:15415 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
416 base::File::FLAG_WRITE | 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]4c2048a2009-03-24 21:02:01421
[email protected]cf02541b2012-04-11 08:02:17422 TestInt64CompletionCallback callback64;
reillygaa435e72015-06-16 00:48:48423 rv = stream->Seek(file_size, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17424 ASSERT_EQ(ERR_IO_PENDING, rv);
wtc69f8ea82015-06-04 00:08:13425 int64_t offset = callback64.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01426 EXPECT_EQ(offset, file_size);
427
[email protected]4c2048a2009-03-24 21:02:01428 int total_bytes_written = 0;
429
[email protected]9f49afb2012-02-16 09:59:20430 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
431 scoped_refptr<DrainableIOBuffer> drainable =
[email protected]90499482013-06-01 00:39:50432 new DrainableIOBuffer(buf.get(), buf->size());
[email protected]4c2048a2009-03-24 21:02:01433 while (total_bytes_written != kTestDataSize) {
[email protected]a08305912014-03-21 00:41:15434 rv = stream->Write(drainable.get(), drainable->BytesRemaining(),
435 callback.callback());
[email protected]8effd3f62011-03-25 16:29:07436 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01437 rv = callback.WaitForResult();
438 EXPECT_LT(0, rv);
439 if (rv <= 0)
440 break;
[email protected]9f49afb2012-02-16 09:59:20441 drainable->DidConsume(rv);
[email protected]4c2048a2009-03-24 21:02:01442 total_bytes_written += rv;
443 }
444
445 EXPECT_EQ(kTestDataSize, total_bytes_written);
446
reillygaa435e72015-06-16 00:48:48447 rv = stream->Seek(0, callback64.callback());
[email protected]cf02541b2012-04-11 08:02:17448 ASSERT_EQ(ERR_IO_PENDING, rv);
449 offset = callback64.WaitForResult();
[email protected]4c2048a2009-03-24 21:02:01450 EXPECT_EQ(0, offset);
451
452 int total_bytes_read = 0;
453
454 std::string data_read;
455 for (;;) {
[email protected]9f49afb2012-02-16 09:59:20456 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
[email protected]90499482013-06-01 00:39:50457 rv = stream->Read(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07458 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01459 rv = callback.WaitForResult();
460 EXPECT_LE(0, rv);
461 if (rv <= 0)
462 break;
463 total_bytes_read += rv;
[email protected]9f49afb2012-02-16 09:59:20464 data_read.append(buf->data(), rv);
[email protected]4c2048a2009-03-24 21:02:01465 }
[email protected]aab1b9e2012-11-06 00:29:51466 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01467
[email protected]a08305912014-03-21 00:41:15468 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01469 EXPECT_EQ(kTestDataSize * 2, file_size);
470
471 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
472 const std::string kExpectedFileData =
473 std::string(kTestData) + std::string(kTestData);
474 EXPECT_EQ(kExpectedFileData, data_read);
475}
476
[email protected]5eb431e22011-10-12 08:51:38477class TestWriteReadCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01478 public:
[email protected]90499482013-06-01 00:39:50479 TestWriteReadCompletionCallback(FileStream* stream,
480 int* total_bytes_written,
481 int* total_bytes_read,
482 std::string* data_read)
[email protected]4c2048a2009-03-24 21:02:01483 : result_(0),
484 have_result_(false),
485 waiting_for_result_(false),
486 stream_(stream),
487 total_bytes_written_(total_bytes_written),
488 total_bytes_read_(total_bytes_read),
[email protected]5eb431e22011-10-12 08:51:38489 data_read_(data_read),
490 callback_(base::Bind(&TestWriteReadCompletionCallback::OnComplete,
[email protected]9f49afb2012-02-16 09:59:20491 base::Unretained(this))),
492 test_data_(CreateTestDataBuffer()),
[email protected]90499482013-06-01 00:39:50493 drainable_(new DrainableIOBuffer(test_data_.get(), kTestDataSize)) {}
[email protected]4c2048a2009-03-24 21:02:01494
495 int WaitForResult() {
496 DCHECK(!waiting_for_result_);
497 while (!have_result_) {
498 waiting_for_result_ = true;
[email protected]dd2c4382013-09-07 16:01:47499 base::RunLoop().Run();
[email protected]4c2048a2009-03-24 21:02:01500 waiting_for_result_ = false;
501 }
502 have_result_ = false; // auto-reset for next callback
503 return result_;
504 }
505
[email protected]5eb431e22011-10-12 08:51:38506 const CompletionCallback& callback() const { return callback_; }
507
ananta959eaea2015-02-03 19:50:50508 void ValidateWrittenData() {
509 TestCompletionCallback callback;
510 int rv = 0;
511 for (;;) {
512 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
513 rv = stream_->Read(buf.get(), buf->size(), callback.callback());
514 if (rv == ERR_IO_PENDING) {
515 base::MessageLoop::ScopedNestableTaskAllower allow(
516 base::MessageLoop::current());
517 rv = callback.WaitForResult();
518 }
519 EXPECT_LE(0, rv);
520 if (rv <= 0)
521 break;
522 *total_bytes_read_ += rv;
523 data_read_->append(buf->data(), rv);
524 }
525 }
526
[email protected]4c2048a2009-03-24 21:02:01527 private:
[email protected]5eb431e22011-10-12 08:51:38528 void OnComplete(int result) {
529 DCHECK_LT(0, result);
530 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01531
532 int rv;
533
534 if (*total_bytes_written_ != kTestDataSize) {
535 // Recurse to finish writing all data.
536 int total_bytes_written = 0, total_bytes_read = 0;
537 std::string data_read;
[email protected]5eb431e22011-10-12 08:51:38538 TestWriteReadCompletionCallback callback(
[email protected]4c2048a2009-03-24 21:02:01539 stream_, &total_bytes_written, &total_bytes_read, &data_read);
[email protected]90499482013-06-01 00:39:50540 rv = stream_->Write(
541 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07542 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01543 rv = callback.WaitForResult();
[email protected]9f49afb2012-02-16 09:59:20544 drainable_->DidConsume(total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01545 *total_bytes_written_ += total_bytes_written;
546 *total_bytes_read_ += total_bytes_read;
547 *data_read_ += data_read;
548 } else { // We're done writing all data. Start reading the data.
[email protected]50f91af2014-04-09 17:28:56549 TestInt64CompletionCallback callback64;
reillygaa435e72015-06-16 00:48:48550 EXPECT_EQ(ERR_IO_PENDING, stream_->Seek(0, callback64.callback()));
[email protected]50f91af2014-04-09 17:28:56551 {
552 base::MessageLoop::ScopedNestableTaskAllower allow(
553 base::MessageLoop::current());
554 EXPECT_LE(0, callback64.WaitForResult());
555 }
[email protected]4c2048a2009-03-24 21:02:01556 }
557
558 result_ = *total_bytes_written_;
559 have_result_ = true;
560 if (waiting_for_result_)
ki.stfu375812e2015-10-09 20:23:17561 base::MessageLoop::current()->QuitWhenIdle();
[email protected]4c2048a2009-03-24 21:02:01562 }
563
564 int result_;
565 bool have_result_;
566 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07567 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01568 int* total_bytes_written_;
569 int* total_bytes_read_;
570 std::string* data_read_;
[email protected]5eb431e22011-10-12 08:51:38571 const CompletionCallback callback_;
[email protected]9f49afb2012-02-16 09:59:20572 scoped_refptr<IOBufferWithSize> test_data_;
573 scoped_refptr<DrainableIOBuffer> drainable_;
[email protected]4c2048a2009-03-24 21:02:01574
[email protected]5eb431e22011-10-12 08:51:38575 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01576};
577
[email protected]633ff3b12014-06-20 23:30:18578TEST_F(FileStreamTest, WriteRead) {
wtc69f8ea82015-06-04 00:08:13579 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15580 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01581
[email protected]dd2c4382013-09-07 16:01:47582 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45583 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[email protected]a08305912014-03-21 00:41:15584 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
585 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20586 TestCompletionCallback open_callback;
587 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
588 EXPECT_EQ(ERR_IO_PENDING, rv);
589 EXPECT_EQ(OK, open_callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01590
[email protected]50f91af2014-04-09 17:28:56591 TestInt64CompletionCallback callback64;
reillygaa435e72015-06-16 00:48:48592 EXPECT_EQ(ERR_IO_PENDING, stream->Seek(file_size, callback64.callback()));
[email protected]50f91af2014-04-09 17:28:56593 EXPECT_EQ(file_size, callback64.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01594
595 int total_bytes_written = 0;
596 int total_bytes_read = 0;
597 std::string data_read;
[email protected]aab1b9e2012-11-06 00:29:51598 TestWriteReadCompletionCallback callback(stream.get(), &total_bytes_written,
[email protected]4c2048a2009-03-24 21:02:01599 &total_bytes_read, &data_read);
600
[email protected]9f49afb2012-02-16 09:59:20601 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50602 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07603 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01604 rv = callback.WaitForResult();
605 EXPECT_LT(0, rv);
606 EXPECT_EQ(kTestDataSize, total_bytes_written);
607
ananta959eaea2015-02-03 19:50:50608 callback.ValidateWrittenData();
609
[email protected]aab1b9e2012-11-06 00:29:51610 stream.reset();
[email protected]4c2048a2009-03-24 21:02:01611
[email protected]a08305912014-03-21 00:41:15612 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01613 EXPECT_EQ(kTestDataSize * 2, file_size);
614
615 EXPECT_EQ(kTestDataSize * 2, total_bytes_read);
616 const std::string kExpectedFileData =
617 std::string(kTestData) + std::string(kTestData);
618 EXPECT_EQ(kExpectedFileData, data_read);
619}
620
[email protected]5eb431e22011-10-12 08:51:38621class TestWriteCloseCompletionCallback {
[email protected]4c2048a2009-03-24 21:02:01622 public:
[email protected]5eb431e22011-10-12 08:51:38623 TestWriteCloseCompletionCallback(FileStream* stream, int* total_bytes_written)
[email protected]4c2048a2009-03-24 21:02:01624 : result_(0),
625 have_result_(false),
626 waiting_for_result_(false),
627 stream_(stream),
[email protected]5eb431e22011-10-12 08:51:38628 total_bytes_written_(total_bytes_written),
629 callback_(base::Bind(&TestWriteCloseCompletionCallback::OnComplete,
[email protected]9f49afb2012-02-16 09:59:20630 base::Unretained(this))),
631 test_data_(CreateTestDataBuffer()),
[email protected]90499482013-06-01 00:39:50632 drainable_(new DrainableIOBuffer(test_data_.get(), kTestDataSize)) {}
[email protected]4c2048a2009-03-24 21:02:01633
634 int WaitForResult() {
635 DCHECK(!waiting_for_result_);
636 while (!have_result_) {
637 waiting_for_result_ = true;
[email protected]dd2c4382013-09-07 16:01:47638 base::RunLoop().Run();
[email protected]4c2048a2009-03-24 21:02:01639 waiting_for_result_ = false;
640 }
641 have_result_ = false; // auto-reset for next callback
642 return result_;
643 }
644
[email protected]5eb431e22011-10-12 08:51:38645 const CompletionCallback& callback() const { return callback_; }
646
[email protected]4c2048a2009-03-24 21:02:01647 private:
[email protected]5eb431e22011-10-12 08:51:38648 void OnComplete(int result) {
649 DCHECK_LT(0, result);
650 *total_bytes_written_ += result;
[email protected]4c2048a2009-03-24 21:02:01651
652 int rv;
653
654 if (*total_bytes_written_ != kTestDataSize) {
655 // Recurse to finish writing all data.
656 int total_bytes_written = 0;
[email protected]5eb431e22011-10-12 08:51:38657 TestWriteCloseCompletionCallback callback(stream_, &total_bytes_written);
[email protected]90499482013-06-01 00:39:50658 rv = stream_->Write(
659 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07660 DCHECK_EQ(ERR_IO_PENDING, rv);
[email protected]4c2048a2009-03-24 21:02:01661 rv = callback.WaitForResult();
[email protected]9f49afb2012-02-16 09:59:20662 drainable_->DidConsume(total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01663 *total_bytes_written_ += total_bytes_written;
[email protected]4c2048a2009-03-24 21:02:01664 }
665
666 result_ = *total_bytes_written_;
667 have_result_ = true;
668 if (waiting_for_result_)
ki.stfu375812e2015-10-09 20:23:17669 base::MessageLoop::current()->QuitWhenIdle();
[email protected]4c2048a2009-03-24 21:02:01670 }
671
672 int result_;
673 bool have_result_;
674 bool waiting_for_result_;
[email protected]8effd3f62011-03-25 16:29:07675 FileStream* stream_;
[email protected]4c2048a2009-03-24 21:02:01676 int* total_bytes_written_;
[email protected]5eb431e22011-10-12 08:51:38677 const CompletionCallback callback_;
[email protected]9f49afb2012-02-16 09:59:20678 scoped_refptr<IOBufferWithSize> test_data_;
679 scoped_refptr<DrainableIOBuffer> drainable_;
[email protected]4c2048a2009-03-24 21:02:01680
[email protected]5eb431e22011-10-12 08:51:38681 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback);
[email protected]4c2048a2009-03-24 21:02:01682};
683
[email protected]633ff3b12014-06-20 23:30:18684TEST_F(FileStreamTest, WriteClose) {
wtc69f8ea82015-06-04 00:08:13685 int64_t file_size;
[email protected]a08305912014-03-21 00:41:15686 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01687
[email protected]dd2c4382013-09-07 16:01:47688 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45689 new FileStream(base::ThreadTaskRunnerHandle::Get()));
[email protected]a08305912014-03-21 00:41:15690 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
691 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]66af1d62013-03-06 23:13:20692 TestCompletionCallback open_callback;
693 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
694 EXPECT_EQ(ERR_IO_PENDING, rv);
695 EXPECT_EQ(OK, open_callback.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01696
[email protected]50f91af2014-04-09 17:28:56697 TestInt64CompletionCallback callback64;
reillygaa435e72015-06-16 00:48:48698 EXPECT_EQ(ERR_IO_PENDING, stream->Seek(file_size, callback64.callback()));
[email protected]50f91af2014-04-09 17:28:56699 EXPECT_EQ(file_size, callback64.WaitForResult());
[email protected]4c2048a2009-03-24 21:02:01700
701 int total_bytes_written = 0;
[email protected]aab1b9e2012-11-06 00:29:51702 TestWriteCloseCompletionCallback callback(stream.get(), &total_bytes_written);
[email protected]4c2048a2009-03-24 21:02:01703
[email protected]9f49afb2012-02-16 09:59:20704 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
[email protected]90499482013-06-01 00:39:50705 rv = stream->Write(buf.get(), buf->size(), callback.callback());
[email protected]8effd3f62011-03-25 16:29:07706 if (rv == ERR_IO_PENDING)
[email protected]4c2048a2009-03-24 21:02:01707 total_bytes_written = callback.WaitForResult();
708 EXPECT_LT(0, total_bytes_written);
709 EXPECT_EQ(kTestDataSize, total_bytes_written);
710
[email protected]aab1b9e2012-11-06 00:29:51711 stream.reset();
712
[email protected]a08305912014-03-21 00:41:15713 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
[email protected]4c2048a2009-03-24 21:02:01714 EXPECT_EQ(kTestDataSize * 2, file_size);
715}
716
[email protected]633ff3b12014-06-20 23:30:18717TEST_F(FileStreamTest, OpenAndDelete) {
tapted012326b2015-12-03 04:43:05718 base::SequencedWorkerPoolOwner pool_owner(1, "StreamTest");
[email protected]e3ec0625d2014-05-02 23:58:54719
720 bool prev = base::ThreadRestrictions::SetIOAllowed(false);
tapted012326b2015-12-03 04:43:05721 scoped_ptr<FileStream> stream(new FileStream(pool_owner.pool()));
[email protected]a08305912014-03-21 00:41:15722 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
723 base::File::FLAG_ASYNC;
[email protected]dbb747c2012-02-29 19:29:47724 TestCompletionCallback open_callback;
725 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
726 EXPECT_EQ(ERR_IO_PENDING, rv);
727
728 // Delete the stream without waiting for the open operation to be
729 // complete. Should be safe.
730 stream.reset();
[email protected]e3ec0625d2014-05-02 23:58:54731
732 // Force an operation through the pool.
tapted012326b2015-12-03 04:43:05733 scoped_ptr<FileStream> stream2(new FileStream(pool_owner.pool()));
[email protected]e3ec0625d2014-05-02 23:58:54734 TestCompletionCallback open_callback2;
735 rv = stream2->Open(temp_file_path(), flags, open_callback2.callback());
736 EXPECT_EQ(OK, open_callback2.GetResult(rv));
737 stream2.reset();
738
[email protected]dbb747c2012-02-29 19:29:47739 // open_callback won't be called.
[email protected]dd2c4382013-09-07 16:01:47740 base::RunLoop().RunUntilIdle();
[email protected]dbb747c2012-02-29 19:29:47741 EXPECT_FALSE(open_callback.have_result());
[email protected]e3ec0625d2014-05-02 23:58:54742 base::ThreadRestrictions::SetIOAllowed(prev);
[email protected]dbb747c2012-02-29 19:29:47743}
744
[email protected]633ff3b12014-06-20 23:30:18745// Verify that Write() errors are mapped correctly.
746TEST_F(FileStreamTest, WriteError) {
[email protected]7f00ad62013-09-14 00:56:21747 // Try opening file as read-only and then writing to it using FileStream.
wtc69f8ea82015-06-04 00:08:13748 uint32_t flags =
749 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC;
[email protected]bfb88ec2013-02-27 20:21:35750
[email protected]a08305912014-03-21 00:41:15751 base::File file(temp_file_path(), flags);
752 ASSERT_TRUE(file.IsValid());
753
[email protected]7f00ad62013-09-14 00:56:21754 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45755 new FileStream(file.Pass(), base::ThreadTaskRunnerHandle::Get()));
[email protected]7f00ad62013-09-14 00:56:21756
757 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
[email protected]1a00d082013-09-14 19:57:16758 buf->data()[0] = 0;
759
[email protected]7f00ad62013-09-14 00:56:21760 TestCompletionCallback callback;
761 int rv = stream->Write(buf.get(), 1, callback.callback());
[email protected]bfb88ec2013-02-27 20:21:35762 if (rv == ERR_IO_PENDING)
763 rv = callback.WaitForResult();
764 EXPECT_LT(rv, 0);
[email protected]7f00ad62013-09-14 00:56:21765
[email protected]a08305912014-03-21 00:41:15766 stream.reset();
767 base::RunLoop().RunUntilIdle();
[email protected]bfb88ec2013-02-27 20:21:35768}
769
[email protected]633ff3b12014-06-20 23:30:18770// Verify that Read() errors are mapped correctly.
771TEST_F(FileStreamTest, ReadError) {
[email protected]7f00ad62013-09-14 00:56:21772 // Try opening file for write and then reading from it using FileStream.
wtc69f8ea82015-06-04 00:08:13773 uint32_t flags =
774 base::File::FLAG_OPEN | base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
[email protected]bfb88ec2013-02-27 20:21:35775
[email protected]a08305912014-03-21 00:41:15776 base::File file(temp_file_path(), flags);
777 ASSERT_TRUE(file.IsValid());
778
[email protected]7f00ad62013-09-14 00:56:21779 scoped_ptr<FileStream> stream(
skyostil4891b25b2015-06-11 11:43:45780 new FileStream(file.Pass(), base::ThreadTaskRunnerHandle::Get()));
[email protected]7f00ad62013-09-14 00:56:21781
782 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
783 TestCompletionCallback callback;
784 int rv = stream->Read(buf.get(), 1, callback.callback());
[email protected]bfb88ec2013-02-27 20:21:35785 if (rv == ERR_IO_PENDING)
786 rv = callback.WaitForResult();
787 EXPECT_LT(rv, 0);
[email protected]7f00ad62013-09-14 00:56:21788
[email protected]a08305912014-03-21 00:41:15789 stream.reset();
790 base::RunLoop().RunUntilIdle();
[email protected]bfb88ec2013-02-27 20:21:35791}
792
[email protected]f12d1e12013-11-20 07:04:55793#if defined(OS_ANDROID)
[email protected]633ff3b12014-06-20 23:30:18794TEST_F(FileStreamTest, ContentUriRead) {
[email protected]f12d1e12013-11-20 07:04:55795 base::FilePath test_dir;
796 PathService::Get(base::DIR_SOURCE_ROOT, &test_dir);
797 test_dir = test_dir.AppendASCII("net");
798 test_dir = test_dir.AppendASCII("data");
799 test_dir = test_dir.AppendASCII("file_stream_unittest");
800 ASSERT_TRUE(base::PathExists(test_dir));
801 base::FilePath image_file = test_dir.Append(FILE_PATH_LITERAL("red.png"));
802
803 // Insert the image into MediaStore. MediaStore will do some conversions, and
804 // return the content URI.
[email protected]92be8eb2014-08-07 22:57:11805 base::FilePath path = base::InsertImageIntoMediaStore(image_file);
[email protected]f12d1e12013-11-20 07:04:55806 EXPECT_TRUE(path.IsContentUri());
807 EXPECT_TRUE(base::PathExists(path));
wtc69f8ea82015-06-04 00:08:13808 int64_t file_size;
[email protected]56285702013-12-04 18:22:49809 EXPECT_TRUE(base::GetFileSize(path, &file_size));
[email protected]f12d1e12013-11-20 07:04:55810 EXPECT_LT(0, file_size);
811
skyostil4891b25b2015-06-11 11:43:45812 FileStream stream(base::ThreadTaskRunnerHandle::Get());
[email protected]a08305912014-03-21 00:41:15813 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
814 base::File::FLAG_ASYNC;
[email protected]f12d1e12013-11-20 07:04:55815 TestCompletionCallback callback;
816 int rv = stream.Open(path, flags, callback.callback());
817 EXPECT_EQ(ERR_IO_PENDING, rv);
818 EXPECT_EQ(OK, callback.WaitForResult());
819
[email protected]f12d1e12013-11-20 07:04:55820 int total_bytes_read = 0;
821
822 std::string data_read;
823 for (;;) {
824 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
825 rv = stream.Read(buf.get(), buf->size(), callback.callback());
826 if (rv == ERR_IO_PENDING)
827 rv = callback.WaitForResult();
828 EXPECT_LE(0, rv);
829 if (rv <= 0)
830 break;
831 total_bytes_read += rv;
832 data_read.append(buf->data(), rv);
833 }
834 EXPECT_EQ(file_size, total_bytes_read);
835}
836#endif
837
[email protected]4c2048a2009-03-24 21:02:01838} // namespace
[email protected]96d73822011-10-10 02:11:24839
[email protected]8effd3f62011-03-25 16:29:07840} // namespace net