| Index: content/browser/loader/async_revalidation_driver_unittest.cc
|
| diff --git a/content/browser/loader/async_revalidation_driver_unittest.cc b/content/browser/loader/async_revalidation_driver_unittest.cc
|
| deleted file mode 100644
|
| index 7543d13393b0207ee82bec94f5a5a8f4918ddf2c..0000000000000000000000000000000000000000
|
| --- a/content/browser/loader/async_revalidation_driver_unittest.cc
|
| +++ /dev/null
|
| @@ -1,403 +0,0 @@
|
| -// Copyright 2015 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 "content/browser/loader/async_revalidation_driver.h"
|
| -
|
| -#include <string>
|
| -#include <type_traits>
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback.h"
|
| -#include "base/location.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "content/public/browser/client_certificate_delegate.h"
|
| -#include "content/public/common/content_client.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "content/test/test_content_browser_client.h"
|
| -#include "ipc/ipc_message.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/network_delegate_impl.h"
|
| -#include "net/base/request_priority.h"
|
| -#include "net/ssl/ssl_cert_request_info.h"
|
| -#include "net/url_request/url_request_job_factory.h"
|
| -#include "net/url_request/url_request_job_factory_impl.h"
|
| -#include "net/url_request/url_request_status.h"
|
| -#include "net/url_request/url_request_test_job.h"
|
| -#include "net/url_request/url_request_test_util.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace content {
|
| -namespace {
|
| -
|
| -// Dummy implementation of ResourceThrottle, an instance of which is needed to
|
| -// initialize AsyncRevalidationDriver.
|
| -class ResourceThrottleStub : public ResourceThrottle {
|
| - public:
|
| - ResourceThrottleStub() {}
|
| -
|
| - // If true, defers the request in WillStartRequest.
|
| - void set_defer_request_on_will_start_request(
|
| - bool defer_request_on_will_start_request) {
|
| - defer_request_on_will_start_request_ = defer_request_on_will_start_request;
|
| - }
|
| -
|
| - // ResourceThrottler implementation:
|
| - void WillStartRequest(bool* defer) override {
|
| - *defer = defer_request_on_will_start_request_;
|
| - }
|
| -
|
| - const char* GetNameForLogging() const override {
|
| - return "ResourceThrottleStub";
|
| - }
|
| -
|
| - private:
|
| - bool defer_request_on_will_start_request_ = false;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ResourceThrottleStub);
|
| -};
|
| -
|
| -// There are multiple layers of boilerplate needed to use a URLRequestTestJob
|
| -// subclass. Subclasses of AsyncRevalidationDriverTest can use
|
| -// BindCreateProtocolHandlerCallback() to bypass most of that boilerplate.
|
| -using CreateProtocolHandlerCallback = base::Callback<
|
| - std::unique_ptr<net::URLRequestJobFactory::ProtocolHandler>()>;
|
| -
|
| -template <typename T>
|
| -CreateProtocolHandlerCallback BindCreateProtocolHandlerCallback() {
|
| - static_assert(std::is_base_of<net::URLRequestJob, T>::value,
|
| - "Template argument to BindCreateProtocolHandlerCallback() must "
|
| - "be a subclass of URLRequestJob.");
|
| -
|
| - class TemplatedProtocolHandler
|
| - : public net::URLRequestJobFactory::ProtocolHandler {
|
| - public:
|
| - static std::unique_ptr<net::URLRequestJobFactory::ProtocolHandler>
|
| - Create() {
|
| - return base::MakeUnique<TemplatedProtocolHandler>();
|
| - }
|
| -
|
| - // URLRequestJobFactory::ProtocolHandler implementation:
|
| - net::URLRequestJob* MaybeCreateJob(
|
| - net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate) const override {
|
| - return new T(request, network_delegate);
|
| - }
|
| - };
|
| -
|
| - return base::Bind(&TemplatedProtocolHandler::Create);
|
| -}
|
| -
|
| -// An implementation of NetworkDelegate that captures the status of the last
|
| -// URLRequest to be destroyed.
|
| -class StatusCapturingNetworkDelegate : public net::NetworkDelegateImpl {
|
| - public:
|
| - const net::URLRequestStatus& last_status() { return last_status_; }
|
| -
|
| - private:
|
| - // net::NetworkDelegate implementation.
|
| - void OnURLRequestDestroyed(net::URLRequest* request) override {
|
| - last_status_ = request->status();
|
| - }
|
| -
|
| - net::URLRequestStatus last_status_;
|
| -};
|
| -
|
| -class AsyncRevalidationDriverTest : public testing::Test {
|
| - protected:
|
| - // Constructor for test fixtures that subclass this one.
|
| - AsyncRevalidationDriverTest(
|
| - const CreateProtocolHandlerCallback& create_protocol_handler_callback)
|
| - : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
|
| - create_protocol_handler_callback_(create_protocol_handler_callback),
|
| - raw_ptr_resource_throttle_(nullptr),
|
| - raw_ptr_request_(nullptr) {
|
| - test_url_request_context_.set_job_factory(&job_factory_);
|
| - test_url_request_context_.set_network_delegate(&network_delegate_);
|
| - }
|
| -
|
| - // Constructor for tests that use this fixture directly.
|
| - AsyncRevalidationDriverTest()
|
| - : AsyncRevalidationDriverTest(
|
| - base::Bind(net::URLRequestTestJob::CreateProtocolHandler)) {}
|
| -
|
| - bool async_revalidation_complete_called() const {
|
| - return async_revalidation_complete_called_;
|
| - }
|
| -
|
| - const net::URLRequestStatus& last_status() {
|
| - return network_delegate_.last_status();
|
| - }
|
| -
|
| - void SetUpAsyncRevalidationDriverWithRequestToUrl(const GURL& url) {
|
| - std::unique_ptr<net::URLRequest> request(
|
| - test_url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY,
|
| - nullptr /* delegate */));
|
| - raw_ptr_request_ = request.get();
|
| - raw_ptr_resource_throttle_ = new ResourceThrottleStub();
|
| - // This use of base::Unretained() is safe because |driver_|, and the closure
|
| - // passed to it, will be destroyed before this object is.
|
| - driver_.reset(new AsyncRevalidationDriver(
|
| - std::move(request), base::WrapUnique(raw_ptr_resource_throttle_),
|
| - base::Bind(&AsyncRevalidationDriverTest::OnAsyncRevalidationComplete,
|
| - base::Unretained(this))));
|
| - }
|
| -
|
| - void SetUpAsyncRevalidationDriverWithDefaultRequest() {
|
| - SetUpAsyncRevalidationDriverWithRequestToUrl(
|
| - net::URLRequestTestJob::test_url_1());
|
| - }
|
| -
|
| - void SetUp() override {
|
| - job_factory_.SetProtocolHandler("test",
|
| - create_protocol_handler_callback_.Run());
|
| - SetUpAsyncRevalidationDriverWithDefaultRequest();
|
| - }
|
| -
|
| - void OnAsyncRevalidationComplete() {
|
| - EXPECT_FALSE(async_revalidation_complete_called_);
|
| - async_revalidation_complete_called_ = true;
|
| - driver_.reset();
|
| - }
|
| -
|
| - TestBrowserThreadBundle thread_bundle_;
|
| - net::URLRequestJobFactoryImpl job_factory_;
|
| - net::TestURLRequestContext test_url_request_context_;
|
| - StatusCapturingNetworkDelegate network_delegate_;
|
| - CreateProtocolHandlerCallback create_protocol_handler_callback_;
|
| -
|
| - // The AsyncRevalidationDriver owns the URLRequest and the ResourceThrottle.
|
| - ResourceThrottleStub* raw_ptr_resource_throttle_;
|
| - net::URLRequest* raw_ptr_request_;
|
| - std::unique_ptr<AsyncRevalidationDriver> driver_;
|
| - bool async_revalidation_complete_called_ = false;
|
| -};
|
| -
|
| -TEST_F(AsyncRevalidationDriverTest, NormalRequestCompletes) {
|
| - driver_->StartRequest();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_TRUE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -// Verifies that request that should be deferred at start is deferred.
|
| -TEST_F(AsyncRevalidationDriverTest, DeferOnStart) {
|
| - raw_ptr_resource_throttle_->set_defer_request_on_will_start_request(true);
|
| -
|
| - driver_->StartRequest();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(raw_ptr_request_->is_pending());
|
| - EXPECT_FALSE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -// Verifies that resuming a deferred request works. Assumes that DeferOnStart
|
| -// passes.
|
| -TEST_F(AsyncRevalidationDriverTest, ResumeDeferredRequestWorks) {
|
| - raw_ptr_resource_throttle_->set_defer_request_on_will_start_request(true);
|
| -
|
| - driver_->StartRequest();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - ResourceThrottle::Delegate* driver_as_resource_throttle_delegate =
|
| - driver_.get();
|
| - driver_as_resource_throttle_delegate->Resume();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_TRUE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -// Verifies that redirects are not followed.
|
| -TEST_F(AsyncRevalidationDriverTest, RedirectsAreNotFollowed) {
|
| - SetUpAsyncRevalidationDriverWithRequestToUrl(
|
| - net::URLRequestTestJob::test_url_redirect_to_url_2());
|
| -
|
| - driver_->StartRequest();
|
| - while (net::URLRequestTestJob::ProcessOnePendingMessage())
|
| - base::RunLoop().RunUntilIdle();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(last_status().is_success());
|
| - EXPECT_EQ(net::ERR_ABORTED, last_status().error());
|
| - EXPECT_TRUE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -// A mock URLRequestJob which simulates an SSL client auth request.
|
| -class MockClientCertURLRequestJob : public net::URLRequestTestJob {
|
| - public:
|
| - MockClientCertURLRequestJob(net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate)
|
| - : net::URLRequestTestJob(request, network_delegate, true),
|
| - weak_factory_(this) {}
|
| -
|
| - // net::URLRequestTestJob implementation:
|
| - void Start() override {
|
| - scoped_refptr<net::SSLCertRequestInfo> cert_request_info(
|
| - new net::SSLCertRequestInfo);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MockClientCertURLRequestJob::NotifyCertificateRequested,
|
| - weak_factory_.GetWeakPtr(),
|
| - base::RetainedRef(cert_request_info)));
|
| - }
|
| -
|
| - void ContinueWithCertificate(
|
| - net::X509Certificate* cert,
|
| - net::SSLPrivateKey* client_private_key) override {
|
| - ADD_FAILURE() << "Certificate supplied.";
|
| - }
|
| -
|
| - void Kill() override {
|
| - weak_factory_.InvalidateWeakPtrs();
|
| - URLRequestJob::Kill();
|
| - }
|
| -
|
| - private:
|
| - base::WeakPtrFactory<MockClientCertURLRequestJob> weak_factory_;
|
| -};
|
| -
|
| -class AsyncRevalidationDriverClientCertTest
|
| - : public AsyncRevalidationDriverTest {
|
| - protected:
|
| - AsyncRevalidationDriverClientCertTest()
|
| - : AsyncRevalidationDriverTest(
|
| - BindCreateProtocolHandlerCallback<MockClientCertURLRequestJob>()) {}
|
| -};
|
| -
|
| -// Test browser client that causes the test to fail if SelectClientCertificate()
|
| -// is called. Automatically sets itself as the browser client when constructed
|
| -// and restores the old browser client in the destructor.
|
| -class ScopedDontSelectCertificateBrowserClient
|
| - : public TestContentBrowserClient {
|
| - public:
|
| - ScopedDontSelectCertificateBrowserClient() {
|
| - old_client_ = SetBrowserClientForTesting(this);
|
| - }
|
| -
|
| - ~ScopedDontSelectCertificateBrowserClient() override {
|
| - SetBrowserClientForTesting(old_client_);
|
| - }
|
| -
|
| - void SelectClientCertificate(
|
| - WebContents* web_contents,
|
| - net::SSLCertRequestInfo* cert_request_info,
|
| - std::unique_ptr<ClientCertificateDelegate> delegate) override {
|
| - ADD_FAILURE() << "SelectClientCertificate was called.";
|
| - }
|
| -
|
| - private:
|
| - ContentBrowserClient* old_client_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedDontSelectCertificateBrowserClient);
|
| -};
|
| -
|
| -// Verifies that async revalidation requests do not attempt to provide client
|
| -// certificates.
|
| -TEST_F(AsyncRevalidationDriverClientCertTest, RequestRejected) {
|
| - // Ensure that SelectClientCertificate is not called during this test.
|
| - ScopedDontSelectCertificateBrowserClient test_client;
|
| -
|
| - // Start the request and wait for it to pause.
|
| - driver_->StartRequest();
|
| -
|
| - // Because TestBrowserThreadBundle only uses one real thread, this is
|
| - // sufficient to ensure that tasks posted to the "UI thread" have run.
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Check that the request aborted.
|
| - EXPECT_FALSE(last_status().is_success());
|
| - EXPECT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, last_status().error());
|
| - EXPECT_TRUE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -// A mock URLRequestJob which simulates an SSL certificate error.
|
| -class MockSSLErrorURLRequestJob : public net::URLRequestTestJob {
|
| - public:
|
| - MockSSLErrorURLRequestJob(net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate)
|
| - : net::URLRequestTestJob(request, network_delegate, true),
|
| - weak_factory_(this) {}
|
| -
|
| - // net::URLRequestTestJob implementation:
|
| - void Start() override {
|
| - // This SSLInfo isn't really valid, but it is good enough for testing.
|
| - net::SSLInfo ssl_info;
|
| - ssl_info.SetCertError(net::ERR_CERT_DATE_INVALID);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MockSSLErrorURLRequestJob::NotifySSLCertificateError,
|
| - weak_factory_.GetWeakPtr(), ssl_info, false));
|
| - }
|
| -
|
| - void ContinueDespiteLastError() override {
|
| - ADD_FAILURE() << "ContinueDespiteLastError called.";
|
| - }
|
| -
|
| - private:
|
| - base::WeakPtrFactory<MockSSLErrorURLRequestJob> weak_factory_;
|
| -};
|
| -
|
| -class AsyncRevalidationDriverSSLErrorTest : public AsyncRevalidationDriverTest {
|
| - protected:
|
| - AsyncRevalidationDriverSSLErrorTest()
|
| - : AsyncRevalidationDriverTest(
|
| - BindCreateProtocolHandlerCallback<MockSSLErrorURLRequestJob>()) {}
|
| -};
|
| -
|
| -// Verifies that async revalidation requests do not attempt to recover from SSL
|
| -// certificate errors.
|
| -TEST_F(AsyncRevalidationDriverSSLErrorTest, RequestWithSSLErrorRejected) {
|
| - // Start the request and wait for it to pause.
|
| - driver_->StartRequest();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Check that the request has been aborted.
|
| - EXPECT_FALSE(last_status().is_success());
|
| - EXPECT_EQ(net::ERR_ABORTED, last_status().error());
|
| - EXPECT_TRUE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -// A URLRequestTestJob that sets |request_time| and |was_cached| on their
|
| -// response_info, and causes the test to fail if Read() is called.
|
| -class FromCacheURLRequestJob : public net::URLRequestTestJob {
|
| - public:
|
| - FromCacheURLRequestJob(net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate)
|
| - : net::URLRequestTestJob(request, network_delegate, true) {}
|
| -
|
| - void GetResponseInfo(net::HttpResponseInfo* info) override {
|
| - URLRequestTestJob::GetResponseInfo(info);
|
| - info->request_time = base::Time::Now();
|
| - info->was_cached = true;
|
| - }
|
| -
|
| - int ReadRawData(net::IOBuffer* buf, int buf_size) override {
|
| - ADD_FAILURE() << "ReadRawData() was called.";
|
| - return URLRequestTestJob::ReadRawData(buf, buf_size);
|
| - }
|
| -
|
| - private:
|
| - ~FromCacheURLRequestJob() override {}
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FromCacheURLRequestJob);
|
| -};
|
| -
|
| -class AsyncRevalidationDriverFromCacheTest
|
| - : public AsyncRevalidationDriverTest {
|
| - protected:
|
| - AsyncRevalidationDriverFromCacheTest()
|
| - : AsyncRevalidationDriverTest(
|
| - BindCreateProtocolHandlerCallback<FromCacheURLRequestJob>()) {}
|
| -};
|
| -
|
| -TEST_F(AsyncRevalidationDriverFromCacheTest,
|
| - CacheNotReadOnSuccessfulRevalidation) {
|
| - driver_->StartRequest();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_TRUE(async_revalidation_complete_called());
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace content
|
|
|