OLD | NEW |
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" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 | 64 |
65 private: | 65 private: |
66 base::FilePath temp_file_path_; | 66 base::FilePath temp_file_path_; |
67 }; | 67 }; |
68 | 68 |
69 namespace { | 69 namespace { |
70 | 70 |
71 TEST_F(FileStreamTest, AsyncOpenExplicitClose) { | 71 TEST_F(FileStreamTest, AsyncOpenExplicitClose) { |
72 TestCompletionCallback callback; | 72 TestCompletionCallback callback; |
73 FileStream stream(base::MessageLoopProxy::current()); | 73 FileStream stream(base::MessageLoopProxy::current()); |
74 int flags = base::File::FLAG_OPEN | | 74 int flags = |
75 base::File::FLAG_READ | | 75 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
76 base::File::FLAG_ASYNC; | |
77 int rv = stream.Open(temp_file_path(), flags, callback.callback()); | 76 int rv = stream.Open(temp_file_path(), flags, callback.callback()); |
78 EXPECT_EQ(ERR_IO_PENDING, rv); | 77 EXPECT_EQ(ERR_IO_PENDING, rv); |
79 EXPECT_EQ(OK, callback.WaitForResult()); | 78 EXPECT_EQ(OK, callback.WaitForResult()); |
80 EXPECT_TRUE(stream.IsOpen()); | 79 EXPECT_TRUE(stream.IsOpen()); |
81 EXPECT_TRUE(stream.GetFileForTesting().IsValid()); | 80 EXPECT_TRUE(stream.GetFileForTesting().IsValid()); |
82 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback())); | 81 EXPECT_EQ(ERR_IO_PENDING, stream.Close(callback.callback())); |
83 EXPECT_EQ(OK, callback.WaitForResult()); | 82 EXPECT_EQ(OK, callback.WaitForResult()); |
84 EXPECT_FALSE(stream.IsOpen()); | 83 EXPECT_FALSE(stream.IsOpen()); |
85 EXPECT_FALSE(stream.GetFileForTesting().IsValid()); | 84 EXPECT_FALSE(stream.GetFileForTesting().IsValid()); |
86 } | 85 } |
87 | 86 |
88 TEST_F(FileStreamTest, AsyncOpenExplicitCloseOrphaned) { | 87 TEST_F(FileStreamTest, AsyncOpenExplicitCloseOrphaned) { |
89 TestCompletionCallback callback; | 88 TestCompletionCallback callback; |
90 scoped_ptr<FileStream> stream(new FileStream( | 89 scoped_ptr<FileStream> stream( |
91 base::MessageLoopProxy::current())); | 90 new FileStream(base::MessageLoopProxy::current())); |
92 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 91 int flags = |
93 base::File::FLAG_ASYNC; | 92 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
94 int rv = stream->Open(temp_file_path(), flags, callback.callback()); | 93 int rv = stream->Open(temp_file_path(), flags, callback.callback()); |
95 EXPECT_EQ(ERR_IO_PENDING, rv); | 94 EXPECT_EQ(ERR_IO_PENDING, rv); |
96 EXPECT_EQ(OK, callback.WaitForResult()); | 95 EXPECT_EQ(OK, callback.WaitForResult()); |
97 EXPECT_TRUE(stream->IsOpen()); | 96 EXPECT_TRUE(stream->IsOpen()); |
98 EXPECT_TRUE(stream->GetFileForTesting().IsValid()); | 97 EXPECT_TRUE(stream->GetFileForTesting().IsValid()); |
99 EXPECT_EQ(ERR_IO_PENDING, stream->Close(callback.callback())); | 98 EXPECT_EQ(ERR_IO_PENDING, stream->Close(callback.callback())); |
100 stream.reset(); | 99 stream.reset(); |
101 // File isn't actually closed yet. | 100 // File isn't actually closed yet. |
102 base::RunLoop runloop; | 101 base::RunLoop runloop; |
103 runloop.RunUntilIdle(); | 102 runloop.RunUntilIdle(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE | | 134 flags = base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_WRITE | |
136 base::File::FLAG_ASYNC; | 135 base::File::FLAG_ASYNC; |
137 file.Initialize(temp_file_path(), flags); | 136 file.Initialize(temp_file_path(), flags); |
138 | 137 |
139 scoped_ptr<FileStream> write_stream( | 138 scoped_ptr<FileStream> write_stream( |
140 new FileStream(file.Pass(), base::MessageLoopProxy::current())); | 139 new FileStream(file.Pass(), base::MessageLoopProxy::current())); |
141 ASSERT_EQ(ERR_IO_PENDING, | 140 ASSERT_EQ(ERR_IO_PENDING, |
142 write_stream->Seek(FROM_BEGIN, 0, callback64.callback())); | 141 write_stream->Seek(FROM_BEGIN, 0, callback64.callback())); |
143 ASSERT_EQ(0, callback64.WaitForResult()); | 142 ASSERT_EQ(0, callback64.WaitForResult()); |
144 scoped_refptr<IOBufferWithSize> write_buffer = CreateTestDataBuffer(); | 143 scoped_refptr<IOBufferWithSize> write_buffer = CreateTestDataBuffer(); |
145 rv = write_stream->Write(write_buffer.get(), kTestDataSize, | 144 rv = write_stream->Write( |
146 callback.callback()); | 145 write_buffer.get(), kTestDataSize, callback.callback()); |
147 ASSERT_EQ(kTestDataSize, callback.GetResult(rv)); | 146 ASSERT_EQ(kTestDataSize, callback.GetResult(rv)); |
148 write_stream.reset(); | 147 write_stream.reset(); |
149 | 148 |
150 // Read into buffer and compare to make sure the handle worked fine. | 149 // Read into buffer and compare to make sure the handle worked fine. |
151 ASSERT_EQ(kTestDataSize, | 150 ASSERT_EQ( |
152 base::ReadFile(temp_file_path(), read_buffer->data(), | 151 kTestDataSize, |
153 kTestDataSize)); | 152 base::ReadFile(temp_file_path(), read_buffer->data(), kTestDataSize)); |
154 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize)); | 153 ASSERT_EQ(0, memcmp(kTestData, read_buffer->data(), kTestDataSize)); |
155 } | 154 } |
156 | 155 |
157 TEST_F(FileStreamTest, UseClosedStream) { | 156 TEST_F(FileStreamTest, UseClosedStream) { |
158 int rv = 0; | 157 int rv = 0; |
159 TestCompletionCallback callback; | 158 TestCompletionCallback callback; |
160 TestInt64CompletionCallback callback64; | 159 TestInt64CompletionCallback callback64; |
161 | 160 |
162 FileStream stream(base::MessageLoopProxy::current()); | 161 FileStream stream(base::MessageLoopProxy::current()); |
163 | 162 |
164 EXPECT_FALSE(stream.IsOpen()); | 163 EXPECT_FALSE(stream.IsOpen()); |
165 | 164 |
166 // Try seeking... | 165 // Try seeking... |
167 rv = stream.Seek(FROM_BEGIN, 5, callback64.callback()); | 166 rv = stream.Seek(FROM_BEGIN, 5, callback64.callback()); |
168 EXPECT_EQ(ERR_UNEXPECTED, callback64.GetResult(rv)); | 167 EXPECT_EQ(ERR_UNEXPECTED, callback64.GetResult(rv)); |
169 | 168 |
170 // Try reading... | 169 // Try reading... |
171 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(10); | 170 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(10); |
172 rv = stream.Read(buf, buf->size(), callback.callback()); | 171 rv = stream.Read(buf, buf->size(), callback.callback()); |
173 EXPECT_EQ(ERR_UNEXPECTED, callback.GetResult(rv)); | 172 EXPECT_EQ(ERR_UNEXPECTED, callback.GetResult(rv)); |
174 } | 173 } |
175 | 174 |
176 TEST_F(FileStreamTest, AsyncRead) { | 175 TEST_F(FileStreamTest, AsyncRead) { |
177 int64 file_size; | 176 int64 file_size; |
178 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 177 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
179 | 178 |
180 FileStream stream(base::MessageLoopProxy::current()); | 179 FileStream stream(base::MessageLoopProxy::current()); |
181 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 180 int flags = |
182 base::File::FLAG_ASYNC; | 181 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
183 TestCompletionCallback callback; | 182 TestCompletionCallback callback; |
184 int rv = stream.Open(temp_file_path(), flags, callback.callback()); | 183 int rv = stream.Open(temp_file_path(), flags, callback.callback()); |
185 EXPECT_EQ(ERR_IO_PENDING, rv); | 184 EXPECT_EQ(ERR_IO_PENDING, rv); |
186 EXPECT_EQ(OK, callback.WaitForResult()); | 185 EXPECT_EQ(OK, callback.WaitForResult()); |
187 | 186 |
188 int total_bytes_read = 0; | 187 int total_bytes_read = 0; |
189 | 188 |
190 std::string data_read; | 189 std::string data_read; |
191 for (;;) { | 190 for (;;) { |
192 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); | 191 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
193 rv = stream.Read(buf.get(), buf->size(), callback.callback()); | 192 rv = stream.Read(buf.get(), buf->size(), callback.callback()); |
194 if (rv == ERR_IO_PENDING) | 193 if (rv == ERR_IO_PENDING) |
195 rv = callback.WaitForResult(); | 194 rv = callback.WaitForResult(); |
196 EXPECT_LE(0, rv); | 195 EXPECT_LE(0, rv); |
197 if (rv <= 0) | 196 if (rv <= 0) |
198 break; | 197 break; |
199 total_bytes_read += rv; | 198 total_bytes_read += rv; |
200 data_read.append(buf->data(), rv); | 199 data_read.append(buf->data(), rv); |
201 } | 200 } |
202 EXPECT_EQ(file_size, total_bytes_read); | 201 EXPECT_EQ(file_size, total_bytes_read); |
203 EXPECT_EQ(kTestData, data_read); | 202 EXPECT_EQ(kTestData, data_read); |
204 } | 203 } |
205 | 204 |
206 TEST_F(FileStreamTest, AsyncRead_EarlyDelete) { | 205 TEST_F(FileStreamTest, AsyncRead_EarlyDelete) { |
207 int64 file_size; | 206 int64 file_size; |
208 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 207 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
209 | 208 |
210 scoped_ptr<FileStream> stream( | 209 scoped_ptr<FileStream> stream( |
211 new FileStream(base::MessageLoopProxy::current())); | 210 new FileStream(base::MessageLoopProxy::current())); |
212 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 211 int flags = |
213 base::File::FLAG_ASYNC; | 212 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
214 TestCompletionCallback callback; | 213 TestCompletionCallback callback; |
215 int rv = stream->Open(temp_file_path(), flags, callback.callback()); | 214 int rv = stream->Open(temp_file_path(), flags, callback.callback()); |
216 EXPECT_EQ(ERR_IO_PENDING, rv); | 215 EXPECT_EQ(ERR_IO_PENDING, rv); |
217 EXPECT_EQ(OK, callback.WaitForResult()); | 216 EXPECT_EQ(OK, callback.WaitForResult()); |
218 | 217 |
219 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); | 218 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
220 rv = stream->Read(buf.get(), buf->size(), callback.callback()); | 219 rv = stream->Read(buf.get(), buf->size(), callback.callback()); |
221 stream.reset(); // Delete instead of closing it. | 220 stream.reset(); // Delete instead of closing it. |
222 if (rv < 0) { | 221 if (rv < 0) { |
223 EXPECT_EQ(ERR_IO_PENDING, rv); | 222 EXPECT_EQ(ERR_IO_PENDING, rv); |
224 // The callback should not be called if the request is cancelled. | 223 // The callback should not be called if the request is cancelled. |
225 base::RunLoop().RunUntilIdle(); | 224 base::RunLoop().RunUntilIdle(); |
226 EXPECT_FALSE(callback.have_result()); | 225 EXPECT_FALSE(callback.have_result()); |
227 } else { | 226 } else { |
228 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv)); | 227 EXPECT_EQ(std::string(kTestData, rv), std::string(buf->data(), rv)); |
229 } | 228 } |
230 } | 229 } |
231 | 230 |
232 TEST_F(FileStreamTest, AsyncRead_FromOffset) { | 231 TEST_F(FileStreamTest, AsyncRead_FromOffset) { |
233 int64 file_size; | 232 int64 file_size; |
234 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 233 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
235 | 234 |
236 FileStream stream(base::MessageLoopProxy::current()); | 235 FileStream stream(base::MessageLoopProxy::current()); |
237 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 236 int flags = |
238 base::File::FLAG_ASYNC; | 237 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
239 TestCompletionCallback callback; | 238 TestCompletionCallback callback; |
240 int rv = stream.Open(temp_file_path(), flags, callback.callback()); | 239 int rv = stream.Open(temp_file_path(), flags, callback.callback()); |
241 EXPECT_EQ(ERR_IO_PENDING, rv); | 240 EXPECT_EQ(ERR_IO_PENDING, rv); |
242 EXPECT_EQ(OK, callback.WaitForResult()); | 241 EXPECT_EQ(OK, callback.WaitForResult()); |
243 | 242 |
244 TestInt64CompletionCallback callback64; | 243 TestInt64CompletionCallback callback64; |
245 const int64 kOffset = 3; | 244 const int64 kOffset = 3; |
246 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback()); | 245 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback()); |
247 ASSERT_EQ(ERR_IO_PENDING, rv); | 246 ASSERT_EQ(ERR_IO_PENDING, rv); |
248 int64 new_offset = callback64.WaitForResult(); | 247 int64 new_offset = callback64.WaitForResult(); |
(...skipping 12 matching lines...) Expand all Loading... |
261 break; | 260 break; |
262 total_bytes_read += rv; | 261 total_bytes_read += rv; |
263 data_read.append(buf->data(), rv); | 262 data_read.append(buf->data(), rv); |
264 } | 263 } |
265 EXPECT_EQ(file_size - kOffset, total_bytes_read); | 264 EXPECT_EQ(file_size - kOffset, total_bytes_read); |
266 EXPECT_EQ(kTestData + kOffset, data_read); | 265 EXPECT_EQ(kTestData + kOffset, data_read); |
267 } | 266 } |
268 | 267 |
269 TEST_F(FileStreamTest, AsyncSeekAround) { | 268 TEST_F(FileStreamTest, AsyncSeekAround) { |
270 FileStream stream(base::MessageLoopProxy::current()); | 269 FileStream stream(base::MessageLoopProxy::current()); |
271 int flags = base::File::FLAG_OPEN | base::File::FLAG_ASYNC | | 270 int flags = |
272 base::File::FLAG_READ; | 271 base::File::FLAG_OPEN | base::File::FLAG_ASYNC | base::File::FLAG_READ; |
273 TestCompletionCallback callback; | 272 TestCompletionCallback callback; |
274 int rv = stream.Open(temp_file_path(), flags, callback.callback()); | 273 int rv = stream.Open(temp_file_path(), flags, callback.callback()); |
275 EXPECT_EQ(ERR_IO_PENDING, rv); | 274 EXPECT_EQ(ERR_IO_PENDING, rv); |
276 EXPECT_EQ(OK, callback.WaitForResult()); | 275 EXPECT_EQ(OK, callback.WaitForResult()); |
277 | 276 |
278 TestInt64CompletionCallback callback64; | 277 TestInt64CompletionCallback callback64; |
279 | 278 |
280 const int64 kOffset = 3; | 279 const int64 kOffset = 3; |
281 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback()); | 280 rv = stream.Seek(FROM_BEGIN, kOffset, callback64.callback()); |
282 ASSERT_EQ(ERR_IO_PENDING, rv); | 281 ASSERT_EQ(ERR_IO_PENDING, rv); |
(...skipping 30 matching lines...) Expand all Loading... |
313 int64 file_size; | 312 int64 file_size; |
314 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 313 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
315 EXPECT_EQ(0, file_size); | 314 EXPECT_EQ(0, file_size); |
316 | 315 |
317 int total_bytes_written = 0; | 316 int total_bytes_written = 0; |
318 | 317 |
319 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); | 318 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
320 scoped_refptr<DrainableIOBuffer> drainable = | 319 scoped_refptr<DrainableIOBuffer> drainable = |
321 new DrainableIOBuffer(buf.get(), buf->size()); | 320 new DrainableIOBuffer(buf.get(), buf->size()); |
322 while (total_bytes_written != kTestDataSize) { | 321 while (total_bytes_written != kTestDataSize) { |
323 rv = stream.Write(drainable.get(), drainable->BytesRemaining(), | 322 rv = stream.Write( |
324 callback.callback()); | 323 drainable.get(), drainable->BytesRemaining(), callback.callback()); |
325 if (rv == ERR_IO_PENDING) | 324 if (rv == ERR_IO_PENDING) |
326 rv = callback.WaitForResult(); | 325 rv = callback.WaitForResult(); |
327 EXPECT_LT(0, rv); | 326 EXPECT_LT(0, rv); |
328 if (rv <= 0) | 327 if (rv <= 0) |
329 break; | 328 break; |
330 drainable->DidConsume(rv); | 329 drainable->DidConsume(rv); |
331 total_bytes_written += rv; | 330 total_bytes_written += rv; |
332 } | 331 } |
333 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 332 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
334 EXPECT_EQ(file_size, total_bytes_written); | 333 EXPECT_EQ(file_size, total_bytes_written); |
(...skipping 25 matching lines...) Expand all Loading... |
360 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 359 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
361 EXPECT_EQ(file_size, rv); | 360 EXPECT_EQ(file_size, rv); |
362 } | 361 } |
363 } | 362 } |
364 | 363 |
365 TEST_F(FileStreamTest, AsyncWrite_FromOffset) { | 364 TEST_F(FileStreamTest, AsyncWrite_FromOffset) { |
366 int64 file_size; | 365 int64 file_size; |
367 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 366 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
368 | 367 |
369 FileStream stream(base::MessageLoopProxy::current()); | 368 FileStream stream(base::MessageLoopProxy::current()); |
370 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE | | 369 int flags = |
371 base::File::FLAG_ASYNC; | 370 base::File::FLAG_OPEN | base::File::FLAG_WRITE | base::File::FLAG_ASYNC; |
372 TestCompletionCallback callback; | 371 TestCompletionCallback callback; |
373 int rv = stream.Open(temp_file_path(), flags, callback.callback()); | 372 int rv = stream.Open(temp_file_path(), flags, callback.callback()); |
374 EXPECT_EQ(ERR_IO_PENDING, rv); | 373 EXPECT_EQ(ERR_IO_PENDING, rv); |
375 EXPECT_EQ(OK, callback.WaitForResult()); | 374 EXPECT_EQ(OK, callback.WaitForResult()); |
376 | 375 |
377 TestInt64CompletionCallback callback64; | 376 TestInt64CompletionCallback callback64; |
378 const int64 kOffset = 0; | 377 const int64 kOffset = 0; |
379 rv = stream.Seek(FROM_END, kOffset, callback64.callback()); | 378 rv = stream.Seek(FROM_END, kOffset, callback64.callback()); |
380 ASSERT_EQ(ERR_IO_PENDING, rv); | 379 ASSERT_EQ(ERR_IO_PENDING, rv); |
381 int64 new_offset = callback64.WaitForResult(); | 380 int64 new_offset = callback64.WaitForResult(); |
382 EXPECT_EQ(kTestDataSize, new_offset); | 381 EXPECT_EQ(kTestDataSize, new_offset); |
383 | 382 |
384 int total_bytes_written = 0; | 383 int total_bytes_written = 0; |
385 | 384 |
386 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); | 385 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
387 scoped_refptr<DrainableIOBuffer> drainable = | 386 scoped_refptr<DrainableIOBuffer> drainable = |
388 new DrainableIOBuffer(buf.get(), buf->size()); | 387 new DrainableIOBuffer(buf.get(), buf->size()); |
389 while (total_bytes_written != kTestDataSize) { | 388 while (total_bytes_written != kTestDataSize) { |
390 rv = stream.Write(drainable.get(), drainable->BytesRemaining(), | 389 rv = stream.Write( |
391 callback.callback()); | 390 drainable.get(), drainable->BytesRemaining(), callback.callback()); |
392 if (rv == ERR_IO_PENDING) | 391 if (rv == ERR_IO_PENDING) |
393 rv = callback.WaitForResult(); | 392 rv = callback.WaitForResult(); |
394 EXPECT_LT(0, rv); | 393 EXPECT_LT(0, rv); |
395 if (rv <= 0) | 394 if (rv <= 0) |
396 break; | 395 break; |
397 drainable->DidConsume(rv); | 396 drainable->DidConsume(rv); |
398 total_bytes_written += rv; | 397 total_bytes_written += rv; |
399 } | 398 } |
400 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 399 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
401 EXPECT_EQ(file_size, kTestDataSize * 2); | 400 EXPECT_EQ(file_size, kTestDataSize * 2); |
(...skipping 28 matching lines...) Expand all Loading... |
430 } | 429 } |
431 EXPECT_EQ(file_size, total_bytes_read); | 430 EXPECT_EQ(file_size, total_bytes_read); |
432 EXPECT_TRUE(data_read == kTestData); | 431 EXPECT_TRUE(data_read == kTestData); |
433 | 432 |
434 int total_bytes_written = 0; | 433 int total_bytes_written = 0; |
435 | 434 |
436 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); | 435 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
437 scoped_refptr<DrainableIOBuffer> drainable = | 436 scoped_refptr<DrainableIOBuffer> drainable = |
438 new DrainableIOBuffer(buf.get(), buf->size()); | 437 new DrainableIOBuffer(buf.get(), buf->size()); |
439 while (total_bytes_written != kTestDataSize) { | 438 while (total_bytes_written != kTestDataSize) { |
440 rv = stream->Write(drainable.get(), drainable->BytesRemaining(), | 439 rv = stream->Write( |
441 callback.callback()); | 440 drainable.get(), drainable->BytesRemaining(), callback.callback()); |
442 if (rv == ERR_IO_PENDING) | 441 if (rv == ERR_IO_PENDING) |
443 rv = callback.WaitForResult(); | 442 rv = callback.WaitForResult(); |
444 EXPECT_LT(0, rv); | 443 EXPECT_LT(0, rv); |
445 if (rv <= 0) | 444 if (rv <= 0) |
446 break; | 445 break; |
447 drainable->DidConsume(rv); | 446 drainable->DidConsume(rv); |
448 total_bytes_written += rv; | 447 total_bytes_written += rv; |
449 } | 448 } |
450 | 449 |
451 stream.reset(); | 450 stream.reset(); |
(...skipping 20 matching lines...) Expand all Loading... |
472 ASSERT_EQ(ERR_IO_PENDING, rv); | 471 ASSERT_EQ(ERR_IO_PENDING, rv); |
473 int64 offset = callback64.WaitForResult(); | 472 int64 offset = callback64.WaitForResult(); |
474 EXPECT_EQ(offset, file_size); | 473 EXPECT_EQ(offset, file_size); |
475 | 474 |
476 int total_bytes_written = 0; | 475 int total_bytes_written = 0; |
477 | 476 |
478 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); | 477 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
479 scoped_refptr<DrainableIOBuffer> drainable = | 478 scoped_refptr<DrainableIOBuffer> drainable = |
480 new DrainableIOBuffer(buf.get(), buf->size()); | 479 new DrainableIOBuffer(buf.get(), buf->size()); |
481 while (total_bytes_written != kTestDataSize) { | 480 while (total_bytes_written != kTestDataSize) { |
482 rv = stream->Write(drainable.get(), drainable->BytesRemaining(), | 481 rv = stream->Write( |
483 callback.callback()); | 482 drainable.get(), drainable->BytesRemaining(), callback.callback()); |
484 if (rv == ERR_IO_PENDING) | 483 if (rv == ERR_IO_PENDING) |
485 rv = callback.WaitForResult(); | 484 rv = callback.WaitForResult(); |
486 EXPECT_LT(0, rv); | 485 EXPECT_LT(0, rv); |
487 if (rv <= 0) | 486 if (rv <= 0) |
488 break; | 487 break; |
489 drainable->DidConsume(rv); | 488 drainable->DidConsume(rv); |
490 total_bytes_written += rv; | 489 total_bytes_written += rv; |
491 } | 490 } |
492 | 491 |
493 EXPECT_EQ(kTestDataSize, total_bytes_written); | 492 EXPECT_EQ(kTestDataSize, total_bytes_written); |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 EXPECT_EQ(ERR_IO_PENDING, rv); | 633 EXPECT_EQ(ERR_IO_PENDING, rv); |
635 EXPECT_EQ(OK, open_callback.WaitForResult()); | 634 EXPECT_EQ(OK, open_callback.WaitForResult()); |
636 | 635 |
637 TestInt64CompletionCallback callback64; | 636 TestInt64CompletionCallback callback64; |
638 EXPECT_EQ(ERR_IO_PENDING, stream->Seek(FROM_END, 0, callback64.callback())); | 637 EXPECT_EQ(ERR_IO_PENDING, stream->Seek(FROM_END, 0, callback64.callback())); |
639 EXPECT_EQ(file_size, callback64.WaitForResult()); | 638 EXPECT_EQ(file_size, callback64.WaitForResult()); |
640 | 639 |
641 int total_bytes_written = 0; | 640 int total_bytes_written = 0; |
642 int total_bytes_read = 0; | 641 int total_bytes_read = 0; |
643 std::string data_read; | 642 std::string data_read; |
644 TestWriteReadCompletionCallback callback(stream.get(), &total_bytes_written, | 643 TestWriteReadCompletionCallback callback( |
645 &total_bytes_read, &data_read); | 644 stream.get(), &total_bytes_written, &total_bytes_read, &data_read); |
646 | 645 |
647 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); | 646 scoped_refptr<IOBufferWithSize> buf = CreateTestDataBuffer(); |
648 rv = stream->Write(buf.get(), buf->size(), callback.callback()); | 647 rv = stream->Write(buf.get(), buf->size(), callback.callback()); |
649 if (rv == ERR_IO_PENDING) | 648 if (rv == ERR_IO_PENDING) |
650 rv = callback.WaitForResult(); | 649 rv = callback.WaitForResult(); |
651 EXPECT_LT(0, rv); | 650 EXPECT_LT(0, rv); |
652 EXPECT_EQ(kTestDataSize, total_bytes_written); | 651 EXPECT_EQ(kTestDataSize, total_bytes_written); |
653 | 652 |
654 stream.reset(); | 653 stream.reset(); |
655 | 654 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); | 756 EXPECT_TRUE(base::GetFileSize(temp_file_path(), &file_size)); |
758 EXPECT_EQ(kTestDataSize * 2, file_size); | 757 EXPECT_EQ(kTestDataSize * 2, file_size); |
759 } | 758 } |
760 | 759 |
761 TEST_F(FileStreamTest, AsyncOpenAndDelete) { | 760 TEST_F(FileStreamTest, AsyncOpenAndDelete) { |
762 scoped_refptr<base::SequencedWorkerPool> pool( | 761 scoped_refptr<base::SequencedWorkerPool> pool( |
763 new base::SequencedWorkerPool(1, "StreamTest")); | 762 new base::SequencedWorkerPool(1, "StreamTest")); |
764 | 763 |
765 bool prev = base::ThreadRestrictions::SetIOAllowed(false); | 764 bool prev = base::ThreadRestrictions::SetIOAllowed(false); |
766 scoped_ptr<FileStream> stream(new FileStream(pool.get())); | 765 scoped_ptr<FileStream> stream(new FileStream(pool.get())); |
767 int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE | | 766 int flags = |
768 base::File::FLAG_ASYNC; | 767 base::File::FLAG_OPEN | base::File::FLAG_WRITE | base::File::FLAG_ASYNC; |
769 TestCompletionCallback open_callback; | 768 TestCompletionCallback open_callback; |
770 int rv = stream->Open(temp_file_path(), flags, open_callback.callback()); | 769 int rv = stream->Open(temp_file_path(), flags, open_callback.callback()); |
771 EXPECT_EQ(ERR_IO_PENDING, rv); | 770 EXPECT_EQ(ERR_IO_PENDING, rv); |
772 | 771 |
773 // Delete the stream without waiting for the open operation to be | 772 // Delete the stream without waiting for the open operation to be |
774 // complete. Should be safe. | 773 // complete. Should be safe. |
775 stream.reset(); | 774 stream.reset(); |
776 | 775 |
777 // Force an operation through the pool. | 776 // Force an operation through the pool. |
778 scoped_ptr<FileStream> stream2(new FileStream(pool.get())); | 777 scoped_ptr<FileStream> stream2(new FileStream(pool.get())); |
779 TestCompletionCallback open_callback2; | 778 TestCompletionCallback open_callback2; |
780 rv = stream2->Open(temp_file_path(), flags, open_callback2.callback()); | 779 rv = stream2->Open(temp_file_path(), flags, open_callback2.callback()); |
781 EXPECT_EQ(OK, open_callback2.GetResult(rv)); | 780 EXPECT_EQ(OK, open_callback2.GetResult(rv)); |
782 stream2.reset(); | 781 stream2.reset(); |
783 | 782 |
784 pool->Shutdown(); | 783 pool->Shutdown(); |
785 | 784 |
786 // open_callback won't be called. | 785 // open_callback won't be called. |
787 base::RunLoop().RunUntilIdle(); | 786 base::RunLoop().RunUntilIdle(); |
788 EXPECT_FALSE(open_callback.have_result()); | 787 EXPECT_FALSE(open_callback.have_result()); |
789 base::ThreadRestrictions::SetIOAllowed(prev); | 788 base::ThreadRestrictions::SetIOAllowed(prev); |
790 } | 789 } |
791 | 790 |
792 // Verify that async Write() errors are mapped correctly. | 791 // Verify that async Write() errors are mapped correctly. |
793 TEST_F(FileStreamTest, AsyncWriteError) { | 792 TEST_F(FileStreamTest, AsyncWriteError) { |
794 // Try opening file as read-only and then writing to it using FileStream. | 793 // Try opening file as read-only and then writing to it using FileStream. |
795 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 794 uint32 flags = |
796 base::File::FLAG_ASYNC; | 795 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
797 | 796 |
798 base::File file(temp_file_path(), flags); | 797 base::File file(temp_file_path(), flags); |
799 ASSERT_TRUE(file.IsValid()); | 798 ASSERT_TRUE(file.IsValid()); |
800 | 799 |
801 scoped_ptr<FileStream> stream( | 800 scoped_ptr<FileStream> stream( |
802 new FileStream(file.Pass(), base::MessageLoopProxy::current())); | 801 new FileStream(file.Pass(), base::MessageLoopProxy::current())); |
803 | 802 |
804 scoped_refptr<IOBuffer> buf = new IOBuffer(1); | 803 scoped_refptr<IOBuffer> buf = new IOBuffer(1); |
805 buf->data()[0] = 0; | 804 buf->data()[0] = 0; |
806 | 805 |
807 TestCompletionCallback callback; | 806 TestCompletionCallback callback; |
808 int rv = stream->Write(buf.get(), 1, callback.callback()); | 807 int rv = stream->Write(buf.get(), 1, callback.callback()); |
809 if (rv == ERR_IO_PENDING) | 808 if (rv == ERR_IO_PENDING) |
810 rv = callback.WaitForResult(); | 809 rv = callback.WaitForResult(); |
811 EXPECT_LT(rv, 0); | 810 EXPECT_LT(rv, 0); |
812 | 811 |
813 stream.reset(); | 812 stream.reset(); |
814 base::RunLoop().RunUntilIdle(); | 813 base::RunLoop().RunUntilIdle(); |
815 } | 814 } |
816 | 815 |
817 // Verify that async Read() errors are mapped correctly. | 816 // Verify that async Read() errors are mapped correctly. |
818 TEST_F(FileStreamTest, AsyncReadError) { | 817 TEST_F(FileStreamTest, AsyncReadError) { |
819 // Try opening file for write and then reading from it using FileStream. | 818 // Try opening file for write and then reading from it using FileStream. |
820 uint32 flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE | | 819 uint32 flags = |
821 base::File::FLAG_ASYNC; | 820 base::File::FLAG_OPEN | base::File::FLAG_WRITE | base::File::FLAG_ASYNC; |
822 | 821 |
823 base::File file(temp_file_path(), flags); | 822 base::File file(temp_file_path(), flags); |
824 ASSERT_TRUE(file.IsValid()); | 823 ASSERT_TRUE(file.IsValid()); |
825 | 824 |
826 scoped_ptr<FileStream> stream( | 825 scoped_ptr<FileStream> stream( |
827 new FileStream(file.Pass(), base::MessageLoopProxy::current())); | 826 new FileStream(file.Pass(), base::MessageLoopProxy::current())); |
828 | 827 |
829 scoped_refptr<IOBuffer> buf = new IOBuffer(1); | 828 scoped_refptr<IOBuffer> buf = new IOBuffer(1); |
830 TestCompletionCallback callback; | 829 TestCompletionCallback callback; |
831 int rv = stream->Read(buf.get(), 1, callback.callback()); | 830 int rv = stream->Read(buf.get(), 1, callback.callback()); |
832 if (rv == ERR_IO_PENDING) | 831 if (rv == ERR_IO_PENDING) |
833 rv = callback.WaitForResult(); | 832 rv = callback.WaitForResult(); |
834 EXPECT_LT(rv, 0); | 833 EXPECT_LT(rv, 0); |
835 | 834 |
836 stream.reset(); | 835 stream.reset(); |
837 base::RunLoop().RunUntilIdle(); | 836 base::RunLoop().RunUntilIdle(); |
(...skipping 12 matching lines...) Expand all Loading... |
850 // Insert the image into MediaStore. MediaStore will do some conversions, and | 849 // Insert the image into MediaStore. MediaStore will do some conversions, and |
851 // return the content URI. | 850 // return the content URI. |
852 base::FilePath path = file_util::InsertImageIntoMediaStore(image_file); | 851 base::FilePath path = file_util::InsertImageIntoMediaStore(image_file); |
853 EXPECT_TRUE(path.IsContentUri()); | 852 EXPECT_TRUE(path.IsContentUri()); |
854 EXPECT_TRUE(base::PathExists(path)); | 853 EXPECT_TRUE(base::PathExists(path)); |
855 int64 file_size; | 854 int64 file_size; |
856 EXPECT_TRUE(base::GetFileSize(path, &file_size)); | 855 EXPECT_TRUE(base::GetFileSize(path, &file_size)); |
857 EXPECT_LT(0, file_size); | 856 EXPECT_LT(0, file_size); |
858 | 857 |
859 FileStream stream(base::MessageLoopProxy::current()); | 858 FileStream stream(base::MessageLoopProxy::current()); |
860 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 859 int flags = |
861 base::File::FLAG_ASYNC; | 860 base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC; |
862 TestCompletionCallback callback; | 861 TestCompletionCallback callback; |
863 int rv = stream.Open(path, flags, callback.callback()); | 862 int rv = stream.Open(path, flags, callback.callback()); |
864 EXPECT_EQ(ERR_IO_PENDING, rv); | 863 EXPECT_EQ(ERR_IO_PENDING, rv); |
865 EXPECT_EQ(OK, callback.WaitForResult()); | 864 EXPECT_EQ(OK, callback.WaitForResult()); |
866 | 865 |
867 int total_bytes_read = 0; | 866 int total_bytes_read = 0; |
868 | 867 |
869 std::string data_read; | 868 std::string data_read; |
870 for (;;) { | 869 for (;;) { |
871 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); | 870 scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); |
872 rv = stream.Read(buf.get(), buf->size(), callback.callback()); | 871 rv = stream.Read(buf.get(), buf->size(), callback.callback()); |
873 if (rv == ERR_IO_PENDING) | 872 if (rv == ERR_IO_PENDING) |
874 rv = callback.WaitForResult(); | 873 rv = callback.WaitForResult(); |
875 EXPECT_LE(0, rv); | 874 EXPECT_LE(0, rv); |
876 if (rv <= 0) | 875 if (rv <= 0) |
877 break; | 876 break; |
878 total_bytes_read += rv; | 877 total_bytes_read += rv; |
879 data_read.append(buf->data(), rv); | 878 data_read.append(buf->data(), rv); |
880 } | 879 } |
881 EXPECT_EQ(file_size, total_bytes_read); | 880 EXPECT_EQ(file_size, total_bytes_read); |
882 } | 881 } |
883 #endif | 882 #endif |
884 | 883 |
885 } // namespace | 884 } // namespace |
886 | 885 |
887 } // namespace net | 886 } // namespace net |
OLD | NEW |