| Index: content/browser/loader/resource_loader_unittest.cc
|
| diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc
|
| index bf4f52f27c47089c9381558dee3229eda0b3defc..d228300968d47cdb670b691ecb9ac745cba91cd3 100644
|
| --- a/content/browser/loader/resource_loader_unittest.cc
|
| +++ b/content/browser/loader/resource_loader_unittest.cc
|
| @@ -48,12 +48,13 @@ class ClientCertStoreStub : public net::ClientCertStore {
|
| }
|
|
|
| // net::ClientCertStore:
|
| - virtual bool GetClientCerts(const net::SSLCertRequestInfo& cert_request_info,
|
| - net::CertificateList* selected_certs) OVERRIDE {
|
| + virtual void GetClientCerts(const net::SSLCertRequestInfo& cert_request_info,
|
| + net::CertificateList* selected_certs,
|
| + const base::Closure& callback) OVERRIDE {
|
| ++request_count_;
|
| requested_authorities_ = cert_request_info.cert_authorities;
|
| *selected_certs = response_;
|
| - return true;
|
| + callback.Run();
|
| }
|
|
|
| private:
|
| @@ -143,6 +144,23 @@ class SelectCertificateBrowserClient : public TestContentBrowserClient {
|
| int call_count_;
|
| };
|
|
|
| +class ResourceContextStub : public MockResourceContext {
|
| + public:
|
| + explicit ResourceContextStub(net::URLRequestContext* test_request_context)
|
| + : MockResourceContext(test_request_context) {}
|
| +
|
| + virtual scoped_ptr<net::ClientCertStore> CreateClientCertStore() OVERRIDE {
|
| + return dummy_cert_store_.Pass();
|
| + }
|
| +
|
| + void SetClientCertStore(scoped_ptr<net::ClientCertStore> store) {
|
| + dummy_cert_store_ = store.Pass();
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<net::ClientCertStore> dummy_cert_store_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| class ResourceLoaderTest : public testing::Test,
|
| @@ -182,12 +200,9 @@ class ResourceLoaderTest : public testing::Test,
|
| content::TestBrowserThreadBundle thread_bundle_;
|
|
|
| net::TestURLRequestContext test_url_request_context_;
|
| - content::MockResourceContext resource_context_;
|
| + ResourceContextStub resource_context_;
|
| };
|
|
|
| -// When OpenSSL is used, client cert store is not being queried in
|
| -// ResourceLoader.
|
| -#if !defined(USE_OPENSSL)
|
| // Verifies if a call to net::UrlRequest::Delegate::OnCertificateRequested()
|
| // causes client cert store to be queried for certificates and if the returned
|
| // certificates are correctly passed to the content browser client for
|
| @@ -218,10 +233,11 @@ TEST_F(ResourceLoaderTest, ClientCertStoreLookup) {
|
| // later.
|
| net::URLRequest* raw_ptr_to_request = request.get();
|
| ClientCertStoreStub* raw_ptr_to_store = test_store.get();
|
| + resource_context_.SetClientCertStore(
|
| + test_store.PassAs<net::ClientCertStore>());
|
|
|
| scoped_ptr<ResourceHandler> resource_handler(new ResourceHandlerStub());
|
| - ResourceLoader loader(request.Pass(), resource_handler.Pass(), this,
|
| - test_store.PassAs<net::ClientCertStore>());
|
| + ResourceLoader loader(request.Pass(), resource_handler.Pass(), this);
|
|
|
| // Prepare a dummy certificate request.
|
| scoped_refptr<net::SSLCertRequestInfo> cert_request_info(
|
| @@ -250,6 +266,52 @@ TEST_F(ResourceLoaderTest, ClientCertStoreLookup) {
|
| EXPECT_EQ(1, test_client.call_count());
|
| EXPECT_EQ(dummy_certs, test_client.passed_certs());
|
| }
|
| -#endif // !defined(OPENSSL)
|
| +
|
| +// Verifies if a call to net::URLRequest::Delegate::OnCertificateRequested()
|
| +// on a platform with a NULL client cert store still calls the content browser
|
| +// client for selection.
|
| +TEST_F(ResourceLoaderTest, ClientCertStoreNull) {
|
| + const int kRenderProcessId = 1;
|
| + const int kRenderViewId = 2;
|
| +
|
| + scoped_ptr<net::URLRequest> request(new net::URLRequest(
|
| + GURL("dummy"), NULL, resource_context_.GetRequestContext()));
|
| + ResourceRequestInfo::AllocateForTesting(request.get(),
|
| + ResourceType::MAIN_FRAME,
|
| + &resource_context_,
|
| + kRenderProcessId,
|
| + kRenderViewId,
|
| + false);
|
| +
|
| + // Ownership of the |request| is about to be turned over to ResourceLoader. We
|
| + // need to keep a raw pointer copy to access this object later.
|
| + net::URLRequest* raw_ptr_to_request = request.get();
|
| +
|
| + scoped_ptr<ResourceHandler> resource_handler(new ResourceHandlerStub());
|
| + ResourceLoader loader(request.Pass(), resource_handler.Pass(), this);
|
| +
|
| + // Prepare a dummy certificate request.
|
| + scoped_refptr<net::SSLCertRequestInfo> cert_request_info(
|
| + new net::SSLCertRequestInfo());
|
| + std::vector<std::string> dummy_authority(1, "dummy");
|
| + cert_request_info->cert_authorities = dummy_authority;
|
| +
|
| + // Plug in test content browser client.
|
| + SelectCertificateBrowserClient test_client;
|
| + ContentBrowserClient* old_client = SetBrowserClientForTesting(&test_client);
|
| +
|
| + // Everything is set up. Trigger the resource loader certificate request event
|
| + // and run the message loop.
|
| + loader.OnCertificateRequested(raw_ptr_to_request, cert_request_info.get());
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Restore the original content browser client.
|
| + SetBrowserClientForTesting(old_client);
|
| +
|
| + // Check if the SelectClientCertificate was called on the content browser
|
| + // client.
|
| + EXPECT_EQ(1, test_client.call_count());
|
| + EXPECT_EQ(net::CertificateList(), test_client.passed_certs());
|
| +}
|
|
|
| } // namespace content
|
|
|