Chromium Code Reviews| Index: chrome/browser/net/sqlite_origin_bound_cert_store_unittest.cc |
| diff --git a/chrome/browser/net/sqlite_origin_bound_cert_store_unittest.cc b/chrome/browser/net/sqlite_origin_bound_cert_store_unittest.cc |
| index 476839544fb3bcf17b352826e17e82dcf5c8cc1d..06cb2744b9567188a67430f04fe3d8f5682f680b 100644 |
| --- a/chrome/browser/net/sqlite_origin_bound_cert_store_unittest.cc |
| +++ b/chrome/browser/net/sqlite_origin_bound_cert_store_unittest.cc |
| @@ -12,6 +12,7 @@ |
| #include "chrome/browser/net/sqlite_origin_bound_cert_store.h" |
| #include "chrome/common/chrome_constants.h" |
| #include "content/test/test_browser_thread.h" |
| +#include "sql/statement.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| using content::BrowserThread; |
| @@ -34,7 +35,8 @@ class SQLiteOriginBoundCertStoreTest : public testing::Test { |
| // Make sure the store gets written at least once. |
| store_->AddOriginBoundCert( |
| net::DefaultOriginBoundCertStore::OriginBoundCert( |
| - "https://encrypted.google.com:8443", "a", "b")); |
| + "https://encrypted.google.com:8443", |
| + net::CLIENT_CERT_RSA_SIGN, "a", "b")); |
| } |
| content::TestBrowserThread db_thread_; |
| @@ -75,6 +77,10 @@ TEST_F(SQLiteOriginBoundCertStoreTest, RemoveOnDestruction) { |
| // Test if data is stored as expected in the SQLite database. |
| TEST_F(SQLiteOriginBoundCertStoreTest, TestPersistence) { |
| + store_->AddOriginBoundCert( |
| + net::DefaultOriginBoundCertStore::OriginBoundCert( |
| + "https://www.google.com/", net::CLIENT_CERT_ECDSA_SIGN, "c", "d")); |
| + |
| std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs; |
| // Replace the store effectively destroying the current one and forcing it |
| // to write it's data to disk. Then we can see if after loading it again it |
| @@ -90,12 +96,27 @@ TEST_F(SQLiteOriginBoundCertStoreTest, TestPersistence) { |
| // Reload and test for persistence |
| ASSERT_TRUE(store_->Load(&certs)); |
| - ASSERT_EQ(1U, certs.size()); |
| - ASSERT_STREQ("https://encrypted.google.com:8443", certs[0]->origin().c_str()); |
| - ASSERT_STREQ("a", certs[0]->private_key().c_str()); |
| - ASSERT_STREQ("b", certs[0]->cert().c_str()); |
| + ASSERT_EQ(2U, certs.size()); |
| + net::DefaultOriginBoundCertStore::OriginBoundCert* ec_cert; |
| + net::DefaultOriginBoundCertStore::OriginBoundCert* rsa_cert; |
| + if (net::CLIENT_CERT_RSA_SIGN == certs[0]->type()) { |
| + rsa_cert = certs[0]; |
| + ec_cert = certs[1]; |
| + } else { |
| + rsa_cert = certs[1]; |
| + ec_cert = certs[0]; |
| + } |
| + ASSERT_STREQ("https://encrypted.google.com:8443", rsa_cert->origin().c_str()); |
| + ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, rsa_cert->type()); |
| + ASSERT_STREQ("a", rsa_cert->private_key().c_str()); |
| + ASSERT_STREQ("b", rsa_cert->cert().c_str()); |
| + ASSERT_STREQ("https://www.google.com/", ec_cert->origin().c_str()); |
| + ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, ec_cert->type()); |
| + ASSERT_STREQ("c", ec_cert->private_key().c_str()); |
| + ASSERT_STREQ("d", ec_cert->cert().c_str()); |
| // Now delete the cert and check persistence again. |
| + store_->DeleteOriginBoundCert(*certs[1]); |
|
wtc
2011/12/02 22:06:59
Nit: if the order of deleting certs doesn't matter
mattm
2011/12/05 22:19:20
Done.
|
| store_->DeleteOriginBoundCert(*certs[0]); |
| store_ = NULL; |
| // Make sure we wait until the destructor has run. |
| @@ -110,6 +131,69 @@ TEST_F(SQLiteOriginBoundCertStoreTest, TestPersistence) { |
| ASSERT_EQ(0U, certs.size()); |
| } |
| +TEST_F(SQLiteOriginBoundCertStoreTest, TestUpgrade) { |
| + // Reset the store. We'll be using a different database for this test. |
| + store_ = NULL; |
| + |
| + FilePath v1_db_path(temp_dir_.path().AppendASCII("v1db")); |
| + |
| + // Create a version 1 database. |
| + { |
| + sql::Connection db; |
| + ASSERT_TRUE(db.Open(v1_db_path)); |
| + ASSERT_TRUE(db.Execute( |
| + "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY," |
| + "value LONGVARCHAR);" |
| + "INSERT INTO \"meta\" VALUES('version','1');" |
| + "INSERT INTO \"meta\" VALUES('last_compatible_version','1');" |
| + "CREATE TABLE origin_bound_certs (" |
| + "origin TEXT NOT NULL UNIQUE PRIMARY KEY," |
| + "private_key BLOB NOT NULL,cert BLOB NOT NULL);" |
| + "INSERT INTO \"origin_bound_certs\" VALUES(" |
| + "'https://google.com',X'AA',X'BB');" |
| + "INSERT INTO \"origin_bound_certs\" VALUES(" |
| + "'https://foo.com',X'CC',X'DD');" |
| + )); |
| + } |
| + |
| + std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs; |
| + store_ = new SQLiteOriginBoundCertStore(v1_db_path); |
| + |
| + // Load the database and ensure the certs can be read and are marked as RSA. |
| + ASSERT_TRUE(store_->Load(&certs)); |
| + ASSERT_EQ(2U, certs.size()); |
| + ASSERT_STREQ("https://google.com", certs[0]->origin().c_str()); |
| + ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type()); |
| + ASSERT_STREQ("\xaa", certs[0]->private_key().c_str()); |
| + ASSERT_STREQ("\xbb", certs[0]->cert().c_str()); |
| + ASSERT_STREQ("https://foo.com", certs[1]->origin().c_str()); |
| + ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[1]->type()); |
| + ASSERT_STREQ("\xcc", certs[1]->private_key().c_str()); |
| + ASSERT_STREQ("\xdd", certs[1]->cert().c_str()); |
| + |
| + STLDeleteContainerPointers(certs.begin(), certs.end()); |
| + certs.clear(); |
| + |
| + store_ = NULL; |
| + // Make sure we wait until the destructor has run. |
| + scoped_refptr<base::ThreadTestHelper> helper( |
| + new base::ThreadTestHelper( |
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); |
| + ASSERT_TRUE(helper->Run()); |
| + |
| + // Verify the database version is updated. |
| + { |
| + sql::Connection db; |
| + ASSERT_TRUE(db.Open(v1_db_path)); |
| + sql::Statement smt(db.GetUniqueStatement( |
| + "SELECT value FROM meta WHERE key = \"version\"")); |
| + ASSERT_TRUE(smt); |
| + ASSERT_TRUE(smt.Step()); |
| + EXPECT_EQ(2, smt.ColumnInt(0)); |
| + EXPECT_FALSE(smt.Step()); |
| + } |
| +} |
| + |
| // Test that we can force the database to be written by calling Flush(). |
| TEST_F(SQLiteOriginBoundCertStoreTest, TestFlush) { |
| // File timestamps don't work well on all platforms, so we'll determine |
| @@ -125,9 +209,11 @@ TEST_F(SQLiteOriginBoundCertStoreTest, TestFlush) { |
| std::string private_key(1000, c); |
| std::string cert(1000, c); |
| store_->AddOriginBoundCert( |
| - net::DefaultOriginBoundCertStore::OriginBoundCert(origin, |
| - private_key, |
| - cert)); |
| + net::DefaultOriginBoundCertStore::OriginBoundCert( |
| + origin, |
| + net::CLIENT_CERT_RSA_SIGN, |
| + private_key, |
| + cert)); |
| } |
| // Call Flush() and wait until the DB thread is idle. |