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 "base/message_loop_proxy.h"
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event.h"
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/threading/thread.h"
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "build/build_config.h"
906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/common/net/url_fetcher.h"
1006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "net/http/http_response_headers.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/url_request/url_request_context_getter.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/url_request/url_request_test_util.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "net/url_request/url_request_throttler_manager.h"
1506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
1606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(USE_NSS)
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "net/ocsp/nss_ocsp.h"
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochusing base::Time;
2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochusing base::TimeDelta;
2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// TODO(eroman): Add a regression test for http://crbug.com/40505.
2506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
2606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochnamespace {
2706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data");
2906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass CurriedTask : public Task {
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CurriedTask(Task* task, MessageLoop* target_loop)
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : task_(task),
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        target_loop_(target_loop) {}
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Run() {
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    target_loop_->PostTask(FROM_HERE, task_);
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Task* const task_;
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MessageLoop* const target_loop_;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(CurriedTask);
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TestURLRequestContextGetter : public net::URLRequestContextGetter {
4806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
4906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  explicit TestURLRequestContextGetter(
5006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      base::MessageLoopProxy* io_message_loop_proxy)
5106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch          : io_message_loop_proxy_(io_message_loop_proxy) {
5206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual net::URLRequestContext* GetURLRequestContext() {
5406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!context_)
5506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      context_ = new TestURLRequestContext();
5606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return context_;
5706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const {
5906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return io_message_loop_proxy_;
6006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
6106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch protected:
6306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
6406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private:
6606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ~TestURLRequestContextGetter() {}
6706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<net::URLRequestContext> context_;
6906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
7006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherTest : public testing::Test, public URLFetcher::Delegate {
7406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
7506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  URLFetcherTest() : fetcher_(NULL) { }
7606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
7706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Creates a URLFetcher, using the program's main thread to do IO.
7806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void CreateFetcher(const GURL& url);
7906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
8006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
8106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
8206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
8406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
8506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
8606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
8706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
8806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() {
8906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return io_message_loop_proxy_;
9006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
9106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
9206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch protected:
9306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void SetUp() {
9406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    testing::Test::SetUp();
9506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
9606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    io_message_loop_proxy_ = base::MessageLoopProxy::CreateForCurrentThread();
9706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(USE_NSS)
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    net::EnsureOCSPInit();
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void TearDown() {
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(USE_NSS)
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    net::ShutdownOCSP();
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
10706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
10806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int GetNumFetcherCores() const {
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return URLFetcher::GetNumFetcherCores();
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
11306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher is designed to run on the main UI thread, but in our tests
11406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // we assume that the current thread is the IO thread where the URLFetcher
11506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // dispatches its requests to.  When we wish to simulate being used from
11606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // a UI thread, we dispatch a worker thread to do so.
11706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoopForIO io_loop_;
11806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
11906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
12006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  URLFetcher* fetcher_;
12106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
12206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLFetcherTest::CreateFetcher(const GURL& url) {
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  fetcher_ = new URLFetcher(url, URLFetcher::GET, this);
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  fetcher_->set_request_context(new TestURLRequestContextGetter(
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      io_message_loop_proxy()));
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  fetcher_->Start();
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid URLFetcherTest::OnURLFetchComplete(const URLFetcher* source,
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const GURL& url,
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const net::URLRequestStatus& status,
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        int response_code,
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const ResponseCookies& cookies,
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const std::string& data) {
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(status.is_success());
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(200, response_code);  // HTTP OK
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(data.empty());
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delete fetcher_;  // Have to delete this here and not in the destructor,
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    // because the destructor won't necessarily run on the
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    // same thread that CreateFetcher() did.
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If the current message loop is not the IO loop, it will be shut down when
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the main loop returns and this thread subsequently goes out of scope.
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
15106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of URLFetcherTest that does a POST instead
15206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherPostTest : public URLFetcherTest {
15306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
15406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void CreateFetcher(const GURL& url);
15506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
15606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
15706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
15806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
16006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
16106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
16206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
16306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
16406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
16506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of URLFetcherTest that tests headers.
16606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherHeadersTest : public URLFetcherTest {
16706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
16806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
16906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
17006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
17206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
17306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
17406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
17506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
17606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
17706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of URLFetcherTest that tests overload protection.
17806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherProtectTest : public URLFetcherTest {
17906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
18006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void CreateFetcher(const GURL& url);
18106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
18206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
18306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
18506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
18606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
18706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
18806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private:
18906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  Time start_time_;
19006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
19106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
19206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of URLFetcherTest that tests overload protection, when responses
19306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// passed through.
19406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherProtectTestPassedThrough : public URLFetcherTest {
19506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
19606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void CreateFetcher(const GURL& url);
19706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
19806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
19906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
20106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
20206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
20306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
20406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private:
20506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  Time start_time_;
20606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
20706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
20806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of URLFetcherTest that tests bad HTTPS requests.
20906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherBadHTTPSTest : public URLFetcherTest {
21006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
21106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  URLFetcherBadHTTPSTest();
21206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
21306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
21406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
21506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
21706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
21806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
21906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
22006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
22106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private:
22206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  FilePath cert_dir_;
22306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
22406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
22506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of URLFetcherTest that tests request cancellation on shutdown.
22606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass URLFetcherCancelTest : public URLFetcherTest {
22706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
22806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void CreateFetcher(const GURL& url);
22906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // URLFetcher::Delegate
23006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
23106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const GURL& url,
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
23306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  int response_code,
23406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const ResponseCookies& cookies,
23506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                  const std::string& data);
23606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
23706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  void CancelRequest();
23806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
23906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
24006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Version of TestURLRequestContext that posts a Quit task to the IO
24106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// thread once it is deleted.
24206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass CancelTestURLRequestContext : public TestURLRequestContext {
24306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual ~CancelTestURLRequestContext() {
24406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // The d'tor should execute in the IO thread. Post the quit task to the
24506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // current thread.
24606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
24706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
24806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
24906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass CancelTestURLRequestContextGetter : public net::URLRequestContextGetter {
25106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
25206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  explicit CancelTestURLRequestContextGetter(
25306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      base::MessageLoopProxy* io_message_loop_proxy)
25406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      : io_message_loop_proxy_(io_message_loop_proxy),
25506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch        context_created_(false, false) {
25606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual net::URLRequestContext* GetURLRequestContext() {
25806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (!context_) {
25906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      context_ = new CancelTestURLRequestContext();
26006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      context_created_.Signal();
26106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    }
26206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return context_;
26306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const {
26506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    return io_message_loop_proxy_;
26606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
26706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  void WaitForContextCreation() {
26806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    context_created_.Wait();
26906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
27006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
27106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private:
27206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ~CancelTestURLRequestContextGetter() {}
27306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
27406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
27506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  base::WaitableEvent context_created_;
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<net::URLRequestContext> context_;
27706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
27806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Version of URLFetcherTest that tests retying the same request twice.
280201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass URLFetcherMultipleAttemptTest : public URLFetcherTest {
281201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // URLFetcher::Delegate
283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const GURL& url,
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  const net::URLRequestStatus& status,
286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  int response_code,
287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const ResponseCookies& cookies,
288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const std::string& data);
289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string data_;
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
29306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Wrapper that lets us call CreateFetcher() on a thread of our choice.  We
29406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// could make URLFetcherTest refcounted and use PostTask(FROM_HERE.. ) to call
29506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// CreateFetcher() directly, but the ownership of the URLFetcherTest is a bit
29606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// confusing in that case because GTest doesn't know about the refcounting.
29706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// It's less confusing to just do it this way.
29806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass FetcherWrapperTask : public Task {
29906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public:
30006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  FetcherWrapperTask(URLFetcherTest* test, const GURL& url)
30106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      : test_(test), url_(url) { }
30206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  virtual void Run() {
30306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    test_->CreateFetcher(url_);
30406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
30506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
30606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private:
30706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  URLFetcherTest* test_;
30806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  GURL url_;
30906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch};
31006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
31106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherPostTest::CreateFetcher(const GURL& url) {
31206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_ = new URLFetcher(url, URLFetcher::POST, this);
31306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->set_request_context(new TestURLRequestContextGetter(
31406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      io_message_loop_proxy()));
31506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->set_upload_data("application/x-www-form-urlencoded",
31606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                            "bobsyeruncle");
31706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->Start();
31806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
31906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
32006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source,
32106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                            const GURL& url,
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                            const net::URLRequestStatus& status,
32306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                            int response_code,
32406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                            const ResponseCookies& cookies,
32506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                            const std::string& data) {
32606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_EQ(std::string("bobsyeruncle"), data);
32706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
32806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                     cookies, data);
32906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
33006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
33106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherHeadersTest::OnURLFetchComplete(
33206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const URLFetcher* source,
33306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const GURL& url,
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const net::URLRequestStatus& status,
33506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    int response_code,
33606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const ResponseCookies& cookies,
33706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const std::string& data) {
33806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  std::string header;
33906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_TRUE(source->response_headers()->GetNormalizedHeader("cache-control",
34006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                                              &header));
34106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_EQ("private", header);
34206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
34306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                     cookies, data);
34406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
34506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
34606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherProtectTest::CreateFetcher(const GURL& url) {
34706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_ = new URLFetcher(url, URLFetcher::GET, this);
34806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->set_request_context(new TestURLRequestContextGetter(
34906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      io_message_loop_proxy()));
35006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  start_time_ = Time::Now();
351201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  fetcher_->set_max_retries(11);
35206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->Start();
35306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
35406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid URLFetcherProtectTest::OnURLFetchComplete(
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const URLFetcher* source,
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& url,
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const net::URLRequestStatus& status,
35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int response_code,
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const ResponseCookies& cookies,
36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& data) {
36206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  const TimeDelta one_second = TimeDelta::FromMilliseconds(1000);
36306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (response_code >= 500) {
36406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // Now running ServerUnavailable test.
36506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // It takes more than 1 second to finish all 11 requests.
36606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_TRUE(Time::Now() - start_time_ >= one_second);
36706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_TRUE(status.is_success());
36806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_FALSE(data.empty());
36906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    delete fetcher_;
37006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
37106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  } else {
37206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // Now running Overload test.
37306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    static int count = 0;
37406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    count++;
37506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    if (count < 20) {
37606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      fetcher_->Start();
37706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    } else {
37806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      // We have already sent 20 requests continuously. And we expect that
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // it takes more than 1 second due to the overload protection settings.
38006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      EXPECT_TRUE(Time::Now() - start_time_ >= one_second);
38106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      URLFetcherTest::OnURLFetchComplete(source, url, status, response_code,
38206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch                                         cookies, data);
38306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    }
38406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
38506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
38606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
38706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherProtectTestPassedThrough::CreateFetcher(const GURL& url) {
38806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_ = new URLFetcher(url, URLFetcher::GET, this);
38906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->set_request_context(new TestURLRequestContextGetter(
39006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      io_message_loop_proxy()));
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  fetcher_->set_automatically_retry_on_5xx(false);
39206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  start_time_ = Time::Now();
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  fetcher_->set_max_retries(11);
39406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->Start();
39506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
39606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
39706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherProtectTestPassedThrough::OnURLFetchComplete(
39806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const URLFetcher* source,
39906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const GURL& url,
40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const net::URLRequestStatus& status,
40106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    int response_code,
40206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const ResponseCookies& cookies,
40306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const std::string& data) {
40406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  const TimeDelta one_minute = TimeDelta::FromMilliseconds(60000);
40506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  if (response_code >= 500) {
40606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // Now running ServerUnavailable test.
40706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // It should get here on the first attempt, so almost immediately and
40806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // *not* to attempt to execute all 11 requests (2.5 minutes).
40906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_TRUE(Time::Now() - start_time_ < one_minute);
41006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_TRUE(status.is_success());
41106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // Check that suggested back off time is bigger than 0.
41206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_GT(fetcher_->backoff_delay().InMicroseconds(), 0);
41306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    EXPECT_FALSE(data.empty());
41406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  } else {
41506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    // We should not get here!
4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ADD_FAILURE();
41706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  }
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  delete fetcher_;
4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
42106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
42206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
42306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
42406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochURLFetcherBadHTTPSTest::URLFetcherBadHTTPSTest() {
42506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  PathService::Get(base::DIR_SOURCE_ROOT, &cert_dir_);
42606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  cert_dir_ = cert_dir_.AppendASCII("chrome");
42706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  cert_dir_ = cert_dir_.AppendASCII("test");
42806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  cert_dir_ = cert_dir_.AppendASCII("data");
42906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  cert_dir_ = cert_dir_.AppendASCII("ssl");
43006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  cert_dir_ = cert_dir_.AppendASCII("certificates");
43106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
43206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
43306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// The "server certificate expired" error should result in automatic
43406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// cancellation of the request by
43521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// net::URLRequest::Delegate::OnSSLCertificateError.
43606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherBadHTTPSTest::OnURLFetchComplete(
43706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const URLFetcher* source,
43806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const GURL& url,
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const net::URLRequestStatus& status,
44006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    int response_code,
44106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const ResponseCookies& cookies,
44206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch    const std::string& data) {
44306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // This part is different from URLFetcherTest::OnURLFetchComplete
44406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // because this test expects the request to be cancelled.
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(net::URLRequestStatus::CANCELED, status.status());
44606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_EQ(net::ERR_ABORTED, status.os_error());
44706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_EQ(-1, response_code);
44806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_TRUE(cookies.empty());
44906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  EXPECT_TRUE(data.empty());
45006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
45106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // The rest is the same as URLFetcherTest::OnURLFetchComplete.
45206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  delete fetcher_;
45306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
45406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
45506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
45606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherCancelTest::CreateFetcher(const GURL& url) {
45706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_ = new URLFetcher(url, URLFetcher::GET, this);
45806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  CancelTestURLRequestContextGetter* context_getter =
45906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch      new CancelTestURLRequestContextGetter(io_message_loop_proxy());
46006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->set_request_context(context_getter);
461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  fetcher_->set_max_retries(2);
46206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  fetcher_->Start();
46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We need to wait for the creation of the net::URLRequestContext, since we
46406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // rely on it being destroyed as a signal to end the test.
46506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  context_getter->WaitForContextCreation();
46606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  CancelRequest();
46706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
46806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid URLFetcherCancelTest::OnURLFetchComplete(
47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const URLFetcher* source,
47172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GURL& url,
47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const net::URLRequestStatus& status,
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int response_code,
47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const ResponseCookies& cookies,
47572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& data) {
47606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // We should have cancelled the request before completion.
47706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ADD_FAILURE();
47806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  delete fetcher_;
47906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
48006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
48106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
48206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochvoid URLFetcherCancelTest::CancelRequest() {
48306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  delete fetcher_;
48406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // The URLFetcher's test context will post a Quit task once it is
48506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // deleted. So if this test simply hangs, it means cancellation
48606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // did not work.
48706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
48806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
489201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid URLFetcherMultipleAttemptTest::OnURLFetchComplete(
490201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const URLFetcher* source,
491201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const GURL& url,
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const net::URLRequestStatus& status,
493201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    int response_code,
494201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const ResponseCookies& cookies,
495201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string& data) {
496201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(status.is_success());
497201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(200, response_code);  // HTTP OK
498201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(data.empty());
499201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!data.empty() && data_.empty()) {
500201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    data_ = data;
501201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    fetcher_->Start();
502201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
503201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_EQ(data, data_);
504201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    delete fetcher_;  // Have to delete this here and not in the destructor,
505201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                      // because the destructor won't necessarily run on the
506201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                      // same thread that CreateFetcher() did.
507201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
508201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
509201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // If the current message loop is not the IO loop, it will be shut down when
510201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // the main loop returns and this thread subsequently goes out of scope.
511201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
512201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
513201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
51406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherTest, SameThreadsTest) {
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
51806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Create the fetcher on the main thread.  Since IO will happen on the main
51906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // thread, this will test URLFetcher's ability to do everything on one
52006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // thread.
5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CreateFetcher(test_server.GetURL("defaultresponse"));
52206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
52306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
52406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
52506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX)
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SIGSEGV on Mac: http://crbug.com/60426
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(URLFetcherTest, DISABLED_DifferentThreadsTest) {
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
53006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherTest, DifferentThreadsTest) {
53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Create a separate thread that will create the URLFetcher.  The current
53606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // (main) thread will do the IO, and when the fetch is complete it will
53706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // terminate the main thread's message loop; then the other thread's
53806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // message loop will be shut down automatically as the thread goes out of
53906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // scope.
54006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  base::Thread t("URLFetcher test thread");
54106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_TRUE(t.Start());
54206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this,
5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      test_server.GetURL("defaultresponse")));
54406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
54506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
54606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
54706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX)
54972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SIGSEGV on Mac: http://crbug.com/60426
55072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(URLFetcherPostTest, DISABLED_Basic) {
55172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
55206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherPostTest, Basic) {
55372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CreateFetcher(test_server.GetURL("echo"));
55806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
55906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
56006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
56106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherHeadersTest, Headers) {
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP,
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CreateFetcher(test_server.GetURL("files/with-headers.html"));
56706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
56806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // The actual tests are in the URLFetcherHeadersTest fixture.
56906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
57006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
57106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherProtectTest, Overload) {
5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server.GetURL("defaultresponse"));
57606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
57706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Registers an entry for test url. It only allows 3 requests to be sent
57806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // in 200 milliseconds.
579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::URLRequestThrottlerManager* manager =
580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::URLRequestThrottlerManager::GetInstance();
581201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_refptr<net::URLRequestThrottlerEntry> entry(
582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new net::URLRequestThrottlerEntry(manager, 200, 3, 1, 2.0, 0.0, 256));
583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  manager->OverrideEntryForTests(url, entry);
58406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
58506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  CreateFetcher(url);
58606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
58706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
588201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
589201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url);
59006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
59106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
59206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherProtectTest, ServerUnavailable) {
5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server.GetURL("files/server-unavailable.html"));
59706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
59806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Registers an entry for test url. The backoff time is calculated by:
59906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  //     new_backoff = 2.0 * old_backoff + 0
60006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // and maximum backoff time is 256 milliseconds.
60106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Maximum retries allowed is set to 11.
602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::URLRequestThrottlerManager* manager =
603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::URLRequestThrottlerManager::GetInstance();
604201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_refptr<net::URLRequestThrottlerEntry> entry(
605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new net::URLRequestThrottlerEntry(manager, 200, 3, 1, 2.0, 0.0, 256));
606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  manager->OverrideEntryForTests(url, entry);
60706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
60806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  CreateFetcher(url);
60906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
61006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
611201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
612201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url);
61306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
61406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
61506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherProtectTestPassedThrough, ServerUnavailablePropagateResponse) {
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
6183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server.GetURL("files/server-unavailable.html"));
62006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
62106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Registers an entry for test url. The backoff time is calculated by:
62206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  //     new_backoff = 2.0 * old_backoff + 0
623201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // and maximum backoff time is 150000 milliseconds.
62406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Maximum retries allowed is set to 11.
625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::URLRequestThrottlerManager* manager =
626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::URLRequestThrottlerManager::GetInstance();
627201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_refptr<net::URLRequestThrottlerEntry> entry(
628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new net::URLRequestThrottlerEntry(
629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          manager, 200, 3, 100, 2.0, 0.0, 150000));
63006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Total time if *not* for not doing automatic backoff would be 150s.
63106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // In reality it should be "as soon as server responds".
632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  manager->OverrideEntryForTests(url, entry);
63306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
63406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  CreateFetcher(url);
63506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
63606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
63706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
638201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url);
639201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
64006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
64172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX)
64272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SIGSEGV on Mac: http://crbug.com/60426
64372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(URLFetcherBadHTTPSTest, DISABLED_BadHTTPSTest) {
64472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
64506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherBadHTTPSTest, BadHTTPSTest) {
64672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
647513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  net::TestServer::HTTPSOptions https_options(
648513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      net::TestServer::HTTPSOptions::CERT_EXPIRED);
649513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  net::TestServer test_server(https_options, FilePath(kDocRoot));
6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
65106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
6523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CreateFetcher(test_server.GetURL("defaultresponse"));
65306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
65406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
65506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
65672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX)
65772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SIGSEGV on Mac: http://crbug.com/60426
65872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(URLFetcherCancelTest, DISABLED_ReleasesContext) {
65972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else
66006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherCancelTest, ReleasesContext) {
66172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server.GetURL("files/server-unavailable.html"));
66606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
66706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Registers an entry for test url. The backoff time is calculated by:
66806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  //     new_backoff = 2.0 * old_backoff + 0
66906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // The initial backoff is 2 seconds and maximum backoff is 4 seconds.
67006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Maximum retries allowed is set to 2.
671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::URLRequestThrottlerManager* manager =
672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::URLRequestThrottlerManager::GetInstance();
673201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_refptr<net::URLRequestThrottlerEntry> entry(
674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new net::URLRequestThrottlerEntry(
675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          manager, 200, 3, 2000, 2.0, 0.0, 4000));
676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  manager->OverrideEntryForTests(url, entry);
67706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
67806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Create a separate thread that will create the URLFetcher.  The current
67906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // (main) thread will do the IO, and when the fetch is complete it will
68006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // terminate the main thread's message loop; then the other thread's
68106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // message loop will be shut down automatically as the thread goes out of
68206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // scope.
68306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  base::Thread t("URLFetcher test thread");
68406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_TRUE(t.Start());
68506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, url));
68606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
68706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
688201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
689201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url);
69006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
69106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
69206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(URLFetcherCancelTest, CancelWhileDelayedStartTaskPending) {
6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
6953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server.GetURL("files/server-unavailable.html"));
69706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
69806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // Register an entry for test url.
699201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Using a sliding window of 4 seconds, and max of 1 request, under a fast
70006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // run we expect to have a 4 second delay when posting the Start task.
701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::URLRequestThrottlerManager* manager =
702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::URLRequestThrottlerManager::GetInstance();
703201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_refptr<net::URLRequestThrottlerEntry> entry(
704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new net::URLRequestThrottlerEntry(
705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          manager, 4000, 1, 2000, 2.0, 0.0, 4000));
706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  manager->OverrideEntryForTests(url, entry);
707201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Fake that a request has just started.
708201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  entry->ReserveSendingTimeForNextRequest(base::TimeTicks());
70906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
71006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // The next request we try to send will be delayed by ~4 seconds.
71106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // The slower the test runs, the less the delay will be (since it takes the
71206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  // time difference from now).
71306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
71406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  base::Thread t("URLFetcher test thread");
71506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  ASSERT_TRUE(t.Start());
71606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, url));
71706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
71806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch  MessageLoop::current()->Run();
719201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
720201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url);
721201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
722201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
723201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(URLFetcherMultipleAttemptTest, SameData) {
724201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
725201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(test_server.Start());
726201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
727201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Create the fetcher on the main thread.  Since IO will happen on the main
728201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // thread, this will test URLFetcher's ability to do everything on one
729201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // thread.
730201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CreateFetcher(test_server.GetURL("defaultresponse"));
731201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
732201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MessageLoop::current()->Run();
73306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}
73406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch
735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests to make sure CancelAll() will successfully cancel existing URLFetchers.
736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(URLFetcherTest, CancelAll) {
737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot));
738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_TRUE(test_server.Start());
739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(0, GetNumFetcherCores());
740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CreateFetcher(test_server.GetURL("defaultresponse"));
742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  io_message_loop_proxy()->PostTask(
743ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FROM_HERE,
744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new CurriedTask(new MessageLoop::QuitTask(), MessageLoop::current()));
745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MessageLoop::current()->Run();
746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(1, GetNumFetcherCores());
747ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLFetcher::CancelAll();
748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(0, GetNumFetcherCores());
749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delete fetcher_;
750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
75206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}  // namespace.
753