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 |