Index: chrome/browser/url_fetcher_unittest.cc |
=================================================================== |
--- chrome/browser/url_fetcher_unittest.cc (revision 8164) |
+++ chrome/browser/url_fetcher_unittest.cc (working copy) |
@@ -1,479 +0,0 @@ |
-// Copyright (c) 2006-2008 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/thread.h" |
-#include "base/time.h" |
-#include "chrome/browser/url_fetcher.h" |
-#include "chrome/browser/url_fetcher_protect.h" |
-#if defined(OS_LINUX) |
-// TODO(port): ugly hack for linux |
-namespace ChromePluginLib { |
- void UnloadAllPlugins() {} |
-} |
-#else |
-#include "chrome/common/chrome_plugin_lib.h" |
-#endif |
-#include "net/base/ssl_test_util.h" |
-#include "net/url_request/url_request_unittest.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using base::Time; |
-using base::TimeDelta; |
- |
-namespace { |
- |
-const wchar_t kDocRoot[] = L"chrome/test/data"; |
- |
-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 URLRequestStatus& status, |
- int response_code, |
- const ResponseCookies& cookies, |
- const std::string& data); |
- |
- protected: |
- virtual void SetUp() { |
- testing::Test::SetUp(); |
- |
- // Ensure that any plugin operations done by other tests are cleaned up. |
- ChromePluginLib::UnloadAllPlugins(); |
- } |
- |
- // 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_; |
- |
- URLFetcher* fetcher_; |
-}; |
- |
-// 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 URLRequestStatus& status, |
- int response_code, |
- const 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 URLRequestStatus& status, |
- int response_code, |
- const ResponseCookies& cookies, |
- const std::string& data); |
-}; |
- |
-// Version of URLFetcherTest that tests overload proctection. |
-class URLFetcherProtectTest : public URLFetcherTest { |
- public: |
- virtual void CreateFetcher(const GURL& url); |
- // URLFetcher::Delegate |
- virtual void OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const URLRequestStatus& status, |
- int response_code, |
- const 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 URLRequestStatus& status, |
- int response_code, |
- const ResponseCookies& cookies, |
- const std::string& data); |
- |
- protected: |
- FilePath GetExpiredCertPath(); |
- SSLTestUtil util_; |
- |
- 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 URLRequestStatus& status, |
- int response_code, |
- const ResponseCookies& cookies, |
- const std::string& data); |
- |
- void CancelRequest(); |
- void TestContextReleased(); |
- |
- private: |
- base::OneShotTimer<URLFetcherCancelTest> timer_; |
- bool context_released_; |
-}; |
- |
-// Version of TestURLRequestContext that let us know if the request context |
-// is properly released. |
-class CancelTestURLRequestContext : public TestURLRequestContext { |
- public: |
- explicit CancelTestURLRequestContext(bool* destructor_called) |
- : destructor_called_(destructor_called) { |
- *destructor_called_ = false; |
- } |
- |
- virtual ~CancelTestURLRequestContext() { |
- *destructor_called_ = true; |
- } |
- |
- private: |
- bool* destructor_called_; |
-}; |
- |
-// 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 URLFetcherTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context(new TestURLRequestContext()); |
- fetcher_->set_io_loop(&io_loop_); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const URLRequestStatus& status, |
- int response_code, |
- const 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_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
- // If MessageLoop::current() != io_loop_, it will be shut down when the |
- // main loop returns and this thread subsequently goes out of scope. |
-} |
- |
-void URLFetcherPostTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::POST, this); |
- fetcher_->set_request_context(new TestURLRequestContext()); |
- fetcher_->set_io_loop(&io_loop_); |
- fetcher_->set_upload_data("application/x-www-form-urlencoded", |
- "bobsyeruncle"); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const URLRequestStatus& status, |
- int response_code, |
- const 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 URLRequestStatus& status, |
- int response_code, |
- const 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 URLFetcherProtectTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context(new TestURLRequestContext()); |
- fetcher_->set_io_loop(&io_loop_); |
- start_time_ = Time::Now(); |
- fetcher_->Start(); |
-} |
- |
-void URLFetcherProtectTest::OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const URLRequestStatus& status, |
- int response_code, |
- const 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_loop_.Quit(); |
- } 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 pretection settings. |
- EXPECT_TRUE(Time::Now() - start_time_ >= one_second); |
- URLFetcherTest::OnURLFetchComplete(source, url, status, response_code, |
- cookies, data); |
- } |
- } |
-} |
- |
-URLFetcherBadHTTPSTest::URLFetcherBadHTTPSTest() { |
- PathService::Get(base::DIR_SOURCE_ROOT, &cert_dir_); |
- cert_dir_ = cert_dir_.Append(FILE_PATH_LITERAL("chrome")); |
- cert_dir_ = cert_dir_.Append(FILE_PATH_LITERAL("test")); |
- cert_dir_ = cert_dir_.Append(FILE_PATH_LITERAL("data")); |
- cert_dir_ = cert_dir_.Append(FILE_PATH_LITERAL("ssl")); |
- cert_dir_ = cert_dir_.Append(FILE_PATH_LITERAL("certificates")); |
-} |
- |
-// The "server certificate expired" error should result in automatic |
-// cancellation of the request by |
-// URLRequest::Delegate::OnSSLCertificateError. |
-void URLFetcherBadHTTPSTest::OnURLFetchComplete( |
- const URLFetcher* source, |
- const GURL& url, |
- const URLRequestStatus& status, |
- int response_code, |
- const ResponseCookies& cookies, |
- const std::string& data) { |
- // This part is different from URLFetcherTest::OnURLFetchComplete |
- // because this test expects the request to be cancelled. |
- EXPECT_EQ(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_loop_.Quit(); |
-} |
- |
-FilePath URLFetcherBadHTTPSTest::GetExpiredCertPath() { |
- return cert_dir_.Append(FILE_PATH_LITERAL("expired_cert.pem")); |
-} |
- |
-void URLFetcherCancelTest::CreateFetcher(const GURL& url) { |
- fetcher_ = new URLFetcher(url, URLFetcher::GET, this); |
- fetcher_->set_request_context( |
- new CancelTestURLRequestContext(&context_released_)); |
- fetcher_->set_io_loop(&io_loop_); |
- fetcher_->Start(); |
- // Make sure we give the IO thread a chance to run. |
- timer_.Start(TimeDelta::FromMilliseconds(100), this, |
- &URLFetcherCancelTest::CancelRequest); |
-} |
- |
-void URLFetcherCancelTest::OnURLFetchComplete(const URLFetcher* source, |
- const GURL& url, |
- const URLRequestStatus& status, |
- int response_code, |
- const ResponseCookies& cookies, |
- const std::string& data) { |
- // We should have cancelled the request before completion. |
- ADD_FAILURE(); |
- delete fetcher_; |
- io_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
- |
-void URLFetcherCancelTest::CancelRequest() { |
- delete fetcher_; |
- timer_.Stop(); |
- // Make sure we give the IO thread a chance to run. |
- timer_.Start(TimeDelta::FromMilliseconds(100), this, |
- &URLFetcherCancelTest::TestContextReleased); |
-} |
- |
-void URLFetcherCancelTest::TestContextReleased() { |
- EXPECT_TRUE(context_released_); |
- timer_.Stop(); |
- io_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
-} |
- |
-} // namespace. |
- |
-TEST_F(URLFetcherTest, SameThreadsTest) { |
- // 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. |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(kDocRoot); |
- ASSERT_TRUE(NULL != server.get()); |
- |
- CreateFetcher(GURL(server->TestServerPage("defaultresponse"))); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(URLFetcherTest, DifferentThreadsTest) { |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(kDocRoot); |
- ASSERT_TRUE(NULL != server.get()); |
- // 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"); |
- t.Start(); |
- t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, |
- GURL(server->TestServerPage("defaultresponse")))); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(URLFetcherPostTest, Basic) { |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(kDocRoot); |
- ASSERT_TRUE(NULL != server.get()); |
- CreateFetcher(GURL(server->TestServerPage("echo"))); |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(URLFetcherHeadersTest, Headers) { |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(L"net/data/url_request_unittest"); |
- ASSERT_TRUE(NULL != server.get()); |
- CreateFetcher(GURL(server->TestServerPage("files/with-headers.html"))); |
- MessageLoop::current()->Run(); |
- // The actual tests are in the URLFetcherHeadersTest fixture. |
-} |
- |
-TEST_F(URLFetcherProtectTest, Overload) { |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(kDocRoot); |
- ASSERT_TRUE(NULL != server.get()); |
- GURL url = GURL(server->TestServerPage("defaultresponse")); |
- |
- // Registers an entry for test url. It only allows 3 requests to be sent |
- // in 200 milliseconds. |
- URLFetcherProtectManager* manager = URLFetcherProtectManager::GetInstance(); |
- URLFetcherProtectEntry* entry = |
- new URLFetcherProtectEntry(200, 3, 11, 1, 2.0, 0, 256); |
- manager->Register(url.host(), entry); |
- |
- CreateFetcher(url); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(URLFetcherProtectTest, ServerUnavailable) { |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(L"chrome/test/data"); |
- ASSERT_TRUE(NULL != server.get()); |
- GURL url = GURL(server->TestServerPage("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. |
- URLFetcherProtectManager* manager = URLFetcherProtectManager::GetInstance(); |
- URLFetcherProtectEntry* entry = |
- new URLFetcherProtectEntry(200, 3, 11, 1, 2.0, 0, 256); |
- manager->Register(url.host(), entry); |
- |
- CreateFetcher(url); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-#if defined(OS_WIN) |
-TEST_F(URLFetcherBadHTTPSTest, BadHTTPSTest) { |
-#else |
-// TODO(port): Enable BadHTTPSTest. Currently asserts in |
-// URLFetcherBadHTTPSTest::OnURLFetchComplete don't pass. |
-TEST_F(URLFetcherBadHTTPSTest, DISABLED_BadHTTPSTest) { |
-#endif |
- scoped_refptr<HTTPSTestServer> server = |
- HTTPSTestServer::CreateServer(util_.kHostName, util_.kBadHTTPSPort, |
- kDocRoot, util_.GetExpiredCertPath().ToWStringHack()); |
- ASSERT_TRUE(NULL != server.get()); |
- |
- CreateFetcher(GURL(server->TestServerPage("defaultresponse"))); |
- |
- MessageLoop::current()->Run(); |
-} |
- |
-TEST_F(URLFetcherCancelTest, ReleasesContext) { |
- scoped_refptr<HTTPTestServer> server = |
- HTTPTestServer::CreateServer(L"chrome/test/data"); |
- ASSERT_TRUE(NULL != server.get()); |
- GURL url = GURL(server->TestServerPage("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. |
- URLFetcherProtectManager* manager = URLFetcherProtectManager::GetInstance(); |
- URLFetcherProtectEntry* entry = |
- new URLFetcherProtectEntry(200, 3, 2, 2000, 2.0, 0, 4000); |
- manager->Register(url.host(), 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"); |
- t.Start(); |
- t.message_loop()->PostTask(FROM_HERE, new FetcherWrapperTask(this, url)); |
- |
- MessageLoop::current()->Run(); |
-} |