test_url_fetcher_factory.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/url_request/test_url_fetcher_factory.h" 6 7#include <string> 8 9#include "base/bind.h" 10#include "base/compiler_specific.h" 11#include "base/memory/weak_ptr.h" 12#include "base/message_loop.h" 13#include "net/base/host_port_pair.h" 14#include "net/http/http_response_headers.h" 15#include "net/url_request/url_fetcher_delegate.h" 16#include "net/url_request/url_fetcher_impl.h" 17#include "net/url_request/url_request_status.h" 18 19namespace net { 20 21ScopedURLFetcherFactory::ScopedURLFetcherFactory( 22 URLFetcherFactory* factory) { 23 DCHECK(!URLFetcherImpl::factory()); 24 URLFetcherImpl::set_factory(factory); 25} 26 27ScopedURLFetcherFactory::~ScopedURLFetcherFactory() { 28 DCHECK(URLFetcherImpl::factory()); 29 URLFetcherImpl::set_factory(NULL); 30} 31 32TestURLFetcher::TestURLFetcher(int id, 33 const GURL& url, 34 URLFetcherDelegate* d) 35 : owner_(NULL), 36 id_(id), 37 original_url_(url), 38 delegate_(d), 39 delegate_for_tests_(NULL), 40 did_receive_last_chunk_(false), 41 fake_load_flags_(0), 42 fake_response_code_(-1), 43 fake_response_destination_(STRING), 44 fake_was_fetched_via_proxy_(false), 45 fake_max_retries_(0) { 46} 47 48TestURLFetcher::~TestURLFetcher() { 49 if (delegate_for_tests_) 50 delegate_for_tests_->OnRequestEnd(id_); 51 if (owner_) 52 owner_->RemoveFetcherFromMap(id_); 53} 54 55void TestURLFetcher::SetUploadData(const std::string& upload_content_type, 56 const std::string& upload_content) { 57 upload_data_ = upload_content; 58} 59 60void TestURLFetcher::SetUploadFilePath( 61 const std::string& upload_content_type, 62 const base::FilePath& file_path, 63 scoped_refptr<base::TaskRunner> file_task_runner) { 64 upload_file_path_ = file_path; 65} 66 67void TestURLFetcher::SetChunkedUpload(const std::string& upload_content_type) { 68} 69 70void TestURLFetcher::AppendChunkToUpload(const std::string& data, 71 bool is_last_chunk) { 72 DCHECK(!did_receive_last_chunk_); 73 did_receive_last_chunk_ = is_last_chunk; 74 chunks_.push_back(data); 75 if (delegate_for_tests_) 76 delegate_for_tests_->OnChunkUpload(id_); 77} 78 79void TestURLFetcher::SetLoadFlags(int load_flags) { 80 fake_load_flags_= load_flags; 81} 82 83int TestURLFetcher::GetLoadFlags() const { 84 return fake_load_flags_; 85} 86 87void TestURLFetcher::SetReferrer(const std::string& referrer) { 88} 89 90void TestURLFetcher::SetExtraRequestHeaders( 91 const std::string& extra_request_headers) { 92 fake_extra_request_headers_.Clear(); 93 fake_extra_request_headers_.AddHeadersFromString(extra_request_headers); 94} 95 96void TestURLFetcher::AddExtraRequestHeader(const std::string& header_line) { 97 fake_extra_request_headers_.AddHeaderFromString(header_line); 98} 99 100void TestURLFetcher::GetExtraRequestHeaders( 101 HttpRequestHeaders* headers) const { 102 *headers = fake_extra_request_headers_; 103} 104 105void TestURLFetcher::SetRequestContext( 106 URLRequestContextGetter* request_context_getter) { 107} 108 109void TestURLFetcher::SetFirstPartyForCookies( 110 const GURL& first_party_for_cookies) { 111} 112 113void TestURLFetcher::SetURLRequestUserData( 114 const void* key, 115 const CreateDataCallback& create_data_callback) { 116} 117 118void TestURLFetcher::SetStopOnRedirect(bool stop_on_redirect) { 119} 120 121void TestURLFetcher::SetAutomaticallyRetryOn5xx(bool retry) { 122} 123 124void TestURLFetcher::SetMaxRetriesOn5xx(int max_retries) { 125 fake_max_retries_ = max_retries; 126} 127 128int TestURLFetcher::GetMaxRetriesOn5xx() const { 129 return fake_max_retries_; 130} 131 132base::TimeDelta TestURLFetcher::GetBackoffDelay() const { 133 return fake_backoff_delay_; 134} 135 136void TestURLFetcher::SetAutomaticallyRetryOnNetworkChanges(int max_retries) { 137} 138 139void TestURLFetcher::SaveResponseToFileAtPath( 140 const base::FilePath& file_path, 141 scoped_refptr<base::TaskRunner> file_task_runner) { 142} 143 144void TestURLFetcher::SaveResponseToTemporaryFile( 145 scoped_refptr<base::TaskRunner> file_task_runner) { 146} 147 148HttpResponseHeaders* TestURLFetcher::GetResponseHeaders() const { 149 return fake_response_headers_; 150} 151 152HostPortPair TestURLFetcher::GetSocketAddress() const { 153 NOTIMPLEMENTED(); 154 return HostPortPair(); 155} 156 157bool TestURLFetcher::WasFetchedViaProxy() const { 158 return fake_was_fetched_via_proxy_; 159} 160 161void TestURLFetcher::Start() { 162 // Overriden to do nothing. It is assumed the caller will notify the delegate. 163 if (delegate_for_tests_) 164 delegate_for_tests_->OnRequestStart(id_); 165} 166 167const GURL& TestURLFetcher::GetOriginalURL() const { 168 return original_url_; 169} 170 171const GURL& TestURLFetcher::GetURL() const { 172 return fake_url_; 173} 174 175const URLRequestStatus& TestURLFetcher::GetStatus() const { 176 return fake_status_; 177} 178 179int TestURLFetcher::GetResponseCode() const { 180 return fake_response_code_; 181} 182 183const ResponseCookies& TestURLFetcher::GetCookies() const { 184 return fake_cookies_; 185} 186 187bool TestURLFetcher::FileErrorOccurred(int* out_error_code) const { 188 NOTIMPLEMENTED(); 189 return false; 190} 191 192void TestURLFetcher::ReceivedContentWasMalformed() { 193} 194 195bool TestURLFetcher::GetResponseAsString( 196 std::string* out_response_string) const { 197 if (fake_response_destination_ != STRING) 198 return false; 199 200 *out_response_string = fake_response_string_; 201 return true; 202} 203 204bool TestURLFetcher::GetResponseAsFilePath( 205 bool take_ownership, base::FilePath* out_response_path) const { 206 if (fake_response_destination_ != TEMP_FILE) 207 return false; 208 209 *out_response_path = fake_response_file_path_; 210 return true; 211} 212 213void TestURLFetcher::set_status(const URLRequestStatus& status) { 214 fake_status_ = status; 215} 216 217void TestURLFetcher::set_was_fetched_via_proxy(bool flag) { 218 fake_was_fetched_via_proxy_ = flag; 219} 220 221void TestURLFetcher::set_response_headers( 222 scoped_refptr<HttpResponseHeaders> headers) { 223 fake_response_headers_ = headers; 224} 225 226void TestURLFetcher::set_backoff_delay(base::TimeDelta backoff_delay) { 227 fake_backoff_delay_ = backoff_delay; 228} 229 230void TestURLFetcher::SetDelegateForTests(DelegateForTests* delegate_for_tests) { 231 delegate_for_tests_ = delegate_for_tests; 232} 233 234void TestURLFetcher::SetResponseString(const std::string& response) { 235 fake_response_destination_ = STRING; 236 fake_response_string_ = response; 237} 238 239void TestURLFetcher::SetResponseFilePath(const base::FilePath& path) { 240 fake_response_destination_ = TEMP_FILE; 241 fake_response_file_path_ = path; 242} 243 244TestURLFetcherFactory::TestURLFetcherFactory() 245 : ScopedURLFetcherFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 246 delegate_for_tests_(NULL), 247 remove_fetcher_on_delete_(false) { 248} 249 250TestURLFetcherFactory::~TestURLFetcherFactory() {} 251 252URLFetcher* TestURLFetcherFactory::CreateURLFetcher( 253 int id, 254 const GURL& url, 255 URLFetcher::RequestType request_type, 256 URLFetcherDelegate* d) { 257 TestURLFetcher* fetcher = new TestURLFetcher(id, url, d); 258 if (remove_fetcher_on_delete_) 259 fetcher->set_owner(this); 260 fetcher->SetDelegateForTests(delegate_for_tests_); 261 fetchers_[id] = fetcher; 262 return fetcher; 263} 264 265TestURLFetcher* TestURLFetcherFactory::GetFetcherByID(int id) const { 266 Fetchers::const_iterator i = fetchers_.find(id); 267 return i == fetchers_.end() ? NULL : i->second; 268} 269 270void TestURLFetcherFactory::RemoveFetcherFromMap(int id) { 271 Fetchers::iterator i = fetchers_.find(id); 272 DCHECK(i != fetchers_.end()); 273 fetchers_.erase(i); 274} 275 276void TestURLFetcherFactory::SetDelegateForTests( 277 TestURLFetcherDelegateForTests* delegate_for_tests) { 278 delegate_for_tests_ = delegate_for_tests; 279} 280 281FakeURLFetcher::FakeURLFetcher(const GURL& url, 282 URLFetcherDelegate* d, 283 const std::string& response_data, 284 bool success) 285 : TestURLFetcher(0, url, d), 286 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { 287 set_status(URLRequestStatus( 288 success ? URLRequestStatus::SUCCESS : URLRequestStatus::FAILED, 289 0)); 290 set_response_code(success ? 200 : 500); 291 SetResponseString(response_data); 292} 293 294FakeURLFetcher::~FakeURLFetcher() {} 295 296void FakeURLFetcher::Start() { 297 MessageLoop::current()->PostTask( 298 FROM_HERE, 299 base::Bind(&FakeURLFetcher::RunDelegate, weak_factory_.GetWeakPtr())); 300} 301 302void FakeURLFetcher::RunDelegate() { 303 delegate()->OnURLFetchComplete(this); 304} 305 306const GURL& FakeURLFetcher::GetURL() const { 307 return TestURLFetcher::GetOriginalURL(); 308} 309 310FakeURLFetcherFactory::FakeURLFetcherFactory( 311 URLFetcherFactory* default_factory) 312 : ScopedURLFetcherFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 313 creator_(base::Bind(&DefaultFakeURLFetcherCreator)), 314 default_factory_(default_factory) { 315} 316 317FakeURLFetcherFactory::FakeURLFetcherFactory( 318 URLFetcherFactory* default_factory, 319 const FakeURLFetcherCreator& creator) 320 : ScopedURLFetcherFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 321 creator_(creator), 322 default_factory_(default_factory) { 323} 324 325scoped_ptr<FakeURLFetcher> FakeURLFetcherFactory::DefaultFakeURLFetcherCreator( 326 const GURL& url, 327 URLFetcherDelegate* delegate, 328 const std::string& response, 329 bool success) { 330 return scoped_ptr<FakeURLFetcher>(new FakeURLFetcher(url, delegate, 331 response, success)); 332} 333 334FakeURLFetcherFactory::~FakeURLFetcherFactory() {} 335 336URLFetcher* FakeURLFetcherFactory::CreateURLFetcher( 337 int id, 338 const GURL& url, 339 URLFetcher::RequestType request_type, 340 URLFetcherDelegate* d) { 341 FakeResponseMap::const_iterator it = fake_responses_.find(url); 342 if (it == fake_responses_.end()) { 343 if (default_factory_ == NULL) { 344 // If we don't have a baked response for that URL we return NULL. 345 DLOG(ERROR) << "No baked response for URL: " << url.spec(); 346 return NULL; 347 } else { 348 return default_factory_->CreateURLFetcher(id, url, request_type, d); 349 } 350 } 351 352 scoped_ptr<FakeURLFetcher> fake_fetcher = 353 creator_.Run(url, d, it->second.first, it->second.second); 354 // TODO: Make URLFetcherFactory::CreateURLFetcher return a scoped_ptr 355 return fake_fetcher.release(); 356} 357 358void FakeURLFetcherFactory::SetFakeResponse(const std::string& url, 359 const std::string& response_data, 360 bool success) { 361 // Overwrite existing URL if it already exists. 362 fake_responses_[GURL(url)] = std::make_pair(response_data, success); 363} 364 365void FakeURLFetcherFactory::ClearFakeResponses() { 366 fake_responses_.clear(); 367} 368 369URLFetcherImplFactory::URLFetcherImplFactory() {} 370 371URLFetcherImplFactory::~URLFetcherImplFactory() {} 372 373URLFetcher* URLFetcherImplFactory::CreateURLFetcher( 374 int id, 375 const GURL& url, 376 URLFetcher::RequestType request_type, 377 URLFetcherDelegate* d) { 378 return new URLFetcherImpl(url, request_type, d); 379} 380 381} // namespace net 382