Index: net/http/http_response_body_drainer_unittest.cc |
diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc |
index d9b6492a5378ad55986d89375c2a53894e441bc9..23356abc030eec8d719e4bffa5f17b9d79366d3e 100644 |
--- a/net/http/http_response_body_drainer_unittest.cc |
+++ b/net/http/http_response_body_drainer_unittest.cc |
@@ -69,6 +69,7 @@ class MockHttpStream : public HttpStream { |
closed_(false), |
stall_reads_forever_(false), |
num_chunks_(0), |
+ delay_eof_chunk_(false), |
is_complete_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {} |
virtual ~MockHttpStream() {} |
@@ -130,6 +131,8 @@ class MockHttpStream : public HttpStream { |
void set_num_chunks(int num_chunks) { num_chunks_ = num_chunks; } |
+ void DelayEofChunk() { delay_eof_chunk_ = true; } |
mmenke
2012/10/12 18:55:05
Think the logic would be a little simpler if you m
|
+ |
private: |
void CompleteRead(); |
@@ -141,6 +144,7 @@ class MockHttpStream : public HttpStream { |
bool closed_; |
bool stall_reads_forever_; |
int num_chunks_; |
+ bool delay_eof_chunk_; |
bool is_complete_; |
base::WeakPtrFactory<MockHttpStream> weak_factory_; |
}; |
@@ -154,10 +158,10 @@ int MockHttpStream::ReadResponseBody( |
if (stall_reads_forever_) |
return ERR_IO_PENDING; |
- if (num_chunks_ == 0) |
+ if (num_chunks_ == 0 && !delay_eof_chunk_) |
return ERR_UNEXPECTED; |
- if (buf_len > kMagicChunkSize && num_chunks_ > 1) { |
+ if (buf_len > kMagicChunkSize && (num_chunks_ > 1 || delay_eof_chunk_)) { |
user_buf_ = buf; |
callback_ = callback; |
MessageLoop::current()->PostTask( |
@@ -178,10 +182,15 @@ void MockHttpStream::CompleteRead() { |
std::memset(user_buf_->data(), 1, kMagicChunkSize); |
user_buf_ = NULL; |
callback_.Reset(); |
- num_chunks_--; |
- if (!num_chunks_) |
+ if (num_chunks_) { |
+ num_chunks_--; |
+ if (!num_chunks_ && !delay_eof_chunk_) |
+ is_complete_ = true; |
+ callback.Run(kMagicChunkSize); |
+ } else { |
is_complete_ = true; |
- callback.Run(kMagicChunkSize); |
+ callback.Run(0); |
+ } |
} |
class HttpResponseBodyDrainerTest : public testing::Test { |
@@ -225,6 +234,13 @@ TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncOK) { |
EXPECT_FALSE(result_waiter_.WaitForResult()); |
} |
+TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncDelayedOK) { |
+ mock_stream_->set_num_chunks(3); |
+ mock_stream_->DelayEofChunk(); |
+ drainer_->Start(session_); |
+ EXPECT_FALSE(result_waiter_.WaitForResult()); |
+} |
+ |
TEST_F(HttpResponseBodyDrainerTest, DrainBodySizeEqualsDrainBuffer) { |
mock_stream_->set_num_chunks( |
HttpResponseBodyDrainer::kDrainBodyBufferSize / kMagicChunkSize); |