Chromium Code Reviews| 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..e5abe78dcaa2188cb09ca1c19d8f11d585ea9fd6 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. |
| + scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
|
willchan no longer on Chromium
2012/09/12 21:09:50
Does this need to be allocated on heap? How about:
hashimoto
2012/09/12 21:48:18
Done.
|
| + |
| + // Set mock readers to the stream. |
| + scoped_ptr<MockUploadElementReader> reader; |
|
willchan no longer on Chromium
2012/09/12 21:09:50
Why do you bother making this scoped, since you al
hashimoto
2012/09/12 21:48:18
I thought using scoped_ptr is always safer than ra
|
| + |
| + reader.reset(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.release()); |
| + |
| + reader.reset(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.release()); |
| + |
| + reader.reset(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.release()); |
| + |
| + reader.reset(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.release()); |
| + |
| + reader.reset(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.release()); |
| + |
| + // 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. |
| + scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
| + |
| + // Set a mock reader to the stream. |
| + scoped_ptr<MockUploadElementReader> reader; |
| + |
| + reader.reset(new MockUploadElementReader); |
| + reader->SetAsyncInitExpectation(ERR_FAILED); |
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false)); |
| + stream->element_readers_.push_back(reader.release()); |
| + |
| + // 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. |
| + scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
| + |
| + // Set mock readers to the stream. |
| + scoped_ptr<MockUploadElementReader> reader; |
| + |
| + reader.reset(new MockUploadElementReader); |
| + reader->SetAsyncInitExpectation(OK); |
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false)); |
| + stream->element_readers_.push_back(reader.release()); |
| + |
| + reader.reset(new MockUploadElementReader); |
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED)); |
| + EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true)); |
| + stream->element_readers_.push_back(reader.release()); |
| + |
| + // 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)); |
| } |