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 33d035e43d15d2ec69c604e4cb1306eb7d4b70b6..d2d0512036091631ea17dc32768ffb69e75f5fe5 100644 |
| --- a/net/base/upload_data_stream_unittest.cc |
| +++ b/net/base/upload_data_stream_unittest.cc |
| @@ -4,6 +4,7 @@ |
| #include "net/base/upload_data_stream.h" |
| +#include <algorithm> |
| #include <vector> |
| #include "base/basictypes.h" |
| @@ -39,7 +40,7 @@ std::string ReadFromUploadDataStream(UploadDataStream* stream) { |
| std::string data_read; |
| scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| while (!stream->IsEOF()) { |
| - const int bytes_read = stream->Read(buf, kTestBufferSize); |
| + const int bytes_read = stream->ReadSync(buf, kTestBufferSize); |
| data_read.append(buf->data(), bytes_read); |
| } |
| return data_read; |
| @@ -48,14 +49,22 @@ std::string ReadFromUploadDataStream(UploadDataStream* stream) { |
| // A mock class of UploadElementReader. |
| class MockUploadElementReader : public UploadElementReader { |
| public: |
| - MockUploadElementReader() : init_result_(OK) {} |
| + 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() {} |
| MOCK_METHOD1(Init, int(const CompletionCallback& callback)); |
|
mmenke
2012/10/16 19:13:41
nit: Should have a comment "UploadElementReader i
hashimoto
2012/10/17 08:04:31
Done.
|
| - MOCK_CONST_METHOD0(GetContentLength, uint64()); |
| - MOCK_CONST_METHOD0(BytesRemaining, uint64()); |
| - MOCK_CONST_METHOD0(IsInMemory, bool()); |
| - MOCK_METHOD2(ReadSync, int(char* buf, int buf_length)); |
| + uint64 GetContentLength() const OVERRIDE { return content_length_; } |
| + uint64 BytesRemaining() const OVERRIDE { return bytes_remaining_; } |
| + bool IsInMemory() const OVERRIDE { return is_in_memory_; } |
|
mmenke
2012/10/16 19:13:41
These 3 should be virtual
hashimoto
2012/10/17 08:04:31
Done.
|
| + 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) { |
| @@ -65,14 +74,41 @@ class MockUploadElementReader : public UploadElementReader { |
| Return(ERR_IO_PENDING))); |
| } |
| + // Sets expectation to return the specified result from Read(). |
| + void SetReadExpectation(int result) { |
|
mmenke
2012/10/16 19:13:41
Shouldn't this be SetAsyncReadExpectation?
hashimoto
2012/10/17 08:04:31
This method is used to set expectations for both s
|
| + read_result_ = result; |
| + EXPECT_CALL(*this, Read(_, _, _)) |
| + .WillOnce(Invoke(this, &MockUploadElementReader::OnRead)); |
| + } |
| + |
| private: |
| void OnInit(const CompletionCallback& callback) { |
| MessageLoop::current()->PostTask(FROM_HERE, |
| base::Bind(callback, init_result_)); |
| } |
| + int OnRead(IOBuffer* buf, |
| + int buf_length, |
| + const CompletionCallback& callback) { |
| + bytes_remaining_ = std::max(0, bytes_remaining_ - read_result_); |
| + if (IsInMemory()) { |
| + return read_result_; |
| + } else { |
| + 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_; |
| }; |
| // A mock CompletionCallback. |
| @@ -120,7 +156,7 @@ TEST_F(UploadDataStreamTest, ConsumeAllBytes) { |
| EXPECT_FALSE(stream->IsEOF()); |
| scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| while (!stream->IsEOF()) { |
| - int bytes_read = stream->Read(buf, kTestBufferSize); |
| + int bytes_read = stream->ReadSync(buf, kTestBufferSize); |
| ASSERT_LE(0, bytes_read); // Not an error. |
| } |
| EXPECT_EQ(kTestDataSize, stream->position()); |
| @@ -148,7 +184,7 @@ TEST_F(UploadDataStreamTest, File) { |
| EXPECT_FALSE(stream->IsEOF()); |
| scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| while (!stream->IsEOF()) { |
| - int bytes_read = stream->Read(buf, kTestBufferSize); |
| + int bytes_read = stream->ReadSync(buf, kTestBufferSize); |
| ASSERT_LE(0, bytes_read); // Not an error. |
| } |
| EXPECT_EQ(kTestDataSize, stream->position()); |
| @@ -182,7 +218,7 @@ TEST_F(UploadDataStreamTest, FileSmallerThanLength) { |
| uint64 read_counter = 0; |
| scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| while (!stream->IsEOF()) { |
| - int bytes_read = stream->Read(buf, kTestBufferSize); |
| + int bytes_read = stream->ReadSync(buf, kTestBufferSize); |
| ASSERT_LE(0, bytes_read); // Not an error. |
| read_counter += bytes_read; |
| EXPECT_EQ(read_counter, stream->position()); |
| @@ -218,7 +254,7 @@ TEST_F(UploadDataStreamTest, FileAndBytes) { |
| EXPECT_FALSE(stream->IsEOF()); |
| scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| while (!stream->IsEOF()) { |
| - int bytes_read = stream->Read(buf, kTestBufferSize); |
| + int bytes_read = stream->ReadSync(buf, kTestBufferSize); |
| ASSERT_LE(0, bytes_read); // Not an error. |
| } |
| EXPECT_EQ(kStreamSize, stream->position()); |
| @@ -242,7 +278,7 @@ TEST_F(UploadDataStreamTest, Chunk) { |
| EXPECT_FALSE(stream->IsEOF()); |
| scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| while (!stream->IsEOF()) { |
| - int bytes_read = stream->Read(buf, kTestBufferSize); |
| + int bytes_read = stream->ReadSync(buf, kTestBufferSize); |
| ASSERT_LE(0, bytes_read); // Not an error. |
| } |
| EXPECT_EQ(kStreamSize, stream->position()); |
| @@ -257,34 +293,24 @@ TEST_F(UploadDataStreamTest, InitAsync) { |
| // Set mock readers to the stream. |
| MockUploadElementReader* reader = NULL; |
| - reader = new MockUploadElementReader; |
| + reader = new MockUploadElementReader(kTestDataSize, true); |
| 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 = new MockUploadElementReader(kTestDataSize, true); |
| 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 = new MockUploadElementReader(kTestDataSize, false); |
| 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 = new MockUploadElementReader(kTestDataSize, false); |
| 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 = new MockUploadElementReader(kTestDataSize, true); |
| 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(). |
| @@ -302,9 +328,8 @@ TEST_F(UploadDataStreamTest, InitAsyncFailureAsync) { |
| // Set a mock reader to the stream. |
| MockUploadElementReader* reader = NULL; |
| - reader = new MockUploadElementReader; |
| + reader = new MockUploadElementReader(kTestDataSize, false); |
| reader->SetAsyncInitExpectation(ERR_FAILED); |
| - EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false)); |
| stream.element_readers_.push_back(reader); |
| // Run Init(). |
| @@ -322,14 +347,12 @@ TEST_F(UploadDataStreamTest, InitAsyncFailureSync) { |
| // Set mock readers to the stream. |
| MockUploadElementReader* reader = NULL; |
| - reader = new MockUploadElementReader; |
| + reader = new MockUploadElementReader(kTestDataSize, false); |
| reader->SetAsyncInitExpectation(OK); |
| - EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(false)); |
| stream.element_readers_.push_back(reader); |
| - reader = new MockUploadElementReader; |
| + reader = new MockUploadElementReader(kTestDataSize, true); |
| EXPECT_CALL(*reader, Init(_)).WillOnce(Return(ERR_FAILED)); |
| - EXPECT_CALL(*reader, IsInMemory()).WillRepeatedly(Return(true)); |
| stream.element_readers_.push_back(reader); |
| // Run Init(). |
| @@ -339,6 +362,83 @@ TEST_F(UploadDataStreamTest, InitAsyncFailureSync) { |
| MessageLoop::current()->RunAllPending(); |
| } |
| +// Read() with on-memory and not-on-memory readers. |
|
mmenke
2012/10/16 19:13:41
Async Read()?
hashimoto
2012/10/17 08:04:31
Done.
|
| +TEST_F(UploadDataStreamTest, ReadAsync) { |
| + // Create stream without element readers. |
| + UploadDataStream stream(upload_data_); |
| + |
| + // Set mock readers to the stream. |
| + MockUploadElementReader* reader = NULL; |
| + |
| + reader = new MockUploadElementReader(kTestDataSize, true); |
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); |
| + reader->SetReadExpectation(kTestDataSize); |
| + stream.element_readers_.push_back(reader); |
| + |
| + reader = new MockUploadElementReader(kTestDataSize, false); |
| + reader->SetAsyncInitExpectation(OK); |
| + reader->SetReadExpectation(kTestDataSize); |
| + stream.element_readers_.push_back(reader); |
| + |
| + reader = new MockUploadElementReader(kTestDataSize, true); |
| + EXPECT_CALL(*reader, Init(_)).WillOnce(Return(OK)); |
| + reader->SetReadExpectation(kTestDataSize); |
| + stream.element_readers_.push_back(reader); |
| + |
| + reader = new MockUploadElementReader(kTestDataSize, false); |
| + reader->SetAsyncInitExpectation(OK); |
| + reader->SetReadExpectation(kTestDataSize); |
| + stream.element_readers_.push_back(reader); |
| + |
| + // Run Init(). |
| + MockCompletionCallback mock_callback; |
| + EXPECT_CALL(mock_callback, Run(OK)).Times(1); |
| + EXPECT_EQ(ERR_IO_PENDING, stream.Init(mock_callback.CreateCallback())); |
| + MessageLoop::current()->RunAllPending(); |
| + |
| + scoped_refptr<IOBuffer> buf = new IOBuffer(kTestBufferSize); |
| + |
| + // Consume the first element. |
| + EXPECT_CALL(mock_callback, Run(kTestDataSize)).Times(0); |
| + EXPECT_EQ(static_cast<int>(kTestDataSize), |
| + stream.Read(buf, kTestDataSize, mock_callback.CreateCallback())); |
| + MessageLoop::current()->RunAllPending(); |
| + |
| + // Consume the second element. |
| + EXPECT_CALL(mock_callback, Run(kTestDataSize)).Times(1); |
| + EXPECT_EQ(ERR_IO_PENDING, |
| + stream.Read(buf, kTestDataSize, mock_callback.CreateCallback())); |
| + MessageLoop::current()->RunAllPending(); |
| + |
| + // Consume the third and the fourth elements. |
| + EXPECT_CALL(mock_callback, Run(kTestDataSize*2)).Times(1); |
| + EXPECT_EQ(ERR_IO_PENDING, |
| + stream.Read(buf, kTestDataSize*2, mock_callback.CreateCallback())); |
| + MessageLoop::current()->RunAllPending(); |
| +} |
| + |
| +// Read with a buffer whose size is same as the data. |
|
mmenke
2012/10/16 19:13:41
Suggest you put this above the previous test, sinc
hashimoto
2012/10/17 08:04:31
Done.
|
| +TEST_F(UploadDataStreamTest, ReadAsyncWithExactSizeBuffer) { |
| + upload_data_->AppendBytes(kTestData, kTestDataSize); |
| + scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
|
mmenke
2012/10/16 19:13:41
It seems completely random to me which tests store
hashimoto
2012/10/17 08:04:31
Done.
|
| + |
| + MockCompletionCallback mock_callback; |
| + EXPECT_CALL(mock_callback, Run(_)).Times(0); |
| + |
| + ASSERT_EQ(OK, stream->Init(mock_callback.CreateCallback())); |
| + EXPECT_TRUE(stream->IsInMemory()); |
| + ASSERT_TRUE(stream.get()); |
|
mmenke
2012/10/16 19:13:41
Erm...How can this fail? You created one in the s
hashimoto
2012/10/17 08:04:31
Removed.
|
| + 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, kTestDataSize, |
| + mock_callback.CreateCallback()); |
| + ASSERT_EQ(static_cast<int>(kTestDataSize), bytes_read); // Not an error. |
| + EXPECT_EQ(kTestDataSize, stream->position()); |
| + ASSERT_TRUE(stream->IsEOF()); |
| +} |
| + |
| void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path, |
| const base::Time& time, |
| bool error_expected) { |