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