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)#ifndef NET_URL_REQUEST_TEST_URL_FETCHER_FACTORY_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_URL_REQUEST_TEST_URL_FETCHER_FACTORY_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_factory.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Changes URLFetcher's Factory for the lifetime of the object. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this scoper cannot be nested (to make it even harder to misuse). 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedURLFetcherFactory : public base::NonThreadSafe { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedURLFetcherFactory(URLFetcherFactory* factory); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ScopedURLFetcherFactory(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedURLFetcherFactory); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestURLFetcher and TestURLFetcherFactory are used for testing consumers of 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLFetcher. TestURLFetcherFactory is a URLFetcherFactory that creates 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestURLFetchers. TestURLFetcher::Start is overriden to do nothing. It is 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected that you'll grab the delegate from the TestURLFetcher and invoke 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the callback method when appropriate. In this way it's easy to mock a 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLFetcher. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typical usage: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // TestURLFetcher requires a MessageLoop. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MessageLoop message_loop; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // And an IO thread to release URLRequestContextGetter in URLFetcher::Core. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserThreadImpl io_thread(BrowserThread::IO, &message_loop); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Create factory (it automatically sets itself as URLFetcher's factory). 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestURLFetcherFactory factory; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Do something that triggers creation of a URLFetcher. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestURLFetcher* fetcher = factory.GetFetcherByID(expected_id); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DCHECK(fetcher); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Notify delegate with whatever data you want. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fetcher->delegate()->OnURLFetchComplete(...); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Make sure consumer of URLFetcher does the right thing. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: if you don't know when your request objects will be created you 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// might want to use the FakeURLFetcher and FakeURLFetcherFactory classes 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// below. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestURLFetcherFactory; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestURLFetcher : public URLFetcher { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Interface for tests to intercept production code classes using URLFetcher. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows even-driven mock server classes to analyze the correctness of 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // requests / uploads events and forge responses back at the right moment. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class DelegateForTests { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback issued correspondingly to the call to the |Start()| method. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRequestStart(int fetcher_id) = 0; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback issued correspondingly to the call to |AppendChunkToUpload|. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uploaded chunks can be retrieved with the |upload_chunks()| getter. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChunkUpload(int fetcher_id) = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback issued correspondingly to the destructor. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnRequestEnd(int fetcher_id) = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLFetcher(int id, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* d); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestURLFetcher(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLFetcher implementation 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUploadData(const std::string& upload_content_type, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& upload_content) OVERRIDE; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUploadFilePath( 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& upload_content_type, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 range_offset, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 range_length, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner) OVERRIDE; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetChunkedUpload( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& upload_content_type) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overriden to cache the chunks uploaded. Caller can read back the uploaded 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chunks with the upload_chunks() accessor. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AppendChunkToUpload(const std::string& data, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_last_chunk) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetLoadFlags(int load_flags) OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetLoadFlags() const OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetReferrer(const std::string& referrer) OVERRIDE; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetExtraRequestHeaders( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extra_request_headers) OVERRIDE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddExtraRequestHeader(const std::string& header_line) OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetExtraRequestHeaders( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) const OVERRIDE; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetRequestContext( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestContextGetter* request_context_getter) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetFirstPartyForCookies( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_for_cookies) OVERRIDE; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetURLRequestUserData( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* key, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CreateDataCallback& create_data_callback) OVERRIDE; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetStopOnRedirect(bool stop_on_redirect) OVERRIDE; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetAutomaticallyRetryOn5xx(bool retry) OVERRIDE; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetMaxRetriesOn5xx(int max_retries) OVERRIDE; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GetMaxRetriesOn5xx() const OVERRIDE; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::TimeDelta GetBackoffDelay() const OVERRIDE; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetAutomaticallyRetryOnNetworkChanges(int max_retries) OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SaveResponseToFileAtPath( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner) OVERRIDE; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SaveResponseToTemporaryFile( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::TaskRunner> file_task_runner) OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HttpResponseHeaders* GetResponseHeaders() const OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HostPortPair GetSocketAddress() const OVERRIDE; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool WasFetchedViaProxy() const OVERRIDE; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() OVERRIDE; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL we were created with. Because of how we're using URLFetcher GetURL() 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // always returns an empty URL. Chances are you'll want to use 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetOriginalURL() in your tests. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const GURL& GetOriginalURL() const OVERRIDE; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const GURL& GetURL() const OVERRIDE; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const URLRequestStatus& GetStatus() const OVERRIDE; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetResponseCode() const OVERRIDE; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const ResponseCookies& GetCookies() const OVERRIDE; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool FileErrorOccurred(int* out_error_code) const OVERRIDE; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ReceivedContentWasMalformed() OVERRIDE; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override response access functions to return fake data. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetResponseAsString( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* out_response_string) const OVERRIDE; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetResponseAsFilePath( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool take_ownership, base::FilePath* out_response_path) const OVERRIDE; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets owner of this class. Set it to a non-NULL value if you want 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to automatically unregister this fetcher from the owning factory 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // upon destruction. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_owner(TestURLFetcherFactory* owner) { owner_ = owner; } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unique ID in our factory. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id() const { return id_; } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the data uploaded on this URLFetcher. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& upload_data() const { return upload_data_; } 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& upload_file_path() const { return upload_file_path_; } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the chunks of data uploaded on this URLFetcher. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::list<std::string>& upload_chunks() const { return chunks_; } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether the last call to |AppendChunkToUpload(...)| was final. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_receive_last_chunk() const { return did_receive_last_chunk_; } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the delegate installed on the URLFetcher. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* delegate() const { return delegate_; } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_url(const GURL& url) { fake_url_ = url; } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_status(const URLRequestStatus& status); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_response_code(int response_code) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_response_code_ = response_code; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_cookies(const ResponseCookies& c) { fake_cookies_ = c; } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_was_fetched_via_proxy(bool flag); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_response_headers(scoped_refptr<HttpResponseHeaders> headers); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_backoff_delay(base::TimeDelta backoff_delay); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetDelegateForTests(DelegateForTests* delegate_for_tests); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set string data. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetResponseString(const std::string& response); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set File data. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetResponseFilePath(const base::FilePath& path); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ResponseDestinationType { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STRING, // Default: In a std::string 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEMP_FILE // Write to a temp file 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLFetcherFactory* owner_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int id_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL original_url_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* delegate_; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelegateForTests* delegate_for_tests_; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string upload_data_; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath upload_file_path_; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string> chunks_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_receive_last_chunk_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User can use set_* methods to provide values returned by getters. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting the real values is not possible, because the real class 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has no setters. The data is a private member of a class defined 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in a .cc file, so we can't get at it with friendship. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fake_load_flags_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL fake_url_; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestStatus fake_status_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fake_response_code_; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCookies fake_cookies_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseDestinationType fake_response_destination_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string fake_response_string_; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath fake_response_file_path_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fake_was_fetched_via_proxy_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders> fake_response_headers_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders fake_extra_request_headers_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fake_max_retries_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta fake_backoff_delay_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestURLFetcher); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TestURLFetcher::DelegateForTests TestURLFetcherDelegateForTests; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simple URLFetcherFactory method that creates TestURLFetchers. All fetchers 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are registered in a map by the id passed to the create method. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Optionally, a fetcher may be automatically unregistered from the map upon 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// its destruction. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestURLFetcherFactory : public URLFetcherFactory, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ScopedURLFetcherFactory { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLFetcherFactory(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestURLFetcherFactory(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLFetcher* CreateURLFetcher( 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher::RequestType request_type, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* d) OVERRIDE; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLFetcher* GetFetcherByID(int id) const; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveFetcherFromMap(int id); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetDelegateForTests(TestURLFetcherDelegateForTests* delegate_for_tests); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_remove_fetcher_on_delete(bool remove_fetcher_on_delete) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) remove_fetcher_on_delete_ = remove_fetcher_on_delete; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps from id passed to create to the returned URLFetcher. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<int, TestURLFetcher*> Fetchers; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Fetchers fetchers_; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLFetcherDelegateForTests* delegate_for_tests_; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether to automatically unregister a fetcher from this factory upon its 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destruction, false by default. 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool remove_fetcher_on_delete_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestURLFetcherFactory); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The FakeURLFetcher and FakeURLFetcherFactory classes are similar to the 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ones above but don't require you to know when exactly the URLFetcher objects 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be created. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These classes let you set pre-baked HTTP responses for particular URLs. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// E.g., if the user requests http://a.com/ then respond with an HTTP/500. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We assume that the thread that is calling Start() on the URLFetcher object 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has a message loop running. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FakeURLFetcher can be used to create a URLFetcher that will emit a fake 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// response when started. This class can be used in place of an actual 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLFetcher. 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Example usage: 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FakeURLFetcher fake_fetcher("http://a.com", some_delegate, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "<html><body>hello world</body></html>", 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// true); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// // Will schedule a call to some_delegate->OnURLFetchComplete(&fake_fetcher). 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fake_fetcher.Start(); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeURLFetcher : public TestURLFetcher { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Normal URL fetcher constructor but also takes in a pre-baked response. 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeURLFetcher(const GURL& url, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLFetcherDelegate* d, 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& response_data, bool success); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the request. This will call the given delegate asynchronously 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with the pre-baked response as parameter. 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start() OVERRIDE; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& GetURL() const OVERRIDE; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeURLFetcher(); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is the method which actually calls the delegate that is passed in the 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // constructor. 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RunDelegate(); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<FakeURLFetcher> weak_factory_; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeURLFetcher); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FakeURLFetcherFactory is a factory for FakeURLFetcher objects. When 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// instantiated, it sets itself up as the default URLFetcherFactory. Fake 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// responses for given URLs can be set using SetFakeResponse. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is not thread-safe. You should not call SetFakeResponse or 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ClearFakeResponse at the same time you call CreateURLFetcher. However, it is 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OK to start URLFetcher objects while setting or clearning fake responses 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// since already created URLFetcher objects will not be affected by any changes 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// made to the fake responses (once a URLFetcher object is created you cannot 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change its fake response). 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example usage: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FakeURLFetcherFactory factory; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // You know that class SomeService will request url http://a.com/ and you 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // want to test the service class by returning an error. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// factory.SetFakeResponse("http://a.com/", "", false); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // But if the service requests http://b.com/asdf you want to respond with 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // a simple html page and an HTTP/200 code. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// factory.SetFakeResponse("http://b.com/asdf", 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "<html><body>hello world</body></html>", 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// true); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SomeService service; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// service.Run(); // Will eventually request these two URLs. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeURLFetcherFactory : public URLFetcherFactory, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ScopedURLFetcherFactory { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Parameters to FakeURLFetcherCreator: url, delegate, response_data, success 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |url| URL for instantiated FakeURLFetcher 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |delegate| Delegate for FakeURLFetcher 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |response_data| response data for FakeURLFetcher 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |success| bool indicating response code. true = 200 and false = 500. 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // These argument should by default be used in instantiating FakeURLFetcher 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // as follows: new FakeURLFetcher(url, delegate, response_data, success) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<scoped_ptr<FakeURLFetcher>( 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL&, 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLFetcherDelegate*, 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string&, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool)> FakeURLFetcherCreator; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |default_factory|, which can be NULL, is a URLFetcherFactory that 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be used to construct a URLFetcher in case the URL being created 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has no pre-baked response. If it is NULL, a URLFetcherImpl will be 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // created in this case. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FakeURLFetcherFactory(URLFetcherFactory* default_factory); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |default_factory|, which can be NULL, is a URLFetcherFactory that 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will be used to construct a URLFetcher in case the URL being created 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has no pre-baked response. If it is NULL, a URLFetcherImpl will be 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // created in this case. 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |creator| is a callback that returns will be called to create a 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FakeURLFetcher if a response is found to a given URL. It can be 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // set to MakeFakeURLFetcher. 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeURLFetcherFactory(URLFetcherFactory* default_factory, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FakeURLFetcherCreator& creator); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeURLFetcherFactory(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If no fake response is set for the given URL this method will delegate the 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call to |default_factory_| if it is not NULL, or return NULL if it is 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, it will return a URLFetcher object which will respond with the 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pre-baked response that the client has set by calling SetFakeResponse(). 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLFetcher* CreateURLFetcher( 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher::RequestType request_type, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* d) OVERRIDE; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the fake response for a given URL. If success is true we will serve 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an HTTP/200 and an HTTP/500 otherwise. The |response_data| may be empty. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFakeResponse(const std::string& url, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response_data, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all the fake responses that were previously set via 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetFakeResponse(). 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearFakeResponses(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FakeURLFetcherCreator creator_; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<GURL, std::pair<std::string, bool> > FakeResponseMap; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeResponseMap fake_responses_; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLFetcherFactory* const default_factory_; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<FakeURLFetcher> DefaultFakeURLFetcherCreator( 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLFetcherDelegate* delegate, 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& response, 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeURLFetcherFactory); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is an implementation of URLFetcherFactory that will create a 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLFetcherImpl. It can be use in conjunction with a FakeURLFetcherFactory in 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// integration tests to control the behavior of some requests but execute 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all the other ones. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcherImplFactory : public URLFetcherFactory { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherImplFactory(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~URLFetcherImplFactory(); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method will create a real URLFetcher. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLFetcher* CreateURLFetcher( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcher::RequestType request_type, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLFetcherDelegate* d) OVERRIDE; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_URL_REQUEST_TEST_URL_FETCHER_FACTORY_H_ 423