| 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
|
| deleted file mode 100644
|
| index 8cce583021f5911a560d16b2cac97263daff0c10..0000000000000000000000000000000000000000
|
| --- a/net/http/http_response_body_drainer_unittest.cc
|
| +++ /dev/null
|
| @@ -1,308 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/http/http_response_body_drainer.h"
|
| -
|
| -#include <cstring>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/test_completion_callback.h"
|
| -#include "net/http/http_network_session.h"
|
| -#include "net/http/http_server_properties_impl.h"
|
| -#include "net/http/http_stream.h"
|
| -#include "net/http/transport_security_state.h"
|
| -#include "net/proxy/proxy_service.h"
|
| -#include "net/ssl/ssl_config_service_defaults.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace net {
|
| -
|
| -namespace {
|
| -
|
| -const int kMagicChunkSize = 1024;
|
| -static_assert((HttpResponseBodyDrainer::kDrainBodyBufferSize %
|
| - kMagicChunkSize) == 0,
|
| - "chunk size needs to divide evenly into buffer size");
|
| -
|
| -class CloseResultWaiter {
|
| - public:
|
| - CloseResultWaiter()
|
| - : result_(false),
|
| - have_result_(false),
|
| - waiting_for_result_(false) {}
|
| -
|
| - int WaitForResult() {
|
| - CHECK(!waiting_for_result_);
|
| - while (!have_result_) {
|
| - waiting_for_result_ = true;
|
| - base::MessageLoop::current()->Run();
|
| - waiting_for_result_ = false;
|
| - }
|
| - return result_;
|
| - }
|
| -
|
| - void set_result(bool result) {
|
| - result_ = result;
|
| - have_result_ = true;
|
| - if (waiting_for_result_)
|
| - base::MessageLoop::current()->Quit();
|
| - }
|
| -
|
| - private:
|
| - int result_;
|
| - bool have_result_;
|
| - bool waiting_for_result_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CloseResultWaiter);
|
| -};
|
| -
|
| -class MockHttpStream : public HttpStream {
|
| - public:
|
| - MockHttpStream(CloseResultWaiter* result_waiter)
|
| - : result_waiter_(result_waiter),
|
| - buf_len_(0),
|
| - closed_(false),
|
| - stall_reads_forever_(false),
|
| - num_chunks_(0),
|
| - is_sync_(false),
|
| - is_last_chunk_zero_size_(false),
|
| - is_complete_(false),
|
| - weak_factory_(this) {}
|
| - ~MockHttpStream() override {}
|
| -
|
| - // HttpStream implementation.
|
| - int InitializeStream(const HttpRequestInfo* request_info,
|
| - RequestPriority priority,
|
| - const BoundNetLog& net_log,
|
| - const CompletionCallback& callback) override {
|
| - return ERR_UNEXPECTED;
|
| - }
|
| - int SendRequest(const HttpRequestHeaders& request_headers,
|
| - HttpResponseInfo* response,
|
| - const CompletionCallback& callback) override {
|
| - return ERR_UNEXPECTED;
|
| - }
|
| - UploadProgress GetUploadProgress() const override { return UploadProgress(); }
|
| - int ReadResponseHeaders(const CompletionCallback& callback) override {
|
| - return ERR_UNEXPECTED;
|
| - }
|
| -
|
| - bool CanFindEndOfResponse() const override { return true; }
|
| - bool IsConnectionReused() const override { return false; }
|
| - void SetConnectionReused() override {}
|
| - bool IsConnectionReusable() const override { return false; }
|
| - int64 GetTotalReceivedBytes() const override { return 0; }
|
| - void GetSSLInfo(SSLInfo* ssl_info) override {}
|
| - void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override {}
|
| -
|
| - // Mocked API
|
| - int ReadResponseBody(IOBuffer* buf,
|
| - int buf_len,
|
| - const CompletionCallback& callback) override;
|
| - void Close(bool not_reusable) override {
|
| - CHECK(!closed_);
|
| - closed_ = true;
|
| - result_waiter_->set_result(not_reusable);
|
| - }
|
| -
|
| - HttpStream* RenewStreamForAuth() override { return NULL; }
|
| -
|
| - bool IsResponseBodyComplete() const override { return is_complete_; }
|
| -
|
| - bool IsSpdyHttpStream() const override { return false; }
|
| -
|
| - bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override {
|
| - return false;
|
| - }
|
| -
|
| - void Drain(HttpNetworkSession*) override {}
|
| -
|
| - void SetPriority(RequestPriority priority) override {}
|
| -
|
| - // Methods to tweak/observer mock behavior:
|
| - void set_stall_reads_forever() { stall_reads_forever_ = true; }
|
| -
|
| - void set_num_chunks(int num_chunks) { num_chunks_ = num_chunks; }
|
| -
|
| - void set_sync() { is_sync_ = true; }
|
| -
|
| - void set_is_last_chunk_zero_size() { is_last_chunk_zero_size_ = true; }
|
| -
|
| - private:
|
| - int ReadResponseBodyImpl(IOBuffer* buf, int buf_len);
|
| - void CompleteRead();
|
| -
|
| - bool closed() const { return closed_; }
|
| -
|
| - CloseResultWaiter* const result_waiter_;
|
| - scoped_refptr<IOBuffer> user_buf_;
|
| - CompletionCallback callback_;
|
| - int buf_len_;
|
| - bool closed_;
|
| - bool stall_reads_forever_;
|
| - int num_chunks_;
|
| - bool is_sync_;
|
| - bool is_last_chunk_zero_size_;
|
| - bool is_complete_;
|
| - base::WeakPtrFactory<MockHttpStream> weak_factory_;
|
| -};
|
| -
|
| -int MockHttpStream::ReadResponseBody(IOBuffer* buf,
|
| - int buf_len,
|
| - const CompletionCallback& callback) {
|
| - CHECK(!callback.is_null());
|
| - CHECK(callback_.is_null());
|
| - CHECK(buf);
|
| -
|
| - if (stall_reads_forever_)
|
| - return ERR_IO_PENDING;
|
| -
|
| - if (is_complete_)
|
| - return ERR_UNEXPECTED;
|
| -
|
| - if (!is_sync_) {
|
| - user_buf_ = buf;
|
| - buf_len_ = buf_len;
|
| - callback_ = callback;
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MockHttpStream::CompleteRead, weak_factory_.GetWeakPtr()));
|
| - return ERR_IO_PENDING;
|
| - } else {
|
| - return ReadResponseBodyImpl(buf, buf_len);
|
| - }
|
| -}
|
| -
|
| -int MockHttpStream::ReadResponseBodyImpl(IOBuffer* buf, int buf_len) {
|
| - if (is_last_chunk_zero_size_ && num_chunks_ == 1) {
|
| - buf_len = 0;
|
| - } else {
|
| - if (buf_len > kMagicChunkSize)
|
| - buf_len = kMagicChunkSize;
|
| - std::memset(buf->data(), 1, buf_len);
|
| - }
|
| - num_chunks_--;
|
| - if (!num_chunks_)
|
| - is_complete_ = true;
|
| -
|
| - return buf_len;
|
| -}
|
| -
|
| -void MockHttpStream::CompleteRead() {
|
| - int result = ReadResponseBodyImpl(user_buf_.get(), buf_len_);
|
| - user_buf_ = NULL;
|
| - CompletionCallback callback = callback_;
|
| - callback_.Reset();
|
| - callback.Run(result);
|
| -}
|
| -
|
| -class HttpResponseBodyDrainerTest : public testing::Test {
|
| - protected:
|
| - HttpResponseBodyDrainerTest()
|
| - : proxy_service_(ProxyService::CreateDirect()),
|
| - ssl_config_service_(new SSLConfigServiceDefaults),
|
| - http_server_properties_(new HttpServerPropertiesImpl()),
|
| - transport_security_state_(new TransportSecurityState()),
|
| - session_(CreateNetworkSession()),
|
| - mock_stream_(new MockHttpStream(&result_waiter_)),
|
| - drainer_(new HttpResponseBodyDrainer(mock_stream_)) {}
|
| -
|
| - ~HttpResponseBodyDrainerTest() override {}
|
| -
|
| - HttpNetworkSession* CreateNetworkSession() const {
|
| - HttpNetworkSession::Params params;
|
| - params.proxy_service = proxy_service_.get();
|
| - params.ssl_config_service = ssl_config_service_.get();
|
| - params.http_server_properties = http_server_properties_->GetWeakPtr();
|
| - params.transport_security_state = transport_security_state_.get();
|
| - return new HttpNetworkSession(params);
|
| - }
|
| -
|
| - scoped_ptr<ProxyService> proxy_service_;
|
| - scoped_refptr<SSLConfigService> ssl_config_service_;
|
| - scoped_ptr<HttpServerPropertiesImpl> http_server_properties_;
|
| - scoped_ptr<TransportSecurityState> transport_security_state_;
|
| - const scoped_refptr<HttpNetworkSession> session_;
|
| - CloseResultWaiter result_waiter_;
|
| - MockHttpStream* const mock_stream_; // Owned by |drainer_|.
|
| - HttpResponseBodyDrainer* const drainer_; // Deletes itself.
|
| -};
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodySyncSingleOK) {
|
| - mock_stream_->set_num_chunks(1);
|
| - mock_stream_->set_sync();
|
| - drainer_->Start(session_.get());
|
| - EXPECT_FALSE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodySyncOK) {
|
| - mock_stream_->set_num_chunks(3);
|
| - mock_stream_->set_sync();
|
| - drainer_->Start(session_.get());
|
| - EXPECT_FALSE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncOK) {
|
| - mock_stream_->set_num_chunks(3);
|
| - drainer_->Start(session_.get());
|
| - EXPECT_FALSE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -// Test the case when the final chunk is 0 bytes. This can happen when
|
| -// the final 0-byte chunk of a chunk-encoded http response is read in a last
|
| -// call to ReadResponseBody, after all data were returned from HttpStream.
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodyAsyncEmptyChunk) {
|
| - mock_stream_->set_num_chunks(4);
|
| - mock_stream_->set_is_last_chunk_zero_size();
|
| - drainer_->Start(session_.get());
|
| - EXPECT_FALSE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodySyncEmptyChunk) {
|
| - mock_stream_->set_num_chunks(4);
|
| - mock_stream_->set_sync();
|
| - mock_stream_->set_is_last_chunk_zero_size();
|
| - drainer_->Start(session_.get());
|
| - EXPECT_FALSE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodySizeEqualsDrainBuffer) {
|
| - mock_stream_->set_num_chunks(
|
| - HttpResponseBodyDrainer::kDrainBodyBufferSize / kMagicChunkSize);
|
| - drainer_->Start(session_.get());
|
| - EXPECT_FALSE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodyTimeOut) {
|
| - mock_stream_->set_num_chunks(2);
|
| - mock_stream_->set_stall_reads_forever();
|
| - drainer_->Start(session_.get());
|
| - EXPECT_TRUE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, CancelledBySession) {
|
| - mock_stream_->set_num_chunks(2);
|
| - mock_stream_->set_stall_reads_forever();
|
| - drainer_->Start(session_.get());
|
| - // HttpNetworkSession should delete |drainer_|.
|
| -}
|
| -
|
| -TEST_F(HttpResponseBodyDrainerTest, DrainBodyTooLarge) {
|
| - int too_many_chunks =
|
| - HttpResponseBodyDrainer::kDrainBodyBufferSize / kMagicChunkSize;
|
| - too_many_chunks += 1; // Now it's too large.
|
| -
|
| - mock_stream_->set_num_chunks(too_many_chunks);
|
| - drainer_->Start(session_.get());
|
| - EXPECT_TRUE(result_waiter_.WaitForResult());
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -} // namespace net
|
|
|