| Index: net/url_request/url_fetcher_impl_unittest.cc
|
| diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc
|
| deleted file mode 100644
|
| index faea357e5d60dcdc81378daf688f6da4f2e62e5b..0000000000000000000000000000000000000000
|
| --- a/net/url_request/url_fetcher_impl_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1619 +0,0 @@
|
| -// Copyright (c) 2012 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 "net/url_request/url_fetcher_impl.h"
|
| -
|
| -#include <algorithm>
|
| -#include <string>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| -#include "base/path_service.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/threading/thread.h"
|
| -#include "build/build_config.h"
|
| -#include "crypto/nss_util.h"
|
| -#include "net/base/elements_upload_data_stream.h"
|
| -#include "net/base/network_change_notifier.h"
|
| -#include "net/base/upload_bytes_element_reader.h"
|
| -#include "net/base/upload_element_reader.h"
|
| -#include "net/base/upload_file_element_reader.h"
|
| -#include "net/dns/mock_host_resolver.h"
|
| -#include "net/http/http_response_headers.h"
|
| -#include "net/test/spawned_test_server/spawned_test_server.h"
|
| -#include "net/url_request/url_fetcher_delegate.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) || defined(OS_IOS)
|
| -#include "net/ocsp/nss_ocsp.h"
|
| -#endif
|
| -
|
| -namespace net {
|
| -
|
| -using base::Time;
|
| -using base::TimeDelta;
|
| -
|
| -// TODO(eroman): Add a regression test for http://crbug.com/40505.
|
| -
|
| -namespace {
|
| -
|
| -// TODO(akalin): Move all the test data to somewhere under net/.
|
| -const base::FilePath::CharType kDocRoot[] =
|
| - FILE_PATH_LITERAL("net/data/url_fetcher_impl_unittest");
|
| -const char kTestServerFilePrefix[] = "files/";
|
| -
|
| -class ThrottlingTestURLRequestContext : public TestURLRequestContext {
|
| - public:
|
| - ThrottlingTestURLRequestContext() : TestURLRequestContext(true) {
|
| - set_throttler_manager(&throttler_manager_);
|
| - Init();
|
| - DCHECK(throttler_manager() != NULL);
|
| - }
|
| -
|
| - private:
|
| - URLRequestThrottlerManager throttler_manager_;
|
| -};
|
| -
|
| -class ThrottlingTestURLRequestContextGetter
|
| - : public TestURLRequestContextGetter {
|
| - public:
|
| - ThrottlingTestURLRequestContextGetter(
|
| - base::MessageLoopProxy* io_message_loop_proxy,
|
| - TestURLRequestContext* request_context)
|
| - : TestURLRequestContextGetter(io_message_loop_proxy),
|
| - context_(request_context) {
|
| - }
|
| -
|
| - // TestURLRequestContextGetter:
|
| - TestURLRequestContext* GetURLRequestContext() override { return context_; }
|
| -
|
| - protected:
|
| - ~ThrottlingTestURLRequestContextGetter() override {}
|
| -
|
| - TestURLRequestContext* const context_;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class URLFetcherTest : public testing::Test,
|
| - public URLFetcherDelegate {
|
| - public:
|
| - URLFetcherTest() : fetcher_(NULL), expected_status_code_(200) {}
|
| -
|
| - static int GetNumFetcherCores() {
|
| - return URLFetcherImpl::GetNumFetcherCores();
|
| - }
|
| -
|
| - // Creates a URLFetcher, using the program's main thread to do IO.
|
| - virtual void CreateFetcher(const GURL& url);
|
| -
|
| - // URLFetcherDelegate:
|
| - // Subclasses that override this should either call this function or
|
| - // CleanupAfterFetchComplete() at the end of their processing, depending on
|
| - // whether they want to check for a non-empty HTTP 200 response or not.
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - // Deletes |fetcher| and terminates the message loop.
|
| - void CleanupAfterFetchComplete();
|
| -
|
| - scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() {
|
| - return io_message_loop_proxy_;
|
| - }
|
| -
|
| - TestURLRequestContext* request_context() {
|
| - return context_.get();
|
| - }
|
| -
|
| - protected:
|
| - // testing::Test:
|
| - void SetUp() override {
|
| - testing::Test::SetUp();
|
| -
|
| - context_.reset(new ThrottlingTestURLRequestContext());
|
| - io_message_loop_proxy_ = base::MessageLoopProxy::current();
|
| -
|
| -#if defined(USE_NSS) || defined(OS_IOS)
|
| - crypto::EnsureNSSInit();
|
| - EnsureNSSHttpIOInit();
|
| -#endif
|
| - }
|
| -
|
| - void TearDown() override {
|
| -#if defined(USE_NSS) || defined(OS_IOS)
|
| - ShutdownNSSHttpIO();
|
| -#endif
|
| - }
|
| -
|
| - // 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.
|
| - scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
|
| -
|
| - URLFetcherImpl* fetcher_;
|
| - scoped_ptr<TestURLRequestContext> context_;
|
| - int expected_status_code_;
|
| -};
|
| -
|
| -// A test fixture that uses a MockHostResolver, so that name resolutions can
|
| -// be manipulated by the tests to keep connections in the resolving state.
|
| -class URLFetcherMockDnsTest : public URLFetcherTest {
|
| - public:
|
| - // testing::Test:
|
| - void SetUp() override;
|
| -
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - protected:
|
| - GURL test_url_;
|
| - scoped_ptr<SpawnedTestServer> test_server_;
|
| - MockHostResolver resolver_;
|
| - scoped_ptr<URLFetcher> completed_fetcher_;
|
| -};
|
| -
|
| -void URLFetcherTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - EXPECT_TRUE(source->GetStatus().is_success());
|
| - EXPECT_EQ(expected_status_code_, source->GetResponseCode()); // HTTP OK
|
| -
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_FALSE(data.empty());
|
| -
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -void URLFetcherTest::CleanupAfterFetchComplete() {
|
| - 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,
|
| - base::MessageLoop::QuitClosure());
|
| - // 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 URLFetcherMockDnsTest::SetUp() {
|
| - URLFetcherTest::SetUp();
|
| -
|
| - resolver_.set_ondemand_mode(true);
|
| - resolver_.rules()->AddRule("example.com", "127.0.0.1");
|
| -
|
| - context_.reset(new TestURLRequestContext(true));
|
| - context_->set_host_resolver(&resolver_);
|
| - context_->Init();
|
| -
|
| - test_server_.reset(new SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot)));
|
| - ASSERT_TRUE(test_server_->Start());
|
| -
|
| - // test_server_.GetURL() returns a URL with 127.0.0.1 (kLocalhost), that is
|
| - // immediately resolved by the MockHostResolver. Use a hostname instead to
|
| - // trigger an async resolve.
|
| - test_url_ = GURL(
|
| - base::StringPrintf("http://example.com:%d/defaultresponse",
|
| - test_server_->host_port_pair().port()));
|
| - ASSERT_TRUE(test_url_.is_valid());
|
| -}
|
| -
|
| -void URLFetcherMockDnsTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| -}
|
| -
|
| -void URLFetcherMockDnsTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - io_message_loop_proxy()->PostTask(FROM_HERE,
|
| - base::MessageLoop::QuitClosure());
|
| - ASSERT_EQ(fetcher_, source);
|
| - EXPECT_EQ(test_url_, source->GetOriginalURL());
|
| - completed_fetcher_.reset(fetcher_);
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -// Version of URLFetcherTest that does a POST instead
|
| -class URLFetcherPostTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that does a POST of a file using
|
| -// SetUploadDataStream
|
| -class URLFetcherPostFileTest : public URLFetcherTest {
|
| - public:
|
| - URLFetcherPostFileTest();
|
| -
|
| - void SetUploadRange(uint64 range_offset, uint64 range_length) {
|
| - range_offset_ = range_offset;
|
| - range_length_ = range_length;
|
| - }
|
| -
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - private:
|
| - base::FilePath path_;
|
| - uint64 range_offset_;
|
| - uint64 range_length_;
|
| -};
|
| -
|
| -class URLFetcherSetUploadFactoryTest : public URLFetcherTest {
|
| - public:
|
| - URLFetcherSetUploadFactoryTest() : create_stream_count_(0) {}
|
| -
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - // Callback passed to URLFetcher to create upload stream.
|
| - scoped_ptr<UploadDataStream> CreateUploadStream() {
|
| - ++create_stream_count_;
|
| - const std::string str("bobsyeruncle\n");
|
| - std::vector<char> buffer(str.begin(), str.end());
|
| - return ElementsUploadDataStream::CreateWithReader(
|
| - scoped_ptr<UploadElementReader>(
|
| - new UploadOwnedBytesElementReader(&buffer)),
|
| - 0);
|
| - }
|
| -
|
| - size_t create_stream_count() const { return create_stream_count_; }
|
| -
|
| - private:
|
| - // Count of calling CreateStream.
|
| - size_t create_stream_count_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that does a POST instead with empty upload body
|
| -class URLFetcherEmptyPostTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests download progress reports.
|
| -class URLFetcherDownloadProgressTest : public URLFetcherTest {
|
| - public:
|
| - URLFetcherDownloadProgressTest()
|
| - : previous_progress_(0),
|
| - expected_total_(0) {
|
| - }
|
| -
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchDownloadProgress(const URLFetcher* source,
|
| - int64 current,
|
| - int64 total) override;
|
| -
|
| - protected:
|
| - // Download progress returned by the previous callback.
|
| - int64 previous_progress_;
|
| - // Size of the file being downloaded, known in advance (provided by each test
|
| - // case).
|
| - int64 expected_total_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests progress reports at cancellation.
|
| -class URLFetcherDownloadProgressCancelTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| - void OnURLFetchDownloadProgress(const URLFetcher* source,
|
| - int64 current,
|
| - int64 total) override;
|
| -
|
| - protected:
|
| - bool cancelled_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests upload progress reports.
|
| -class URLFetcherUploadProgressTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchUploadProgress(const URLFetcher* source,
|
| - int64 current,
|
| - int64 total) override;
|
| -
|
| - protected:
|
| - int64 previous_progress_;
|
| - std::string chunk_;
|
| - int64 number_of_chunks_added_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests headers.
|
| -class URLFetcherHeadersTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests SocketAddress.
|
| -class URLFetcherSocketAddressTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - protected:
|
| - std::string expected_host_;
|
| - uint16 expected_port_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests stopping on a redirect.
|
| -class URLFetcherStopOnRedirectTest : public URLFetcherTest {
|
| - public:
|
| - URLFetcherStopOnRedirectTest();
|
| - ~URLFetcherStopOnRedirectTest() override;
|
| -
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - protected:
|
| - // The URL we should be redirected to.
|
| - static const char* kRedirectTarget;
|
| -
|
| - bool callback_called_; // Set to true in OnURLFetchComplete().
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests overload protection.
|
| -class URLFetcherProtectTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - private:
|
| - Time start_time_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests overload protection, when responses
|
| -// passed through.
|
| -class URLFetcherProtectTestPassedThrough : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - private:
|
| - Time start_time_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests bad HTTPS requests.
|
| -class URLFetcherBadHTTPSTest : public URLFetcherTest {
|
| - public:
|
| - URLFetcherBadHTTPSTest();
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - private:
|
| - base::FilePath cert_dir_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests request cancellation on shutdown.
|
| -class URLFetcherCancelTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherTest:
|
| - void CreateFetcher(const GURL& url) override;
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - void CancelRequest();
|
| -};
|
| -
|
| -// Version of TestURLRequestContext that posts a Quit task to the IO
|
| -// thread once it is deleted.
|
| -class CancelTestURLRequestContext : public ThrottlingTestURLRequestContext {
|
| - public:
|
| - explicit CancelTestURLRequestContext() {
|
| - }
|
| -
|
| - private:
|
| - ~CancelTestURLRequestContext() override {
|
| - // The d'tor should execute in the IO thread. Post the quit task to the
|
| - // current thread.
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::MessageLoop::QuitClosure());
|
| - }
|
| -};
|
| -
|
| -class CancelTestURLRequestContextGetter
|
| - : public TestURLRequestContextGetter {
|
| - public:
|
| - CancelTestURLRequestContextGetter(
|
| - base::MessageLoopProxy* io_message_loop_proxy,
|
| - const GURL& throttle_for_url)
|
| - : TestURLRequestContextGetter(io_message_loop_proxy),
|
| - io_message_loop_proxy_(io_message_loop_proxy),
|
| - context_created_(false, false),
|
| - throttle_for_url_(throttle_for_url) {
|
| - }
|
| -
|
| - // TestURLRequestContextGetter:
|
| - TestURLRequestContext* GetURLRequestContext() override {
|
| - if (!context_.get()) {
|
| - context_.reset(new CancelTestURLRequestContext());
|
| - DCHECK(context_->throttler_manager());
|
| -
|
| - // 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.
|
| - scoped_refptr<URLRequestThrottlerEntry> entry(
|
| - new URLRequestThrottlerEntry(context_->throttler_manager(),
|
| - std::string(),
|
| - 200,
|
| - 3,
|
| - 2000,
|
| - 2.0,
|
| - 0.0,
|
| - 4000));
|
| - context_->throttler_manager()
|
| - ->OverrideEntryForTests(throttle_for_url_, entry.get());
|
| -
|
| - context_created_.Signal();
|
| - }
|
| - return context_.get();
|
| - }
|
| -
|
| - virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const {
|
| - return io_message_loop_proxy_;
|
| - }
|
| -
|
| - void WaitForContextCreation() {
|
| - context_created_.Wait();
|
| - }
|
| -
|
| - protected:
|
| - ~CancelTestURLRequestContextGetter() override {}
|
| -
|
| - private:
|
| - scoped_ptr<TestURLRequestContext> context_;
|
| - scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
|
| - base::WaitableEvent context_created_;
|
| - GURL throttle_for_url_;
|
| -};
|
| -
|
| -// Version of URLFetcherTest that tests retying the same request twice.
|
| -class URLFetcherMultipleAttemptTest : public URLFetcherTest {
|
| - public:
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - private:
|
| - std::string data_;
|
| -};
|
| -
|
| -class URLFetcherFileTest : public URLFetcherTest {
|
| - public:
|
| - URLFetcherFileTest() : take_ownership_of_file_(false),
|
| - expected_file_error_(OK) {}
|
| -
|
| - void CreateFetcherForFile(const GURL& url, const base::FilePath& file_path);
|
| - void CreateFetcherForTempFile(const GURL& url);
|
| -
|
| - // URLFetcherDelegate:
|
| - void OnURLFetchComplete(const URLFetcher* source) override;
|
| -
|
| - protected:
|
| - base::FilePath expected_file_;
|
| - base::FilePath file_path_;
|
| -
|
| - // 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_file_;
|
| -
|
| - // Expected file error code for the test. OK when expecting success.
|
| - int expected_file_error_;
|
| -};
|
| -
|
| -void URLFetcherPostTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->SetUploadData("application/x-www-form-urlencoded", "bobsyeruncle");
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherPostTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_EQ(std::string("bobsyeruncle"), data);
|
| - URLFetcherTest::OnURLFetchComplete(source);
|
| -}
|
| -
|
| -URLFetcherPostFileTest::URLFetcherPostFileTest()
|
| - : range_offset_(0),
|
| - range_length_(kuint64max) {
|
| - PathService::Get(base::DIR_SOURCE_ROOT, &path_);
|
| - path_ = path_.Append(FILE_PATH_LITERAL("net"));
|
| - path_ = path_.Append(FILE_PATH_LITERAL("data"));
|
| - path_ = path_.Append(FILE_PATH_LITERAL("url_request_unittest"));
|
| - path_ = path_.Append(FILE_PATH_LITERAL("BullRunSpeech.txt"));
|
| -}
|
| -
|
| -void URLFetcherPostFileTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->SetUploadFilePath("application/x-www-form-urlencoded",
|
| - path_,
|
| - range_offset_,
|
| - range_length_,
|
| - base::MessageLoopProxy::current());
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherPostFileTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - std::string expected;
|
| - ASSERT_TRUE(base::ReadFileToString(path_, &expected));
|
| - ASSERT_LE(range_offset_, expected.size());
|
| - uint64 expected_size =
|
| - std::min(range_length_, expected.size() - range_offset_);
|
| -
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_EQ(expected.substr(range_offset_, expected_size), data);
|
| - URLFetcherTest::OnURLFetchComplete(source);
|
| -}
|
| -
|
| -void URLFetcherSetUploadFactoryTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->SetUploadStreamFactory(
|
| - "text/plain",
|
| - base::Bind(&URLFetcherSetUploadFactoryTest::CreateUploadStream,
|
| - base::Unretained(this)));
|
| - fetcher_->SetAutomaticallyRetryOn5xx(true);
|
| - fetcher_->SetMaxRetriesOn5xx(1);
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherSetUploadFactoryTest::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_EQ("bobsyeruncle\n", data);
|
| - URLFetcherTest::OnURLFetchComplete(source);
|
| -}
|
| -
|
| -void URLFetcherEmptyPostTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this);
|
| - fetcher_->SetRequestContext(new TestURLRequestContextGetter(
|
| - io_message_loop_proxy()));
|
| - fetcher_->SetUploadData("text/plain", std::string());
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherEmptyPostTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - EXPECT_TRUE(source->GetStatus().is_success());
|
| - EXPECT_EQ(200, source->GetResponseCode()); // HTTP OK
|
| -
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_TRUE(data.empty());
|
| -
|
| - CleanupAfterFetchComplete();
|
| - // Do not call the super class method URLFetcherTest::OnURLFetchComplete,
|
| - // since it expects a non-empty response.
|
| -}
|
| -
|
| -void URLFetcherDownloadProgressTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherDownloadProgressTest::OnURLFetchDownloadProgress(
|
| - const URLFetcher* source, int64 progress, int64 total) {
|
| - // Increasing between 0 and total.
|
| - EXPECT_LE(0, progress);
|
| - EXPECT_GE(total, progress);
|
| - EXPECT_LE(previous_progress_, progress);
|
| - EXPECT_EQ(expected_total_, total);
|
| - previous_progress_ = progress;
|
| -}
|
| -
|
| -void URLFetcherDownloadProgressCancelTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - cancelled_ = false;
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherDownloadProgressCancelTest::OnURLFetchDownloadProgress(
|
| - const URLFetcher* source, int64 current, int64 total) {
|
| - EXPECT_FALSE(cancelled_);
|
| - if (!cancelled_) {
|
| - cancelled_ = true;
|
| - CleanupAfterFetchComplete();
|
| - }
|
| -}
|
| -
|
| -void URLFetcherDownloadProgressCancelTest::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - // Should have been cancelled.
|
| - ADD_FAILURE();
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -void URLFetcherUploadProgressTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::POST, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - previous_progress_ = 0;
|
| - // Large enough data to require more than one read from UploadDataStream.
|
| - chunk_.assign(1<<16, 'a');
|
| - // Use chunked upload to wait for a timer event of progress notification.
|
| - fetcher_->SetChunkedUpload("application/x-www-form-urlencoded");
|
| - fetcher_->Start();
|
| - number_of_chunks_added_ = 1;
|
| - fetcher_->AppendChunkToUpload(chunk_, false);
|
| -}
|
| -
|
| -void URLFetcherUploadProgressTest::OnURLFetchUploadProgress(
|
| - const URLFetcher* source, int64 current, int64 total) {
|
| - // Increasing between 0 and total.
|
| - EXPECT_LE(0, current);
|
| - EXPECT_GE(static_cast<int64>(chunk_.size()) * number_of_chunks_added_,
|
| - current);
|
| - EXPECT_LE(previous_progress_, current);
|
| - previous_progress_ = current;
|
| - EXPECT_EQ(-1, total);
|
| -
|
| - if (number_of_chunks_added_ < 2) {
|
| - number_of_chunks_added_ += 1;
|
| - fetcher_->AppendChunkToUpload(chunk_, true);
|
| - }
|
| -}
|
| -
|
| -void URLFetcherHeadersTest::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - std::string header;
|
| - EXPECT_TRUE(source->GetResponseHeaders()->GetNormalizedHeader("cache-control",
|
| - &header));
|
| - EXPECT_EQ("private", header);
|
| - URLFetcherTest::OnURLFetchComplete(source);
|
| -}
|
| -
|
| -void URLFetcherSocketAddressTest::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - EXPECT_EQ("127.0.0.1", source->GetSocketAddress().host());
|
| - EXPECT_EQ(expected_port_, source->GetSocketAddress().port());
|
| - URLFetcherTest::OnURLFetchComplete(source);
|
| -}
|
| -
|
| -// static
|
| -const char* URLFetcherStopOnRedirectTest::kRedirectTarget =
|
| - "http://redirect.target.com";
|
| -
|
| -URLFetcherStopOnRedirectTest::URLFetcherStopOnRedirectTest()
|
| - : callback_called_(false) {
|
| -}
|
| -
|
| -URLFetcherStopOnRedirectTest::~URLFetcherStopOnRedirectTest() {
|
| -}
|
| -
|
| -void URLFetcherStopOnRedirectTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->SetStopOnRedirect(true);
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherStopOnRedirectTest::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - callback_called_ = true;
|
| - EXPECT_EQ(GURL(kRedirectTarget), source->GetURL());
|
| - EXPECT_EQ(URLRequestStatus::CANCELED, source->GetStatus().status());
|
| - EXPECT_EQ(ERR_ABORTED, source->GetStatus().error());
|
| - EXPECT_EQ(301, source->GetResponseCode());
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -void URLFetcherProtectTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - start_time_ = Time::Now();
|
| - fetcher_->SetMaxRetriesOn5xx(11);
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherProtectTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - const TimeDelta one_second = TimeDelta::FromMilliseconds(1000);
|
| - if (source->GetResponseCode() >= 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(source->GetStatus().is_success());
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_FALSE(data.empty());
|
| - CleanupAfterFetchComplete();
|
| - } else {
|
| - // Now running Overload test.
|
| - static int count = 0;
|
| - count++;
|
| - if (count < 20) {
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - 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);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void URLFetcherProtectTestPassedThrough::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->SetAutomaticallyRetryOn5xx(false);
|
| - start_time_ = Time::Now();
|
| - fetcher_->SetMaxRetriesOn5xx(11);
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherProtectTestPassedThrough::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - const TimeDelta one_minute = TimeDelta::FromMilliseconds(60000);
|
| - if (source->GetResponseCode() >= 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(source->GetStatus().is_success());
|
| - // Check that suggested back off time is bigger than 0.
|
| - EXPECT_GT(fetcher_->GetBackoffDelay().InMicroseconds(), 0);
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_FALSE(data.empty());
|
| - } else {
|
| - // We should not get here!
|
| - ADD_FAILURE();
|
| - }
|
| -
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -
|
| -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
|
| -// URLRequest::Delegate::OnSSLCertificateError.
|
| -void URLFetcherBadHTTPSTest::OnURLFetchComplete(
|
| - const URLFetcher* source) {
|
| - // This part is different from URLFetcherTest::OnURLFetchComplete
|
| - // because this test expects the request to be cancelled.
|
| - EXPECT_EQ(URLRequestStatus::CANCELED, source->GetStatus().status());
|
| - EXPECT_EQ(ERR_ABORTED, source->GetStatus().error());
|
| - EXPECT_EQ(-1, source->GetResponseCode());
|
| - EXPECT_TRUE(source->GetCookies().empty());
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_TRUE(data.empty());
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -void URLFetcherCancelTest::CreateFetcher(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - CancelTestURLRequestContextGetter* context_getter =
|
| - new CancelTestURLRequestContextGetter(io_message_loop_proxy().get(), url);
|
| - fetcher_->SetRequestContext(context_getter);
|
| - fetcher_->SetMaxRetriesOn5xx(2);
|
| - fetcher_->Start();
|
| - // We need to wait for the creation of the 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) {
|
| - // We should have cancelled the request before completion.
|
| - ADD_FAILURE();
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -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) {
|
| - EXPECT_TRUE(source->GetStatus().is_success());
|
| - EXPECT_EQ(200, source->GetResponseCode()); // HTTP OK
|
| - std::string data;
|
| - EXPECT_TRUE(source->GetResponseAsString(&data));
|
| - EXPECT_FALSE(data.empty());
|
| - if (!data.empty() && data_.empty()) {
|
| - data_ = data;
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| - fetcher_->Start();
|
| - } else {
|
| - EXPECT_EQ(data, data_);
|
| - CleanupAfterFetchComplete();
|
| - }
|
| -}
|
| -
|
| -void URLFetcherFileTest::CreateFetcherForFile(const GURL& url,
|
| - const base::FilePath& file_path) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| -
|
| - // Use the IO message loop to do the file operations in this test.
|
| - fetcher_->SaveResponseToFileAtPath(file_path, io_message_loop_proxy());
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherFileTest::CreateFetcherForTempFile(const GURL& url) {
|
| - fetcher_ = new URLFetcherImpl(url, URLFetcher::GET, this);
|
| - fetcher_->SetRequestContext(new ThrottlingTestURLRequestContextGetter(
|
| - io_message_loop_proxy().get(), request_context()));
|
| -
|
| - // Use the IO message loop to do the file operations in this test.
|
| - fetcher_->SaveResponseToTemporaryFile(io_message_loop_proxy());
|
| - fetcher_->Start();
|
| -}
|
| -
|
| -void URLFetcherFileTest::OnURLFetchComplete(const URLFetcher* source) {
|
| - if (expected_file_error_ == OK) {
|
| - EXPECT_TRUE(source->GetStatus().is_success());
|
| - EXPECT_EQ(OK, source->GetStatus().error());
|
| - EXPECT_EQ(200, source->GetResponseCode());
|
| -
|
| - EXPECT_TRUE(source->GetResponseAsFilePath(
|
| - take_ownership_of_file_, &file_path_));
|
| -
|
| - EXPECT_TRUE(base::ContentsEqual(expected_file_, file_path_));
|
| - } else {
|
| - EXPECT_FALSE(source->GetStatus().is_success());
|
| - EXPECT_EQ(expected_file_error_, source->GetStatus().error());
|
| - }
|
| - CleanupAfterFetchComplete();
|
| -}
|
| -
|
| -TEST_F(URLFetcherTest, SameThreadsTest) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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"));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherTest, DifferentThreadsTest) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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,
|
| - base::Bind(&URLFetcherTest::CreateFetcher,
|
| - base::Unretained(this),
|
| - test_server.GetURL("defaultresponse")));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -void CancelAllOnIO() {
|
| - EXPECT_EQ(1, URLFetcherTest::GetNumFetcherCores());
|
| - URLFetcherImpl::CancelAll();
|
| - EXPECT_EQ(0, URLFetcherTest::GetNumFetcherCores());
|
| -}
|
| -
|
| -// Tests to make sure CancelAll() will successfully cancel existing URLFetchers.
|
| -TEST_F(URLFetcherTest, CancelAll) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| -
|
| - CreateFetcher(test_server.GetURL("defaultresponse"));
|
| - io_message_loop_proxy()->PostTaskAndReply(
|
| - FROM_HERE, base::Bind(&CancelAllOnIO), base::MessageLoop::QuitClosure());
|
| - base::MessageLoop::current()->Run();
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - delete fetcher_;
|
| -}
|
| -
|
| -TEST_F(URLFetcherMockDnsTest, DontRetryOnNetworkChangedByDefault) {
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - EXPECT_FALSE(resolver_.has_pending_requests());
|
| -
|
| - // This posts a task to start the fetcher.
|
| - CreateFetcher(test_url_);
|
| - fetcher_->Start();
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - // The fetcher is now running, but is pending the host resolve.
|
| - EXPECT_EQ(1, GetNumFetcherCores());
|
| - EXPECT_TRUE(resolver_.has_pending_requests());
|
| - ASSERT_FALSE(completed_fetcher_);
|
| -
|
| - // A network change notification aborts the connect job.
|
| - NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - EXPECT_FALSE(resolver_.has_pending_requests());
|
| - ASSERT_TRUE(completed_fetcher_);
|
| -
|
| - // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
|
| - EXPECT_EQ(ERR_NETWORK_CHANGED, completed_fetcher_->GetStatus().error());
|
| -}
|
| -
|
| -TEST_F(URLFetcherMockDnsTest, RetryOnNetworkChangedAndFail) {
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - EXPECT_FALSE(resolver_.has_pending_requests());
|
| -
|
| - // This posts a task to start the fetcher.
|
| - CreateFetcher(test_url_);
|
| - fetcher_->SetAutomaticallyRetryOnNetworkChanges(3);
|
| - fetcher_->Start();
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - // The fetcher is now running, but is pending the host resolve.
|
| - EXPECT_EQ(1, GetNumFetcherCores());
|
| - EXPECT_TRUE(resolver_.has_pending_requests());
|
| - ASSERT_FALSE(completed_fetcher_);
|
| -
|
| - // Make it fail 3 times.
|
| - for (int i = 0; i < 3; ++i) {
|
| - // A network change notification aborts the connect job.
|
| - NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - // But the fetcher retries automatically.
|
| - EXPECT_EQ(1, GetNumFetcherCores());
|
| - EXPECT_TRUE(resolver_.has_pending_requests());
|
| - ASSERT_FALSE(completed_fetcher_);
|
| - }
|
| -
|
| - // A 4th failure doesn't trigger another retry, and propagates the error
|
| - // to the owner of the fetcher.
|
| - NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - EXPECT_FALSE(resolver_.has_pending_requests());
|
| - ASSERT_TRUE(completed_fetcher_);
|
| -
|
| - // And the owner of the fetcher gets the ERR_NETWORK_CHANGED error.
|
| - EXPECT_EQ(ERR_NETWORK_CHANGED, completed_fetcher_->GetStatus().error());
|
| -}
|
| -
|
| -TEST_F(URLFetcherMockDnsTest, RetryOnNetworkChangedAndSucceed) {
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - EXPECT_FALSE(resolver_.has_pending_requests());
|
| -
|
| - // This posts a task to start the fetcher.
|
| - CreateFetcher(test_url_);
|
| - fetcher_->SetAutomaticallyRetryOnNetworkChanges(3);
|
| - fetcher_->Start();
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - // The fetcher is now running, but is pending the host resolve.
|
| - EXPECT_EQ(1, GetNumFetcherCores());
|
| - EXPECT_TRUE(resolver_.has_pending_requests());
|
| - ASSERT_FALSE(completed_fetcher_);
|
| -
|
| - // Make it fail 3 times.
|
| - for (int i = 0; i < 3; ++i) {
|
| - // A network change notification aborts the connect job.
|
| - NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - // But the fetcher retries automatically.
|
| - EXPECT_EQ(1, GetNumFetcherCores());
|
| - EXPECT_TRUE(resolver_.has_pending_requests());
|
| - ASSERT_FALSE(completed_fetcher_);
|
| - }
|
| -
|
| - // Now let it succeed by resolving the pending request.
|
| - resolver_.ResolveAllPending();
|
| - base::MessageLoop::current()->Run();
|
| -
|
| - // URLFetcherMockDnsTest::OnURLFetchComplete() will quit the loop.
|
| - EXPECT_EQ(0, GetNumFetcherCores());
|
| - EXPECT_FALSE(resolver_.has_pending_requests());
|
| - ASSERT_TRUE(completed_fetcher_);
|
| -
|
| - // This time the request succeeded.
|
| - EXPECT_EQ(OK, completed_fetcher_->GetStatus().error());
|
| - EXPECT_EQ(200, completed_fetcher_->GetResponseCode());
|
| -}
|
| -
|
| -TEST_F(URLFetcherPostTest, Basic) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("echo"));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherPostFileTest, Basic) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("echo"));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherPostFileTest, Range) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - SetUploadRange(30, 100);
|
| -
|
| - CreateFetcher(test_server.GetURL("echo"));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherSetUploadFactoryTest, Basic) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("echo"));
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(1u, create_stream_count());
|
| -}
|
| -
|
| -TEST_F(URLFetcherSetUploadFactoryTest, Retry) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| - expected_status_code_ = 500;
|
| - CreateFetcher(test_server.GetURL("echo?status=500"));
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(2u, create_stream_count());
|
| -}
|
| -
|
| -TEST_F(URLFetcherEmptyPostTest, Basic) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("echo"));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherUploadProgressTest, Basic) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("echo"));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherDownloadProgressTest, Basic) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - // Get a file large enough to require more than one read into
|
| - // URLFetcher::Core's IOBuffer.
|
| - static const char kFileToFetch[] = "animate1.gif";
|
| - // Hardcoded file size - it cannot be easily fetched when a remote http server
|
| - // is used for testing.
|
| - static const int64 kFileSize = 19021;
|
| -
|
| - expected_total_ = kFileSize;
|
| -
|
| - CreateFetcher(test_server.GetURL(
|
| - std::string(kTestServerFilePrefix) + kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherDownloadProgressCancelTest, CancelWhileProgressReport) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - // Get a file large enough to require more than one read into
|
| - // URLFetcher::Core's IOBuffer.
|
| - static const char kFileToFetch[] = "animate1.gif";
|
| - CreateFetcher(test_server.GetURL(
|
| - std::string(kTestServerFilePrefix) + kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherHeadersTest, Headers) {
|
| - SpawnedTestServer test_server(
|
| - SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("files/with-headers.html"));
|
| - base::MessageLoop::current()->Run();
|
| - // The actual tests are in the URLFetcherHeadersTest fixture.
|
| -}
|
| -
|
| -TEST_F(URLFetcherSocketAddressTest, SocketAddress) {
|
| - SpawnedTestServer test_server(
|
| - SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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"));
|
| - base::MessageLoop::current()->Run();
|
| - // The actual tests are in the URLFetcherSocketAddressTest fixture.
|
| -}
|
| -
|
| -TEST_F(URLFetcherStopOnRedirectTest, StopOnRedirect) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(
|
| - test_server.GetURL(std::string("server-redirect?") + kRedirectTarget));
|
| - base::MessageLoop::current()->Run();
|
| - EXPECT_TRUE(callback_called_);
|
| -}
|
| -
|
| -TEST_F(URLFetcherProtectTest, Overload) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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.
|
| - scoped_refptr<URLRequestThrottlerEntry> entry(
|
| - new URLRequestThrottlerEntry(request_context()->throttler_manager(),
|
| - std::string(),
|
| - 200,
|
| - 3,
|
| - 1,
|
| - 2.0,
|
| - 0.0,
|
| - 256));
|
| - request_context()->throttler_manager()
|
| - ->OverrideEntryForTests(url, entry.get());
|
| -
|
| - CreateFetcher(url);
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherProtectTest, ServerUnavailable) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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.
|
| - scoped_refptr<URLRequestThrottlerEntry> entry(
|
| - new URLRequestThrottlerEntry(request_context()->throttler_manager(),
|
| - std::string(),
|
| - 200,
|
| - 3,
|
| - 1,
|
| - 2.0,
|
| - 0.0,
|
| - 256));
|
| - request_context()->throttler_manager()
|
| - ->OverrideEntryForTests(url, entry.get());
|
| -
|
| - CreateFetcher(url);
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherProtectTestPassedThrough, ServerUnavailablePropagateResponse) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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.
|
| - scoped_refptr<URLRequestThrottlerEntry> entry(
|
| - new URLRequestThrottlerEntry(request_context()->throttler_manager(),
|
| - std::string(),
|
| - 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".
|
| - request_context()->throttler_manager()
|
| - ->OverrideEntryForTests(url, entry.get());
|
| -
|
| - CreateFetcher(url);
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherBadHTTPSTest, BadHTTPSTest) {
|
| - SpawnedTestServer::SSLOptions ssl_options(
|
| - SpawnedTestServer::SSLOptions::CERT_EXPIRED);
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
|
| - ssl_options,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - CreateFetcher(test_server.GetURL("defaultresponse"));
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherCancelTest, ReleasesContext) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - GURL url(test_server.GetURL("files/server-unavailable.html"));
|
| -
|
| - // 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,
|
| - base::Bind(&URLFetcherCancelTest::CreateFetcher,
|
| - base::Unretained(this), url));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherCancelTest, CancelWhileDelayedStartTaskPending) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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.
|
| - scoped_refptr<URLRequestThrottlerEntry> entry(
|
| - new URLRequestThrottlerEntry(request_context()->throttler_manager(),
|
| - std::string(),
|
| - 4000,
|
| - 1,
|
| - 2000,
|
| - 2.0,
|
| - 0.0,
|
| - 4000));
|
| - request_context()->throttler_manager()
|
| - ->OverrideEntryForTests(url, entry.get());
|
| - // 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,
|
| - base::Bind(&URLFetcherTest::CreateFetcher, base::Unretained(this), url));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherMultipleAttemptTest, SameData) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::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"));
|
| -
|
| - base::MessageLoop::current()->Run();
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, SmallGet) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - // Get a small file.
|
| - static const char kFileToFetch[] = "simple.html";
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForFile(
|
| - test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
|
| - temp_dir.path().AppendASCII(kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -
|
| - ASSERT_FALSE(base::PathExists(file_path_))
|
| - << file_path_.value() << " not removed.";
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, LargeGet) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - // Get a file large enough to require more than one read into
|
| - // URLFetcher::Core's IOBuffer.
|
| - static const char kFileToFetch[] = "animate1.gif";
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForFile(
|
| - test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
|
| - temp_dir.path().AppendASCII(kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, SavedOutputFileOwnerhisp) {
|
| - // If the caller takes the ownership of the output file, the file should
|
| - // persist even after URLFetcher is gone. If not, the file must be deleted.
|
| - const bool kTake[] = {false, true};
|
| - for (size_t i = 0; i < arraysize(kTake); ++i) {
|
| - take_ownership_of_file_ = kTake[i];
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - // Get a small file.
|
| - static const char kFileToFetch[] = "simple.html";
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForFile(
|
| - test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
|
| - temp_dir.path().AppendASCII(kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - ASSERT_EQ(kTake[i], base::PathExists(file_path_)) <<
|
| - "FilePath: " << file_path_.value();
|
| - }
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, OverwriteExistingFile) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - // Create a file before trying to fetch.
|
| - static const char kFileToFetch[] = "simple.html";
|
| - std::string data(10000, '?'); // Meant to be larger than simple.html.
|
| - file_path_ = temp_dir.path().AppendASCII(kFileToFetch);
|
| - ASSERT_EQ(static_cast<int>(data.size()),
|
| - base::WriteFile(file_path_, data.data(), data.size()));
|
| - ASSERT_TRUE(base::PathExists(file_path_));
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - ASSERT_FALSE(base::ContentsEqual(file_path_, expected_file_));
|
| -
|
| - // Get a small file.
|
| - CreateFetcherForFile(
|
| - test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
|
| - file_path_);
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, TryToOverwriteDirectory) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - base::ScopedTempDir temp_dir;
|
| - ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
| -
|
| - // Create a directory before trying to fetch.
|
| - static const char kFileToFetch[] = "simple.html";
|
| - file_path_ = temp_dir.path().AppendASCII(kFileToFetch);
|
| - ASSERT_TRUE(base::CreateDirectory(file_path_));
|
| - ASSERT_TRUE(base::PathExists(file_path_));
|
| -
|
| - // Get a small file.
|
| - expected_file_error_ = ERR_ACCESS_DENIED;
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForFile(
|
| - test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch),
|
| - file_path_);
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, SmallGetToTempFile) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - // Get a small file.
|
| - static const char kFileToFetch[] = "simple.html";
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForTempFile(
|
| - test_server.GetURL(std::string(kTestServerFilePrefix) + kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -
|
| - ASSERT_FALSE(base::PathExists(file_path_))
|
| - << file_path_.value() << " not removed.";
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, LargeGetToTempFile) {
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - // Get a file large enough to require more than one read into
|
| - // URLFetcher::Core's IOBuffer.
|
| - static const char kFileToFetch[] = "animate1.gif";
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForTempFile(test_server.GetURL(
|
| - std::string(kTestServerFilePrefix) + kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -}
|
| -
|
| -TEST_F(URLFetcherFileTest, SavedOutputTempFileOwnerhisp) {
|
| - // If the caller takes the ownership of the temp file, the file should persist
|
| - // even after URLFetcher is gone. If not, the file must be deleted.
|
| - const bool kTake[] = {false, true};
|
| - for (size_t i = 0; i < arraysize(kTake); ++i) {
|
| - take_ownership_of_file_ = kTake[i];
|
| -
|
| - SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
|
| - SpawnedTestServer::kLocalhost,
|
| - base::FilePath(kDocRoot));
|
| - ASSERT_TRUE(test_server.Start());
|
| -
|
| - // Get a small file.
|
| - static const char kFileToFetch[] = "simple.html";
|
| - expected_file_ = test_server.GetDocumentRoot().AppendASCII(kFileToFetch);
|
| - CreateFetcherForTempFile(test_server.GetURL(
|
| - std::string(kTestServerFilePrefix) + kFileToFetch));
|
| -
|
| - base::MessageLoop::current()->Run(); // OnURLFetchComplete() will Quit().
|
| -
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| - ASSERT_EQ(kTake[i], base::PathExists(file_path_)) <<
|
| - "FilePath: " << file_path_.value();
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -} // namespace net
|
|
|