| 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 |