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..a4f4d1ae0fb14bdea27fca1a282b759958fded53 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)); |
- 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_; } |
+ 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) { |
+ 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,61 @@ TEST_F(UploadDataStreamTest, InitAsyncFailureSync) { |
MessageLoop::current()->RunAllPending(); |
} |
+// Read() with on-memory and not-on-memory readers. |
+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, true); |
+ 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(1); |
+ EXPECT_EQ(ERR_IO_PENDING, |
+ 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(); |
+} |
+ |
void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path, |
const base::Time& time, |
bool error_expected) { |