Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: net/base/file_stream_unittest.cc

Issue 323683002: net: FileStream cleanup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review feedback Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/file_stream.h" 5 #include "net/base/file_stream.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/files/file.h" 10 #include "base/files/file.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/message_loop/message_loop_proxy.h" 12 #include "base/message_loop/message_loop_proxy.h"
13 #include "base/path_service.h" 13 #include "base/path_service.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/strings/string_util.h"
15 #include "base/synchronization/waitable_event.h" 16 #include "base/synchronization/waitable_event.h"
16 #include "base/test/test_timeouts.h" 17 #include "base/test/test_timeouts.h"
17 #include "base/threading/sequenced_worker_pool.h" 18 #include "base/threading/sequenced_worker_pool.h"
18 #include "base/threading/thread_restrictions.h" 19 #include "base/threading/thread_restrictions.h"
19 #include "net/base/capturing_net_log.h" 20 #include "net/base/capturing_net_log.h"
20 #include "net/base/io_buffer.h" 21 #include "net/base/io_buffer.h"
21 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
22 #include "net/base/test_completion_callback.h" 23 #include "net/base/test_completion_callback.h"
23 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
24 #include "testing/platform_test.h" 25 #include "testing/platform_test.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 } 62 }
62 63
63 const base::FilePath temp_file_path() const { return temp_file_path_; } 64 const base::FilePath temp_file_path() const { return temp_file_path_; }
64 65
65 private: 66 private:
66 base::FilePath temp_file_path_; 67 base::FilePath temp_file_path_;
67 }; 68 };
68 69
69 namespace { 70 namespace {
70 71
71 TEST_F(FileStreamTest, AsyncOpenExplicitClose) { 72 TEST_F(FileStreamTest, OpenExplicitClose) {
72 TestCompletionCallback callback; 73 TestCompletionCallback callback;
73 FileStream stream(base::MessageLoopProxy::current()); 74 FileStream stream(base::MessageLoopProxy::current());
74 int flags = base::File::FLAG_OPEN | 75 int flags = base::File::FLAG_OPEN |
75 base::File::FLAG_READ | 76 base::File::FLAG_READ |
76 base::File::FLAG_ASYNC; 77 base::File::FLAG_ASYNC;
77 int rv = stream.Open(temp_file_path(), flags, callback.callback()); 78 int rv = stream.Open(temp_file_path(), flags, callback.callback());
78 EXPECT_EQ(ERR_IO_PENDING, rv); 79 EXPECT_EQ(ERR_IO_PENDING, rv);
79 EXPECT_EQ(OK, callback.WaitForResult()); 80 EXPECT_EQ(OK, callback.WaitForResult());
80 EXPECT_TRUE(stream.IsOpen()); 81 EXPECT_TRUE(stream.IsOpen());
81 EXPECT_TRUE(stream.GetFileForTesting().IsValid()); 82 EXPECT_TRUE(stream.GetFileForTesting().IsValid());
82 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback())); 83 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback()));
83 EXPECT_EQ(OK, callback.WaitForResult()); 84 EXPECT_EQ(OK, callback.WaitForResult());
84 EXPECT_FALSE(stream.IsOpen()); 85 EXPECT_FALSE(stream.IsOpen());
85 EXPECT_FALSE(stream.GetFileForTesting().IsValid()); 86 EXPECT_FALSE(stream.GetFileForTesting().IsValid());
86 } 87 }
87 88
88 TEST_F(FileStreamTest, AsyncOpenExplicitCloseOrphaned) { 89 TEST_F(FileStreamTest, OpenExplicitCloseOrphaned) {
89 TestCompletionCallback callback; 90 TestCompletionCallback callback;
90 scoped_ptr<FileStream> stream(new FileStream( 91 scoped_ptr<FileStream> stream(new FileStream(
91 base::MessageLoopProxy::current())); 92 base::MessageLoopProxy::current()));
92 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 93 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
93 base::File::FLAG_ASYNC; 94 base::File::FLAG_ASYNC;
94 int rv = stream->Open(temp_file_path(), flags, callback.callback()); 95 int rv = stream->Open(temp_file_path(), flags, callback.callback());
95 EXPECT_EQ(ERR_IO_PENDING, rv); 96 EXPECT_EQ(ERR_IO_PENDING, rv);
96 EXPECT_EQ(OK, callback.WaitForResult()); 97 EXPECT_EQ(OK, callback.WaitForResult());
97 EXPECT_TRUE(stream->IsOpen()); 98 EXPECT_TRUE(stream->IsOpen());
98 EXPECT_TRUE(stream->GetFileForTesting().IsValid()); 99 EXPECT_TRUE(stream->GetFileForTesting().IsValid());
(...skipping 14 matching lines...) Expand all
113 ASSERT_EQ(kTestDataSize, 114 ASSERT_EQ(kTestDataSize,
114 base::WriteFile(temp_file_path(), kTestData, kTestDataSize)); 115 base::WriteFile(temp_file_path(), kTestData, kTestDataSize));
115 int flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ | 116 int flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
116 base::File::FLAG_ASYNC; 117 base::File::FLAG_ASYNC;
117 base::File file(temp_file_path(), flags); 118 base::File file(temp_file_path(), flags);
118 119
119 // Seek to the beginning of the file and read. 120 // Seek to the beginning of the file and read.
120 scoped_ptr<FileStream> read_stream( 121 scoped_ptr<FileStream> read_stream(
121 new FileStream(file.Pass(), base::MessageLoopProxy::current())); 122 new FileStream(file.Pass(), base::MessageLoopProxy::current()));
122 ASSERT_EQ(ERR_IO_PENDING, 123 ASSERT_EQ(ERR_IO_PENDING,
123 read_stream->Seek(FROM_BEGIN, 0, callback64.callback())); 124 read_stream->Seek(base::File::FROM_BEGIN, 0,
125 callback64.callback()));
124 ASSERT_EQ(0, callback64.WaitForResult()); 126 ASSERT_EQ(0, callback64.WaitForResult());
125 // Read into buffer and compare. 127 // Read into buffer and compare.
126 scoped_refptr<IOBufferWithSize> read_buffer = 128 scoped_refptr<IOBufferWithSize> read_buffer =
127 new IOBufferWithSize(kTestDataSize); 129 new IOBufferWithSize(kTestDataSize);
128 rv = read_stream->Read(read_buffer.get(), kTestDataSize, callback.callback()); 130 rv = read_stream->Read(read_buffer.get(), kTestDataSize, callback.callback());
129 ASSERT_EQ(kTestDataSize, callback.GetResult(rv)); 131 ASSERT_EQ(kTestDataSize, callback.GetResult(rv));
130 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize)); 132 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize));
131 read_stream.reset(); 133 read_stream.reset();
132 134
133 // 2. Test writing with a file handle. 135 // 2. Test writing with a file handle.
134 base::DeleteFile(temp_file_path(), false); 136 base::DeleteFile(temp_file_path(), false);
135 flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE | 137 flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE |
136 base::File::FLAG_ASYNC; 138 base::File::FLAG_ASYNC;
137 file.Initialize(temp_file_path(), flags); 139 file.Initialize(temp_file_path(), flags);
138 140
139 scoped_ptr<FileStream> write_stream( 141 scoped_ptr<FileStream> write_stream(
140 new FileStream(file.Pass(), base::MessageLoopProxy::current())); 142 new FileStream(file.Pass(), base::MessageLoopProxy::current()));
141 ASSERT_EQ(ERR_IO_PENDING, 143 ASSERT_EQ(ERR_IO_PENDING,
142 write_stream->Seek(FROM_BEGIN, 0, callback64.callback())); 144 write_stream->Seek(base::File::FROM_BEGIN, 0,
145 callback64.callback()));
143 ASSERT_EQ(0, callback64.WaitForResult()); 146 ASSERT_EQ(0, callback64.WaitForResult());
144 scoped_refptr<IOBufferWithSize> write_buffer = CreateTestDataBuffer(); 147 scoped_refptr<IOBufferWithSize> write_buffer = CreateTestDataBuffer();
145 rv = write_stream->Write(write_buffer.get(), kTestDataSize, 148 rv = write_stream->Write(write_buffer.get(), kTestDataSize,
146 callback.callback()); 149 callback.callback());
147 ASSERT_EQ(kTestDataSize, callback.GetResult(rv)); 150 ASSERT_EQ(kTestDataSize, callback.GetResult(rv));
148 write_stream.reset(); 151 write_stream.reset();
149 152
150 // Read into buffer and compare to make sure the handle worked fine. 153 // Read into buffer and compare to make sure the handle worked fine.
151 ASSERT_EQ(kTestDataSize, 154 ASSERT_EQ(kTestDataSize,
152 base::ReadFile(temp_file_path(), read_buffer->data(), 155 base::ReadFile(temp_file_path(), read_buffer->data(),
153 kTestDataSize)); 156 kTestDataSize));
154 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize)); 157 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize));
155 } 158 }
156 159
157 TEST_F(FileStreamTest, UseClosedStream) { 160 TEST_F(FileStreamTest, UseClosedStream) {
158 int rv = 0; 161 int rv = 0;
159 TestCompletionCallback callback; 162 TestCompletionCallback callback;
160 TestInt64CompletionCallback callback64; 163 TestInt64CompletionCallback callback64;
161 164
162 FileStream stream(base::MessageLoopProxy::current()); 165 FileStream stream(base::MessageLoopProxy::current());
163 166
164 EXPECT_FALSE(stream.IsOpen()); 167 EXPECT_FALSE(stream.IsOpen());
165 168
166 // Try seeking... 169 // Try seeking...
167 rv = stream.Seek(FROM_BEGIN, 5, callback64.callback()); 170 rv = stream.Seek(base::File::FROM_BEGIN, 5, callback64.callback());
168 EXPECT_EQ(ERR_UNEXPECTED, callback64.GetResult(rv)); 171 EXPECT_EQ(ERR_UNEXPECTED, callback64.GetResult(rv));
169 172
170 // Try reading... 173 // Try reading...
171 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(10); 174 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(10);
172 rv = stream.Read(buf, buf->size(), callback.callback()); 175 rv = stream.Read(buf, buf->size(), callback.callback());
173 EXPECT_EQ(ERR_UNEXPECTED, callback.GetResult(rv)); 176 EXPECT_EQ(ERR_UNEXPECTED, callback.GetResult(rv));
174 } 177 }
175 178
176 TEST_F(FileStreamTest, AsyncRead) { 179 TEST_F(FileStreamTest, Read) {
177 int64 file_size; 180 int64 file_size;
178 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 181 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
179 182
180 FileStream stream(base::MessageLoopProxy::current()); 183 FileStream stream(base::MessageLoopProxy::current());
181 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 184 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
182 base::File::FLAG_ASYNC; 185 base::File::FLAG_ASYNC;
183 TestCompletionCallback callback; 186 TestCompletionCallback callback;
184 int rv = stream.Open(temp_file_path(), flags, callback.callback()); 187 int rv = stream.Open(temp_file_path(), flags, callback.callback());
185 EXPECT_EQ(ERR_IO_PENDING, rv); 188 EXPECT_EQ(OK, callback.GetResult(rv));
186 EXPECT_EQ(OK, callback.WaitForResult());
187 189
188 int total_bytes_read = 0; 190 int total_bytes_read = 0;
189 191
190 std::string data_read; 192 std::string data_read;
191 for (;;) { 193 for (;;) {
192 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); 194 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
193 rv = stream.Read(buf.get(), buf->size(), callback.callback()); 195 rv = stream.Read(buf.get(), buf->size(), callback.callback());
194 if (rv == ERR_IO_PENDING) 196 rv = callback.GetResult(rv);
195 rv = callback.WaitForResult();
196 EXPECT_LE(0, rv); 197 EXPECT_LE(0, rv);
197 if (rv <= 0) 198 if (rv <= 0)
198 break; 199 break;
199 total_bytes_read += rv; 200 total_bytes_read += rv;
200 data_read.append(buf->data(), rv); 201 data_read.append(buf->data(), rv);
201 } 202 }
202 EXPECT_EQ(file_size, total_bytes_read); 203 EXPECT_EQ(file_size, total_bytes_read);
203 EXPECT_EQ(kTestData, data_read); 204 EXPECT_EQ(kTestData, data_read);
204 } 205 }
205 206
206 TEST_F(FileStreamTest, AsyncRead_EarlyDelete) { 207 TEST_F(FileStreamTest, ReadNonBlocking) {
208 TestCompletionCallback callback;
209
210 #if defined(OS_WIN)
211 FileStream stream(base::MessageLoopProxy::current());
212 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
213 base::File::FLAG_ASYNC;
214 int rv = stream.Open(temp_file_path(), flags, callback.callback());
215 EXPECT_EQ(OK, callback.GetResult(rv));
216 #elif defined(OS_POSIX)
217 int fds[2], rv;
hashimoto 2014/06/13 06:10:42 Oh, I wasn't aware that libevent does nothing for
rvargas (doing something else) 2014/06/13 19:58:24 Expanded the comment.
218 ASSERT_EQ(0, pipe(fds));
219 base::File read_end(fds[0]);
220 base::File write_end(fds[1]);
221 ASSERT_TRUE(read_end.IsValid());
222 ASSERT_EQ(kTestDataSize,
223 write_end.WriteAtCurrentPos(kTestData, kTestDataSize));
224 write_end.Close();
225
226 FileStream stream(read_end.Pass(), base::MessageLoopProxy::current());
227 #endif // OS_POSIX
228
229 int total_bytes_read = 0;
230 std::string data_read;
231 for (;;) {
232 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
233 rv = stream.ReadNonBlocking(buf.get(), buf->size(), callback.callback());
234 rv = callback.GetResult(rv);
235 EXPECT_LE(0, rv);
236 if (rv <= 0)
237 break;
238 total_bytes_read += rv;
239 data_read.append(buf->data(), rv);
240 }
241 EXPECT_EQ(kTestDataSize, total_bytes_read);
242 EXPECT_EQ(kTestData, data_read);
243 }
244
245 // Tests for proper cleanup when waiting to issue a non-blocking operation.
246 TEST_F(FileStreamTest, ReadNonBlocking_Stuck) {
247 {
248 FileStream stream(base::MessageLoopProxy::current());
249 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
250 base::File::FLAG_ASYNC;
251 TestCompletionCallback callback;
252 int rv = stream.Open(temp_file_path(), flags, callback.callback());
253 EXPECT_EQ(OK, callback.GetResult(rv));
254
255 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
256 // This will get stuck on POSIX.
257 stream.ReadNonBlocking(buf.get(), buf->size(), callback.callback());
258 }
259 // The stream is gone. Allow proper cleanup.
260 base::RunLoop().RunUntilIdle();
261 }
262
263 TEST_F(FileStreamTest, Read_EarlyDelete) {
207 int64 file_size; 264 int64 file_size;
208 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 265 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
209 266
210 scoped_ptr<FileStream> stream( 267 scoped_ptr<FileStream> stream(
211 new FileStream(base::MessageLoopProxy::current())); 268 new FileStream(base::MessageLoopProxy::current()));
212 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 269 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
213 base::File::FLAG_ASYNC; 270 base::File::FLAG_ASYNC;
214 TestCompletionCallback callback; 271 TestCompletionCallback callback;
215 int rv = stream->Open(temp_file_path(), flags, callback.callback()); 272 int rv = stream->Open(temp_file_path(), flags, callback.callback());
216 EXPECT_EQ(ERR_IO_PENDING, rv); 273 EXPECT_EQ(ERR_IO_PENDING, rv);
217 EXPECT_EQ(OK, callback.WaitForResult()); 274 EXPECT_EQ(OK, callback.WaitForResult());
218 275
219 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); 276 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
220 rv = stream->Read(buf.get(), buf->size(), callback.callback()); 277 rv = stream->Read(buf.get(), buf->size(), callback.callback());
221 stream.reset(); // Delete instead of closing it. 278 stream.reset(); // Delete instead of closing it.
222 if (rv < 0) { 279 if (rv < 0) {
223 EXPECT_EQ(ERR_IO_PENDING, rv); 280 EXPECT_EQ(ERR_IO_PENDING, rv);
224 // The callback should not be called if the request is cancelled. 281 // The callback should not be called if the request is cancelled.
225 base::RunLoop().RunUntilIdle(); 282 base::RunLoop().RunUntilIdle();
226 EXPECT_FALSE(callback.have_result()); 283 EXPECT_FALSE(callback.have_result());
227 } else { 284 } else {
228 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv)); 285 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv));
229 } 286 }
230 } 287 }
231 288
232 TEST_F(FileStreamTest, AsyncRead_FromOffset) { 289 TEST_F(FileStreamTest, Read_FromOffset) {
233 int64 file_size; 290 int64 file_size;
234 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 291 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
235 292
236 FileStream stream(base::MessageLoopProxy::current()); 293 FileStream stream(base::MessageLoopProxy::current());
237 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 294 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
238 base::File::FLAG_ASYNC; 295 base::File::FLAG_ASYNC;
239 TestCompletionCallback callback; 296 TestCompletionCallback callback;
240 int rv = stream.Open(temp_file_path(), flags, callback.callback()); 297 int rv = stream.Open(temp_file_path(), flags, callback.callback());
241 EXPECT_EQ(ERR_IO_PENDING, rv); 298 EXPECT_EQ(ERR_IO_PENDING, rv);
242 EXPECT_EQ(OK, callback.WaitForResult()); 299 EXPECT_EQ(OK, callback.WaitForResult());
243 300
244 TestInt64CompletionCallback callback64; 301 TestInt64CompletionCallback callback64;
245 const int64 kOffset = 3; 302 const int64 kOffset = 3;
246 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback()); 303 rv = stream.Seek(base::File::FROM_BEGIN, kOffset, callback64.callback());
247 ASSERT_EQ(ERR_IO_PENDING, rv); 304 ASSERT_EQ(ERR_IO_PENDING, rv);
248 int64 new_offset = callback64.WaitForResult(); 305 int64 new_offset = callback64.WaitForResult();
249 EXPECT_EQ(kOffset, new_offset); 306 EXPECT_EQ(kOffset, new_offset);
250 307
251 int total_bytes_read = 0; 308 int total_bytes_read = 0;
252 309
253 std::string data_read; 310 std::string data_read;
254 for (;;) { 311 for (;;) {
255 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); 312 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
256 rv = stream.Read(buf.get(), buf->size(), callback.callback()); 313 rv = stream.Read(buf.get(), buf->size(), callback.callback());
257 if (rv == ERR_IO_PENDING) 314 if (rv == ERR_IO_PENDING)
258 rv = callback.WaitForResult(); 315 rv = callback.WaitForResult();
259 EXPECT_LE(0, rv); 316 EXPECT_LE(0, rv);
260 if (rv <= 0) 317 if (rv <= 0)
261 break; 318 break;
262 total_bytes_read += rv; 319 total_bytes_read += rv;
263 data_read.append(buf->data(), rv); 320 data_read.append(buf->data(), rv);
264 } 321 }
265 EXPECT_EQ(file_size - kOffset, total_bytes_read); 322 EXPECT_EQ(file_size - kOffset, total_bytes_read);
266 EXPECT_EQ(kTestData + kOffset, data_read); 323 EXPECT_EQ(kTestData + kOffset, data_read);
267 } 324 }
268 325
269 TEST_F(FileStreamTest, AsyncSeekAround) { 326 TEST_F(FileStreamTest, SeekAround) {
270 FileStream stream(base::MessageLoopProxy::current()); 327 FileStream stream(base::MessageLoopProxy::current());
271 int flags = base::File::FLAG_OPEN | base::File::FLAG_ASYNC | 328 int flags = base::File::FLAG_OPEN | base::File::FLAG_ASYNC |
272 base::File::FLAG_READ; 329 base::File::FLAG_READ;
273 TestCompletionCallback callback; 330 TestCompletionCallback callback;
274 int rv = stream.Open(temp_file_path(), flags, callback.callback()); 331 int rv = stream.Open(temp_file_path(), flags, callback.callback());
275 EXPECT_EQ(ERR_IO_PENDING, rv); 332 EXPECT_EQ(ERR_IO_PENDING, rv);
276 EXPECT_EQ(OK, callback.WaitForResult()); 333 EXPECT_EQ(OK, callback.WaitForResult());
277 334
278 TestInt64CompletionCallback callback64; 335 TestInt64CompletionCallback callback64;
279 336
280 const int64 kOffset = 3; 337 const int64 kOffset = 3;
281 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback()); 338 rv = stream.Seek(base::File::FROM_BEGIN, kOffset, callback64.callback());
282 ASSERT_EQ(ERR_IO_PENDING, rv); 339 ASSERT_EQ(ERR_IO_PENDING, rv);
283 int64 new_offset = callback64.WaitForResult(); 340 int64 new_offset = callback64.WaitForResult();
284 EXPECT_EQ(kOffset, new_offset); 341 EXPECT_EQ(kOffset, new_offset);
285 342
286 rv = stream.Seek(FROM_CURRENT, kOffset, callback64.callback()); 343 rv = stream.Seek(base::File::FROM_CURRENT, kOffset, callback64.callback());
287 ASSERT_EQ(ERR_IO_PENDING, rv); 344 ASSERT_EQ(ERR_IO_PENDING, rv);
288 new_offset = callback64.WaitForResult(); 345 new_offset = callback64.WaitForResult();
289 EXPECT_EQ(2 * kOffset, new_offset); 346 EXPECT_EQ(2 * kOffset, new_offset);
290 347
291 rv = stream.Seek(FROM_CURRENT, -kOffset, callback64.callback()); 348 rv = stream.Seek(base::File::FROM_CURRENT, -kOffset, callback64.callback());
292 ASSERT_EQ(ERR_IO_PENDING, rv); 349 ASSERT_EQ(ERR_IO_PENDING, rv);
293 new_offset = callback64.WaitForResult(); 350 new_offset = callback64.WaitForResult();
294 EXPECT_EQ(kOffset, new_offset); 351 EXPECT_EQ(kOffset, new_offset);
295 352
296 const int kTestDataLen = arraysize(kTestData) - 1; 353 const int kTestDataLen = arraysize(kTestData) - 1;
297 354
298 rv = stream.Seek(FROM_END, -kTestDataLen, callback64.callback()); 355 rv = stream.Seek(base::File::FROM_END, -kTestDataLen, callback64.callback());
299 ASSERT_EQ(ERR_IO_PENDING, rv); 356 ASSERT_EQ(ERR_IO_PENDING, rv);
300 new_offset = callback64.WaitForResult(); 357 new_offset = callback64.WaitForResult();
301 EXPECT_EQ(0, new_offset); 358 EXPECT_EQ(0, new_offset);
302 } 359 }
303 360
304 TEST_F(FileStreamTest, AsyncWrite) { 361 TEST_F(FileStreamTest, Write) {
305 FileStream stream(base::MessageLoopProxy::current()); 362 FileStream stream(base::MessageLoopProxy::current());
306 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | 363 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
307 base::File::FLAG_ASYNC; 364 base::File::FLAG_ASYNC;
308 TestCompletionCallback callback; 365 TestCompletionCallback callback;
309 int rv = stream.Open(temp_file_path(), flags, callback.callback()); 366 int rv = stream.Open(temp_file_path(), flags, callback.callback());
310 EXPECT_EQ(ERR_IO_PENDING, rv); 367 EXPECT_EQ(OK, callback.GetResult(rv));
311 EXPECT_EQ(OK, callback.WaitForResult());
312 368
313 int64 file_size; 369 int64 file_size;
314 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 370 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
315 EXPECT_EQ(0, file_size); 371 EXPECT_EQ(0, file_size);
316 372
317 int total_bytes_written = 0; 373 scoped_refptr<IOBuffer> buf = CreateTestDataBuffer();
374 rv = stream.Write(buf.get(), kTestDataSize, callback.callback());
375 rv = callback.GetResult(rv);
376 EXPECT_EQ(kTestDataSize, rv);
318 377
319 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
320 scoped_refptr<DrainableIOBuffer> drainable =
321 new DrainableIOBuffer(buf.get(), buf->size());
322 while (total_bytes_written != kTestDataSize) {
323 rv = stream.Write(drainable.get(), drainable->BytesRemaining(),
324 callback.callback());
325 if (rv == ERR_IO_PENDING)
326 rv = callback.WaitForResult();
327 EXPECT_LT(0, rv);
328 if (rv <= 0)
329 break;
330 drainable->DidConsume(rv);
331 total_bytes_written += rv;
332 }
333 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 378 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
334 EXPECT_EQ(file_size, total_bytes_written); 379 EXPECT_EQ(kTestDataSize, file_size);
380
381 std::string data_read;
382 EXPECT_TRUE(base::ReadFileToString(temp_file_path(), &data_read));
383 EXPECT_EQ(kTestData, data_read);
335 } 384 }
336 385
337 TEST_F(FileStreamTest, AsyncWrite_EarlyDelete) { 386 TEST_F(FileStreamTest, WriteNonBlocking) {
387 TestCompletionCallback callback;
388
389 #if defined(OS_WIN)
390 FileStream stream(base::MessageLoopProxy::current());
391 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
392 base::File::FLAG_ASYNC;
393 int rv = stream.Open(temp_file_path(), flags, callback.callback());
394 EXPECT_EQ(OK, callback.GetResult(rv));
395 #elif defined(OS_POSIX)
396 int fds[2], rv;
397 ASSERT_EQ(0, pipe(fds));
398 base::File read_end(fds[0]);
399 base::File write_end(fds[1]);
400 ASSERT_TRUE(read_end.IsValid());
401 FileStream stream(write_end.Pass(), base::MessageLoopProxy::current());
402 #endif // OS_POSIX
403
404 scoped_refptr<IOBuffer> buf = CreateTestDataBuffer();
405 rv = stream.WriteNonBlocking(buf.get(), kTestDataSize, callback.callback());
406 rv = callback.GetResult(rv);
407 EXPECT_EQ(kTestDataSize, rv);
408 std::string data_read;
409
410 #if defined(OS_WIN)
411 EXPECT_TRUE(base::ReadFileToString(temp_file_path(), &data_read));
412 #elif defined(OS_POSIX)
413 ASSERT_EQ(kTestDataSize,
414 read_end.ReadAtCurrentPos(WriteInto(&data_read, kTestDataSize + 1),
415 kTestDataSize));
416 #endif // OS_POSIX
417
418 EXPECT_EQ(kTestData, data_read);
419 }
420
421 TEST_F(FileStreamTest, Write_EarlyDelete) {
338 scoped_ptr<FileStream> stream( 422 scoped_ptr<FileStream> stream(
339 new FileStream(base::MessageLoopProxy::current())); 423 new FileStream(base::MessageLoopProxy::current()));
340 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | 424 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE |
341 base::File::FLAG_ASYNC; 425 base::File::FLAG_ASYNC;
342 TestCompletionCallback callback; 426 TestCompletionCallback callback;
343 int rv = stream->Open(temp_file_path(), flags, callback.callback()); 427 int rv = stream->Open(temp_file_path(), flags, callback.callback());
344 EXPECT_EQ(ERR_IO_PENDING, rv); 428 EXPECT_EQ(ERR_IO_PENDING, rv);
345 EXPECT_EQ(OK, callback.WaitForResult()); 429 EXPECT_EQ(OK, callback.WaitForResult());
346 430
347 int64 file_size; 431 int64 file_size;
348 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 432 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
349 EXPECT_EQ(0, file_size); 433 EXPECT_EQ(0, file_size);
350 434
351 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); 435 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
352 rv = stream->Write(buf.get(), buf->size(), callback.callback()); 436 rv = stream->Write(buf.get(), buf->size(), callback.callback());
353 stream.reset(); 437 stream.reset();
354 if (rv < 0) { 438 if (rv < 0) {
355 EXPECT_EQ(ERR_IO_PENDING, rv); 439 EXPECT_EQ(ERR_IO_PENDING, rv);
356 // The callback should not be called if the request is cancelled. 440 // The callback should not be called if the request is cancelled.
357 base::RunLoop().RunUntilIdle(); 441 base::RunLoop().RunUntilIdle();
358 EXPECT_FALSE(callback.have_result()); 442 EXPECT_FALSE(callback.have_result());
359 } else { 443 } else {
360 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 444 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
361 EXPECT_EQ(file_size, rv); 445 EXPECT_EQ(file_size, rv);
362 } 446 }
363 } 447 }
364 448
365 TEST_F(FileStreamTest, AsyncWrite_FromOffset) { 449 TEST_F(FileStreamTest, Write_FromOffset) {
366 int64 file_size; 450 int64 file_size;
367 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 451 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
368 452
369 FileStream stream(base::MessageLoopProxy::current()); 453 FileStream stream(base::MessageLoopProxy::current());
370 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE | 454 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
371 base::File::FLAG_ASYNC; 455 base::File::FLAG_ASYNC;
372 TestCompletionCallback callback; 456 TestCompletionCallback callback;
373 int rv = stream.Open(temp_file_path(), flags, callback.callback()); 457 int rv = stream.Open(temp_file_path(), flags, callback.callback());
374 EXPECT_EQ(ERR_IO_PENDING, rv); 458 EXPECT_EQ(ERR_IO_PENDING, rv);
375 EXPECT_EQ(OK, callback.WaitForResult()); 459 EXPECT_EQ(OK, callback.WaitForResult());
376 460
377 TestInt64CompletionCallback callback64; 461 TestInt64CompletionCallback callback64;
378 const int64 kOffset = 0; 462 const int64 kOffset = 0;
379 rv = stream.Seek(FROM_END, kOffset, callback64.callback()); 463 rv = stream.Seek(base::File::FROM_END, kOffset, callback64.callback());
380 ASSERT_EQ(ERR_IO_PENDING, rv); 464 ASSERT_EQ(ERR_IO_PENDING, rv);
381 int64 new_offset = callback64.WaitForResult(); 465 int64 new_offset = callback64.WaitForResult();
382 EXPECT_EQ(kTestDataSize, new_offset); 466 EXPECT_EQ(kTestDataSize, new_offset);
383 467
384 int total_bytes_written = 0; 468 int total_bytes_written = 0;
385 469
386 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); 470 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
387 scoped_refptr<DrainableIOBuffer> drainable = 471 scoped_refptr<DrainableIOBuffer> drainable =
388 new DrainableIOBuffer(buf.get(), buf->size()); 472 new DrainableIOBuffer(buf.get(), buf->size());
389 while (total_bytes_written != kTestDataSize) { 473 while (total_bytes_written != kTestDataSize) {
390 rv = stream.Write(drainable.get(), drainable->BytesRemaining(), 474 rv = stream.Write(drainable.get(), drainable->BytesRemaining(),
391 callback.callback()); 475 callback.callback());
392 if (rv == ERR_IO_PENDING) 476 if (rv == ERR_IO_PENDING)
393 rv = callback.WaitForResult(); 477 rv = callback.WaitForResult();
394 EXPECT_LT(0, rv); 478 EXPECT_LT(0, rv);
395 if (rv <= 0) 479 if (rv <= 0)
396 break; 480 break;
397 drainable->DidConsume(rv); 481 drainable->DidConsume(rv);
398 total_bytes_written += rv; 482 total_bytes_written += rv;
399 } 483 }
400 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 484 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
401 EXPECT_EQ(file_size, kTestDataSize * 2); 485 EXPECT_EQ(file_size, kTestDataSize * 2);
402 } 486 }
403 487
404 TEST_F(FileStreamTest, BasicAsyncReadWrite) { 488 TEST_F(FileStreamTest, BasicReadWrite) {
405 int64 file_size; 489 int64 file_size;
406 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 490 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
407 491
408 scoped_ptr<FileStream> stream( 492 scoped_ptr<FileStream> stream(
409 new FileStream(base::MessageLoopProxy::current())); 493 new FileStream(base::MessageLoopProxy::current()));
410 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 494 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
411 base::File::FLAG_WRITE | base::File::FLAG_ASYNC; 495 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
412 TestCompletionCallback callback; 496 TestCompletionCallback callback;
413 int rv = stream->Open(temp_file_path(), flags, callback.callback()); 497 int rv = stream->Open(temp_file_path(), flags, callback.callback());
414 EXPECT_EQ(ERR_IO_PENDING, rv); 498 EXPECT_EQ(ERR_IO_PENDING, rv);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 drainable->DidConsume(rv); 531 drainable->DidConsume(rv);
448 total_bytes_written += rv; 532 total_bytes_written += rv;
449 } 533 }
450 534
451 stream.reset(); 535 stream.reset();
452 536
453 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 537 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
454 EXPECT_EQ(kTestDataSize * 2, file_size); 538 EXPECT_EQ(kTestDataSize * 2, file_size);
455 } 539 }
456 540
457 TEST_F(FileStreamTest, BasicAsyncWriteRead) { 541 TEST_F(FileStreamTest, BasicWriteRead) {
458 int64 file_size; 542 int64 file_size;
459 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 543 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
460 544
461 scoped_ptr<FileStream> stream( 545 scoped_ptr<FileStream> stream(
462 new FileStream(base::MessageLoopProxy::current())); 546 new FileStream(base::MessageLoopProxy::current()));
463 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 547 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
464 base::File::FLAG_WRITE | base::File::FLAG_ASYNC; 548 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
465 TestCompletionCallback callback; 549 TestCompletionCallback callback;
466 int rv = stream->Open(temp_file_path(), flags, callback.callback()); 550 int rv = stream->Open(temp_file_path(), flags, callback.callback());
467 EXPECT_EQ(ERR_IO_PENDING, rv); 551 EXPECT_EQ(ERR_IO_PENDING, rv);
468 EXPECT_EQ(OK, callback.WaitForResult()); 552 EXPECT_EQ(OK, callback.WaitForResult());
469 553
470 TestInt64CompletionCallback callback64; 554 TestInt64CompletionCallback callback64;
471 rv = stream->Seek(FROM_END, 0, callback64.callback()); 555 rv = stream->Seek(base::File::FROM_END, 0, callback64.callback());
472 ASSERT_EQ(ERR_IO_PENDING, rv); 556 ASSERT_EQ(ERR_IO_PENDING, rv);
473 int64 offset = callback64.WaitForResult(); 557 int64 offset = callback64.WaitForResult();
474 EXPECT_EQ(offset, file_size); 558 EXPECT_EQ(offset, file_size);
475 559
476 int total_bytes_written = 0; 560 int total_bytes_written = 0;
477 561
478 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); 562 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
479 scoped_refptr<DrainableIOBuffer> drainable = 563 scoped_refptr<DrainableIOBuffer> drainable =
480 new DrainableIOBuffer(buf.get(), buf->size()); 564 new DrainableIOBuffer(buf.get(), buf->size());
481 while (total_bytes_written != kTestDataSize) { 565 while (total_bytes_written != kTestDataSize) {
482 rv = stream->Write(drainable.get(), drainable->BytesRemaining(), 566 rv = stream->Write(drainable.get(), drainable->BytesRemaining(),
483 callback.callback()); 567 callback.callback());
484 if (rv == ERR_IO_PENDING) 568 if (rv == ERR_IO_PENDING)
485 rv = callback.WaitForResult(); 569 rv = callback.WaitForResult();
486 EXPECT_LT(0, rv); 570 EXPECT_LT(0, rv);
487 if (rv <= 0) 571 if (rv <= 0)
488 break; 572 break;
489 drainable->DidConsume(rv); 573 drainable->DidConsume(rv);
490 total_bytes_written += rv; 574 total_bytes_written += rv;
491 } 575 }
492 576
493 EXPECT_EQ(kTestDataSize, total_bytes_written); 577 EXPECT_EQ(kTestDataSize, total_bytes_written);
494 578
495 rv = stream->Seek(FROM_BEGIN, 0, callback64.callback()); 579 rv = stream->Seek(base::File::FROM_BEGIN, 0, callback64.callback());
496 ASSERT_EQ(ERR_IO_PENDING, rv); 580 ASSERT_EQ(ERR_IO_PENDING, rv);
497 offset = callback64.WaitForResult(); 581 offset = callback64.WaitForResult();
498 EXPECT_EQ(0, offset); 582 EXPECT_EQ(0, offset);
499 583
500 int total_bytes_read = 0; 584 int total_bytes_read = 0;
501 585
502 std::string data_read; 586 std::string data_read;
503 for (;;) { 587 for (;;) {
504 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); 588 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
505 rv = stream->Read(buf.get(), buf->size(), callback.callback()); 589 rv = stream->Read(buf.get(), buf->size(), callback.callback());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 drainable_.get(), drainable_->BytesRemaining(), callback.callback()); 654 drainable_.get(), drainable_->BytesRemaining(), callback.callback());
571 DCHECK_EQ(ERR_IO_PENDING, rv); 655 DCHECK_EQ(ERR_IO_PENDING, rv);
572 rv = callback.WaitForResult(); 656 rv = callback.WaitForResult();
573 drainable_->DidConsume(total_bytes_written); 657 drainable_->DidConsume(total_bytes_written);
574 *total_bytes_written_ += total_bytes_written; 658 *total_bytes_written_ += total_bytes_written;
575 *total_bytes_read_ += total_bytes_read; 659 *total_bytes_read_ += total_bytes_read;
576 *data_read_ += data_read; 660 *data_read_ += data_read;
577 } else { // We're done writing all data. Start reading the data. 661 } else { // We're done writing all data. Start reading the data.
578 TestInt64CompletionCallback callback64; 662 TestInt64CompletionCallback callback64;
579 EXPECT_EQ(ERR_IO_PENDING, 663 EXPECT_EQ(ERR_IO_PENDING,
580 stream_->Seek(FROM_BEGIN, 0, callback64.callback())); 664 stream_->Seek(base::File::FROM_BEGIN, 0,
665 callback64.callback()));
581 { 666 {
582 base::MessageLoop::ScopedNestableTaskAllower allow( 667 base::MessageLoop::ScopedNestableTaskAllower allow(
583 base::MessageLoop::current()); 668 base::MessageLoop::current());
584 EXPECT_LE(0, callback64.WaitForResult()); 669 EXPECT_LE(0, callback64.WaitForResult());
585 } 670 }
586 671
587 TestCompletionCallback callback; 672 TestCompletionCallback callback;
588 for (;;) { 673 for (;;) {
589 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); 674 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4);
590 rv = stream_->Read(buf.get(), buf->size(), callback.callback()); 675 rv = stream_->Read(buf.get(), buf->size(), callback.callback());
(...skipping 23 matching lines...) Expand all
614 int* total_bytes_written_; 699 int* total_bytes_written_;
615 int* total_bytes_read_; 700 int* total_bytes_read_;
616 std::string* data_read_; 701 std::string* data_read_;
617 const CompletionCallback callback_; 702 const CompletionCallback callback_;
618 scoped_refptr<IOBufferWithSize> test_data_; 703 scoped_refptr<IOBufferWithSize> test_data_;
619 scoped_refptr<DrainableIOBuffer> drainable_; 704 scoped_refptr<DrainableIOBuffer> drainable_;
620 705
621 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback); 706 DISALLOW_COPY_AND_ASSIGN(TestWriteReadCompletionCallback);
622 }; 707 };
623 708
624 TEST_F(FileStreamTest, AsyncWriteRead) { 709 TEST_F(FileStreamTest, WriteRead) {
625 int64 file_size; 710 int64 file_size;
626 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 711 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
627 712
628 scoped_ptr<FileStream> stream( 713 scoped_ptr<FileStream> stream(
629 new FileStream(base::MessageLoopProxy::current())); 714 new FileStream(base::MessageLoopProxy::current()));
630 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 715 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
631 base::File::FLAG_WRITE | base::File::FLAG_ASYNC; 716 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
632 TestCompletionCallback open_callback; 717 TestCompletionCallback open_callback;
633 int rv = stream->Open(temp_file_path(), flags, open_callback.callback()); 718 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
634 EXPECT_EQ(ERR_IO_PENDING, rv); 719 EXPECT_EQ(ERR_IO_PENDING, rv);
635 EXPECT_EQ(OK, open_callback.WaitForResult()); 720 EXPECT_EQ(OK, open_callback.WaitForResult());
636 721
637 TestInt64CompletionCallback callback64; 722 TestInt64CompletionCallback callback64;
638 EXPECT_EQ(ERR_IO_PENDING, stream->Seek(FROM_END, 0, callback64.callback())); 723 EXPECT_EQ(ERR_IO_PENDING,
724 stream->Seek(base::File::FROM_END, 0, callback64.callback()));
639 EXPECT_EQ(file_size, callback64.WaitForResult()); 725 EXPECT_EQ(file_size, callback64.WaitForResult());
640 726
641 int total_bytes_written = 0; 727 int total_bytes_written = 0;
642 int total_bytes_read = 0; 728 int total_bytes_read = 0;
643 std::string data_read; 729 std::string data_read;
644 TestWriteReadCompletionCallback callback(stream.get(), &total_bytes_written, 730 TestWriteReadCompletionCallback callback(stream.get(), &total_bytes_written,
645 &total_bytes_read, &data_read); 731 &total_bytes_read, &data_read);
646 732
647 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); 733 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
648 rv = stream->Write(buf.get(), buf->size(), callback.callback()); 734 rv = stream->Write(buf.get(), buf->size(), callback.callback());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 bool waiting_for_result_; 804 bool waiting_for_result_;
719 FileStream* stream_; 805 FileStream* stream_;
720 int* total_bytes_written_; 806 int* total_bytes_written_;
721 const CompletionCallback callback_; 807 const CompletionCallback callback_;
722 scoped_refptr<IOBufferWithSize> test_data_; 808 scoped_refptr<IOBufferWithSize> test_data_;
723 scoped_refptr<DrainableIOBuffer> drainable_; 809 scoped_refptr<DrainableIOBuffer> drainable_;
724 810
725 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback); 811 DISALLOW_COPY_AND_ASSIGN(TestWriteCloseCompletionCallback);
726 }; 812 };
727 813
728 TEST_F(FileStreamTest, AsyncWriteClose) { 814 TEST_F(FileStreamTest, WriteClose) {
729 int64 file_size; 815 int64 file_size;
730 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 816 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
731 817
732 scoped_ptr<FileStream> stream( 818 scoped_ptr<FileStream> stream(
733 new FileStream(base::MessageLoopProxy::current())); 819 new FileStream(base::MessageLoopProxy::current()));
734 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 820 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
735 base::File::FLAG_WRITE | base::File::FLAG_ASYNC; 821 base::File::FLAG_WRITE | base::File::FLAG_ASYNC;
736 TestCompletionCallback open_callback; 822 TestCompletionCallback open_callback;
737 int rv = stream->Open(temp_file_path(), flags, open_callback.callback()); 823 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
738 EXPECT_EQ(ERR_IO_PENDING, rv); 824 EXPECT_EQ(ERR_IO_PENDING, rv);
739 EXPECT_EQ(OK, open_callback.WaitForResult()); 825 EXPECT_EQ(OK, open_callback.WaitForResult());
740 826
741 TestInt64CompletionCallback callback64; 827 TestInt64CompletionCallback callback64;
742 EXPECT_EQ(ERR_IO_PENDING, stream->Seek(FROM_END, 0, callback64.callback())); 828 EXPECT_EQ(ERR_IO_PENDING,
829 stream->Seek(base::File::FROM_END, 0, callback64.callback()));
743 EXPECT_EQ(file_size, callback64.WaitForResult()); 830 EXPECT_EQ(file_size, callback64.WaitForResult());
744 831
745 int total_bytes_written = 0; 832 int total_bytes_written = 0;
746 TestWriteCloseCompletionCallback callback(stream.get(), &total_bytes_written); 833 TestWriteCloseCompletionCallback callback(stream.get(), &total_bytes_written);
747 834
748 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); 835 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer();
749 rv = stream->Write(buf.get(), buf->size(), callback.callback()); 836 rv = stream->Write(buf.get(), buf->size(), callback.callback());
750 if (rv == ERR_IO_PENDING) 837 if (rv == ERR_IO_PENDING)
751 total_bytes_written = callback.WaitForResult(); 838 total_bytes_written = callback.WaitForResult();
752 EXPECT_LT(0, total_bytes_written); 839 EXPECT_LT(0, total_bytes_written);
753 EXPECT_EQ(kTestDataSize, total_bytes_written); 840 EXPECT_EQ(kTestDataSize, total_bytes_written);
754 841
755 stream.reset(); 842 stream.reset();
756 843
757 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); 844 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size));
758 EXPECT_EQ(kTestDataSize * 2, file_size); 845 EXPECT_EQ(kTestDataSize * 2, file_size);
759 } 846 }
760 847
761 TEST_F(FileStreamTest, AsyncOpenAndDelete) { 848 TEST_F(FileStreamTest, OpenAndDelete) {
762 scoped_refptr<base::SequencedWorkerPool> pool( 849 scoped_refptr<base::SequencedWorkerPool> pool(
763 new base::SequencedWorkerPool(1, "StreamTest")); 850 new base::SequencedWorkerPool(1, "StreamTest"));
764 851
765 bool prev = base::ThreadRestrictions::SetIOAllowed(false); 852 bool prev = base::ThreadRestrictions::SetIOAllowed(false);
766 scoped_ptr<FileStream> stream(new FileStream(pool.get())); 853 scoped_ptr<FileStream> stream(new FileStream(pool.get()));
767 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE | 854 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
768 base::File::FLAG_ASYNC; 855 base::File::FLAG_ASYNC;
769 TestCompletionCallback open_callback; 856 TestCompletionCallback open_callback;
770 int rv = stream->Open(temp_file_path(), flags, open_callback.callback()); 857 int rv = stream->Open(temp_file_path(), flags, open_callback.callback());
771 EXPECT_EQ(ERR_IO_PENDING, rv); 858 EXPECT_EQ(ERR_IO_PENDING, rv);
(...skipping 10 matching lines...) Expand all
782 stream2.reset(); 869 stream2.reset();
783 870
784 pool->Shutdown(); 871 pool->Shutdown();
785 872
786 // open_callback won't be called. 873 // open_callback won't be called.
787 base::RunLoop().RunUntilIdle(); 874 base::RunLoop().RunUntilIdle();
788 EXPECT_FALSE(open_callback.have_result()); 875 EXPECT_FALSE(open_callback.have_result());
789 base::ThreadRestrictions::SetIOAllowed(prev); 876 base::ThreadRestrictions::SetIOAllowed(prev);
790 } 877 }
791 878
792 // Verify that async Write() errors are mapped correctly. 879 // Verify that async Write() errors are mapped correctly.
hashimoto 2014/06/13 06:10:42 nit: "async" still mentioned here.
rvargas (doing something else) 2014/06/13 19:58:24 Done.
793 TEST_F(FileStreamTest, AsyncWriteError) { 880 TEST_F(FileStreamTest, WriteError) {
794 // Try opening file as read-only and then writing to it using FileStream. 881 // Try opening file as read-only and then writing to it using FileStream.
795 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 882 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_READ |
796 base::File::FLAG_ASYNC; 883 base::File::FLAG_ASYNC;
797 884
798 base::File file(temp_file_path(), flags); 885 base::File file(temp_file_path(), flags);
799 ASSERT_TRUE(file.IsValid()); 886 ASSERT_TRUE(file.IsValid());
800 887
801 scoped_ptr<FileStream> stream( 888 scoped_ptr<FileStream> stream(
802 new FileStream(file.Pass(), base::MessageLoopProxy::current())); 889 new FileStream(file.Pass(), base::MessageLoopProxy::current()));
803 890
804 scoped_refptr<IOBuffer> buf = new IOBuffer(1); 891 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
805 buf->data()[0] = 0; 892 buf->data()[0] = 0;
806 893
807 TestCompletionCallback callback; 894 TestCompletionCallback callback;
808 int rv = stream->Write(buf.get(), 1, callback.callback()); 895 int rv = stream->Write(buf.get(), 1, callback.callback());
809 if (rv == ERR_IO_PENDING) 896 if (rv == ERR_IO_PENDING)
810 rv = callback.WaitForResult(); 897 rv = callback.WaitForResult();
811 EXPECT_LT(rv, 0); 898 EXPECT_LT(rv, 0);
812 899
813 stream.reset(); 900 stream.reset();
814 base::RunLoop().RunUntilIdle(); 901 base::RunLoop().RunUntilIdle();
815 } 902 }
816 903
817 // Verify that async Read() errors are mapped correctly. 904 // Verify that async Read() errors are mapped correctly.
hashimoto 2014/06/13 06:10:42 ditto.
rvargas (doing something else) 2014/06/13 19:58:24 Done.
818 TEST_F(FileStreamTest, AsyncReadError) { 905 TEST_F(FileStreamTest, ReadError) {
819 // Try opening file for write and then reading from it using FileStream. 906 // Try opening file for write and then reading from it using FileStream.
820 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE | 907 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
821 base::File::FLAG_ASYNC; 908 base::File::FLAG_ASYNC;
822 909
823 base::File file(temp_file_path(), flags); 910 base::File file(temp_file_path(), flags);
824 ASSERT_TRUE(file.IsValid()); 911 ASSERT_TRUE(file.IsValid());
825 912
826 scoped_ptr<FileStream> stream( 913 scoped_ptr<FileStream> stream(
827 new FileStream(file.Pass(), base::MessageLoopProxy::current())); 914 new FileStream(file.Pass(), base::MessageLoopProxy::current()));
828 915
829 scoped_refptr<IOBuffer> buf = new IOBuffer(1); 916 scoped_refptr<IOBuffer> buf = new IOBuffer(1);
830 TestCompletionCallback callback; 917 TestCompletionCallback callback;
831 int rv = stream->Read(buf.get(), 1, callback.callback()); 918 int rv = stream->Read(buf.get(), 1, callback.callback());
832 if (rv == ERR_IO_PENDING) 919 if (rv == ERR_IO_PENDING)
833 rv = callback.WaitForResult(); 920 rv = callback.WaitForResult();
834 EXPECT_LT(rv, 0); 921 EXPECT_LT(rv, 0);
835 922
836 stream.reset(); 923 stream.reset();
837 base::RunLoop().RunUntilIdle(); 924 base::RunLoop().RunUntilIdle();
838 } 925 }
839 926
840 #if defined(OS_ANDROID) 927 #if defined(OS_ANDROID)
841 TEST_F(FileStreamTest, ContentUriAsyncRead) { 928 TEST_F(FileStreamTest, ContentUriRead) {
842 base::FilePath test_dir; 929 base::FilePath test_dir;
843 PathService::Get(base::DIR_SOURCE_ROOT, &test_dir); 930 PathService::Get(base::DIR_SOURCE_ROOT, &test_dir);
844 test_dir = test_dir.AppendASCII("net"); 931 test_dir = test_dir.AppendASCII("net");
845 test_dir = test_dir.AppendASCII("data"); 932 test_dir = test_dir.AppendASCII("data");
846 test_dir = test_dir.AppendASCII("file_stream_unittest"); 933 test_dir = test_dir.AppendASCII("file_stream_unittest");
847 ASSERT_TRUE(base::PathExists(test_dir)); 934 ASSERT_TRUE(base::PathExists(test_dir));
848 base::FilePath image_file = test_dir.Append(FILE_PATH_LITERAL("red.png")); 935 base::FilePath image_file = test_dir.Append(FILE_PATH_LITERAL("red.png"));
849 936
850 // Insert the image into MediaStore. MediaStore will do some conversions, and 937 // Insert the image into MediaStore. MediaStore will do some conversions, and
851 // return the content URI. 938 // return the content URI.
(...skipping 26 matching lines...) Expand all
878 total_bytes_read += rv; 965 total_bytes_read += rv;
879 data_read.append(buf->data(), rv); 966 data_read.append(buf->data(), rv);
880 } 967 }
881 EXPECT_EQ(file_size, total_bytes_read); 968 EXPECT_EQ(file_size, total_bytes_read);
882 } 969 }
883 #endif 970 #endif
884 971
885 } // namespace 972 } // namespace
886 973
887 } // namespace net 974 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698