Handle cases when user cert database has NULL slots

The slots can be NULL if the user's username hash is empty string (e.g. in retail mode)

BUG=349085,340505
TEST=
Retail mode does not immediately restart (i.e. no crash).
In retail mode, go to chrome://settings/certificates -> buttons for importing certs should be disabled

Review URL: https://codereview.chromium.org/193273002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257570 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chromeos/cert_loader_unittest.cc b/chromeos/cert_loader_unittest.cc
index 57def93..fc47704 100644
--- a/chromeos/cert_loader_unittest.cc
+++ b/chromeos/cert_loader_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/run_loop.h"
 #include "crypto/nss_util.h"
 #include "crypto/nss_util_internal.h"
+#include "crypto/scoped_nss_types.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_data_directory.h"
 #include "net/cert/nss_cert_database_chromeos.h"
@@ -304,5 +305,19 @@
   EXPECT_EQ(1U, GetAndResetCertificatesLoadedEventsCount());
 }
 
+TEST_F(CertLoaderTest, DatabaseWithUnsetSlots) {
+  primary_db_.reset(new net::NSSCertDatabaseChromeOS(crypto::ScopedPK11Slot(),
+                                                     crypto::ScopedPK11Slot()));
+  primary_db_->SetSlowTaskRunnerForTest(message_loop_.message_loop_proxy());
+  cert_loader_->StartWithNSSDB(primary_db_.get());
+
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(1u, GetAndResetCertificatesLoadedEventsCount());
+
+  EXPECT_TRUE(cert_loader_->certificates_loaded());
+  EXPECT_EQ(-1, cert_loader_->TPMTokenSlotID());
+  EXPECT_FALSE(cert_loader_->IsHardwareBacked());
+}
+
 }  // namespace
 }  // namespace chromeos