172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string> 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/compiler_specific.h" 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/message_loop.h" 114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "net/url_request/url_request_status.h" 1206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 13513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTestURLFetcher::TestURLFetcher(int id, 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const GURL& url, 1506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::RequestType request_type, 1606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::Delegate* d) 1706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch : URLFetcher(url, request_type, d), 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch id_(id), 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen original_url_(url), 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen did_receive_last_chunk_(false) { 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 23dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTestURLFetcher::~TestURLFetcher() { 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid TestURLFetcher::AppendChunkToUpload(const std::string& data, 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_last_chunk) { 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!did_receive_last_chunk_); 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen did_receive_last_chunk_ = is_last_chunk; 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen chunks_.push_back(data); 3106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 3206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTestURLFetcherFactory::TestURLFetcherFactory() {} 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTestURLFetcherFactory::~TestURLFetcherFactory() {} 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochURLFetcher* TestURLFetcherFactory::CreateURLFetcher( 3806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch int id, 3906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch const GURL& url, 4006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::RequestType request_type, 4106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch URLFetcher::Delegate* d) { 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TestURLFetcher* fetcher = new TestURLFetcher(id, url, request_type, d); 4306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch fetchers_[id] = fetcher; 4406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch return fetcher; 4506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 4606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 4706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTestURLFetcher* TestURLFetcherFactory::GetFetcherByID(int id) const { 4806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch Fetchers::const_iterator i = fetchers_.find(id); 4906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch return i == fetchers_.end() ? NULL : i->second; 5006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid TestURLFetcherFactory::RemoveFetcherFromMap(int id) { 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Fetchers::iterator i = fetchers_.find(id); 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DCHECK(i != fetchers_.end()); 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch fetchers_.erase(i); 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// This class is used by the FakeURLFetcherFactory below. 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass FakeURLFetcher : public URLFetcher { 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Normal URL fetcher constructor but also takes in a pre-baked response. 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FakeURLFetcher(const GURL& url, RequestType request_type, Delegate* d, 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string& response_data, bool success) 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : URLFetcher(url, request_type, d), 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch url_(url), 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch response_data_(response_data), 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch success_(success), 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Start the request. This will call the given delegate asynchronously 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // with the pre-baked response as parameter. 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void Start() { 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch MessageLoop::current()->PostTask( 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FROM_HERE, 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch method_factory_.NewRunnableMethod(&FakeURLFetcher::RunDelegate)); 774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~FakeURLFetcher() { 814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // This is the method which actually calls the delegate that is passed in the 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // constructor. 854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void RunDelegate() { 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen net::URLRequestStatus status; 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen status.set_status(success_ ? net::URLRequestStatus::SUCCESS : 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen net::URLRequestStatus::FAILED); 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch delegate()->OnURLFetchComplete(this, url_, status, success_ ? 200 : 500, 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ResponseCookies(), response_data_); 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Pre-baked response data and flag which indicates whether the request should 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // be successful or not. 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL url_; 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch std::string response_data_; 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool success_; 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Method factory used to run the delegate. 1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ScopedRunnableMethodFactory<FakeURLFetcher> method_factory_; 1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(FakeURLFetcher); 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenFakeURLFetcherFactory::FakeURLFetcherFactory() {} 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenFakeURLFetcherFactory::~FakeURLFetcherFactory() {} 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochURLFetcher* FakeURLFetcherFactory::CreateURLFetcher( 1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int id, 1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const GURL& url, 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch URLFetcher::RequestType request_type, 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch URLFetcher::Delegate* d) { 1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FakeResponseMap::const_iterator it = fake_responses_.find(url); 1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (it == fake_responses_.end()) { 1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // If we don't have a baked response for that URL we return NULL. 1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DLOG(ERROR) << "No baked response for URL: " << url.spec(); 1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return NULL; 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return new FakeURLFetcher(url, request_type, d, 1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch it->second.first, it->second.second); 1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid FakeURLFetcherFactory::SetFakeResponse(const std::string& url, 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string& response_data, 1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool success) { 1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overwrite existing URL if it already exists. 1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch fake_responses_[GURL(url)] = std::make_pair(response_data, success); 1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid FakeURLFetcherFactory::ClearFakeReponses() { 1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch fake_responses_.clear(); 1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 134