test_url_fetcher_factory.cc revision f2477e01787aa58f445919b809d89e252beef54f
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"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/net_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_impl.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/url_request/url_fetcher_response_writer.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedURLFetcherFactory::ScopedURLFetcherFactory(
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherFactory* factory) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!URLFetcherImpl::factory());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLFetcherImpl::set_factory(factory);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedURLFetcherFactory::~ScopedURLFetcherFactory() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(URLFetcherImpl::factory());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLFetcherImpl::set_factory(NULL);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcher::TestURLFetcher(int id,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const GURL& url,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               URLFetcherDelegate* d)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : owner_(NULL),
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      id_(id),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_url_(url),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(d),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_for_tests_(NULL),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_receive_last_chunk_(false),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_load_flags_(0),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_response_code_(-1),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_response_destination_(STRING),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_was_fetched_via_proxy_(false),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fake_max_retries_(0) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcher::~TestURLFetcher() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_for_tests_)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_for_tests_->OnRequestEnd(id_);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (owner_)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    owner_->RemoveFetcherFromMap(id_);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetUploadData(const std::string& upload_content_type,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& upload_content) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  upload_data_ = upload_content;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetUploadFilePath(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& upload_content_type,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file_path,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint64 range_offset,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint64 range_length,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::TaskRunner> file_task_runner) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  upload_file_path_ = file_path;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetChunkedUpload(const std::string& upload_content_type) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::AppendChunkToUpload(const std::string& data,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool is_last_chunk) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!did_receive_last_chunk_);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  did_receive_last_chunk_ = is_last_chunk;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chunks_.push_back(data);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_for_tests_)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_for_tests_->OnChunkUpload(id_);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetLoadFlags(int load_flags) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_load_flags_= load_flags;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestURLFetcher::GetLoadFlags() const {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_load_flags_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetReferrer(const std::string& referrer) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetExtraRequestHeaders(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& extra_request_headers) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_extra_request_headers_.Clear();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_extra_request_headers_.AddHeadersFromString(extra_request_headers);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::AddExtraRequestHeader(const std::string& header_line) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_extra_request_headers_.AddHeaderFromString(header_line);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::GetExtraRequestHeaders(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders* headers) const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *headers = fake_extra_request_headers_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetRequestContext(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequestContextGetter* request_context_getter) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetFirstPartyForCookies(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& first_party_for_cookies) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetURLRequestUserData(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const void* key,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CreateDataCallback& create_data_callback) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetStopOnRedirect(bool stop_on_redirect) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetAutomaticallyRetryOn5xx(bool retry) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetMaxRetriesOn5xx(int max_retries) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_max_retries_ = max_retries;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TestURLFetcher::GetMaxRetriesOn5xx() const {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_max_retries_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta TestURLFetcher::GetBackoffDelay() const {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_backoff_delay_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetAutomaticallyRetryOnNetworkChanges(int max_retries) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SaveResponseToFileAtPath(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file_path,
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SaveResponseToTemporaryFile(
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_refptr<base::SequencedTaskRunner> file_task_runner) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TestURLFetcher::SaveResponseWithWriter(
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<URLFetcherResponseWriter> response_writer) {
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const {
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return fake_response_headers_.get();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostPortPair TestURLFetcher::GetSocketAddress() const {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HostPortPair();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLFetcher::WasFetchedViaProxy() const {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_was_fetched_via_proxy_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::Start() {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriden to do nothing. It is assumed the caller will notify the delegate.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_for_tests_)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_for_tests_->OnRequestStart(id_);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& TestURLFetcher::GetOriginalURL() const {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return original_url_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GURL& TestURLFetcher::GetURL() const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_url_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const URLRequestStatus& TestURLFetcher::GetStatus() const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_status_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestURLFetcher::GetResponseCode() const {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_response_code_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ResponseCookies& TestURLFetcher::GetCookies() const {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fake_cookies_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::ReceivedContentWasMalformed() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLFetcher::GetResponseAsString(
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* out_response_string) const {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fake_response_destination_ != STRING)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out_response_string = fake_response_string_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestURLFetcher::GetResponseAsFilePath(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool take_ownership, base::FilePath* out_response_path) const {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fake_response_destination_ != TEMP_FILE)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out_response_path = fake_response_file_path_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_status(const URLRequestStatus& status) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_status_ = status;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_was_fetched_via_proxy(bool flag) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_was_fetched_via_proxy_ = flag;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_response_headers(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<HttpResponseHeaders> headers) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_headers_ = headers;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::set_backoff_delay(base::TimeDelta backoff_delay) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_backoff_delay_ = backoff_delay;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetDelegateForTests(DelegateForTests* delegate_for_tests) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_for_tests_ = delegate_for_tests;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcher::SetResponseString(const std::string& response) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_destination_ = STRING;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_string_ = response;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestURLFetcher::SetResponseFilePath(const base::FilePath& path) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_destination_ = TEMP_FILE;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_response_file_path_ = path;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcherFactory::TestURLFetcherFactory()
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ScopedURLFetcherFactory(this),
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_for_tests_(NULL),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      remove_fetcher_on_delete_(false) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcherFactory::~TestURLFetcherFactory() {}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcher* TestURLFetcherFactory::CreateURLFetcher(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcher::RequestType request_type,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherDelegate* d) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLFetcher* fetcher = new TestURLFetcher(id, url, d);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (remove_fetcher_on_delete_)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fetcher->set_owner(this);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->SetDelegateForTests(delegate_for_tests_);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetchers_[id] = fetcher;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return fetcher;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestURLFetcher* TestURLFetcherFactory::GetFetcherByID(int id) const {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Fetchers::const_iterator i = fetchers_.find(id);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i == fetchers_.end() ? NULL : i->second;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcherFactory::RemoveFetcherFromMap(int id) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Fetchers::iterator i = fetchers_.find(id);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(i != fetchers_.end());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetchers_.erase(i);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestURLFetcherFactory::SetDelegateForTests(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestURLFetcherDelegateForTests* delegate_for_tests) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_for_tests_ = delegate_for_tests;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeURLFetcher::FakeURLFetcher(const GURL& url,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               URLFetcherDelegate* d,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const std::string& response_data,
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               HttpStatusCode response_code,
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               URLRequestStatus::Status status)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestURLFetcher(0, url, d),
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Error error = OK;
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  switch(status) {
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case URLRequestStatus::SUCCESS:
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      // |error| is initialized to OK.
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case URLRequestStatus::IO_PENDING:
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      error = ERR_IO_PENDING;
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case URLRequestStatus::CANCELED:
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      error = ERR_ABORTED;
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case URLRequestStatus::FAILED:
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      error = ERR_FAILED;
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set_status(URLRequestStatus(status, error));
3070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  set_response_code(response_code);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetResponseString(response_data);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeURLFetcher::~FakeURLFetcher() {}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeURLFetcher::Start() {
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&FakeURLFetcher::RunDelegate, weak_factory_.GetWeakPtr()));
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeURLFetcher::RunDelegate() {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate()->OnURLFetchComplete(this);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GURL& FakeURLFetcher::GetURL() const {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TestURLFetcher::GetOriginalURL();
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeURLFetcherFactory::FakeURLFetcherFactory(
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLFetcherFactory* default_factory)
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ScopedURLFetcherFactory(this),
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      creator_(base::Bind(&DefaultFakeURLFetcherCreator)),
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default_factory_(default_factory) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeURLFetcherFactory::FakeURLFetcherFactory(
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLFetcherFactory* default_factory,
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FakeURLFetcherCreator& creator)
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : ScopedURLFetcherFactory(this),
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      creator_(creator),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_factory_(default_factory) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<FakeURLFetcher> FakeURLFetcherFactory::DefaultFakeURLFetcherCreator(
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLFetcherDelegate* delegate,
3450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      const std::string& response_data,
346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      HttpStatusCode response_code,
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      URLRequestStatus::Status status) {
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return scoped_ptr<FakeURLFetcher>(
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new FakeURLFetcher(url, delegate, response_data, response_code, status));
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeURLFetcherFactory::~FakeURLFetcherFactory() {}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcher* FakeURLFetcherFactory::CreateURLFetcher(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcher::RequestType request_type,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherDelegate* d) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeResponseMap::const_iterator it = fake_responses_.find(url);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it == fake_responses_.end()) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (default_factory_ == NULL) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If we don't have a baked response for that URL we return NULL.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(ERROR) << "No baked response for URL: " << url.spec();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return default_factory_->CreateURLFetcher(id, url, request_type, d);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<FakeURLFetcher> fake_fetcher =
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      creator_.Run(url, d, it->second.response_data,
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   it->second.response_code, it->second.status);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO: Make URLFetcherFactory::CreateURLFetcher return a scoped_ptr
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return fake_fetcher.release();
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeURLFetcherFactory::SetFakeResponse(
378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const GURL& url,
379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::string& response_data,
380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    HttpStatusCode response_code,
381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    URLRequestStatus::Status status) {
382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overwrite existing URL if it already exists.
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FakeURLResponse response;
384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  response.response_data = response_data;
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  response.response_code = response_code;
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  response.status = status;
387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fake_responses_[url] = response;
388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeURLFetcherFactory::ClearFakeResponses() {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fake_responses_.clear();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcherImplFactory::URLFetcherImplFactory() {}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcherImplFactory::~URLFetcherImplFactory() {}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLFetcher* URLFetcherImplFactory::CreateURLFetcher(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcher::RequestType request_type,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLFetcherDelegate* d) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new URLFetcherImpl(url, request_type, d);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
407