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" |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |