test_url_fetcher_factory.cc revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
1513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Use of this source code is governed by a BSD-style license that can be 306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// found in the LICENSE file. 406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/common/net/test_url_fetcher_factory.h" 64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string> 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/message_loop.h" 94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "net/url_request/url_request_status.h" 1006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 11513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTestURLFetcher::TestURLFetcher(int id, 12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& url, 1306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::RequestType request_type, 1406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::Delegate* d) 1506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch : URLFetcher(url, request_type, d), 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch id_(id), 1706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch original_url_(url) { 1806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 1906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 2006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochURLFetcher* TestURLFetcherFactory::CreateURLFetcher( 2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch int id, 2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch const GURL& url, 2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::RequestType request_type, 2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::Delegate* d) { 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TestURLFetcher* fetcher = new TestURLFetcher(id, url, request_type, d); 2606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch fetchers_[id] = fetcher; 2706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch return fetcher; 2806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 2906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 3006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTestURLFetcher* TestURLFetcherFactory::GetFetcherByID(int id) const { 3106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch Fetchers::const_iterator i = fetchers_.find(id); 3206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch return i == fetchers_.end() ? NULL : i->second; 3306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestURLFetcherFactory::RemoveFetcherFromMap(int id) { 36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Fetchers::iterator i = fetchers_.find(id); 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DCHECK(i != fetchers_.end()); 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch fetchers_.erase(i); 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// This class is used by the FakeURLFetcherFactory below. 424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass FakeURLFetcher : public URLFetcher { 434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Normal URL fetcher constructor but also takes in a pre-baked response. 454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FakeURLFetcher(const GURL& url, RequestType request_type, Delegate* d, 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string& response_data, bool success) 474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : URLFetcher(url, request_type, d), 484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch url_(url), 494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch response_data_(response_data), 504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch success_(success), 514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Start the request. This will call the given delegate asynchronously 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // with the pre-baked response as parameter. 564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void Start() { 574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch MessageLoop::current()->PostTask( 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FROM_HERE, 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch method_factory_.NewRunnableMethod(&FakeURLFetcher::RunDelegate)); 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~FakeURLFetcher() { 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This is the method which actually calls the delegate that is passed in the 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // constructor. 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void RunDelegate() { 694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch URLRequestStatus status; 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch status.set_status(success_ ? URLRequestStatus::SUCCESS : 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch URLRequestStatus::FAILED); 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch delegate()->OnURLFetchComplete(this, url_, status, success_ ? 200 : 500, 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResponseCookies(), response_data_); 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Pre-baked response data and flag which indicates whether the request should 774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // be successful or not. 784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL url_; 794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string response_data_; 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool success_; 814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Method factory used to run the delegate. 834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ScopedRunnableMethodFactory<FakeURLFetcher> method_factory_; 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(FakeURLFetcher); 864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochURLFetcher* FakeURLFetcherFactory::CreateURLFetcher( 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int id, 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const GURL& url, 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch URLFetcher::RequestType request_type, 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch URLFetcher::Delegate* d) { 934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FakeResponseMap::const_iterator it = fake_responses_.find(url); 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (it == fake_responses_.end()) { 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // If we don't have a baked response for that URL we return NULL. 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DLOG(ERROR) << "No baked response for URL: " << url.spec(); 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return NULL; 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return new FakeURLFetcher(url, request_type, d, 1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch it->second.first, it->second.second); 1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid FakeURLFetcherFactory::SetFakeResponse(const std::string& url, 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string& response_data, 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool success) { 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overwrite existing URL if it already exists. 1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch fake_responses_[GURL(url)] = std::make_pair(response_data, success); 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid FakeURLFetcherFactory::ClearFakeReponses() { 1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch fake_responses_.clear(); 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 113