Index: chrome/common/net/url_fetcher_unittest.cc |
=================================================================== |
--- chrome/common/net/url_fetcher_unittest.cc (revision 87381) |
+++ chrome/common/net/url_fetcher_unittest.cc (working copy) |
@@ -1,902 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/message_loop_proxy.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "base/threading/thread.h" |
-#include "build/build_config.h" |
-#include "chrome/common/net/url_fetcher.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/test/test_server.h" |
-#include "net/url_request/url_request_context_getter.h" |
-#include "net/url_request/url_request_test_util.h" |
-#include "net/url_request/url_request_throttler_manager.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-#if defined(USE_NSS) |
-#include "net/ocsp/nss_ocsp.h" |
-#endif |
- |
-using base::Time; |
-using base::TimeDelta; |
- |
-// TODO(eroman): Add a regression test for http://crbug.com/40505. |
- |
-namespace { |
- |
-const FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data"); |
-const std::string kTestServerFilePrefix = "files/"; |
- |
-class CurriedTask : public Task { |
- public: |
- CurriedTask(Task* task, MessageLoop* target_loop) |
- : task_(task), |
- target_loop_(target_loop) {} |
- |
- virtual void Run() { |
- target_loop_->PostTask(FROM_HERE, task_); |
- } |
- |
- private: |
- Task* const task_; |
- MessageLoop* const target_loop_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CurriedTask); |
-}; |
- |
-class TestURLRequestContextGetter : public net::URLRequestContextGetter { |
- public: |
- explicit TestURLRequestContextGetter( |
- base::MessageLoopProxy* io_message_loop_proxy) |
- : io_message_loop_proxy_(io_message_loop_proxy) { |
- } |
- virtual net::URLRequestContext* GetURLRequestContext() { |
- if (!context_) |
- context_ = new TestURLRequestContext(); |
- return context_; |
- } |
- virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const { |
- return io_message_loop_proxy_; |
- } |
- |
- protected: |
- scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; |
- |
- private: |
- ~TestURLRequestContextGetter() {} |
- |
- scoped_refptr<net::URLRequestContext> context_; |
-}; |
- |
-} // namespace |
- |
-class URLFetcherTest : public testing::Test, public URLFetcher::Delegate { |
- public: |
- URLFetcherTest() : fetcher_(NULL) { } |
- |
- // Creates a URLFetcher, using the program's main thread to do IO. |
- virtual void CreateFetcher(const GURL& url); |
- |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- |
- scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() { |
- return io_message_loop_proxy_; |
- } |
- |
- protected: |
- virtual void SetUp() { |
- testing::Test::SetUp(); |
- |
- io_message_loop_proxy_ = base::MessageLoopProxy::CreateForCurrentThread(); |
- |
-#if defined(USE_NSS) |
- net::EnsureOCSPInit(); |
-#endif |
- } |
- |
- virtual void TearDown() { |
-#if defined(USE_NSS) |
- net::ShutdownOCSP(); |
-#endif |
- } |
- |
- int GetNumFetcherCores() const { |
- return URLFetcher::GetNumFetcherCores(); |
- } |
- |
- // URLFetcher is designed to run on the main UI thread, but in our tests |
- // we assume that the current thread is the IO thread where the URLFetcher |
- // dispatches its requests to. When we wish to simulate being used from |
- // a UI thread, we dispatch a worker thread to do so. |
- MessageLoopForIO io_loop_; |
- scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; |
- |
- URLFetcher* fetcher_; |
-}; |
- |
-void URLFetcherTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context(new TestURLRequestContextGetter( |
- io_message_loop_proxy())); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- EXPECT_TRUE(status.is_success()); |
- EXPECT_EQ(200, response_code); // HTTP OK |
- EXPECT_FALSE(data.empty()); |
- |
- delete fetcher_; // Have to delete this here and not in the destructor, |
- // because the destructor won't necessarily run on the |
- // same thread that CreateFetcher() did. |
- |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
- // If the current message loop is not the IO loop, it will be shut down when |
- // the main loop returns and this thread subsequently goes out of scope. |
-} |
- |
-namespace { |
- |
-// Version of URLFetcherTest that does a POST instead |
-class URLFetcherPostTest : public URLFetcherTest { |
- public: |
- virtual void CreateFetcher(const GURL& url); |
- |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
-}; |
- |
-// Version of URLFetcherTest that tests headers. |
-class URLFetcherHeadersTest : public URLFetcherTest { |
- public: |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
-}; |
- |
-// Version of URLFetcherTest that tests SocketAddress. |
-class URLFetcherSocketAddressTest : public URLFetcherTest { |
- public: |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- protected: |
- std::string expected_host_; |
- uint16 expected_port_; |
-}; |
- |
-// Version of URLFetcherTest that tests overload protection. |
-class URLFetcherProtectTest : public URLFetcherTest { |
- public: |
- virtual void CreateFetcher(const GURL& url); |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- private: |
- Time start_time_; |
-}; |
- |
-// Version of URLFetcherTest that tests overload protection, when responses |
-// passed through. |
-class URLFetcherProtectTestPassedThrough : public URLFetcherTest { |
- public: |
- virtual void CreateFetcher(const GURL& url); |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- private: |
- Time start_time_; |
-}; |
- |
-// Version of URLFetcherTest that tests bad HTTPS requests. |
-class URLFetcherBadHTTPSTest : public URLFetcherTest { |
- public: |
- URLFetcherBadHTTPSTest(); |
- |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- |
- private: |
- FilePath cert_dir_; |
-}; |
- |
-// Version of URLFetcherTest that tests request cancellation on shutdown. |
-class URLFetcherCancelTest : public URLFetcherTest { |
- public: |
- virtual void CreateFetcher(const GURL& url); |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- |
- void CancelRequest(); |
-}; |
- |
-// Version of TestURLRequestContext that posts a Quit task to the IO |
-// thread once it is deleted. |
-class CancelTestURLRequestContext : public TestURLRequestContext { |
- virtual ~CancelTestURLRequestContext() { |
- // The d'tor should execute in the IO thread. Post the quit task to the |
- // current thread. |
- MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
- } |
-}; |
- |
-class CancelTestURLRequestContextGetter : public net::URLRequestContextGetter { |
- public: |
- explicit CancelTestURLRequestContextGetter( |
- base::MessageLoopProxy* io_message_loop_proxy) |
- : io_message_loop_proxy_(io_message_loop_proxy), |
- context_created_(false, false) { |
- } |
- virtual net::URLRequestContext* GetURLRequestContext() { |
- if (!context_) { |
- context_ = new CancelTestURLRequestContext(); |
- context_created_.Signal(); |
- } |
- return context_; |
- } |
- virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const { |
- return io_message_loop_proxy_; |
- } |
- void WaitForContextCreation() { |
- context_created_.Wait(); |
- } |
- |
- private: |
- ~CancelTestURLRequestContextGetter() {} |
- |
- scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; |
- base::WaitableEvent context_created_; |
- scoped_refptr<net::URLRequestContext> context_; |
-}; |
- |
-// Version of URLFetcherTest that tests retying the same request twice. |
-class URLFetcherMultipleAttemptTest : public URLFetcherTest { |
- public: |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- private: |
- std::string data_; |
-}; |
- |
-class URLFetcherTempFileTest : public URLFetcherTest { |
- public: |
- URLFetcherTempFileTest() |
- : take_ownership_of_temp_file_(false) { |
- } |
- |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source); |
- |
- // This obsolete signature should not be used, but must be present |
- // to make clang happy. |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data); |
- |
- virtual void CreateFetcher(const GURL& url); |
- |
- protected: |
- FilePath expected_file_; |
- FilePath temp_file_; |
- |
- // Set by the test. Used in OnURLFetchComplete() to decide if |
- // the URLFetcher should own the temp file, so that we can test |
- // disowning prevents the file from being deleted. |
- bool take_ownership_of_temp_file_; |
-}; |
- |
-void URLFetcherTempFileTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context(new TestURLRequestContextGetter( |
- io_message_loop_proxy())); |
- |
- // Use the IO message loop to do the file operations in this test. |
- fetcher_->SaveResponseToTemporaryFile(io_message_loop_proxy()); |
- fetcher_->Start(); |
-} |
- |
-TEST_F(URLFetcherTempFileTest, SmallGet) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- // Get a small file. |
- const char* kFileToFetch = "simple.html"; |
- expected_file_ = test_server.document_root().AppendASCII(kFileToFetch); |
- CreateFetcher(test_server.GetURL(kTestServerFilePrefix + kFileToFetch)); |
- |
- MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). |
- |
- ASSERT_FALSE(file_util::PathExists(temp_file_)) |
- << temp_file_.value() << " not removed."; |
-} |
- |
-TEST_F(URLFetcherTempFileTest, LargeGet) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- // Get a file large enough to require more than one read into |
- // URLFetcher::Core's IOBuffer. |
- const char* kFileToFetch = "animate1.gif"; |
- expected_file_ = test_server.document_root().AppendASCII(kFileToFetch); |
- CreateFetcher(test_server.GetURL(kTestServerFilePrefix + kFileToFetch)); |
- |
- MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). |
-} |
- |
-TEST_F(URLFetcherTempFileTest, CanTakeOwnershipOfFile) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- // Get a small file. |
- const char* kFileToFetch = "simple.html"; |
- expected_file_ = test_server.document_root().AppendASCII(kFileToFetch); |
- CreateFetcher(test_server.GetURL(kTestServerFilePrefix + kFileToFetch)); |
- |
- MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit(). |
- |
- MessageLoop::current()->RunAllPending(); |
- ASSERT_FALSE(file_util::PathExists(temp_file_)) |
- << temp_file_.value() << " not removed."; |
-} |
- |
-// Wrapper that lets us call CreateFetcher() on a thread of our choice. We |
-// could make URLFetcherTest refcounted and use PostTask(FROM_HERE.. ) to call |
-// CreateFetcher() directly, but the ownership of the URLFetcherTest is a bit |
-// confusing in that case because GTest doesn't know about the refcounting. |
-// It's less confusing to just do it this way. |
-class FetcherWrapperTask : public Task { |
- public: |
- FetcherWrapperTask(URLFetcherTest* test, const GURL& url) |
- : test_(test), url_(url) { } |
- virtual void Run() { |
- test_->CreateFetcher(url_); |
- } |
- |
- private: |
- URLFetcherTest* test_; |
- GURL url_; |
-}; |
- |
-void URLFetcherPostTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::POST, this); |
- fetcher_->set_request_context(new TestURLRequestContextGetter( |
- io_message_loop_proxy())); |
- fetcher_->set_upload_data("application/x-www-form-urlencoded", |
- "bobsyeruncle"); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- EXPECT_EQ(std::string("bobsyeruncle"), data); |
- URLFetcherTest::OnURLFetchComplete(source, url, status, response_code, |
- cookies, data); |
-} |
- |
-void URLFetcherHeadersTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- std::string header; |
- EXPECT_TRUE(source->response_headers()->GetNormalizedHeader("cache-control", |
- &header)); |
- EXPECT_EQ("private", header); |
- URLFetcherTest::OnURLFetchComplete(source, url, status, response_code, |
- cookies, data); |
-} |
- |
-void URLFetcherSocketAddressTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- EXPECT_EQ("127.0.0.1", source->socket_address().host()); |
- EXPECT_EQ(expected_port_, source->socket_address().port()); |
- URLFetcherTest::OnURLFetchComplete(source, url, status, response_code, |
- cookies, data); |
-} |
- |
-void URLFetcherProtectTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context(new TestURLRequestContextGetter( |
- io_message_loop_proxy())); |
- start_time_ = Time::Now(); |
- fetcher_->set_max_retries(11); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherProtectTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- const TimeDelta one_second = TimeDelta::FromMilliseconds(1000); |
- if (response_code >= 500) { |
- // Now running ServerUnavailable test. |
- // It takes more than 1 second to finish all 11 requests. |
- EXPECT_TRUE(Time::Now() - start_time_ >= one_second); |
- EXPECT_TRUE(status.is_success()); |
- EXPECT_FALSE(data.empty()); |
- delete fetcher_; |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
- } else { |
- // Now running Overload test. |
- static int count = 0; |
- count++; |
- if (count < 20) { |
- fetcher_->Start(); |
- } else { |
- // We have already sent 20 requests continuously. And we expect that |
- // it takes more than 1 second due to the overload protection settings. |
- EXPECT_TRUE(Time::Now() - start_time_ >= one_second); |
- URLFetcherTest::OnURLFetchComplete(source, url, status, response_code, |
- cookies, data); |
- } |
- } |
-} |
- |
-void URLFetcherProtectTestPassedThrough::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context(new TestURLRequestContextGetter( |
- io_message_loop_proxy())); |
- fetcher_->set_automatically_retry_on_5xx(false); |
- start_time_ = Time::Now(); |
- fetcher_->set_max_retries(11); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherProtectTestPassedThrough::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- const TimeDelta one_minute = TimeDelta::FromMilliseconds(60000); |
- if (response_code >= 500) { |
- // Now running ServerUnavailable test. |
- // It should get here on the first attempt, so almost immediately and |
- // *not* to attempt to execute all 11 requests (2.5 minutes). |
- EXPECT_TRUE(Time::Now() - start_time_ < one_minute); |
- EXPECT_TRUE(status.is_success()); |
- // Check that suggested back off time is bigger than 0. |
- EXPECT_GT(fetcher_->backoff_delay().InMicroseconds(), 0); |
- EXPECT_FALSE(data.empty()); |
- } else { |
- // We should not get here! |
- ADD_FAILURE(); |
- } |
- |
- delete fetcher_; |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
- |
- |
-URLFetcherBadHTTPSTest::URLFetcherBadHTTPSTest() { |
- PathService::Get(base::DIR_SOURCE_ROOT, &cert_dir_); |
- cert_dir_ = cert_dir_.AppendASCII("chrome"); |
- cert_dir_ = cert_dir_.AppendASCII("test"); |
- cert_dir_ = cert_dir_.AppendASCII("data"); |
- cert_dir_ = cert_dir_.AppendASCII("ssl"); |
- cert_dir_ = cert_dir_.AppendASCII("certificates"); |
-} |
- |
-// The "server certificate expired" error should result in automatic |
-// cancellation of the request by |
-// net::URLRequest::Delegate::OnSSLCertificateError. |
-void URLFetcherBadHTTPSTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- // This part is different from URLFetcherTest::OnURLFetchComplete |
- // because this test expects the request to be cancelled. |
- EXPECT_EQ(net::URLRequestStatus::CANCELED, status.status()); |
- EXPECT_EQ(net::ERR_ABORTED, status.os_error()); |
- EXPECT_EQ(-1, response_code); |
- EXPECT_TRUE(cookies.empty()); |
- EXPECT_TRUE(data.empty()); |
- |
- // The rest is the same as URLFetcherTest::OnURLFetchComplete. |
- delete fetcher_; |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
- |
-void URLFetcherCancelTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- CancelTestURLRequestContextGetter* context_getter = |
- new CancelTestURLRequestContextGetter(io_message_loop_proxy()); |
- fetcher_->set_request_context(context_getter); |
- fetcher_->set_max_retries(2); |
- fetcher_->Start(); |
- // We need to wait for the creation of the net::URLRequestContext, since we |
- // rely on it being destroyed as a signal to end the test. |
- context_getter->WaitForContextCreation(); |
- CancelRequest(); |
-} |
- |
-void URLFetcherCancelTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- // We should have cancelled the request before completion. |
- ADD_FAILURE(); |
- delete fetcher_; |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
- |
-void URLFetcherCancelTest::CancelRequest() { |
- delete fetcher_; |
- // The URLFetcher's test context will post a Quit task once it is |
- // deleted. So if this test simply hangs, it means cancellation |
- // did not work. |
-} |
- |
-void URLFetcherMultipleAttemptTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- EXPECT_TRUE(status.is_success()); |
- EXPECT_EQ(200, response_code); // HTTP OK |
- EXPECT_FALSE(data.empty()); |
- if (!data.empty() && data_.empty()) { |
- data_ = data; |
- fetcher_->Start(); |
- } else { |
- EXPECT_EQ(data, data_); |
- delete fetcher_; // Have to delete this here and not in the destructor, |
- // because the destructor won't necessarily run on the |
- // same thread that CreateFetcher() did. |
- |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
- // If the current message loop is not the IO loop, it will be shut down when |
- // the main loop returns and this thread subsequently goes out of scope. |
- } |
-} |
- |
-void URLFetcherTempFileTest::OnURLFetchComplete(const URLFetcher* source) { |
- EXPECT_TRUE(source->status().is_success()); |
- EXPECT_EQ(source->response_code(), 200); |
- |
- EXPECT_TRUE(source->GetResponseAsFilePath( |
- take_ownership_of_temp_file_, &temp_file_)); |
- |
- EXPECT_TRUE(file_util::ContentsEqual(expected_file_, temp_file_)); |
- |
- delete fetcher_; |
- |
- io_message_loop_proxy()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
- |
-void URLFetcherTempFileTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const net::URLRequestStatus& status, |
- int response_code, |
- const net::ResponseCookies& cookies, |
- const std::string& data) { |
- NOTREACHED(); |
-} |
- |
- |
-TEST_F(URLFetcherTest, SameThreadsTest) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- // Create the fetcher on the main thread. Since IO will happen on the main |
- // thread, this will test URLFetcher's ability to do everything on one |
- // thread. |
- CreateFetcher(test_server.GetURL("defaultresponse")); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-#if defined(OS_MACOSX) |
-// SIGSEGV on Mac: http://crbug.com/60426 |
-TEST_F(URLFetcherTest, DISABLED_DifferentThreadsTest) { |
-#else |
-TEST_F(URLFetcherTest, DifferentThreadsTest) { |
-#endif |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- // Create a separate thread that will create the URLFetcher. The current |
- // (main) thread will do the IO, and when the fetch is complete it will |
- // terminate the main thread's message loop; then the other thread's |
- // message loop will be shut down automatically as the thread goes out of |
- // scope. |
- base::Thread t("URLFetcher test thread"); |
- ASSERT_TRUE(t.Start()); |
- t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, |
- test_server.GetURL("defaultresponse"))); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-#if defined(OS_MACOSX) |
-// SIGSEGV on Mac: http://crbug.com/60426 |
-TEST_F(URLFetcherPostTest, DISABLED_Basic) { |
-#else |
-TEST_F(URLFetcherPostTest, Basic) { |
-#endif |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- CreateFetcher(test_server.GetURL("echo")); |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(URLFetcherHeadersTest, Headers) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, |
- FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); |
- ASSERT_TRUE(test_server.Start()); |
- |
- CreateFetcher(test_server.GetURL("files/with-headers.html")); |
- MessageLoop::current()->Run(); |
- // The actual tests are in the URLFetcherHeadersTest fixture. |
-} |
- |
-TEST_F(URLFetcherSocketAddressTest, SocketAddress) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, |
- FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); |
- ASSERT_TRUE(test_server.Start()); |
- expected_port_ = test_server.host_port_pair().port(); |
- |
- // Reusing "with-headers.html" but doesn't really matter. |
- CreateFetcher(test_server.GetURL("files/with-headers.html")); |
- MessageLoop::current()->Run(); |
- // The actual tests are in the URLFetcherSocketAddressTest fixture. |
-} |
- |
-TEST_F(URLFetcherProtectTest, Overload) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- GURL url(test_server.GetURL("defaultresponse")); |
- |
- // Registers an entry for test url. It only allows 3 requests to be sent |
- // in 200 milliseconds. |
- net::URLRequestThrottlerManager* manager = |
- net::URLRequestThrottlerManager::GetInstance(); |
- scoped_refptr<net::URLRequestThrottlerEntry> entry( |
- new net::URLRequestThrottlerEntry(manager, "", 200, 3, 1, 2.0, 0.0, 256)); |
- manager->OverrideEntryForTests(url, entry); |
- |
- CreateFetcher(url); |
- |
- MessageLoop::current()->Run(); |
- |
- net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url); |
-} |
- |
-TEST_F(URLFetcherProtectTest, ServerUnavailable) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- GURL url(test_server.GetURL("files/server-unavailable.html")); |
- |
- // Registers an entry for test url. The backoff time is calculated by: |
- // new_backoff = 2.0 * old_backoff + 0 |
- // and maximum backoff time is 256 milliseconds. |
- // Maximum retries allowed is set to 11. |
- net::URLRequestThrottlerManager* manager = |
- net::URLRequestThrottlerManager::GetInstance(); |
- scoped_refptr<net::URLRequestThrottlerEntry> entry( |
- new net::URLRequestThrottlerEntry(manager, "", 200, 3, 1, 2.0, 0.0, 256)); |
- manager->OverrideEntryForTests(url, entry); |
- |
- CreateFetcher(url); |
- |
- MessageLoop::current()->Run(); |
- |
- net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url); |
-} |
- |
-TEST_F(URLFetcherProtectTestPassedThrough, ServerUnavailablePropagateResponse) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- GURL url(test_server.GetURL("files/server-unavailable.html")); |
- |
- // Registers an entry for test url. The backoff time is calculated by: |
- // new_backoff = 2.0 * old_backoff + 0 |
- // and maximum backoff time is 150000 milliseconds. |
- // Maximum retries allowed is set to 11. |
- net::URLRequestThrottlerManager* manager = |
- net::URLRequestThrottlerManager::GetInstance(); |
- scoped_refptr<net::URLRequestThrottlerEntry> entry( |
- new net::URLRequestThrottlerEntry( |
- manager, "", 200, 3, 100, 2.0, 0.0, 150000)); |
- // Total time if *not* for not doing automatic backoff would be 150s. |
- // In reality it should be "as soon as server responds". |
- manager->OverrideEntryForTests(url, entry); |
- |
- CreateFetcher(url); |
- |
- MessageLoop::current()->Run(); |
- |
- net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url); |
-} |
- |
-#if defined(OS_MACOSX) |
-// SIGSEGV on Mac: http://crbug.com/60426 |
-TEST_F(URLFetcherBadHTTPSTest, DISABLED_BadHTTPSTest) { |
-#else |
-TEST_F(URLFetcherBadHTTPSTest, BadHTTPSTest) { |
-#endif |
- net::TestServer::HTTPSOptions https_options( |
- net::TestServer::HTTPSOptions::CERT_EXPIRED); |
- net::TestServer test_server(https_options, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- CreateFetcher(test_server.GetURL("defaultresponse")); |
- MessageLoop::current()->Run(); |
-} |
- |
-#if defined(OS_MACOSX) |
-// SIGSEGV on Mac: http://crbug.com/60426 |
-TEST_F(URLFetcherCancelTest, DISABLED_ReleasesContext) { |
-#else |
-TEST_F(URLFetcherCancelTest, ReleasesContext) { |
-#endif |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- GURL url(test_server.GetURL("files/server-unavailable.html")); |
- |
- // Registers an entry for test url. The backoff time is calculated by: |
- // new_backoff = 2.0 * old_backoff +0 |
- // The initial backoff is 2 seconds and maximum backoff is 4 seconds. |
- // Maximum retries allowed is set to 2. |
- net::URLRequestThrottlerManager* manager = |
- net::URLRequestThrottlerManager::GetInstance(); |
- scoped_refptr<net::URLRequestThrottlerEntry> entry( |
- new net::URLRequestThrottlerEntry( |
- manager, "", 200, 3, 2000, 2.0, 0.0, 4000)); |
- manager->OverrideEntryForTests(url, entry); |
- |
- // Create a separate thread that will create the URLFetcher. The current |
- // (main) thread will do the IO, and when the fetch is complete it will |
- // terminate the main thread's message loop; then the other thread's |
- // message loop will be shut down automatically as the thread goes out of |
- // scope. |
- base::Thread t("URLFetcher test thread"); |
- ASSERT_TRUE(t.Start()); |
- t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, url)); |
- |
- MessageLoop::current()->Run(); |
- |
- net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url); |
-} |
- |
-TEST_F(URLFetcherCancelTest, CancelWhileDelayedStartTaskPending) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- GURL url(test_server.GetURL("files/server-unavailable.html")); |
- |
- // Register an entry for test url. |
- // Using a sliding window of 4 seconds, and max of 1 request, under a fast |
- // run we expect to have a 4 second delay when posting the Start task. |
- net::URLRequestThrottlerManager* manager = |
- net::URLRequestThrottlerManager::GetInstance(); |
- scoped_refptr<net::URLRequestThrottlerEntry> entry( |
- new net::URLRequestThrottlerEntry( |
- manager, "", 4000, 1, 2000, 2.0, 0.0, 4000)); |
- manager->OverrideEntryForTests(url, entry); |
- // Fake that a request has just started. |
- entry->ReserveSendingTimeForNextRequest(base::TimeTicks()); |
- |
- // The next request we try to send will be delayed by ~4 seconds. |
- // The slower the test runs, the less the delay will be (since it takes the |
- // time difference from now). |
- |
- base::Thread t("URLFetcher test thread"); |
- ASSERT_TRUE(t.Start()); |
- t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, url)); |
- |
- MessageLoop::current()->Run(); |
- |
- net::URLRequestThrottlerManager::GetInstance()->EraseEntryForTests(url); |
-} |
- |
-TEST_F(URLFetcherMultipleAttemptTest, SameData) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- |
- // Create the fetcher on the main thread. Since IO will happen on the main |
- // thread, this will test URLFetcher's ability to do everything on one |
- // thread. |
- CreateFetcher(test_server.GetURL("defaultresponse")); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-// Tests to make sure CancelAll() will successfully cancel existing URLFetchers. |
-TEST_F(URLFetcherTest, CancelAll) { |
- net::TestServer test_server(net::TestServer::TYPE_HTTP, FilePath(kDocRoot)); |
- ASSERT_TRUE(test_server.Start()); |
- EXPECT_EQ(0, GetNumFetcherCores()); |
- |
- CreateFetcher(test_server.GetURL("defaultresponse")); |
- io_message_loop_proxy()->PostTask( |
- FROM_HERE, |
- new CurriedTask(new MessageLoop::QuitTask(), MessageLoop::current())); |
- MessageLoop::current()->Run(); |
- EXPECT_EQ(1, GetNumFetcherCores()); |
- URLFetcher::CancelAll(); |
- EXPECT_EQ(0, GetNumFetcherCores()); |
- delete fetcher_; |
-} |
- |
-} // namespace. |