| Index: net/base/upload_data_stream_unittest.cc
|
| diff --git a/net/base/upload_data_stream_unittest.cc b/net/base/upload_data_stream_unittest.cc
|
| index 8a8ec394a667b7d662dcc650c6dae18ac55dce86..33d035e43d15d2ec69c604e4cb1306eb7d4b70b6 100644
|
| --- a/net/base/upload_data_stream_unittest.cc
|
| +++ b/net/base/upload_data_stream_unittest.cc
|
| @@ -17,9 +17,15 @@
|
| #include "net/base/net_errors.h"
|
| #include "net/base/upload_data.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 {
|
| @@ -39,6 +45,46 @@ std::string ReadFromUploadDataStream(UploadDataStream* stream) {
|
| return data_read;
|
| }
|
|
|
| +// A mock class of UploadElementReader.
|
| +class MockUploadElementReader : public UploadElementReader {
|
| + public:
|
| + MockUploadElementReader() : init_result_(OK) {}
|
| + virtual ~MockUploadElementReader() {}
|
| +
|
| + MOCK_METHOD1(Init, int(const CompletionCallback& callback));
|
| + MOCK_CONST_METHOD0(GetContentLength, uint64());
|
| + MOCK_CONST_METHOD0(BytesRemaining, uint64());
|
| + MOCK_CONST_METHOD0(IsInMemory, bool());
|
| + MOCK_METHOD2(ReadSync, int(char* buf, int buf_length));
|
| +
|
| + // 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)));
|
| + }
|
| +
|
| + private:
|
| + void OnInit(const CompletionCallback& callback) {
|
| + MessageLoop::current()->PostTask(FROM_HERE,
|
| + base::Bind(callback, init_result_));
|
| + }
|
| +
|
| + // Result value returned from Init().
|
| + int init_result_;
|
| +};
|
| +
|
| +// A mock CompletionCallback.
|
| +class MockCompletionCallback {
|
| + public:
|
| + MOCK_METHOD1(Run, void(int result));
|
| +
|
| + CompletionCallback CreateCallback() {
|
| + return base::Bind(&MockCompletionCallback::Run, base::Unretained(this));
|
| + }
|
| +};
|
| +
|
| } // namespace
|
|
|
| class UploadDataStreamTest : public PlatformTest {
|
| @@ -55,7 +101,7 @@ class UploadDataStreamTest : public PlatformTest {
|
| TEST_F(UploadDataStreamTest, EmptyUploadData) {
|
| upload_data_->AppendBytes("", 0);
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
|
| - ASSERT_EQ(OK, stream->Init());
|
| + ASSERT_EQ(OK, stream->InitSync());
|
| EXPECT_TRUE(stream->IsInMemory());
|
| ASSERT_TRUE(stream.get());
|
| EXPECT_EQ(0U, stream->size());
|
| @@ -66,7 +112,7 @@ TEST_F(UploadDataStreamTest, EmptyUploadData) {
|
| TEST_F(UploadDataStreamTest, ConsumeAllBytes) {
|
| upload_data_->AppendBytes(kTestData, kTestDataSize);
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
|
| - ASSERT_EQ(OK, stream->Init());
|
| + ASSERT_EQ(OK, stream->InitSync());
|
| EXPECT_TRUE(stream->IsInMemory());
|
| ASSERT_TRUE(stream.get());
|
| EXPECT_EQ(kTestDataSize, stream->size());
|
| @@ -94,7 +140,7 @@ TEST_F(UploadDataStreamTest, File) {
|
| upload_data_->SetElements(elements);
|
|
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
|
| - ASSERT_EQ(OK, stream->Init());
|
| + ASSERT_EQ(OK, stream->InitSync());
|
| EXPECT_FALSE(stream->IsInMemory());
|
| ASSERT_TRUE(stream.get());
|
| EXPECT_EQ(kTestDataSize, stream->size());
|
| @@ -127,7 +173,7 @@ TEST_F(UploadDataStreamTest, FileSmallerThanLength) {
|
| upload_data_->SetElements(elements);
|
|
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
|
| - ASSERT_EQ(OK, stream->Init());
|
| + ASSERT_EQ(OK, stream->InitSync());
|
| EXPECT_FALSE(stream->IsInMemory());
|
| ASSERT_TRUE(stream.get());
|
| EXPECT_EQ(kFakeSize, stream->size());
|
| @@ -164,7 +210,7 @@ TEST_F(UploadDataStreamTest, FileAndBytes) {
|
|
|
| const uint64 kStreamSize = kTestDataSize + kFileRangeLength;
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
|
| - ASSERT_EQ(OK, stream->Init());
|
| + ASSERT_EQ(OK, stream->InitSync());
|
| EXPECT_FALSE(stream->IsInMemory());
|
| ASSERT_TRUE(stream.get());
|
| EXPECT_EQ(kStreamSize, stream->size());
|
| @@ -188,7 +234,7 @@ TEST_F(UploadDataStreamTest, Chunk) {
|
|
|
| const uint64 kStreamSize = kTestDataSize*2;
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_));
|
| - ASSERT_EQ(OK, stream->Init());
|
| + ASSERT_EQ(OK, stream->InitSync());
|
| EXPECT_FALSE(stream->IsInMemory());
|
| ASSERT_TRUE(stream.get());
|
| EXPECT_EQ(0U, stream->size()); // Content-Length is 0 for chunked data.
|
| @@ -203,6 +249,96 @@ TEST_F(UploadDataStreamTest, Chunk) {
|
| ASSERT_TRUE(stream->IsEOF());
|
| }
|
|
|
| +// Init() with on-memory and not-on-memory readers.
|
| +TEST_F(UploadDataStreamTest, InitAsync) {
|
| + // Create stream without element readers.
|
| + UploadDataStream stream(upload_data_);
|
| +
|
| + // Set mock readers to the stream.
|
| + MockUploadElementReader* reader = NULL;
|
| +
|
| + reader = new MockUploadElementReader;
|
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| + EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + reader = new MockUploadElementReader;
|
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| + EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + reader = new MockUploadElementReader;
|
| + reader->SetAsyncInitExpectation(OK);
|
| + EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + reader = new MockUploadElementReader;
|
| + reader->SetAsyncInitExpectation(OK);
|
| + EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + reader = new MockUploadElementReader;
|
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK));
|
| + EXPECT_CALL(*reader, GetContentLength()).WillRepeatedly(Return(0));
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + // Run Init().
|
| + MockCompletionCallback mock_callback;
|
| + EXPECT_CALL(mock_callback, Run(OK)).Times(1);
|
| + EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
|
| + MessageLoop::current()->RunAllPending();
|
| +}
|
| +
|
| +// Init() of a reader fails asynchronously.
|
| +TEST_F(UploadDataStreamTest, InitAsyncFailureAsync) {
|
| + // Create stream without element readers.
|
| + UploadDataStream stream(upload_data_);
|
| +
|
| + // Set a mock reader to the stream.
|
| + MockUploadElementReader* reader = NULL;
|
| +
|
| + reader = new MockUploadElementReader;
|
| + reader->SetAsyncInitExpectation(ERR_FAILED);
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + // Run Init().
|
| + MockCompletionCallback mock_callback;
|
| + EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1);
|
| + EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
|
| + MessageLoop::current()->RunAllPending();
|
| +}
|
| +
|
| +// Init() of a reader fails synchronously.
|
| +TEST_F(UploadDataStreamTest, InitAsyncFailureSync) {
|
| + // Create stream without element readers.
|
| + UploadDataStream stream(upload_data_);
|
| +
|
| + // Set mock readers to the stream.
|
| + MockUploadElementReader* reader = NULL;
|
| +
|
| + reader = new MockUploadElementReader;
|
| + reader->SetAsyncInitExpectation(OK);
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + reader = new MockUploadElementReader;
|
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED));
|
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true));
|
| + stream.element_readers_.push_back(reader);
|
| +
|
| + // Run Init().
|
| + MockCompletionCallback mock_callback;
|
| + EXPECT_CALL(mock_callback, Run(ERR_FAILED)).Times(1);
|
| + EXPECT_EQ(stream.Init(mock_callback.CreateCallback()), ERR_IO_PENDING);
|
| + MessageLoop::current()->RunAllPending();
|
| +}
|
| +
|
| void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path,
|
| const base::Time& time,
|
| bool error_expected) {
|
| @@ -216,7 +352,7 @@ void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path,
|
| upload_data->SetElements(elements);
|
|
|
| scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data));
|
| - int error_code = stream->Init();
|
| + int error_code = stream->InitSync();
|
| if (error_expected)
|
| ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code);
|
| else
|
| @@ -259,7 +395,7 @@ TEST_F(UploadDataStreamTest, UploadDataReused) {
|
| // Confirm that the file is read properly.
|
| {
|
| UploadDataStream stream(upload_data_);
|
| - ASSERT_EQ(OK, stream.Init());
|
| + ASSERT_EQ(OK, stream.InitSync());
|
| EXPECT_EQ(kTestDataSize, stream.size());
|
| EXPECT_EQ(kTestData, ReadFromUploadDataStream(&stream));
|
| }
|
| @@ -268,7 +404,7 @@ TEST_F(UploadDataStreamTest, UploadDataReused) {
|
| // file is read properly.
|
| {
|
| UploadDataStream stream(upload_data_);
|
| - ASSERT_EQ(OK, stream.Init());
|
| + ASSERT_EQ(OK, stream.InitSync());
|
| EXPECT_EQ(kTestDataSize, stream.size());
|
| EXPECT_EQ(kTestData, ReadFromUploadDataStream(&stream));
|
| }
|
|
|