| Index: net/http/http_transaction_unittest.cc
|
| diff --git a/net/http/http_transaction_unittest.cc b/net/http/http_transaction_unittest.cc
|
| index 518c1f8360465d9fa1bfca4918a1da3cae205816..fabfb01d576b74d188eb80078dc1e690e75a534f 100644
|
| --- a/net/http/http_transaction_unittest.cc
|
| +++ b/net/http/http_transaction_unittest.cc
|
| @@ -1,10 +1,11 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 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_transaction_unittest.h"
|
|
|
| -#include "base/hash_tables.h"
|
| +#include <algorithm>
|
| +
|
| #include "base/message_loop.h"
|
| #include "base/string_util.h"
|
| #include "net/base/net_errors.h"
|
| @@ -16,6 +17,11 @@
|
| #include "net/http/http_transaction.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +namespace {
|
| +typedef base::hash_map<std::string, const MockTransaction*> MockTransactionMap;
|
| +static MockTransactionMap mock_transactions;
|
| +} // namespace
|
| +
|
| //-----------------------------------------------------------------------------
|
| // mock transaction data
|
|
|
| @@ -104,18 +110,6 @@ static const MockTransaction* const kBuiltinMockTransactions[] = {
|
| &kRangeGET_Transaction
|
| };
|
|
|
| -typedef base::hash_map<std::string, const MockTransaction*>
|
| -MockTransactionMap;
|
| -static MockTransactionMap mock_transactions;
|
| -
|
| -void AddMockTransaction(const MockTransaction* trans) {
|
| - mock_transactions[GURL(trans->url).spec()] = trans;
|
| -}
|
| -
|
| -void RemoveMockTransaction(const MockTransaction* trans) {
|
| - mock_transactions.erase(GURL(trans->url).spec());
|
| -}
|
| -
|
| const MockTransaction* FindMockTransaction(const GURL& url) {
|
| // look for overrides:
|
| MockTransactionMap::const_iterator it = mock_transactions.find(url.spec());
|
| @@ -130,12 +124,222 @@ const MockTransaction* FindMockTransaction(const GURL& url) {
|
| return NULL;
|
| }
|
|
|
| +void AddMockTransaction(const MockTransaction* trans) {
|
| + mock_transactions[GURL(trans->url).spec()] = trans;
|
| +}
|
| +
|
| +void RemoveMockTransaction(const MockTransaction* trans) {
|
| + mock_transactions.erase(GURL(trans->url).spec());
|
| +}
|
| +
|
| +MockHttpRequest::MockHttpRequest(const MockTransaction& t) {
|
| + url = GURL(t.url);
|
| + method = t.method;
|
| + extra_headers.AddHeadersFromString(t.request_headers);
|
| + load_flags = t.load_flags;
|
| +}
|
|
|
| //-----------------------------------------------------------------------------
|
|
|
| // static
|
| int TestTransactionConsumer::quit_counter_ = 0;
|
|
|
| +TestTransactionConsumer::TestTransactionConsumer(
|
| + net::HttpTransactionFactory* factory)
|
| + : state_(IDLE),
|
| + trans_(NULL),
|
| + error_(net::OK) {
|
| + // Disregard the error code.
|
| + factory->CreateTransaction(&trans_);
|
| + ++quit_counter_;
|
| +}
|
| +
|
| +TestTransactionConsumer::~TestTransactionConsumer() {
|
| +}
|
| +
|
| +void TestTransactionConsumer::Start(const net::HttpRequestInfo* request,
|
| + const net::BoundNetLog& net_log) {
|
| + state_ = STARTING;
|
| + int result = trans_->Start(request, this, net_log);
|
| + if (result != net::ERR_IO_PENDING)
|
| + DidStart(result);
|
| +}
|
| +
|
| +void TestTransactionConsumer::DidStart(int result) {
|
| + if (result != net::OK) {
|
| + DidFinish(result);
|
| + } else {
|
| + Read();
|
| + }
|
| +}
|
| +
|
| +void TestTransactionConsumer::DidRead(int result) {
|
| + if (result <= 0) {
|
| + DidFinish(result);
|
| + } else {
|
| + content_.append(read_buf_->data(), result);
|
| + Read();
|
| + }
|
| +}
|
| +
|
| +void TestTransactionConsumer::DidFinish(int result) {
|
| + state_ = DONE;
|
| + error_ = result;
|
| + if (--quit_counter_ == 0)
|
| + MessageLoop::current()->Quit();
|
| +}
|
| +
|
| +void TestTransactionConsumer::Read() {
|
| + state_ = READING;
|
| + read_buf_ = new net::IOBuffer(1024);
|
| + int result = trans_->Read(read_buf_, 1024, this);
|
| + if (result != net::ERR_IO_PENDING)
|
| + DidRead(result);
|
| +}
|
| +
|
| +void TestTransactionConsumer::RunWithParams(const Tuple1<int>& params) {
|
| + int result = params.a;
|
| + switch (state_) {
|
| + case STARTING:
|
| + DidStart(result);
|
| + break;
|
| + case READING:
|
| + DidRead(result);
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| +
|
| +MockNetworkTransaction::MockNetworkTransaction() :
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), data_cursor_(0) {
|
| +}
|
| +
|
| +MockNetworkTransaction::~MockNetworkTransaction() {}
|
| +
|
| +int MockNetworkTransaction::Start(const net::HttpRequestInfo* request,
|
| + net::CompletionCallback* callback,
|
| + const net::BoundNetLog& net_log) {
|
| + const MockTransaction* t = FindMockTransaction(request->url);
|
| + if (!t)
|
| + return net::ERR_FAILED;
|
| +
|
| + std::string resp_status = t->status;
|
| + std::string resp_headers = t->response_headers;
|
| + std::string resp_data = t->data;
|
| + if (t->handler)
|
| + (t->handler)(request, &resp_status, &resp_headers, &resp_data);
|
| +
|
| + std::string header_data = base::StringPrintf(
|
| + "%s\n%s\n", resp_status.c_str(), resp_headers.c_str());
|
| + std::replace(header_data.begin(), header_data.end(), '\n', '\0');
|
| +
|
| + response_.request_time = base::Time::Now();
|
| + if (!t->request_time.is_null())
|
| + response_.request_time = t->request_time;
|
| +
|
| + response_.was_cached = false;
|
| +
|
| + response_.response_time = base::Time::Now();
|
| + if (!t->response_time.is_null())
|
| + response_.response_time = t->response_time;
|
| +
|
| + response_.headers = new net::HttpResponseHeaders(header_data);
|
| + response_.ssl_info.cert_status = t->cert_status;
|
| + data_ = resp_data;
|
| + test_mode_ = t->test_mode;
|
| +
|
| + if (test_mode_ & TEST_MODE_SYNC_NET_START)
|
| + return net::OK;
|
| +
|
| + CallbackLater(callback, net::OK);
|
| + return net::ERR_IO_PENDING;
|
| +}
|
| +
|
| +int MockNetworkTransaction::RestartIgnoringLastError(
|
| + net::CompletionCallback* callback) {
|
| + return net::ERR_FAILED;
|
| +}
|
| +
|
| +int MockNetworkTransaction::RestartWithCertificate(
|
| + net::X509Certificate* client_cert,
|
| + net::CompletionCallback* callback) {
|
| + return net::ERR_FAILED;
|
| +}
|
| +
|
| +int MockNetworkTransaction::RestartWithAuth(const string16& username,
|
| + const string16& password,
|
| + net::CompletionCallback* callback) {
|
| + return net::ERR_FAILED;
|
| +}
|
| +
|
| +bool MockNetworkTransaction::IsReadyToRestartForAuth() {
|
| + return false;
|
| +}
|
| +
|
| +int MockNetworkTransaction::Read(net::IOBuffer* buf, int buf_len,
|
| + net::CompletionCallback* callback) {
|
| + int data_len = static_cast<int>(data_.size());
|
| + int num = std::min(buf_len, data_len - data_cursor_);
|
| + if (num) {
|
| + memcpy(buf->data(), data_.data() + data_cursor_, num);
|
| + data_cursor_ += num;
|
| + }
|
| + if (test_mode_ & TEST_MODE_SYNC_NET_READ)
|
| + return num;
|
| +
|
| + CallbackLater(callback, num);
|
| + return net::ERR_IO_PENDING;
|
| +}
|
| +
|
| +void MockNetworkTransaction::StopCaching() {}
|
| +
|
| +const net::HttpResponseInfo* MockNetworkTransaction::GetResponseInfo() const {
|
| + return &response_;
|
| +}
|
| +
|
| +net::LoadState MockNetworkTransaction::GetLoadState() const {
|
| + if (data_cursor_)
|
| + return net::LOAD_STATE_READING_RESPONSE;
|
| + return net::LOAD_STATE_IDLE;
|
| +}
|
| +
|
| +uint64 MockNetworkTransaction::GetUploadProgress() const {
|
| + return 0;
|
| +}
|
| +
|
| +void MockNetworkTransaction::CallbackLater(net::CompletionCallback* callback,
|
| + int result) {
|
| + MessageLoop::current()->PostTask(FROM_HERE, task_factory_.NewRunnableMethod(
|
| + &MockNetworkTransaction::RunCallback, callback, result));
|
| +}
|
| +
|
| +void MockNetworkTransaction::RunCallback(net::CompletionCallback* callback,
|
| + int result) {
|
| + callback->Run(result);
|
| +}
|
| +
|
| +MockNetworkLayer::MockNetworkLayer() : transaction_count_(0) {}
|
| +
|
| +MockNetworkLayer::~MockNetworkLayer() {}
|
| +
|
| +int MockNetworkLayer::CreateTransaction(
|
| + scoped_ptr<net::HttpTransaction>* trans) {
|
| + transaction_count_++;
|
| + trans->reset(new MockNetworkTransaction());
|
| + return net::OK;
|
| +}
|
| +
|
| +net::HttpCache* MockNetworkLayer::GetCache() {
|
| + return NULL;
|
| +}
|
| +
|
| +net::HttpNetworkSession* MockNetworkLayer::GetSession() {
|
| + return NULL;
|
| +}
|
| +
|
| +void MockNetworkLayer::Suspend(bool suspend) {}
|
|
|
| //-----------------------------------------------------------------------------
|
| // helpers
|
|
|