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