test_url_fetcher_factory.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_impl.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/url_request/url_fetcher_response_writer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedURLFetcherFactory::ScopedURLFetcherFactory(
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherFactory* factory) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!URLFetcherImpl::factory());
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLFetcherImpl::set_factory(factory);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedURLFetcherFactory::~ScopedURLFetcherFactory() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(URLFetcherImpl::factory());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLFetcherImpl::set_factory(NULL);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcher::TestURLFetcher(int id,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const GURL& url,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               URLFetcherDelegate* d)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : owner_(NULL),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      id_(id),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_url_(url),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(d),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_for_tests_(NULL),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_receive_last_chunk_(false),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_load_flags_(0),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_response_code_(-1),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_response_destination_(STRING),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_was_fetched_via_proxy_(false),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_max_retries_(0) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcher::~TestURLFetcher() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_for_tests_)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_for_tests_->OnRequestEnd(id_);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (owner_)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    owner_->RemoveFetcherFromMap(id_);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetUploadData(const std::string& upload_content_type,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& upload_content) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upload_data_ = upload_content;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetUploadFilePath(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& upload_content_type,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file_path,
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint64 range_offset,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint64 range_length,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::TaskRunner> file_task_runner) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  upload_file_path_ = file_path;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetChunkedUpload(const std::string& upload_content_type) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::AppendChunkToUpload(const std::string& data,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool is_last_chunk) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!did_receive_last_chunk_);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  did_receive_last_chunk_ = is_last_chunk;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chunks_.push_back(data);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_for_tests_)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_for_tests_->OnChunkUpload(id_);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetLoadFlags(int load_flags) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_load_flags_= load_flags;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestURLFetcher::GetLoadFlags() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_load_flags_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetReferrer(const std::string& referrer) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetExtraRequestHeaders(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extra_request_headers) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_extra_request_headers_.Clear();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_extra_request_headers_.AddHeadersFromString(extra_request_headers);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::AddExtraRequestHeader(const std::string& header_line) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_extra_request_headers_.AddHeaderFromString(header_line);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::GetExtraRequestHeaders(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders* headers) const {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *headers = fake_extra_request_headers_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetRequestContext(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequestContextGetter* request_context_getter) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetFirstPartyForCookies(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& first_party_for_cookies) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetURLRequestUserData(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* key,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CreateDataCallback& create_data_callback) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetStopOnRedirect(bool stop_on_redirect) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetAutomaticallyRetryOn5xx(bool retry) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetMaxRetriesOn5xx(int max_retries) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_max_retries_ = max_retries;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TestURLFetcher::GetMaxRetriesOn5xx() const {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_max_retries_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta TestURLFetcher::GetBackoffDelay() const {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_backoff_delay_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetAutomaticallyRetryOnNetworkChanges(int max_retries) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SaveResponseToFileAtPath(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file_path,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::TaskRunner> file_task_runner) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SaveResponseToTemporaryFile(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::TaskRunner> file_task_runner) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestURLFetcher::SaveResponseWithWriter(
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<URLFetcherResponseWriter> response_writer) {
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const {
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return fake_response_headers_.get();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair TestURLFetcher::GetSocketAddress() const {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HostPortPair();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLFetcher::WasFetchedViaProxy() const {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_was_fetched_via_proxy_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::Start() {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriden to do nothing. It is assumed the caller will notify the delegate.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_for_tests_)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_for_tests_->OnRequestStart(id_);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& TestURLFetcher::GetOriginalURL() const {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return original_url_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& TestURLFetcher::GetURL() const {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_url_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const URLRequestStatus& TestURLFetcher::GetStatus() const {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_status_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestURLFetcher::GetResponseCode() const {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_response_code_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ResponseCookies& TestURLFetcher::GetCookies() const {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_cookies_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::ReceivedContentWasMalformed() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLFetcher::GetResponseAsString(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* out_response_string) const {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fake_response_destination_ != STRING)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out_response_string = fake_response_string_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLFetcher::GetResponseAsFilePath(
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool take_ownership, base::FilePath* out_response_path) const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fake_response_destination_ != TEMP_FILE)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out_response_path = fake_response_file_path_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_status(const URLRequestStatus& status) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_status_ = status;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_was_fetched_via_proxy(bool flag) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_was_fetched_via_proxy_ = flag;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_response_headers(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<HttpResponseHeaders> headers) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_headers_ = headers;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_backoff_delay(base::TimeDelta backoff_delay) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_backoff_delay_ = backoff_delay;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetDelegateForTests(DelegateForTests* delegate_for_tests) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_for_tests_ = delegate_for_tests;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetResponseString(const std::string& response) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_destination_ = STRING;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_string_ = response;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetResponseFilePath(const base::FilePath& path) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_destination_ = TEMP_FILE;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_file_path_ = path;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcherFactory::TestURLFetcherFactory()
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ScopedURLFetcherFactory(this),
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_for_tests_(NULL),
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      remove_fetcher_on_delete_(false) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcherFactory::~TestURLFetcherFactory() {}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcher* TestURLFetcherFactory::CreateURLFetcher(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcher::RequestType request_type,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherDelegate* d) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLFetcher* fetcher = new TestURLFetcher(id, url, d);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (remove_fetcher_on_delete_)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fetcher->set_owner(this);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->SetDelegateForTests(delegate_for_tests_);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetchers_[id] = fetcher;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fetcher;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcher* TestURLFetcherFactory::GetFetcherByID(int id) const {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Fetchers::const_iterator i = fetchers_.find(id);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i == fetchers_.end() ? NULL : i->second;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcherFactory::RemoveFetcherFromMap(int id) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Fetchers::iterator i = fetchers_.find(id);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(i != fetchers_.end());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetchers_.erase(i);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcherFactory::SetDelegateForTests(
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestURLFetcherDelegateForTests* delegate_for_tests) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_for_tests_ = delegate_for_tests;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeURLFetcher::FakeURLFetcher(const GURL& url,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               URLFetcherDelegate* d,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const std::string& response_data,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               bool success)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestURLFetcher(0, url, d),
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_status(URLRequestStatus(
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      success ? URLRequestStatus::SUCCESS : URLRequestStatus::FAILED,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0));
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_response_code(success ? 200 : 500);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResponseString(response_data);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeURLFetcher::~FakeURLFetcher() {}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeURLFetcher::Start() {
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&FakeURLFetcher::RunDelegate, weak_factory_.GetWeakPtr()));
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeURLFetcher::RunDelegate() {
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate()->OnURLFetchComplete(this);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GURL& FakeURLFetcher::GetURL() const {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TestURLFetcher::GetOriginalURL();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeURLFetcherFactory::FakeURLFetcherFactory(
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLFetcherFactory* default_factory)
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ScopedURLFetcherFactory(this),
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      creator_(base::Bind(&DefaultFakeURLFetcherCreator)),
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_factory_(default_factory) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeURLFetcherFactory::FakeURLFetcherFactory(
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLFetcherFactory* default_factory,
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FakeURLFetcherCreator& creator)
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ScopedURLFetcherFactory(this),
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      creator_(creator),
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_factory_(default_factory) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<FakeURLFetcher> FakeURLFetcherFactory::DefaultFakeURLFetcherCreator(
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLFetcherDelegate* delegate,
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& response,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool success) {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<FakeURLFetcher>(new FakeURLFetcher(url, delegate,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                       response, success));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeURLFetcherFactory::~FakeURLFetcherFactory() {}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcher* FakeURLFetcherFactory::CreateURLFetcher(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcher::RequestType request_type,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherDelegate* d) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeResponseMap::const_iterator it = fake_responses_.find(url);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it == fake_responses_.end()) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (default_factory_ == NULL) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If we don't have a baked response for that URL we return NULL.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(ERROR) << "No baked response for URL: " << url.spec();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return default_factory_->CreateURLFetcher(id, url, request_type, d);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeURLFetcher> fake_fetcher =
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      creator_.Run(url, d, it->second.first, it->second.second);
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO: Make URLFetcherFactory::CreateURLFetcher return a scoped_ptr
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fake_fetcher.release();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeURLFetcherFactory::SetFakeResponse(
361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const GURL& url,
362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::string& response_data,
363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    bool success) {
364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overwrite existing URL if it already exists.
365d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  fake_responses_[url] = std::make_pair(response_data, success);
366d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeURLFetcherFactory::ClearFakeResponses() {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_responses_.clear();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcherImplFactory::URLFetcherImplFactory() {}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcherImplFactory::~URLFetcherImplFactory() {}
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcher* URLFetcherImplFactory::CreateURLFetcher(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcher::RequestType request_type,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherDelegate* d) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new URLFetcherImpl(url, request_type, d);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
385