| Index: chromeos/cert_loader_unittest.cc
|
| diff --git a/chromeos/cert_loader_unittest.cc b/chromeos/cert_loader_unittest.cc
|
| index 6056f7675e849259dffeb2571fe9f4d9b6715198..405cf29d91a1a4608552380c5661ccb840ca1972 100644
|
| --- a/chromeos/cert_loader_unittest.cc
|
| +++ b/chromeos/cert_loader_unittest.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/files/file_util.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| +#include "base/test/scoped_task_scheduler.h"
|
| #include "crypto/scoped_nss_types.h"
|
| #include "crypto/scoped_test_nss_db.h"
|
| #include "net/cert/nss_cert_database_chromeos.h"
|
| @@ -45,7 +46,8 @@ class TestNSSCertDatabase : public net::NSSCertDatabaseChromeOS {
|
| std::move(private_slot)) {}
|
| ~TestNSSCertDatabase() override {}
|
|
|
| - void NotifyOfCertAdded(const net::X509Certificate* cert) {
|
| + // Make this method visible in the public interface.
|
| + void NotifyObserversCertDBChanged() {
|
| NSSCertDatabaseChromeOS::NotifyObserversCertDBChanged();
|
| }
|
| };
|
| @@ -54,7 +56,9 @@ class CertLoaderTest : public testing::Test,
|
| public CertLoader::Observer {
|
| public:
|
| CertLoaderTest()
|
| - : cert_loader_(nullptr), certificates_loaded_events_count_(0U) {}
|
| + : cert_loader_(nullptr),
|
| + scoped_task_scheduler_(&message_loop_),
|
| + certificates_loaded_events_count_(0U) {}
|
|
|
| ~CertLoaderTest() override {}
|
|
|
| @@ -80,6 +84,17 @@ class CertLoaderTest : public testing::Test,
|
| GetAndResetCertificatesLoadedEventsCount();
|
| }
|
|
|
| + // Starts the cert loader with a primary cert database which has access to the
|
| + // system token.
|
| + void StartCertLoaderWithPrimaryDBAndSystemToken() {
|
| + CreateCertDatabase(&primary_db_, &primary_certdb_);
|
| + AddSystemToken(primary_certdb_.get());
|
| + cert_loader_->StartWithNSSDB(primary_certdb_.get());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + GetAndResetCertificatesLoadedEventsCount();
|
| + }
|
| +
|
| // CertLoader::Observer:
|
| // The test keeps count of times the observer method was called.
|
| void OnCertificatesLoaded(const net::CertificateList& cert_list,
|
| @@ -125,17 +140,27 @@ class CertLoaderTest : public testing::Test,
|
| ASSERT_TRUE(failed.empty());
|
| }
|
|
|
| + // Import a client cert and key into a PKCS11 slot. Then notify
|
| + // |database_to_notify| (which is presumably using that slot) that new
|
| + // certificates are available.
|
| scoped_refptr<net::X509Certificate> ImportClientCertAndKey(
|
| - TestNSSCertDatabase* database) {
|
| + TestNSSCertDatabase* database_to_notify,
|
| + PK11SlotInfo* slot_to_use) {
|
| // Import a client cert signed by that CA.
|
| scoped_refptr<net::X509Certificate> client_cert(
|
| net::ImportClientCertAndKeyFromFile(net::GetTestCertsDirectory(),
|
| "client_1.pem", "client_1.pk8",
|
| - database->GetPrivateSlot().get()));
|
| - database->NotifyOfCertAdded(client_cert.get());
|
| + slot_to_use));
|
| + database_to_notify->NotifyObserversCertDBChanged();
|
| return client_cert;
|
| }
|
|
|
| + // Import a client cert into |database|'s private slot.
|
| + scoped_refptr<net::X509Certificate> ImportClientCertAndKey(
|
| + TestNSSCertDatabase* database) {
|
| + return ImportClientCertAndKey(database, database->GetPrivateSlot().get());
|
| + }
|
| +
|
| CertLoader* cert_loader_;
|
|
|
| // The user is primary as the one whose certificates CertLoader handles, it
|
| @@ -144,9 +169,20 @@ class CertLoaderTest : public testing::Test,
|
| crypto::ScopedTestNSSDB primary_db_;
|
| std::unique_ptr<TestNSSCertDatabase> primary_certdb_;
|
|
|
| + // Additional NSS DB simulating the system token.
|
| + crypto::ScopedTestNSSDB system_db_;
|
| +
|
| base::MessageLoop message_loop_;
|
|
|
| private:
|
| + // Adds the PKCS11 slot from |system_db_| to |certdb| as system slot.
|
| + void AddSystemToken(TestNSSCertDatabase* certdb) {
|
| + ASSERT_TRUE(system_db_.is_open());
|
| + certdb->SetSystemSlot(
|
| + crypto::ScopedPK11Slot(PK11_ReferenceSlot(system_db_.slot())));
|
| + }
|
| +
|
| + base::test::ScopedTaskScheduler scoped_task_scheduler_;
|
| size_t certificates_loaded_events_count_;
|
| };
|
|
|
| @@ -161,7 +197,7 @@ TEST_F(CertLoaderTest, Basic) {
|
|
|
| EXPECT_FALSE(cert_loader_->certificates_loaded());
|
| EXPECT_TRUE(cert_loader_->CertificatesLoading());
|
| - EXPECT_TRUE(cert_loader_->cert_list().empty());
|
| + EXPECT_TRUE(cert_loader_->all_certs().empty());
|
|
|
| ASSERT_EQ(0U, GetAndResetCertificatesLoadedEventsCount());
|
| base::RunLoop().RunUntilIdle();
|
| @@ -171,7 +207,7 @@ TEST_F(CertLoaderTest, Basic) {
|
| EXPECT_FALSE(cert_loader_->CertificatesLoading());
|
|
|
| // Default CA cert roots should get loaded.
|
| - EXPECT_FALSE(cert_loader_->cert_list().empty());
|
| + EXPECT_FALSE(cert_loader_->all_certs().empty());
|
| }
|
|
|
| TEST_F(CertLoaderTest, CertLoaderUpdatesCertListOnNewCert) {
|
| @@ -183,7 +219,7 @@ TEST_F(CertLoaderTest, CertLoaderUpdatesCertListOnNewCert) {
|
| // Certs are loaded asynchronously, so the new cert should not yet be in the
|
| // cert list.
|
| EXPECT_FALSE(
|
| - IsCertInCertificateList(certs[0].get(), cert_loader_->cert_list()));
|
| + IsCertInCertificateList(certs[0].get(), cert_loader_->all_certs()));
|
|
|
| ASSERT_EQ(0U, GetAndResetCertificatesLoadedEventsCount());
|
| base::RunLoop().RunUntilIdle();
|
| @@ -191,7 +227,7 @@ TEST_F(CertLoaderTest, CertLoaderUpdatesCertListOnNewCert) {
|
|
|
| // The certificate list should be updated now, as the message loop's been run.
|
| EXPECT_TRUE(
|
| - IsCertInCertificateList(certs[0].get(), cert_loader_->cert_list()));
|
| + IsCertInCertificateList(certs[0].get(), cert_loader_->all_certs()));
|
|
|
| EXPECT_FALSE(cert_loader_->IsCertificateHardwareBacked(certs[0].get()));
|
| }
|
| @@ -209,7 +245,7 @@ TEST_F(CertLoaderTest, CertLoaderNoUpdateOnSecondaryDbChanges) {
|
| base::RunLoop().RunUntilIdle();
|
|
|
| EXPECT_FALSE(
|
| - IsCertInCertificateList(certs[0].get(), cert_loader_->cert_list()));
|
| + IsCertInCertificateList(certs[0].get(), cert_loader_->all_certs()));
|
| }
|
|
|
| TEST_F(CertLoaderTest, ClientLoaderUpdateOnNewClientCert) {
|
| @@ -222,7 +258,24 @@ TEST_F(CertLoaderTest, ClientLoaderUpdateOnNewClientCert) {
|
| base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(1U, GetAndResetCertificatesLoadedEventsCount());
|
|
|
| - EXPECT_TRUE(IsCertInCertificateList(cert.get(), cert_loader_->cert_list()));
|
| + EXPECT_TRUE(IsCertInCertificateList(cert.get(), cert_loader_->all_certs()));
|
| +}
|
| +
|
| +TEST_F(CertLoaderTest, ClientLoaderUpdateOnNewClientCertInSystemToken) {
|
| + StartCertLoaderWithPrimaryDBAndSystemToken();
|
| +
|
| + EXPECT_TRUE(cert_loader_->system_certs().empty());
|
| + scoped_refptr<net::X509Certificate> cert(ImportClientCertAndKey(
|
| + primary_certdb_.get(), primary_certdb_->GetSystemSlot().get()));
|
| +
|
| + ASSERT_EQ(0U, GetAndResetCertificatesLoadedEventsCount());
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(1U, GetAndResetCertificatesLoadedEventsCount());
|
| +
|
| + EXPECT_TRUE(IsCertInCertificateList(cert.get(), cert_loader_->all_certs()));
|
| + EXPECT_EQ(1U, cert_loader_->system_certs().size());
|
| + EXPECT_TRUE(
|
| + IsCertInCertificateList(cert.get(), cert_loader_->system_certs()));
|
| }
|
|
|
| TEST_F(CertLoaderTest, CertLoaderNoUpdateOnNewClientCertInSecondaryDb) {
|
| @@ -237,7 +290,7 @@ TEST_F(CertLoaderTest, CertLoaderNoUpdateOnNewClientCertInSecondaryDb) {
|
|
|
| base::RunLoop().RunUntilIdle();
|
|
|
| - EXPECT_FALSE(IsCertInCertificateList(cert.get(), cert_loader_->cert_list()));
|
| + EXPECT_FALSE(IsCertInCertificateList(cert.get(), cert_loader_->all_certs()));
|
| }
|
|
|
| TEST_F(CertLoaderTest, UpdatedOnCertRemoval) {
|
| @@ -249,7 +302,7 @@ TEST_F(CertLoaderTest, UpdatedOnCertRemoval) {
|
| base::RunLoop().RunUntilIdle();
|
|
|
| ASSERT_EQ(1U, GetAndResetCertificatesLoadedEventsCount());
|
| - ASSERT_TRUE(IsCertInCertificateList(cert.get(), cert_loader_->cert_list()));
|
| + ASSERT_TRUE(IsCertInCertificateList(cert.get(), cert_loader_->all_certs()));
|
|
|
| primary_certdb_->DeleteCertAndKey(cert.get());
|
|
|
| @@ -257,7 +310,7 @@ TEST_F(CertLoaderTest, UpdatedOnCertRemoval) {
|
| base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(1U, GetAndResetCertificatesLoadedEventsCount());
|
|
|
| - ASSERT_FALSE(IsCertInCertificateList(cert.get(), cert_loader_->cert_list()));
|
| + ASSERT_FALSE(IsCertInCertificateList(cert.get(), cert_loader_->all_certs()));
|
| }
|
|
|
| TEST_F(CertLoaderTest, UpdatedOnCACertTrustChange) {
|
| @@ -269,7 +322,7 @@ TEST_F(CertLoaderTest, UpdatedOnCACertTrustChange) {
|
| base::RunLoop().RunUntilIdle();
|
| ASSERT_EQ(1U, GetAndResetCertificatesLoadedEventsCount());
|
| ASSERT_TRUE(
|
| - IsCertInCertificateList(certs[0].get(), cert_loader_->cert_list()));
|
| + IsCertInCertificateList(certs[0].get(), cert_loader_->all_certs()));
|
|
|
| // The value that should have been set by |ImportCACert|.
|
| ASSERT_EQ(net::NSSCertDatabase::TRUST_DEFAULT,
|
|
|