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..57a34ca5cfb60aef257e9ec1f7fff56f7761040e 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,23 @@ 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() {} |
+ // UploadElementReader overrides. |
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)); |
+ 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) { |
@@ -65,14 +75,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. |
@@ -100,31 +137,29 @@ class UploadDataStreamTest : public PlatformTest { |
TEST_F(UploadDataStreamTest, EmptyUploadData) { |
upload_data_->AppendBytes("", 0); |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
- ASSERT_EQ(OK, stream->InitSync()); |
- EXPECT_TRUE(stream->IsInMemory()); |
- ASSERT_TRUE(stream.get()); |
- EXPECT_EQ(0U, stream->size()); |
- EXPECT_EQ(0U, stream->position()); |
- EXPECT_TRUE(stream->IsEOF()); |
+ UploadDataStream stream(upload_data_); |
+ ASSERT_EQ(OK, stream.InitSync()); |
+ EXPECT_TRUE(stream.IsInMemory()); |
+ EXPECT_EQ(0U, stream.size()); |
+ EXPECT_EQ(0U, stream.position()); |
+ EXPECT_TRUE(stream.IsEOF()); |
} |
TEST_F(UploadDataStreamTest, ConsumeAllBytes) { |
upload_data_->AppendBytes(kTestData, kTestDataSize); |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
- ASSERT_EQ(OK, stream->InitSync()); |
- EXPECT_TRUE(stream->IsInMemory()); |
- ASSERT_TRUE(stream.get()); |
- EXPECT_EQ(kTestDataSize, stream->size()); |
- EXPECT_EQ(0U, stream->position()); |
- EXPECT_FALSE(stream->IsEOF()); |
+ UploadDataStream stream(upload_data_); |
+ ASSERT_EQ(OK, stream.InitSync()); |
+ 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, kTestBufferSize); |
+ while (!stream.IsEOF()) { |
+ int bytes_read = stream.ReadSync(buf, kTestBufferSize); |
ASSERT_LE(0, bytes_read); // Not an error. |
} |
- EXPECT_EQ(kTestDataSize, stream->position()); |
- ASSERT_TRUE(stream->IsEOF()); |
+ EXPECT_EQ(kTestDataSize, stream.position()); |
+ ASSERT_TRUE(stream.IsEOF()); |
} |
TEST_F(UploadDataStreamTest, File) { |
@@ -139,20 +174,19 @@ TEST_F(UploadDataStreamTest, File) { |
elements.push_back(element); |
upload_data_->SetElements(elements); |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
- ASSERT_EQ(OK, stream->InitSync()); |
- EXPECT_FALSE(stream->IsInMemory()); |
- ASSERT_TRUE(stream.get()); |
- EXPECT_EQ(kTestDataSize, stream->size()); |
- EXPECT_EQ(0U, stream->position()); |
- EXPECT_FALSE(stream->IsEOF()); |
+ UploadDataStream stream(upload_data_); |
+ ASSERT_EQ(OK, stream.InitSync()); |
+ 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()) { |
- int bytes_read = stream->Read(buf, kTestBufferSize); |
+ while (!stream.IsEOF()) { |
+ int bytes_read = stream.ReadSync(buf, kTestBufferSize); |
ASSERT_LE(0, bytes_read); // Not an error. |
} |
- EXPECT_EQ(kTestDataSize, stream->position()); |
- ASSERT_TRUE(stream->IsEOF()); |
+ EXPECT_EQ(kTestDataSize, stream.position()); |
+ ASSERT_TRUE(stream.IsEOF()); |
file_util::Delete(temp_file_path, false); |
} |
@@ -172,25 +206,24 @@ TEST_F(UploadDataStreamTest, FileSmallerThanLength) { |
elements.push_back(element); |
upload_data_->SetElements(elements); |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
- ASSERT_EQ(OK, stream->InitSync()); |
- EXPECT_FALSE(stream->IsInMemory()); |
- ASSERT_TRUE(stream.get()); |
- EXPECT_EQ(kFakeSize, stream->size()); |
- EXPECT_EQ(0U, stream->position()); |
- EXPECT_FALSE(stream->IsEOF()); |
+ UploadDataStream stream(upload_data_); |
+ ASSERT_EQ(OK, stream.InitSync()); |
+ 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()) { |
- int bytes_read = stream->Read(buf, kTestBufferSize); |
+ while (!stream.IsEOF()) { |
+ 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()); |
+ 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()); |
+ EXPECT_EQ(read_counter, stream.position()); |
file_util::Delete(temp_file_path, false); |
} |
@@ -209,20 +242,19 @@ TEST_F(UploadDataStreamTest, FileAndBytes) { |
upload_data_->AppendBytes(kTestData, kTestDataSize); |
const uint64 kStreamSize = kTestDataSize + kFileRangeLength; |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
- ASSERT_EQ(OK, stream->InitSync()); |
- EXPECT_FALSE(stream->IsInMemory()); |
- ASSERT_TRUE(stream.get()); |
- EXPECT_EQ(kStreamSize, stream->size()); |
- EXPECT_EQ(0U, stream->position()); |
- EXPECT_FALSE(stream->IsEOF()); |
+ UploadDataStream stream(upload_data_); |
+ ASSERT_EQ(OK, stream.InitSync()); |
+ 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()) { |
- int bytes_read = stream->Read(buf, kTestBufferSize); |
+ while (!stream.IsEOF()) { |
+ int bytes_read = stream.ReadSync(buf, kTestBufferSize); |
ASSERT_LE(0, bytes_read); // Not an error. |
} |
- EXPECT_EQ(kStreamSize, stream->position()); |
- ASSERT_TRUE(stream->IsEOF()); |
+ EXPECT_EQ(kStreamSize, stream.position()); |
+ ASSERT_TRUE(stream.IsEOF()); |
file_util::Delete(temp_file_path, false); |
} |
@@ -233,20 +265,19 @@ TEST_F(UploadDataStreamTest, Chunk) { |
upload_data_->AppendChunk(kTestData, kTestDataSize, true); |
const uint64 kStreamSize = kTestDataSize*2; |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data_)); |
- 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. |
- EXPECT_EQ(0U, stream->position()); |
- EXPECT_FALSE(stream->IsEOF()); |
+ UploadDataStream stream(upload_data_); |
+ ASSERT_EQ(OK, stream.InitSync()); |
+ EXPECT_FALSE(stream.IsInMemory()); |
+ EXPECT_EQ(0U, stream.size()); // Content-Length is 0 for chunked data. |
+ 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, kTestBufferSize); |
+ while (!stream.IsEOF()) { |
+ int bytes_read = stream.ReadSync(buf, kTestBufferSize); |
ASSERT_LE(0, bytes_read); // Not an error. |
} |
- EXPECT_EQ(kStreamSize, stream->position()); |
- ASSERT_TRUE(stream->IsEOF()); |
+ EXPECT_EQ(kStreamSize, stream.position()); |
+ ASSERT_TRUE(stream.IsEOF()); |
} |
// Init() with on-memory and not-on-memory readers. |
@@ -257,34 +288,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 +323,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 +342,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 +357,82 @@ TEST_F(UploadDataStreamTest, InitAsyncFailureSync) { |
MessageLoop::current()->RunAllPending(); |
} |
+// Read with a buffer whose size is same as the data. |
+TEST_F(UploadDataStreamTest, ReadAsyncWithExactSizeBuffer) { |
+ upload_data_->AppendBytes(kTestData, kTestDataSize); |
+ UploadDataStream stream(upload_data_); |
+ |
+ MockCompletionCallback mock_callback; |
+ EXPECT_CALL(mock_callback, Run(_)).Times(0); |
+ |
+ ASSERT_EQ(OK, stream.Init(mock_callback.CreateCallback())); |
+ 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, kTestDataSize, |
+ mock_callback.CreateCallback()); |
+ 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(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(); |
+} |
+ |
void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path, |
const base::Time& time, |
bool error_expected) { |
@@ -351,8 +445,8 @@ void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path, |
scoped_refptr<UploadData> upload_data(new UploadData); |
upload_data->SetElements(elements); |
- scoped_ptr<UploadDataStream> stream(new UploadDataStream(upload_data)); |
- int error_code = stream->InitSync(); |
+ UploadDataStream stream(upload_data); |
+ int error_code = stream.InitSync(); |
if (error_expected) |
ASSERT_EQ(ERR_UPLOAD_FILE_CHANGED, error_code); |
else |