| 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/elements_upload_data_stream.h" | 5 #include "net/base/elements_upload_data_stream.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 init_result_(OK), | 64 init_result_(OK), |
| 65 read_result_(OK) {} | 65 read_result_(OK) {} |
| 66 | 66 |
| 67 virtual ~MockUploadElementReader() {} | 67 virtual ~MockUploadElementReader() {} |
| 68 | 68 |
| 69 // UploadElementReader overrides. | 69 // UploadElementReader overrides. |
| 70 MOCK_METHOD1(Init, int(const CompletionCallback& callback)); | 70 MOCK_METHOD1(Init, int(const CompletionCallback& callback)); |
| 71 virtual uint64 GetContentLength() const override { return content_length_; } | 71 virtual uint64 GetContentLength() const override { return content_length_; } |
| 72 virtual uint64 BytesRemaining() const override { return bytes_remaining_; } | 72 virtual uint64 BytesRemaining() const override { return bytes_remaining_; } |
| 73 virtual bool IsInMemory() const override { return is_in_memory_; } | 73 virtual bool IsInMemory() const override { return is_in_memory_; } |
| 74 MOCK_METHOD3(Read, int(IOBuffer* buf, | 74 MOCK_METHOD3(Read, |
| 75 int buf_length, | 75 int(IOBuffer* buf, |
| 76 const CompletionCallback& callback)); | 76 int buf_length, |
| 77 const CompletionCallback& callback)); |
| 77 | 78 |
| 78 // Sets expectation to return the specified result from Init() asynchronously. | 79 // Sets expectation to return the specified result from Init() asynchronously. |
| 79 void SetAsyncInitExpectation(int result) { | 80 void SetAsyncInitExpectation(int result) { |
| 80 init_result_ = result; | 81 init_result_ = result; |
| 81 EXPECT_CALL(*this, Init(_)) | 82 EXPECT_CALL(*this, Init(_)) |
| 82 .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit), | 83 .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit), |
| 83 Return(ERR_IO_PENDING))); | 84 Return(ERR_IO_PENDING))); |
| 84 } | 85 } |
| 85 | 86 |
| 86 // Sets expectation to return the specified result from Read(). | 87 // Sets expectation to return the specified result from Read(). |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 scoped_ptr<UploadDataStream> stream( | 147 scoped_ptr<UploadDataStream> stream( |
| 147 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 148 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 148 ASSERT_EQ(OK, stream->Init(CompletionCallback())); | 149 ASSERT_EQ(OK, stream->Init(CompletionCallback())); |
| 149 EXPECT_TRUE(stream->IsInMemory()); | 150 EXPECT_TRUE(stream->IsInMemory()); |
| 150 EXPECT_EQ(0U, stream->size()); | 151 EXPECT_EQ(0U, stream->size()); |
| 151 EXPECT_EQ(0U, stream->position()); | 152 EXPECT_EQ(0U, stream->position()); |
| 152 EXPECT_TRUE(stream->IsEOF()); | 153 EXPECT_TRUE(stream->IsEOF()); |
| 153 } | 154 } |
| 154 | 155 |
| 155 TEST_F(ElementsUploadDataStreamTest, ConsumeAllBytes) { | 156 TEST_F(ElementsUploadDataStreamTest, ConsumeAllBytes) { |
| 156 element_readers_.push_back(new UploadBytesElementReader( | 157 element_readers_.push_back( |
| 157 kTestData, kTestDataSize)); | 158 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 158 scoped_ptr<UploadDataStream> stream( | 159 scoped_ptr<UploadDataStream> stream( |
| 159 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 160 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 160 ASSERT_EQ(OK, stream->Init(CompletionCallback())); | 161 ASSERT_EQ(OK, stream->Init(CompletionCallback())); |
| 161 EXPECT_TRUE(stream->IsInMemory()); | 162 EXPECT_TRUE(stream->IsInMemory()); |
| 162 EXPECT_EQ(kTestDataSize, stream->size()); | 163 EXPECT_EQ(kTestDataSize, stream->size()); |
| 163 EXPECT_EQ(0U, stream->position()); | 164 EXPECT_EQ(0U, stream->position()); |
| 164 EXPECT_FALSE(stream->IsEOF()); | 165 EXPECT_FALSE(stream->IsEOF()); |
| 165 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); | 166 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| 166 while (!stream->IsEOF()) { | 167 while (!stream->IsEOF()) { |
| 167 int bytes_read = | 168 int bytes_read = |
| 168 stream->Read(buf.get(), kTestBufferSize, CompletionCallback()); | 169 stream->Read(buf.get(), kTestBufferSize, CompletionCallback()); |
| 169 ASSERT_LE(0, bytes_read); // Not an error. | 170 ASSERT_LE(0, bytes_read); // Not an error. |
| 170 } | 171 } |
| 171 EXPECT_EQ(kTestDataSize, stream->position()); | 172 EXPECT_EQ(kTestDataSize, stream->position()); |
| 172 ASSERT_TRUE(stream->IsEOF()); | 173 ASSERT_TRUE(stream->IsEOF()); |
| 173 } | 174 } |
| 174 | 175 |
| 175 TEST_F(ElementsUploadDataStreamTest, File) { | 176 TEST_F(ElementsUploadDataStreamTest, File) { |
| 176 base::FilePath temp_file_path; | 177 base::FilePath temp_file_path; |
| 177 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 178 ASSERT_TRUE( |
| 178 &temp_file_path)); | 179 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 179 ASSERT_EQ(static_cast<int>(kTestDataSize), | 180 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 180 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 181 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 181 | 182 |
| 182 element_readers_.push_back( | 183 element_readers_.push_back( |
| 183 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 184 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 184 temp_file_path, | 185 temp_file_path, |
| 185 0, | 186 0, |
| 186 kuint64max, | 187 kuint64max, |
| 187 base::Time())); | 188 base::Time())); |
| 188 | 189 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 202 ERR_IO_PENDING, | 203 ERR_IO_PENDING, |
| 203 stream->Read(buf.get(), kTestBufferSize, read_callback.callback())); | 204 stream->Read(buf.get(), kTestBufferSize, read_callback.callback())); |
| 204 ASSERT_LE(0, read_callback.WaitForResult()); // Not an error. | 205 ASSERT_LE(0, read_callback.WaitForResult()); // Not an error. |
| 205 } | 206 } |
| 206 EXPECT_EQ(kTestDataSize, stream->position()); | 207 EXPECT_EQ(kTestDataSize, stream->position()); |
| 207 ASSERT_TRUE(stream->IsEOF()); | 208 ASSERT_TRUE(stream->IsEOF()); |
| 208 } | 209 } |
| 209 | 210 |
| 210 TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) { | 211 TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) { |
| 211 base::FilePath temp_file_path; | 212 base::FilePath temp_file_path; |
| 212 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 213 ASSERT_TRUE( |
| 213 &temp_file_path)); | 214 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 214 ASSERT_EQ(static_cast<int>(kTestDataSize), | 215 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 215 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 216 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 216 const uint64 kFakeSize = kTestDataSize*2; | 217 const uint64 kFakeSize = kTestDataSize * 2; |
| 217 | 218 |
| 218 UploadFileElementReader::ScopedOverridingContentLengthForTests | 219 UploadFileElementReader::ScopedOverridingContentLengthForTests |
| 219 overriding_content_length(kFakeSize); | 220 overriding_content_length(kFakeSize); |
| 220 | 221 |
| 221 element_readers_.push_back( | 222 element_readers_.push_back( |
| 222 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 223 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 223 temp_file_path, | 224 temp_file_path, |
| 224 0, | 225 0, |
| 225 kuint64max, | 226 kuint64max, |
| 226 base::Time())); | 227 base::Time())); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 254 | 255 |
| 255 TEST_F(ElementsUploadDataStreamTest, ReadErrorSync) { | 256 TEST_F(ElementsUploadDataStreamTest, ReadErrorSync) { |
| 256 // This element cannot be read. | 257 // This element cannot be read. |
| 257 MockUploadElementReader* reader = | 258 MockUploadElementReader* reader = |
| 258 new MockUploadElementReader(kTestDataSize, true); | 259 new MockUploadElementReader(kTestDataSize, true); |
| 259 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); | 260 EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); |
| 260 reader->SetReadExpectation(ERR_FAILED); | 261 reader->SetReadExpectation(ERR_FAILED); |
| 261 element_readers_.push_back(reader); | 262 element_readers_.push_back(reader); |
| 262 | 263 |
| 263 // This element is ignored because of the error from the previous reader. | 264 // This element is ignored because of the error from the previous reader. |
| 264 element_readers_.push_back(new UploadBytesElementReader( | 265 element_readers_.push_back( |
| 265 kTestData, kTestDataSize)); | 266 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 266 | 267 |
| 267 scoped_ptr<UploadDataStream> stream( | 268 scoped_ptr<UploadDataStream> stream( |
| 268 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 269 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 269 | 270 |
| 270 // Run Init(). | 271 // Run Init(). |
| 271 ASSERT_EQ(OK, stream->Init(CompletionCallback())); | 272 ASSERT_EQ(OK, stream->Init(CompletionCallback())); |
| 272 EXPECT_EQ(kTestDataSize*2, stream->size()); | 273 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 273 EXPECT_EQ(0U, stream->position()); | 274 EXPECT_EQ(0U, stream->position()); |
| 274 EXPECT_FALSE(stream->IsEOF()); | 275 EXPECT_FALSE(stream->IsEOF()); |
| 275 | 276 |
| 276 // Prepare a buffer filled with non-zero data. | 277 // Prepare a buffer filled with non-zero data. |
| 277 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); | 278 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| 278 std::fill_n(buf->data(), kTestBufferSize, -1); | 279 std::fill_n(buf->data(), kTestBufferSize, -1); |
| 279 | 280 |
| 280 // Read() results in success even when the reader returns error. | 281 // Read() results in success even when the reader returns error. |
| 281 EXPECT_EQ(static_cast<int>(kTestDataSize * 2), | 282 EXPECT_EQ(static_cast<int>(kTestDataSize * 2), |
| 282 stream->Read(buf.get(), kTestBufferSize, CompletionCallback())); | 283 stream->Read(buf.get(), kTestBufferSize, CompletionCallback())); |
| 283 EXPECT_EQ(kTestDataSize * 2, stream->position()); | 284 EXPECT_EQ(kTestDataSize * 2, stream->position()); |
| 284 EXPECT_TRUE(stream->IsEOF()); | 285 EXPECT_TRUE(stream->IsEOF()); |
| 285 | 286 |
| 286 // The buffer is filled with zero. | 287 // The buffer is filled with zero. |
| 287 EXPECT_EQ(static_cast<int>(kTestDataSize*2), | 288 EXPECT_EQ(static_cast<int>(kTestDataSize * 2), |
| 288 std::count(buf->data(), buf->data() + kTestBufferSize, 0)); | 289 std::count(buf->data(), buf->data() + kTestBufferSize, 0)); |
| 289 } | 290 } |
| 290 | 291 |
| 291 TEST_F(ElementsUploadDataStreamTest, ReadErrorAsync) { | 292 TEST_F(ElementsUploadDataStreamTest, ReadErrorAsync) { |
| 292 // This element cannot be read. | 293 // This element cannot be read. |
| 293 MockUploadElementReader* reader = | 294 MockUploadElementReader* reader = |
| 294 new MockUploadElementReader(kTestDataSize, false); | 295 new MockUploadElementReader(kTestDataSize, false); |
| 295 reader->SetAsyncInitExpectation(OK); | 296 reader->SetAsyncInitExpectation(OK); |
| 296 reader->SetReadExpectation(ERR_FAILED); | 297 reader->SetReadExpectation(ERR_FAILED); |
| 297 element_readers_.push_back(reader); | 298 element_readers_.push_back(reader); |
| 298 | 299 |
| 299 // This element is ignored because of the error from the previous reader. | 300 // This element is ignored because of the error from the previous reader. |
| 300 element_readers_.push_back(new UploadBytesElementReader( | 301 element_readers_.push_back( |
| 301 kTestData, kTestDataSize)); | 302 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 302 | 303 |
| 303 scoped_ptr<UploadDataStream> stream( | 304 scoped_ptr<UploadDataStream> stream( |
| 304 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 305 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 305 | 306 |
| 306 // Run Init(). | 307 // Run Init(). |
| 307 TestCompletionCallback init_callback; | 308 TestCompletionCallback init_callback; |
| 308 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback())); | 309 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback())); |
| 309 EXPECT_EQ(OK, init_callback.WaitForResult()); | 310 EXPECT_EQ(OK, init_callback.WaitForResult()); |
| 310 EXPECT_EQ(kTestDataSize*2, stream->size()); | 311 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 311 EXPECT_EQ(0U, stream->position()); | 312 EXPECT_EQ(0U, stream->position()); |
| 312 EXPECT_FALSE(stream->IsEOF()); | 313 EXPECT_FALSE(stream->IsEOF()); |
| 313 | 314 |
| 314 // Prepare a buffer filled with non-zero data. | 315 // Prepare a buffer filled with non-zero data. |
| 315 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); | 316 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| 316 std::fill_n(buf->data(), kTestBufferSize, -1); | 317 std::fill_n(buf->data(), kTestBufferSize, -1); |
| 317 | 318 |
| 318 // Read() results in success even when the reader returns error. | 319 // Read() results in success even when the reader returns error. |
| 319 TestCompletionCallback read_callback; | 320 TestCompletionCallback read_callback; |
| 320 ASSERT_EQ(ERR_IO_PENDING, | 321 ASSERT_EQ(ERR_IO_PENDING, |
| 321 stream->Read(buf.get(), kTestBufferSize, read_callback.callback())); | 322 stream->Read(buf.get(), kTestBufferSize, read_callback.callback())); |
| 322 EXPECT_EQ(static_cast<int>(kTestDataSize * 2), read_callback.WaitForResult()); | 323 EXPECT_EQ(static_cast<int>(kTestDataSize * 2), read_callback.WaitForResult()); |
| 323 EXPECT_EQ(kTestDataSize*2, stream->position()); | 324 EXPECT_EQ(kTestDataSize * 2, stream->position()); |
| 324 EXPECT_TRUE(stream->IsEOF()); | 325 EXPECT_TRUE(stream->IsEOF()); |
| 325 | 326 |
| 326 // The buffer is filled with zero. | 327 // The buffer is filled with zero. |
| 327 EXPECT_EQ(static_cast<int>(kTestDataSize*2), | 328 EXPECT_EQ(static_cast<int>(kTestDataSize * 2), |
| 328 std::count(buf->data(), buf->data() + kTestBufferSize, 0)); | 329 std::count(buf->data(), buf->data() + kTestBufferSize, 0)); |
| 329 } | 330 } |
| 330 | 331 |
| 331 TEST_F(ElementsUploadDataStreamTest, FileAndBytes) { | 332 TEST_F(ElementsUploadDataStreamTest, FileAndBytes) { |
| 332 base::FilePath temp_file_path; | 333 base::FilePath temp_file_path; |
| 333 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 334 ASSERT_TRUE( |
| 334 &temp_file_path)); | 335 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 335 ASSERT_EQ(static_cast<int>(kTestDataSize), | 336 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 336 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 337 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 337 | 338 |
| 338 const uint64 kFileRangeOffset = 1; | 339 const uint64 kFileRangeOffset = 1; |
| 339 const uint64 kFileRangeLength = 4; | 340 const uint64 kFileRangeLength = 4; |
| 340 element_readers_.push_back( | 341 element_readers_.push_back( |
| 341 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 342 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 342 temp_file_path, | 343 temp_file_path, |
| 343 kFileRangeOffset, | 344 kFileRangeOffset, |
| 344 kFileRangeLength, | 345 kFileRangeLength, |
| 345 base::Time())); | 346 base::Time())); |
| 346 | 347 |
| 347 element_readers_.push_back(new UploadBytesElementReader( | 348 element_readers_.push_back( |
| 348 kTestData, kTestDataSize)); | 349 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 349 | 350 |
| 350 const uint64 kStreamSize = kTestDataSize + kFileRangeLength; | 351 const uint64 kStreamSize = kTestDataSize + kFileRangeLength; |
| 351 TestCompletionCallback init_callback; | 352 TestCompletionCallback init_callback; |
| 352 scoped_ptr<UploadDataStream> stream( | 353 scoped_ptr<UploadDataStream> stream( |
| 353 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 354 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 354 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback())); | 355 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback())); |
| 355 ASSERT_EQ(OK, init_callback.WaitForResult()); | 356 ASSERT_EQ(OK, init_callback.WaitForResult()); |
| 356 EXPECT_FALSE(stream->IsInMemory()); | 357 EXPECT_FALSE(stream->IsInMemory()); |
| 357 EXPECT_EQ(kStreamSize, stream->size()); | 358 EXPECT_EQ(kStreamSize, stream->size()); |
| 358 EXPECT_EQ(0U, stream->position()); | 359 EXPECT_EQ(0U, stream->position()); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 440 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 440 | 441 |
| 441 // Run Init(). | 442 // Run Init(). |
| 442 TestCompletionCallback callback; | 443 TestCompletionCallback callback; |
| 443 ASSERT_EQ(ERR_IO_PENDING, stream->Init(callback.callback())); | 444 ASSERT_EQ(ERR_IO_PENDING, stream->Init(callback.callback())); |
| 444 EXPECT_EQ(ERR_FAILED, callback.WaitForResult()); | 445 EXPECT_EQ(ERR_FAILED, callback.WaitForResult()); |
| 445 } | 446 } |
| 446 | 447 |
| 447 // Read with a buffer whose size is same as the data. | 448 // Read with a buffer whose size is same as the data. |
| 448 TEST_F(ElementsUploadDataStreamTest, ReadAsyncWithExactSizeBuffer) { | 449 TEST_F(ElementsUploadDataStreamTest, ReadAsyncWithExactSizeBuffer) { |
| 449 element_readers_.push_back(new UploadBytesElementReader( | 450 element_readers_.push_back( |
| 450 kTestData, kTestDataSize)); | 451 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 451 scoped_ptr<UploadDataStream> stream( | 452 scoped_ptr<UploadDataStream> stream( |
| 452 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 453 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 453 | 454 |
| 454 ASSERT_EQ(OK, stream->Init(CompletionCallback())); | 455 ASSERT_EQ(OK, stream->Init(CompletionCallback())); |
| 455 EXPECT_TRUE(stream->IsInMemory()); | 456 EXPECT_TRUE(stream->IsInMemory()); |
| 456 EXPECT_EQ(kTestDataSize, stream->size()); | 457 EXPECT_EQ(kTestDataSize, stream->size()); |
| 457 EXPECT_EQ(0U, stream->position()); | 458 EXPECT_EQ(0U, stream->position()); |
| 458 EXPECT_FALSE(stream->IsEOF()); | 459 EXPECT_FALSE(stream->IsEOF()); |
| 459 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestDataSize); | 460 scoped_refptr<IOBuffer> buf = new IOBuffer(kTestDataSize); |
| 460 int bytes_read = stream->Read(buf.get(), kTestDataSize, CompletionCallback()); | 461 int bytes_read = stream->Read(buf.get(), kTestDataSize, CompletionCallback()); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback())); | 537 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback())); |
| 537 int error_code = init_callback.WaitForResult(); | 538 int error_code = init_callback.WaitForResult(); |
| 538 if (error_expected) | 539 if (error_expected) |
| 539 ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code); | 540 ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code); |
| 540 else | 541 else |
| 541 ASSERT_EQ(OK, error_code); | 542 ASSERT_EQ(OK, error_code); |
| 542 } | 543 } |
| 543 | 544 |
| 544 TEST_F(ElementsUploadDataStreamTest, FileChanged) { | 545 TEST_F(ElementsUploadDataStreamTest, FileChanged) { |
| 545 base::FilePath temp_file_path; | 546 base::FilePath temp_file_path; |
| 546 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 547 ASSERT_TRUE( |
| 547 &temp_file_path)); | 548 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 548 ASSERT_EQ(static_cast<int>(kTestDataSize), | 549 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 549 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 550 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 550 | 551 |
| 551 base::File::Info file_info; | 552 base::File::Info file_info; |
| 552 ASSERT_TRUE(base::GetFileInfo(temp_file_path, &file_info)); | 553 ASSERT_TRUE(base::GetFileInfo(temp_file_path, &file_info)); |
| 553 | 554 |
| 554 // Test file not changed. | 555 // Test file not changed. |
| 555 FileChangedHelper(temp_file_path, file_info.last_modified, false); | 556 FileChangedHelper(temp_file_path, file_info.last_modified, false); |
| 556 | 557 |
| 557 // Test file changed. | 558 // Test file changed. |
| 558 FileChangedHelper(temp_file_path, | 559 FileChangedHelper(temp_file_path, |
| 559 file_info.last_modified - base::TimeDelta::FromSeconds(1), | 560 file_info.last_modified - base::TimeDelta::FromSeconds(1), |
| 560 true); | 561 true); |
| 561 } | 562 } |
| 562 | 563 |
| 563 TEST_F(ElementsUploadDataStreamTest, MultipleInit) { | 564 TEST_F(ElementsUploadDataStreamTest, MultipleInit) { |
| 564 base::FilePath temp_file_path; | 565 base::FilePath temp_file_path; |
| 565 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 566 ASSERT_TRUE( |
| 566 &temp_file_path)); | 567 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 567 ASSERT_EQ(static_cast<int>(kTestDataSize), | 568 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 568 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 569 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 569 | 570 |
| 570 // Prepare data. | 571 // Prepare data. |
| 571 element_readers_.push_back(new UploadBytesElementReader( | 572 element_readers_.push_back( |
| 572 kTestData, kTestDataSize)); | 573 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 573 element_readers_.push_back( | 574 element_readers_.push_back( |
| 574 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 575 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 575 temp_file_path, | 576 temp_file_path, |
| 576 0, | 577 0, |
| 577 kuint64max, | 578 kuint64max, |
| 578 base::Time())); | 579 base::Time())); |
| 579 scoped_ptr<UploadDataStream> stream( | 580 scoped_ptr<UploadDataStream> stream( |
| 580 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 581 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 581 | 582 |
| 582 std::string expected_data(kTestData, kTestData + kTestDataSize); | 583 std::string expected_data(kTestData, kTestData + kTestDataSize); |
| 583 expected_data += expected_data; | 584 expected_data += expected_data; |
| 584 | 585 |
| 585 // Call Init(). | 586 // Call Init(). |
| 586 TestCompletionCallback init_callback1; | 587 TestCompletionCallback init_callback1; |
| 587 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); | 588 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); |
| 588 ASSERT_EQ(OK, init_callback1.WaitForResult()); | 589 ASSERT_EQ(OK, init_callback1.WaitForResult()); |
| 589 EXPECT_FALSE(stream->IsEOF()); | 590 EXPECT_FALSE(stream->IsEOF()); |
| 590 EXPECT_EQ(kTestDataSize*2, stream->size()); | 591 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 591 | 592 |
| 592 // Read. | 593 // Read. |
| 593 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); | 594 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); |
| 594 EXPECT_TRUE(stream->IsEOF()); | 595 EXPECT_TRUE(stream->IsEOF()); |
| 595 | 596 |
| 596 // Call Init() again to reset. | 597 // Call Init() again to reset. |
| 597 TestCompletionCallback init_callback2; | 598 TestCompletionCallback init_callback2; |
| 598 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); | 599 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); |
| 599 ASSERT_EQ(OK, init_callback2.WaitForResult()); | 600 ASSERT_EQ(OK, init_callback2.WaitForResult()); |
| 600 EXPECT_FALSE(stream->IsEOF()); | 601 EXPECT_FALSE(stream->IsEOF()); |
| 601 EXPECT_EQ(kTestDataSize*2, stream->size()); | 602 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 602 | 603 |
| 603 // Read again. | 604 // Read again. |
| 604 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); | 605 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); |
| 605 EXPECT_TRUE(stream->IsEOF()); | 606 EXPECT_TRUE(stream->IsEOF()); |
| 606 } | 607 } |
| 607 | 608 |
| 608 TEST_F(ElementsUploadDataStreamTest, MultipleInitAsync) { | 609 TEST_F(ElementsUploadDataStreamTest, MultipleInitAsync) { |
| 609 base::FilePath temp_file_path; | 610 base::FilePath temp_file_path; |
| 610 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 611 ASSERT_TRUE( |
| 611 &temp_file_path)); | 612 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 612 ASSERT_EQ(static_cast<int>(kTestDataSize), | 613 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 613 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 614 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 614 TestCompletionCallback test_callback; | 615 TestCompletionCallback test_callback; |
| 615 | 616 |
| 616 // Prepare data. | 617 // Prepare data. |
| 617 element_readers_.push_back(new UploadBytesElementReader( | 618 element_readers_.push_back( |
| 618 kTestData, kTestDataSize)); | 619 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 619 element_readers_.push_back( | 620 element_readers_.push_back( |
| 620 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 621 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 621 temp_file_path, | 622 temp_file_path, |
| 622 0, | 623 0, |
| 623 kuint64max, | 624 kuint64max, |
| 624 base::Time())); | 625 base::Time())); |
| 625 scoped_ptr<UploadDataStream> stream( | 626 scoped_ptr<UploadDataStream> stream( |
| 626 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 627 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 627 | 628 |
| 628 std::string expected_data(kTestData, kTestData + kTestDataSize); | 629 std::string expected_data(kTestData, kTestData + kTestDataSize); |
| 629 expected_data += expected_data; | 630 expected_data += expected_data; |
| 630 | 631 |
| 631 // Call Init(). | 632 // Call Init(). |
| 632 ASSERT_EQ(ERR_IO_PENDING, stream->Init(test_callback.callback())); | 633 ASSERT_EQ(ERR_IO_PENDING, stream->Init(test_callback.callback())); |
| 633 EXPECT_EQ(OK, test_callback.WaitForResult()); | 634 EXPECT_EQ(OK, test_callback.WaitForResult()); |
| 634 EXPECT_FALSE(stream->IsEOF()); | 635 EXPECT_FALSE(stream->IsEOF()); |
| 635 EXPECT_EQ(kTestDataSize*2, stream->size()); | 636 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 636 | 637 |
| 637 // Read. | 638 // Read. |
| 638 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); | 639 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); |
| 639 EXPECT_TRUE(stream->IsEOF()); | 640 EXPECT_TRUE(stream->IsEOF()); |
| 640 | 641 |
| 641 // Call Init() again to reset. | 642 // Call Init() again to reset. |
| 642 ASSERT_EQ(ERR_IO_PENDING, stream->Init(test_callback.callback())); | 643 ASSERT_EQ(ERR_IO_PENDING, stream->Init(test_callback.callback())); |
| 643 EXPECT_EQ(OK, test_callback.WaitForResult()); | 644 EXPECT_EQ(OK, test_callback.WaitForResult()); |
| 644 EXPECT_FALSE(stream->IsEOF()); | 645 EXPECT_FALSE(stream->IsEOF()); |
| 645 EXPECT_EQ(kTestDataSize*2, stream->size()); | 646 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 646 | 647 |
| 647 // Read again. | 648 // Read again. |
| 648 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); | 649 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); |
| 649 EXPECT_TRUE(stream->IsEOF()); | 650 EXPECT_TRUE(stream->IsEOF()); |
| 650 } | 651 } |
| 651 | 652 |
| 652 TEST_F(ElementsUploadDataStreamTest, InitToReset) { | 653 TEST_F(ElementsUploadDataStreamTest, InitToReset) { |
| 653 base::FilePath temp_file_path; | 654 base::FilePath temp_file_path; |
| 654 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 655 ASSERT_TRUE( |
| 655 &temp_file_path)); | 656 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 656 ASSERT_EQ(static_cast<int>(kTestDataSize), | 657 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 657 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 658 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 658 | 659 |
| 659 // Prepare data. | 660 // Prepare data. |
| 660 element_readers_.push_back(new UploadBytesElementReader( | 661 element_readers_.push_back( |
| 661 kTestData, kTestDataSize)); | 662 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 662 element_readers_.push_back( | 663 element_readers_.push_back( |
| 663 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 664 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 664 temp_file_path, | 665 temp_file_path, |
| 665 0, | 666 0, |
| 666 kuint64max, | 667 kuint64max, |
| 667 base::Time())); | 668 base::Time())); |
| 668 scoped_ptr<UploadDataStream> stream( | 669 scoped_ptr<UploadDataStream> stream( |
| 669 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 670 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 670 | 671 |
| 671 std::vector<char> expected_data(kTestData, kTestData + kTestDataSize); | 672 std::vector<char> expected_data(kTestData, kTestData + kTestDataSize); |
| 672 expected_data.insert(expected_data.end(), expected_data.begin(), | 673 expected_data.insert(expected_data.end(), |
| 674 expected_data.begin(), |
| 673 expected_data.begin() + kTestDataSize); | 675 expected_data.begin() + kTestDataSize); |
| 674 | 676 |
| 675 // Call Init(). | 677 // Call Init(). |
| 676 TestCompletionCallback init_callback1; | 678 TestCompletionCallback init_callback1; |
| 677 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); | 679 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); |
| 678 EXPECT_EQ(OK, init_callback1.WaitForResult()); | 680 EXPECT_EQ(OK, init_callback1.WaitForResult()); |
| 679 EXPECT_FALSE(stream->IsEOF()); | 681 EXPECT_FALSE(stream->IsEOF()); |
| 680 EXPECT_EQ(kTestDataSize*2, stream->size()); | 682 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 681 | 683 |
| 682 // Read some. | 684 // Read some. |
| 683 TestCompletionCallback read_callback1; | 685 TestCompletionCallback read_callback1; |
| 684 std::vector<char> buf(kTestDataSize + kTestDataSize/2); | 686 std::vector<char> buf(kTestDataSize + kTestDataSize / 2); |
| 685 scoped_refptr<IOBuffer> wrapped_buffer = new WrappedIOBuffer(&buf[0]); | 687 scoped_refptr<IOBuffer> wrapped_buffer = new WrappedIOBuffer(&buf[0]); |
| 686 EXPECT_EQ( | 688 EXPECT_EQ(ERR_IO_PENDING, |
| 687 ERR_IO_PENDING, | 689 stream->Read( |
| 688 stream->Read(wrapped_buffer.get(), buf.size(), | 690 wrapped_buffer.get(), buf.size(), read_callback1.callback())); |
| 689 read_callback1.callback())); | |
| 690 EXPECT_EQ(static_cast<int>(buf.size()), read_callback1.WaitForResult()); | 691 EXPECT_EQ(static_cast<int>(buf.size()), read_callback1.WaitForResult()); |
| 691 EXPECT_EQ(buf.size(), stream->position()); | 692 EXPECT_EQ(buf.size(), stream->position()); |
| 692 | 693 |
| 693 // Call Init to reset the state. | 694 // Call Init to reset the state. |
| 694 TestCompletionCallback init_callback2; | 695 TestCompletionCallback init_callback2; |
| 695 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); | 696 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); |
| 696 EXPECT_EQ(OK, init_callback2.WaitForResult()); | 697 EXPECT_EQ(OK, init_callback2.WaitForResult()); |
| 697 EXPECT_FALSE(stream->IsEOF()); | 698 EXPECT_FALSE(stream->IsEOF()); |
| 698 EXPECT_EQ(kTestDataSize*2, stream->size()); | 699 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 699 | 700 |
| 700 // Read. | 701 // Read. |
| 701 TestCompletionCallback read_callback2; | 702 TestCompletionCallback read_callback2; |
| 702 std::vector<char> buf2(kTestDataSize*2); | 703 std::vector<char> buf2(kTestDataSize * 2); |
| 703 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); | 704 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); |
| 704 EXPECT_EQ(ERR_IO_PENDING, | 705 EXPECT_EQ(ERR_IO_PENDING, |
| 705 stream->Read( | 706 stream->Read( |
| 706 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); | 707 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); |
| 707 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); | 708 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); |
| 708 EXPECT_EQ(expected_data, buf2); | 709 EXPECT_EQ(expected_data, buf2); |
| 709 } | 710 } |
| 710 | 711 |
| 711 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncInit) { | 712 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncInit) { |
| 712 base::FilePath temp_file_path; | 713 base::FilePath temp_file_path; |
| 713 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 714 ASSERT_TRUE( |
| 714 &temp_file_path)); | 715 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 715 ASSERT_EQ(static_cast<int>(kTestDataSize), | 716 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 716 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 717 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 717 | 718 |
| 718 // Prepare data. | 719 // Prepare data. |
| 719 element_readers_.push_back(new UploadBytesElementReader( | 720 element_readers_.push_back( |
| 720 kTestData, kTestDataSize)); | 721 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 721 element_readers_.push_back( | 722 element_readers_.push_back( |
| 722 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 723 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 723 temp_file_path, | 724 temp_file_path, |
| 724 0, | 725 0, |
| 725 kuint64max, | 726 kuint64max, |
| 726 base::Time())); | 727 base::Time())); |
| 727 scoped_ptr<UploadDataStream> stream( | 728 scoped_ptr<UploadDataStream> stream( |
| 728 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 729 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 729 | 730 |
| 730 std::vector<char> expected_data(kTestData, kTestData + kTestDataSize); | 731 std::vector<char> expected_data(kTestData, kTestData + kTestDataSize); |
| 731 expected_data.insert(expected_data.end(), expected_data.begin(), | 732 expected_data.insert(expected_data.end(), |
| 733 expected_data.begin(), |
| 732 expected_data.begin() + kTestDataSize); | 734 expected_data.begin() + kTestDataSize); |
| 733 | 735 |
| 734 // Start Init. | 736 // Start Init. |
| 735 TestCompletionCallback init_callback1; | 737 TestCompletionCallback init_callback1; |
| 736 EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); | 738 EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); |
| 737 | 739 |
| 738 // Call Init again to cancel the previous init. | 740 // Call Init again to cancel the previous init. |
| 739 TestCompletionCallback init_callback2; | 741 TestCompletionCallback init_callback2; |
| 740 EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); | 742 EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); |
| 741 EXPECT_EQ(OK, init_callback2.WaitForResult()); | 743 EXPECT_EQ(OK, init_callback2.WaitForResult()); |
| 742 EXPECT_FALSE(stream->IsEOF()); | 744 EXPECT_FALSE(stream->IsEOF()); |
| 743 EXPECT_EQ(kTestDataSize*2, stream->size()); | 745 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 744 | 746 |
| 745 // Read. | 747 // Read. |
| 746 TestCompletionCallback read_callback2; | 748 TestCompletionCallback read_callback2; |
| 747 std::vector<char> buf2(kTestDataSize*2); | 749 std::vector<char> buf2(kTestDataSize * 2); |
| 748 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); | 750 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); |
| 749 EXPECT_EQ(ERR_IO_PENDING, | 751 EXPECT_EQ(ERR_IO_PENDING, |
| 750 stream->Read( | 752 stream->Read( |
| 751 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); | 753 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); |
| 752 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); | 754 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); |
| 753 EXPECT_EQ(expected_data, buf2); | 755 EXPECT_EQ(expected_data, buf2); |
| 754 EXPECT_TRUE(stream->IsEOF()); | 756 EXPECT_TRUE(stream->IsEOF()); |
| 755 | 757 |
| 756 // Make sure callbacks are not called for cancelled operations. | 758 // Make sure callbacks are not called for cancelled operations. |
| 757 EXPECT_FALSE(init_callback1.have_result()); | 759 EXPECT_FALSE(init_callback1.have_result()); |
| 758 } | 760 } |
| 759 | 761 |
| 760 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncRead) { | 762 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncRead) { |
| 761 base::FilePath temp_file_path; | 763 base::FilePath temp_file_path; |
| 762 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 764 ASSERT_TRUE( |
| 763 &temp_file_path)); | 765 base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file_path)); |
| 764 ASSERT_EQ(static_cast<int>(kTestDataSize), | 766 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 765 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 767 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 766 | 768 |
| 767 // Prepare data. | 769 // Prepare data. |
| 768 element_readers_.push_back(new UploadBytesElementReader( | 770 element_readers_.push_back( |
| 769 kTestData, kTestDataSize)); | 771 new UploadBytesElementReader(kTestData, kTestDataSize)); |
| 770 element_readers_.push_back( | 772 element_readers_.push_back( |
| 771 new UploadFileElementReader(base::MessageLoopProxy::current().get(), | 773 new UploadFileElementReader(base::MessageLoopProxy::current().get(), |
| 772 temp_file_path, | 774 temp_file_path, |
| 773 0, | 775 0, |
| 774 kuint64max, | 776 kuint64max, |
| 775 base::Time())); | 777 base::Time())); |
| 776 scoped_ptr<UploadDataStream> stream( | 778 scoped_ptr<UploadDataStream> stream( |
| 777 new ElementsUploadDataStream(element_readers_.Pass(), 0)); | 779 new ElementsUploadDataStream(element_readers_.Pass(), 0)); |
| 778 | 780 |
| 779 std::vector<char> expected_data(kTestData, kTestData + kTestDataSize); | 781 std::vector<char> expected_data(kTestData, kTestData + kTestDataSize); |
| 780 expected_data.insert(expected_data.end(), expected_data.begin(), | 782 expected_data.insert(expected_data.end(), |
| 783 expected_data.begin(), |
| 781 expected_data.begin() + kTestDataSize); | 784 expected_data.begin() + kTestDataSize); |
| 782 | 785 |
| 783 // Call Init(). | 786 // Call Init(). |
| 784 TestCompletionCallback init_callback1; | 787 TestCompletionCallback init_callback1; |
| 785 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); | 788 ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback())); |
| 786 EXPECT_EQ(OK, init_callback1.WaitForResult()); | 789 EXPECT_EQ(OK, init_callback1.WaitForResult()); |
| 787 EXPECT_FALSE(stream->IsEOF()); | 790 EXPECT_FALSE(stream->IsEOF()); |
| 788 EXPECT_EQ(kTestDataSize*2, stream->size()); | 791 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 789 | 792 |
| 790 // Start reading. | 793 // Start reading. |
| 791 TestCompletionCallback read_callback1; | 794 TestCompletionCallback read_callback1; |
| 792 std::vector<char> buf(kTestDataSize*2); | 795 std::vector<char> buf(kTestDataSize * 2); |
| 793 scoped_refptr<IOBuffer> wrapped_buffer = new WrappedIOBuffer(&buf[0]); | 796 scoped_refptr<IOBuffer> wrapped_buffer = new WrappedIOBuffer(&buf[0]); |
| 794 EXPECT_EQ( | 797 EXPECT_EQ(ERR_IO_PENDING, |
| 795 ERR_IO_PENDING, | 798 stream->Read( |
| 796 stream->Read(wrapped_buffer.get(), buf.size(), | 799 wrapped_buffer.get(), buf.size(), read_callback1.callback())); |
| 797 read_callback1.callback())); | |
| 798 | 800 |
| 799 // Call Init to cancel the previous read. | 801 // Call Init to cancel the previous read. |
| 800 TestCompletionCallback init_callback2; | 802 TestCompletionCallback init_callback2; |
| 801 EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); | 803 EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback())); |
| 802 EXPECT_EQ(OK, init_callback2.WaitForResult()); | 804 EXPECT_EQ(OK, init_callback2.WaitForResult()); |
| 803 EXPECT_FALSE(stream->IsEOF()); | 805 EXPECT_FALSE(stream->IsEOF()); |
| 804 EXPECT_EQ(kTestDataSize*2, stream->size()); | 806 EXPECT_EQ(kTestDataSize * 2, stream->size()); |
| 805 | 807 |
| 806 // Read. | 808 // Read. |
| 807 TestCompletionCallback read_callback2; | 809 TestCompletionCallback read_callback2; |
| 808 std::vector<char> buf2(kTestDataSize*2); | 810 std::vector<char> buf2(kTestDataSize * 2); |
| 809 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); | 811 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); |
| 810 EXPECT_EQ(ERR_IO_PENDING, | 812 EXPECT_EQ(ERR_IO_PENDING, |
| 811 stream->Read( | 813 stream->Read( |
| 812 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); | 814 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); |
| 813 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); | 815 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); |
| 814 EXPECT_EQ(expected_data, buf2); | 816 EXPECT_EQ(expected_data, buf2); |
| 815 EXPECT_TRUE(stream->IsEOF()); | 817 EXPECT_TRUE(stream->IsEOF()); |
| 816 | 818 |
| 817 // Make sure callbacks are not called for cancelled operations. | 819 // Make sure callbacks are not called for cancelled operations. |
| 818 EXPECT_FALSE(read_callback1.have_result()); | 820 EXPECT_FALSE(read_callback1.have_result()); |
| 819 } | 821 } |
| 820 | 822 |
| 821 } // namespace net | 823 } // namespace net |
| OLD | NEW |