| Index: net/base/elements_upload_data_stream_unittest.cc
|
| diff --git a/net/base/elements_upload_data_stream_unittest.cc b/net/base/elements_upload_data_stream_unittest.cc
|
| deleted file mode 100644
|
| index e2a431cd79a24d770576b9065fbeaa04b56ee050..0000000000000000000000000000000000000000
|
| --- a/net/base/elements_upload_data_stream_unittest.cc
|
| +++ /dev/null
|
| @@ -1,821 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/base/elements_upload_data_stream.h"
|
| -
|
| -#include <algorithm>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/bind.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/time/time.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/test_completion_callback.h"
|
| -#include "net/base/upload_bytes_element_reader.h"
|
| -#include "net/base/upload_data_stream.h"
|
| -#include "net/base/upload_file_element_reader.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "testing/platform_test.h"
|
| -
|
| -using ::testing::DoAll;
|
| -using ::testing::Invoke;
|
| -using ::testing::Return;
|
| -using ::testing::_;
|
| -
|
| -namespace net {
|
| -
|
| -namespace {
|
| -
|
| -const char kTestData[] = "0123456789";
|
| -const size_t kTestDataSize = arraysize(kTestData) - 1;
|
| -const size_t kTestBufferSize = 1 << 14; // 16KB.
|
| -
|
| -// Reads data from the upload data stream, and returns the data as string.
|
| -std::string ReadFromUploadDataStream(UploadDataStream* stream) {
|
| - std::string data_read;
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - while (!stream->IsEOF()) {
|
| - TestCompletionCallback callback;
|
| - const int result =
|
| - stream->Read(buf.get(), kTestBufferSize, callback.callback());
|
| - const int bytes_read =
|
| - result != ERR_IO_PENDING ? result : callback.WaitForResult();
|
| - data_read.append(buf->data(), bytes_read);
|
| - }
|
| - return data_read;
|
| -}
|
| -
|
| -// A mock class of UploadElementReader.
|
| -class MockUploadElementReader : public UploadElementReader {
|
| - public:
|
| - MockUploadElementReader(int content_length, bool is_in_memory)
|
| - : content_length_(content_length),
|
| - bytes_remaining_(content_length),
|
| - is_in_memory_(is_in_memory),
|
| - init_result_(OK),
|
| - read_result_(OK) {}
|
| -
|
| - virtual ~MockUploadElementReader() {}
|
| -
|
| - // UploadElementReader overrides.
|
| - MOCK_METHOD1(Init, int(const CompletionCallback& callback));
|
| - virtual uint64 GetContentLength() const override { return content_length_; }
|
| - virtual uint64 BytesRemaining() const override { return bytes_remaining_; }
|
| - virtual bool IsInMemory() const override { return is_in_memory_; }
|
| - MOCK_METHOD3(Read, int(IOBuffer* buf,
|
| - int buf_length,
|
| - const CompletionCallback& callback));
|
| -
|
| - // Sets expectation to return the specified result from Init() asynchronously.
|
| - void SetAsyncInitExpectation(int result) {
|
| - init_result_ = result;
|
| - EXPECT_CALL(*this, Init(_))
|
| - .WillOnce(DoAll(Invoke(this, &MockUploadElementReader::OnInit),
|
| - Return(ERR_IO_PENDING)));
|
| - }
|
| -
|
| - // Sets expectation to return the specified result from Read().
|
| - void SetReadExpectation(int result) {
|
| - read_result_ = result;
|
| - EXPECT_CALL(*this, Read(_, _, _))
|
| - .WillOnce(Invoke(this, &MockUploadElementReader::OnRead));
|
| - }
|
| -
|
| - private:
|
| - void OnInit(const CompletionCallback& callback) {
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, init_result_));
|
| - }
|
| -
|
| - int OnRead(IOBuffer* buf,
|
| - int buf_length,
|
| - const CompletionCallback& callback) {
|
| - if (read_result_ > 0)
|
| - bytes_remaining_ = std::max(0, bytes_remaining_ - read_result_);
|
| - if (IsInMemory()) {
|
| - return read_result_;
|
| - } else {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE, base::Bind(callback, read_result_));
|
| - return ERR_IO_PENDING;
|
| - }
|
| - }
|
| -
|
| - int content_length_;
|
| - int bytes_remaining_;
|
| - bool is_in_memory_;
|
| -
|
| - // Result value returned from Init().
|
| - int init_result_;
|
| -
|
| - // Result value returned from Read().
|
| - int read_result_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class ElementsUploadDataStreamTest : public PlatformTest {
|
| - public:
|
| - void SetUp() override {
|
| - PlatformTest::SetUp();
|
| - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
| - }
|
| - ~ElementsUploadDataStreamTest() override {
|
| - element_readers_.clear();
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| -
|
| - void FileChangedHelper(const base::FilePath& file_path,
|
| - const base::Time& time,
|
| - bool error_expected);
|
| -
|
| - base::ScopedTempDir temp_dir_;
|
| - ScopedVector<UploadElementReader> element_readers_;
|
| -};
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, EmptyUploadData) {
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| - ASSERT_EQ(OK, stream->Init(CompletionCallback()));
|
| - EXPECT_TRUE(stream->IsInMemory());
|
| - EXPECT_EQ(0U, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, ConsumeAllBytes) {
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| - ASSERT_EQ(OK, stream->Init(CompletionCallback()));
|
| - EXPECT_TRUE(stream->IsInMemory());
|
| - EXPECT_EQ(kTestDataSize, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - while (!stream->IsEOF()) {
|
| - int bytes_read =
|
| - stream->Read(buf.get(), kTestBufferSize, CompletionCallback());
|
| - ASSERT_LE(0, bytes_read); // Not an error.
|
| - }
|
| - EXPECT_EQ(kTestDataSize, stream->position());
|
| - ASSERT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, File) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| -
|
| - TestCompletionCallback init_callback;
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback()));
|
| - ASSERT_EQ(OK, init_callback.WaitForResult());
|
| - EXPECT_FALSE(stream->IsInMemory());
|
| - EXPECT_EQ(kTestDataSize, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - while (!stream->IsEOF()) {
|
| - TestCompletionCallback read_callback;
|
| - ASSERT_EQ(
|
| - ERR_IO_PENDING,
|
| - stream->Read(buf.get(), kTestBufferSize, read_callback.callback()));
|
| - ASSERT_LE(0, read_callback.WaitForResult()); // Not an error.
|
| - }
|
| - EXPECT_EQ(kTestDataSize, stream->position());
|
| - ASSERT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| - const uint64 kFakeSize = kTestDataSize*2;
|
| -
|
| - UploadFileElementReader::ScopedOverridingContentLengthForTests
|
| - overriding_content_length(kFakeSize);
|
| -
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| -
|
| - TestCompletionCallback init_callback;
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback()));
|
| - ASSERT_EQ(OK, init_callback.WaitForResult());
|
| - EXPECT_FALSE(stream->IsInMemory());
|
| - EXPECT_EQ(kFakeSize, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - uint64 read_counter = 0;
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - while (!stream->IsEOF()) {
|
| - TestCompletionCallback read_callback;
|
| - ASSERT_EQ(
|
| - ERR_IO_PENDING,
|
| - stream->Read(buf.get(), kTestBufferSize, read_callback.callback()));
|
| - int bytes_read = read_callback.WaitForResult();
|
| - ASSERT_LE(0, bytes_read); // Not an error.
|
| - read_counter += bytes_read;
|
| - EXPECT_EQ(read_counter, stream->position());
|
| - }
|
| - // UpdateDataStream will pad out the file with 0 bytes so that the HTTP
|
| - // transaction doesn't hang. Therefore we expected the full size.
|
| - EXPECT_EQ(kFakeSize, read_counter);
|
| - EXPECT_EQ(read_counter, stream->position());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, ReadErrorSync) {
|
| - // This element cannot be read.
|
| - MockUploadElementReader* reader =
|
| - new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| - reader->SetReadExpectation(ERR_FAILED);
|
| - element_readers_.push_back(reader);
|
| -
|
| - // This element is ignored because of the error from the previous reader.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| -
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - // Run Init().
|
| - ASSERT_EQ(OK, stream->Init(CompletionCallback()));
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| -
|
| - // Prepare a buffer filled with non-zero data.
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - std::fill_n(buf->data(), kTestBufferSize, -1);
|
| -
|
| - // Read() results in success even when the reader returns error.
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize * 2),
|
| - stream->Read(buf.get(), kTestBufferSize, CompletionCallback()));
|
| - EXPECT_EQ(kTestDataSize * 2, stream->position());
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -
|
| - // The buffer is filled with zero.
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize*2),
|
| - std::count(buf->data(), buf->data() + kTestBufferSize, 0));
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, ReadErrorAsync) {
|
| - // This element cannot be read.
|
| - MockUploadElementReader* reader =
|
| - new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(OK);
|
| - reader->SetReadExpectation(ERR_FAILED);
|
| - element_readers_.push_back(reader);
|
| -
|
| - // This element is ignored because of the error from the previous reader.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| -
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - // Run Init().
|
| - TestCompletionCallback init_callback;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback()));
|
| - EXPECT_EQ(OK, init_callback.WaitForResult());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| -
|
| - // Prepare a buffer filled with non-zero data.
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - std::fill_n(buf->data(), kTestBufferSize, -1);
|
| -
|
| - // Read() results in success even when the reader returns error.
|
| - TestCompletionCallback read_callback;
|
| - ASSERT_EQ(ERR_IO_PENDING,
|
| - stream->Read(buf.get(), kTestBufferSize, read_callback.callback()));
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize * 2), read_callback.WaitForResult());
|
| - EXPECT_EQ(kTestDataSize*2, stream->position());
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -
|
| - // The buffer is filled with zero.
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize*2),
|
| - std::count(buf->data(), buf->data() + kTestBufferSize, 0));
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, FileAndBytes) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - const uint64 kFileRangeOffset = 1;
|
| - const uint64 kFileRangeLength = 4;
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - kFileRangeOffset,
|
| - kFileRangeLength,
|
| - base::Time()));
|
| -
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| -
|
| - const uint64 kStreamSize = kTestDataSize + kFileRangeLength;
|
| - TestCompletionCallback init_callback;
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback()));
|
| - ASSERT_EQ(OK, init_callback.WaitForResult());
|
| - EXPECT_FALSE(stream->IsInMemory());
|
| - EXPECT_EQ(kStreamSize, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| - while (!stream->IsEOF()) {
|
| - TestCompletionCallback read_callback;
|
| - const int result =
|
| - stream->Read(buf.get(), kTestBufferSize, read_callback.callback());
|
| - const int bytes_read =
|
| - result != ERR_IO_PENDING ? result : read_callback.WaitForResult();
|
| - ASSERT_LE(0, bytes_read); // Not an error.
|
| - }
|
| - EXPECT_EQ(kStreamSize, stream->position());
|
| - ASSERT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -// Init() with on-memory and not-on-memory readers.
|
| -TEST_F(ElementsUploadDataStreamTest, InitAsync) {
|
| - // Create UploadDataStream with mock readers.
|
| - MockUploadElementReader* reader = NULL;
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(OK);
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(OK);
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| - element_readers_.push_back(reader);
|
| -
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - // Run Init().
|
| - TestCompletionCallback callback;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(callback.callback()));
|
| - EXPECT_EQ(OK, callback.WaitForResult());
|
| -}
|
| -
|
| -// Init() of a reader fails asynchronously.
|
| -TEST_F(ElementsUploadDataStreamTest, InitAsyncFailureAsync) {
|
| - // Create UploadDataStream with a mock reader.
|
| - MockUploadElementReader* reader = NULL;
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(ERR_FAILED);
|
| - element_readers_.push_back(reader);
|
| -
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - // Run Init().
|
| - TestCompletionCallback callback;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(callback.callback()));
|
| - EXPECT_EQ(ERR_FAILED, callback.WaitForResult());
|
| -}
|
| -
|
| -// Init() of a reader fails synchronously.
|
| -TEST_F(ElementsUploadDataStreamTest, InitAsyncFailureSync) {
|
| - // Create UploadDataStream with mock readers.
|
| - MockUploadElementReader* reader = NULL;
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(OK);
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED));
|
| - element_readers_.push_back(reader);
|
| -
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - // Run Init().
|
| - TestCompletionCallback callback;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(callback.callback()));
|
| - EXPECT_EQ(ERR_FAILED, callback.WaitForResult());
|
| -}
|
| -
|
| -// Read with a buffer whose size is same as the data.
|
| -TEST_F(ElementsUploadDataStreamTest, ReadAsyncWithExactSizeBuffer) {
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - ASSERT_EQ(OK, stream->Init(CompletionCallback()));
|
| - EXPECT_TRUE(stream->IsInMemory());
|
| - EXPECT_EQ(kTestDataSize, stream->size());
|
| - EXPECT_EQ(0U, stream->position());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestDataSize);
|
| - int bytes_read = stream->Read(buf.get(), kTestDataSize, CompletionCallback());
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize), bytes_read); // Not an error.
|
| - EXPECT_EQ(kTestDataSize, stream->position());
|
| - ASSERT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -// Async Read() with on-memory and not-on-memory readers.
|
| -TEST_F(ElementsUploadDataStreamTest, ReadAsync) {
|
| - // Create UploadDataStream with mock readers.
|
| - MockUploadElementReader* reader = NULL;
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| - reader->SetReadExpectation(kTestDataSize);
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(OK);
|
| - reader->SetReadExpectation(kTestDataSize);
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, true);
|
| - EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| - reader->SetReadExpectation(kTestDataSize);
|
| - element_readers_.push_back(reader);
|
| -
|
| - reader = new MockUploadElementReader(kTestDataSize, false);
|
| - reader->SetAsyncInitExpectation(OK);
|
| - reader->SetReadExpectation(kTestDataSize);
|
| - element_readers_.push_back(reader);
|
| -
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - // Run Init().
|
| - TestCompletionCallback init_callback;
|
| - EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback()));
|
| - EXPECT_EQ(OK, init_callback.WaitForResult());
|
| -
|
| - scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize);
|
| -
|
| - // Consume the first element.
|
| - TestCompletionCallback read_callback1;
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize),
|
| - stream->Read(buf.get(), kTestDataSize, read_callback1.callback()));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_FALSE(read_callback1.have_result());
|
| -
|
| - // Consume the second element.
|
| - TestCompletionCallback read_callback2;
|
| - ASSERT_EQ(ERR_IO_PENDING,
|
| - stream->Read(buf.get(), kTestDataSize, read_callback2.callback()));
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize), read_callback2.WaitForResult());
|
| -
|
| - // Consume the third and the fourth elements.
|
| - TestCompletionCallback read_callback3;
|
| - ASSERT_EQ(
|
| - ERR_IO_PENDING,
|
| - stream->Read(buf.get(), kTestDataSize * 2, read_callback3.callback()));
|
| - EXPECT_EQ(static_cast<int>(kTestDataSize * 2),
|
| - read_callback3.WaitForResult());
|
| -}
|
| -
|
| -void ElementsUploadDataStreamTest::FileChangedHelper(
|
| - const base::FilePath& file_path,
|
| - const base::Time& time,
|
| - bool error_expected) {
|
| - // Don't use element_readers_ here, as this function is called twice, and
|
| - // reusing element_readers_ is wrong.
|
| - ScopedVector<UploadElementReader> element_readers;
|
| - element_readers.push_back(new UploadFileElementReader(
|
| - base::MessageLoopProxy::current().get(), file_path, 1, 2, time));
|
| -
|
| - TestCompletionCallback init_callback;
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers.Pass(), 0));
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback.callback()));
|
| - int error_code = init_callback.WaitForResult();
|
| - if (error_expected)
|
| - ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code);
|
| - else
|
| - ASSERT_EQ(OK, error_code);
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, FileChanged) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - base::File::Info file_info;
|
| - ASSERT_TRUE(base::GetFileInfo(temp_file_path, &file_info));
|
| -
|
| - // Test file not changed.
|
| - FileChangedHelper(temp_file_path, file_info.last_modified, false);
|
| -
|
| - // Test file changed.
|
| - FileChangedHelper(temp_file_path,
|
| - file_info.last_modified - base::TimeDelta::FromSeconds(1),
|
| - true);
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, MultipleInit) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - // Prepare data.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - std::string expected_data(kTestData, kTestData + kTestDataSize);
|
| - expected_data += expected_data;
|
| -
|
| - // Call Init().
|
| - TestCompletionCallback init_callback1;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback()));
|
| - ASSERT_EQ(OK, init_callback1.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read.
|
| - EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get()));
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -
|
| - // Call Init() again to reset.
|
| - TestCompletionCallback init_callback2;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback()));
|
| - ASSERT_EQ(OK, init_callback2.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read again.
|
| - EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get()));
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, MultipleInitAsync) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| - TestCompletionCallback test_callback;
|
| -
|
| - // Prepare data.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - std::string expected_data(kTestData, kTestData + kTestDataSize);
|
| - expected_data += expected_data;
|
| -
|
| - // Call Init().
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(test_callback.callback()));
|
| - EXPECT_EQ(OK, test_callback.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read.
|
| - EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get()));
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -
|
| - // Call Init() again to reset.
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(test_callback.callback()));
|
| - EXPECT_EQ(OK, test_callback.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read again.
|
| - EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get()));
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, InitToReset) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - // Prepare data.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - std::vector<char> expected_data(kTestData, kTestData + kTestDataSize);
|
| - expected_data.insert(expected_data.end(), kTestData,
|
| - kTestData + kTestDataSize);
|
| -
|
| - // Call Init().
|
| - TestCompletionCallback init_callback1;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback()));
|
| - EXPECT_EQ(OK, init_callback1.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read some.
|
| - TestCompletionCallback read_callback1;
|
| - std::vector<char> buf(kTestDataSize + kTestDataSize/2);
|
| - scoped_refptr<IOBuffer> wrapped_buffer = new WrappedIOBuffer(&buf[0]);
|
| - EXPECT_EQ(
|
| - ERR_IO_PENDING,
|
| - stream->Read(wrapped_buffer.get(), buf.size(),
|
| - read_callback1.callback()));
|
| - EXPECT_EQ(static_cast<int>(buf.size()), read_callback1.WaitForResult());
|
| - EXPECT_EQ(buf.size(), stream->position());
|
| -
|
| - // Call Init to reset the state.
|
| - TestCompletionCallback init_callback2;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback()));
|
| - EXPECT_EQ(OK, init_callback2.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read.
|
| - TestCompletionCallback read_callback2;
|
| - std::vector<char> buf2(kTestDataSize*2);
|
| - scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - stream->Read(
|
| - wrapped_buffer2.get(), buf2.size(), read_callback2.callback()));
|
| - EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult());
|
| - EXPECT_EQ(expected_data, buf2);
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncInit) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - // Prepare data.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - std::vector<char> expected_data(kTestData, kTestData + kTestDataSize);
|
| - expected_data.insert(expected_data.end(), kTestData,
|
| - kTestData + kTestDataSize);
|
| -
|
| - // Start Init.
|
| - TestCompletionCallback init_callback1;
|
| - EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback()));
|
| -
|
| - // Call Init again to cancel the previous init.
|
| - TestCompletionCallback init_callback2;
|
| - EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback()));
|
| - EXPECT_EQ(OK, init_callback2.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read.
|
| - TestCompletionCallback read_callback2;
|
| - std::vector<char> buf2(kTestDataSize*2);
|
| - scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - stream->Read(
|
| - wrapped_buffer2.get(), buf2.size(), read_callback2.callback()));
|
| - EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult());
|
| - EXPECT_EQ(expected_data, buf2);
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -
|
| - // Make sure callbacks are not called for cancelled operations.
|
| - EXPECT_FALSE(init_callback1.have_result());
|
| -}
|
| -
|
| -TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncRead) {
|
| - base::FilePath temp_file_path;
|
| - ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
|
| - &temp_file_path));
|
| - ASSERT_EQ(static_cast<int>(kTestDataSize),
|
| - base::WriteFile(temp_file_path, kTestData, kTestDataSize));
|
| -
|
| - // Prepare data.
|
| - element_readers_.push_back(new UploadBytesElementReader(
|
| - kTestData, kTestDataSize));
|
| - element_readers_.push_back(
|
| - new UploadFileElementReader(base::MessageLoopProxy::current().get(),
|
| - temp_file_path,
|
| - 0,
|
| - kuint64max,
|
| - base::Time()));
|
| - scoped_ptr<UploadDataStream> stream(
|
| - new ElementsUploadDataStream(element_readers_.Pass(), 0));
|
| -
|
| - std::vector<char> expected_data(kTestData, kTestData + kTestDataSize);
|
| - expected_data.insert(expected_data.end(), kTestData,
|
| - kTestData + kTestDataSize);
|
| -
|
| - // Call Init().
|
| - TestCompletionCallback init_callback1;
|
| - ASSERT_EQ(ERR_IO_PENDING, stream->Init(init_callback1.callback()));
|
| - EXPECT_EQ(OK, init_callback1.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Start reading.
|
| - TestCompletionCallback read_callback1;
|
| - std::vector<char> buf(kTestDataSize*2);
|
| - scoped_refptr<IOBuffer> wrapped_buffer = new WrappedIOBuffer(&buf[0]);
|
| - EXPECT_EQ(
|
| - ERR_IO_PENDING,
|
| - stream->Read(wrapped_buffer.get(), buf.size(),
|
| - read_callback1.callback()));
|
| -
|
| - // Call Init to cancel the previous read.
|
| - TestCompletionCallback init_callback2;
|
| - EXPECT_EQ(ERR_IO_PENDING, stream->Init(init_callback2.callback()));
|
| - EXPECT_EQ(OK, init_callback2.WaitForResult());
|
| - EXPECT_FALSE(stream->IsEOF());
|
| - EXPECT_EQ(kTestDataSize*2, stream->size());
|
| -
|
| - // Read.
|
| - TestCompletionCallback read_callback2;
|
| - std::vector<char> buf2(kTestDataSize*2);
|
| - scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]);
|
| - EXPECT_EQ(ERR_IO_PENDING,
|
| - stream->Read(
|
| - wrapped_buffer2.get(), buf2.size(), read_callback2.callback()));
|
| - EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult());
|
| - EXPECT_EQ(expected_data, buf2);
|
| - EXPECT_TRUE(stream->IsEOF());
|
| -
|
| - // Make sure callbacks are not called for cancelled operations.
|
| - EXPECT_FALSE(read_callback1.have_result());
|
| -}
|
| -
|
| -} // namespace net
|
|
|