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