Index: chrome/browser/chromeos/certificate_provider/certificate_provider_service_unittest.cc |
diff --git a/chrome/browser/chromeos/certificate_provider/certificate_provider_service_unittest.cc b/chrome/browser/chromeos/certificate_provider/certificate_provider_service_unittest.cc |
index 3fd5e99761656f3c0e5ad86352f982a8bf02c30b..e4bc2e67abee4b22596bfc75524e3983b135719b 100644 |
--- a/chrome/browser/chromeos/certificate_provider/certificate_provider_service_unittest.cc |
+++ b/chrome/browser/chromeos/certificate_provider/certificate_provider_service_unittest.cc |
@@ -15,7 +15,6 @@ |
#include "base/threading/thread_task_runner_handle.h" |
#include "chrome/browser/chromeos/certificate_provider/certificate_provider.h" |
#include "net/base/net_errors.h" |
-#include "net/ssl/client_key_store.h" |
#include "net/test/cert_test_util.h" |
#include "net/test/test_data_directory.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -41,10 +40,15 @@ void ExpectOKAndStoreSignature(std::vector<uint8_t>* out_signature, |
*out_signature = signature; |
} |
-void StoreCertificates(net::CertificateList* out_certs, |
- const net::CertificateList& certs) { |
+void StoreCertificates(net::ClientCertIdentityList* out_certs, |
+ net::ClientCertIdentityList certs) { |
if (out_certs) |
- *out_certs = certs; |
+ *out_certs = std::move(certs); |
+} |
+ |
+void StorePrivateKey(scoped_refptr<net::SSLPrivateKey>* out_key, |
+ scoped_refptr<net::SSLPrivateKey> in_key) { |
+ *out_key = std::move(in_key); |
} |
certificate_provider::CertificateInfo CreateCertInfo( |
@@ -63,6 +67,13 @@ bool IsKeyEqualToCertInfo(const certificate_provider::CertificateInfo& info, |
return info.supported_hashes == key->GetDigestPreferences(); |
} |
+bool ClientCertIdentityAlphabeticSorter( |
+ const std::unique_ptr<net::ClientCertIdentity>& a_identity, |
+ const std::unique_ptr<net::ClientCertIdentity>& b_identity) { |
+ return a_identity->certificate()->subject().GetDisplayName() < |
+ b_identity->certificate()->subject().GetDisplayName(); |
+} |
+ |
class TestDelegate : public CertificateProviderService::Delegate { |
public: |
enum class RequestType { NONE, SIGN, GET_CERTIFICATES }; |
@@ -125,7 +136,6 @@ class CertificateProviderServiceTest : public testing::Test { |
CertificateProviderServiceTest() |
: task_runner_(new base::TestMockTimeTaskRunner()), |
task_runner_handle_(task_runner_), |
- client_key_store_(net::ClientKeyStore::GetInstance()), |
service_(new CertificateProviderService()), |
cert_info1_(CreateCertInfo("client_1.pem")), |
cert_info2_(CreateCertInfo("client_2.pem")) { |
@@ -141,7 +151,7 @@ class CertificateProviderServiceTest : public testing::Test { |
// Triggers a GetCertificates request and returns the request id. Assumes that |
// at least one extension is registered as a certificate provider. |
- int RequestCertificatesFromExtensions(net::CertificateList* certs) { |
+ int RequestCertificatesFromExtensions(net::ClientCertIdentityList* certs) { |
test_delegate_->ClearAndExpectRequest( |
TestDelegate::RequestType::GET_CERTIFICATES); |
@@ -154,12 +164,24 @@ class CertificateProviderServiceTest : public testing::Test { |
return test_delegate_->last_cert_request_id_; |
} |
+ scoped_refptr<net::SSLPrivateKey> FetchIdentityPrivateKey( |
+ net::ClientCertIdentity* identity) { |
+ scoped_refptr<net::SSLPrivateKey> ssl_private_key; |
+ identity->AcquirePrivateKey(base::Bind(StorePrivateKey, &ssl_private_key)); |
+ task_runner_->RunUntilIdle(); |
+ return ssl_private_key; |
+ } |
+ |
// Provides |cert_info1_| through kExtension1. |
- void ProvideDefaultCert() { |
- const int cert_request_id = RequestCertificatesFromExtensions(nullptr); |
+ std::unique_ptr<net::ClientCertIdentity> ProvideDefaultCert() { |
+ net::ClientCertIdentityList certs; |
+ const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
SetCertificateProvidedByExtension(kExtension1, cert_request_id, |
cert_info1_); |
task_runner_->RunUntilIdle(); |
+ if (certs.empty()) |
+ return nullptr; |
+ return std::move(certs[0]); |
} |
// Like service_->SetCertificatesProvidedByExtension but taking a single |
@@ -201,7 +223,6 @@ class CertificateProviderServiceTest : public testing::Test { |
scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
base::ThreadTaskRunnerHandle task_runner_handle_; |
TestDelegate* test_delegate_ = nullptr; |
- net::ClientKeyStore* const client_key_store_; |
std::unique_ptr<CertificateProvider> certificate_provider_; |
std::unique_ptr<CertificateProviderService> service_; |
const certificate_provider::CertificateInfo cert_info1_; |
@@ -214,7 +235,7 @@ class CertificateProviderServiceTest : public testing::Test { |
TEST_F(CertificateProviderServiceTest, GetCertificates) { |
test_delegate_->provider_extensions_.insert(kExtension2); |
- net::CertificateList certs; |
+ net::ClientCertIdentityList certs; |
const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
task_runner_->RunUntilIdle(); |
@@ -230,13 +251,12 @@ TEST_F(CertificateProviderServiceTest, GetCertificates) { |
SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); |
task_runner_->RunUntilIdle(); |
- EXPECT_EQ(2u, certs.size()); |
+ ASSERT_EQ(2u, certs.size()); |
- // Verify that the ClientKeyStore returns key handles for the provide certs. |
- EXPECT_TRUE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); |
- EXPECT_TRUE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info2_.certificate)); |
+ // Verify that the ClientCertIdentity returns key handles for the provided |
+ // certs. |
+ EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
+ EXPECT_TRUE(FetchIdentityPrivateKey(certs[1].get())); |
// Deregister the extensions as certificate providers. The next |
// GetCertificates call must report an empty list of certs. |
@@ -349,7 +369,7 @@ TEST_F(CertificateProviderServiceTest, LookUpCertificate) { |
TEST_F(CertificateProviderServiceTest, GetCertificatesTimeout) { |
test_delegate_->provider_extensions_.insert(kExtension2); |
- net::CertificateList certs; |
+ net::ClientCertIdentityList certs; |
const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
certificate_provider::CertificateInfoList infos; |
@@ -363,43 +383,64 @@ TEST_F(CertificateProviderServiceTest, GetCertificatesTimeout) { |
task_runner_->FastForwardUntilNoTasksRemain(); |
// After the timeout, only extension1_'s certificates are returned. |
// This verifies that the timeout delay is > 0 but not how long the delay is. |
- EXPECT_EQ(1u, certs.size()); |
+ ASSERT_EQ(1u, certs.size()); |
- EXPECT_TRUE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); |
+ EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
} |
TEST_F(CertificateProviderServiceTest, UnloadExtensionAfterGetCertificates) { |
test_delegate_->provider_extensions_.insert(kExtension2); |
- const int cert_request_id = RequestCertificatesFromExtensions(nullptr); |
+ net::ClientCertIdentityList certs; |
+ const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); |
task_runner_->RunUntilIdle(); |
+ ASSERT_EQ(2u, certs.size()); |
+ |
+ // Sort the returned certs to ensure that the test results are stable. |
+ std::sort(certs.begin(), certs.end(), ClientCertIdentityAlphabeticSorter); |
+ |
// Private key handles for both certificates must be available now. |
- EXPECT_TRUE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); |
- EXPECT_TRUE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info2_.certificate)); |
+ EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
+ EXPECT_TRUE(FetchIdentityPrivateKey(certs[1].get())); |
// Unload one of the extensions. |
service_->OnExtensionUnloaded(kExtension2); |
// extension1 isn't affected by the uninstall. |
- EXPECT_TRUE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); |
+ EXPECT_TRUE(FetchIdentityPrivateKey(certs[0].get())); |
// No key handles that were backed by the uninstalled extension must be |
// returned. |
- EXPECT_FALSE( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info2_.certificate)); |
+ EXPECT_FALSE(FetchIdentityPrivateKey(certs[1].get())); |
+} |
+ |
+TEST_F(CertificateProviderServiceTest, DestroyServiceAfterGetCertificates) { |
+ test_delegate_->provider_extensions_.insert(kExtension2); |
+ |
+ net::ClientCertIdentityList certs; |
+ const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
+ |
+ SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
+ SetCertificateProvidedByExtension(kExtension2, cert_request_id, cert_info2_); |
+ task_runner_->RunUntilIdle(); |
+ |
+ ASSERT_EQ(2u, certs.size()); |
+ |
+ // Destroy the service. |
+ service_.reset(); |
+ |
+ // Private key handles for both certificates should return nullptr now. |
+ EXPECT_FALSE(FetchIdentityPrivateKey(certs[0].get())); |
+ EXPECT_FALSE(FetchIdentityPrivateKey(certs[1].get())); |
} |
TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringGetCertificates) { |
test_delegate_->provider_extensions_.insert(kExtension2); |
- net::CertificateList certs; |
+ net::ClientCertIdentityList certs; |
const int cert_request_id = RequestCertificatesFromExtensions(&certs); |
SetCertificateProvidedByExtension(kExtension1, cert_request_id, cert_info1_); |
@@ -415,10 +456,11 @@ TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringGetCertificates) { |
// Trying to sign data using the exposed SSLPrivateKey must cause a sign |
// request. The reply must be correctly routed back to the private key. |
TEST_F(CertificateProviderServiceTest, SignRequest) { |
- ProvideDefaultCert(); |
+ std::unique_ptr<net::ClientCertIdentity> cert(ProvideDefaultCert()); |
+ ASSERT_TRUE(cert); |
scoped_refptr<net::SSLPrivateKey> private_key( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); |
+ FetchIdentityPrivateKey(cert.get())); |
ASSERT_TRUE(private_key); |
EXPECT_TRUE(IsKeyEqualToCertInfo(cert_info1_, private_key.get())); |
@@ -452,10 +494,11 @@ TEST_F(CertificateProviderServiceTest, SignRequest) { |
} |
TEST_F(CertificateProviderServiceTest, UnloadExtensionDuringSign) { |
- ProvideDefaultCert(); |
+ std::unique_ptr<net::ClientCertIdentity> cert(ProvideDefaultCert()); |
+ ASSERT_TRUE(cert); |
scoped_refptr<net::SSLPrivateKey> private_key( |
- client_key_store_->FetchClientCertPrivateKey(*cert_info1_.certificate)); |
+ FetchIdentityPrivateKey(cert.get())); |
ASSERT_TRUE(private_key); |
test_delegate_->ClearAndExpectRequest(TestDelegate::RequestType::SIGN); |