Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: chrome/browser/net/sqlite_origin_bound_cert_store_unittest.cc

Issue 8890073: Handle Origin Bound Certificate expiration. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review changes Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/net/sqlite_origin_bound_cert_store.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/file_util.h" 6 #include "base/file_util.h"
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/scoped_temp_dir.h" 9 #include "base/scoped_temp_dir.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
11 #include "base/test/thread_test_helper.h" 11 #include "base/test/thread_test_helper.h"
12 #include "chrome/browser/net/sqlite_origin_bound_cert_store.h" 12 #include "chrome/browser/net/sqlite_origin_bound_cert_store.h"
13 #include "chrome/common/chrome_constants.h" 13 #include "chrome/common/chrome_constants.h"
14 #include "content/test/test_browser_thread.h" 14 #include "content/test/test_browser_thread.h"
15 #include "net/base/cert_test_util.h"
15 #include "sql/statement.h" 16 #include "sql/statement.h"
16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
17 18
18 using content::BrowserThread; 19 using content::BrowserThread;
19 20
20 class SQLiteOriginBoundCertStoreTest : public testing::Test { 21 class SQLiteOriginBoundCertStoreTest : public testing::Test {
21 public: 22 public:
22 SQLiteOriginBoundCertStoreTest() 23 SQLiteOriginBoundCertStoreTest()
23 : db_thread_(BrowserThread::DB) { 24 : db_thread_(BrowserThread::DB) {
24 } 25 }
25 26
26 protected: 27 protected:
28 static void ReadTestKeyAndCert(std::string* key, std::string* cert) {
29 FilePath key_path = net::GetTestCertsDirectory().AppendASCII(
30 "unittest.originbound.key.der");
31 FilePath cert_path = net::GetTestCertsDirectory().AppendASCII(
32 "unittest.originbound.der");
33 ASSERT_TRUE(file_util::ReadFileToString(key_path, key));
34 ASSERT_TRUE(file_util::ReadFileToString(cert_path, cert));
35 }
36
37 static base::Time GetTestCertExpirationTime() {
38 // Cert expiration time from 'dumpasn1 unittest.originbound.der':
39 // GeneralizedTime 19/11/2111 02:23:45 GMT
40 base::Time::Exploded exploded_time;
41 exploded_time.year = 2111;
42 exploded_time.month = 11;
43 exploded_time.day_of_week = 0; // Unused.
44 exploded_time.day_of_month = 19;
45 exploded_time.hour = 2;
46 exploded_time.minute = 23;
47 exploded_time.second = 45;
48 exploded_time.millisecond = 0;
49 return base::Time::FromUTCExploded(exploded_time);
50 }
51
27 virtual void SetUp() { 52 virtual void SetUp() {
28 db_thread_.Start(); 53 db_thread_.Start();
29 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 54 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
30 store_ = new SQLiteOriginBoundCertStore( 55 store_ = new SQLiteOriginBoundCertStore(
31 temp_dir_.path().Append(chrome::kOBCertFilename)); 56 temp_dir_.path().Append(chrome::kOBCertFilename));
32 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs; 57 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs;
33 ASSERT_TRUE(store_->Load(&certs)); 58 ASSERT_TRUE(store_->Load(&certs));
34 ASSERT_EQ(0u, certs.size()); 59 ASSERT_EQ(0u, certs.size());
35 // Make sure the store gets written at least once. 60 // Make sure the store gets written at least once.
36 store_->AddOriginBoundCert( 61 store_->AddOriginBoundCert(
37 net::DefaultOriginBoundCertStore::OriginBoundCert( 62 net::DefaultOriginBoundCertStore::OriginBoundCert(
38 "https://encrypted.google.com:8443", 63 "https://encrypted.google.com:8443",
39 net::CLIENT_CERT_RSA_SIGN, "a", "b")); 64 net::CLIENT_CERT_RSA_SIGN,
65 base::Time(),
66 "a", "b"));
40 } 67 }
41 68
42 content::TestBrowserThread db_thread_; 69 content::TestBrowserThread db_thread_;
43 ScopedTempDir temp_dir_; 70 ScopedTempDir temp_dir_;
44 scoped_refptr<SQLiteOriginBoundCertStore> store_; 71 scoped_refptr<SQLiteOriginBoundCertStore> store_;
45 }; 72 };
46 73
47 TEST_F(SQLiteOriginBoundCertStoreTest, KeepOnDestruction) { 74 TEST_F(SQLiteOriginBoundCertStoreTest, KeepOnDestruction) {
48 store_->SetClearLocalStateOnExit(false); 75 store_->SetClearLocalStateOnExit(false);
49 store_ = NULL; 76 store_ = NULL;
(...skipping 22 matching lines...) Expand all
72 ASSERT_TRUE(helper->Run()); 99 ASSERT_TRUE(helper->Run());
73 100
74 ASSERT_FALSE(file_util::PathExists( 101 ASSERT_FALSE(file_util::PathExists(
75 temp_dir_.path().Append(chrome::kOBCertFilename))); 102 temp_dir_.path().Append(chrome::kOBCertFilename)));
76 } 103 }
77 104
78 // Test if data is stored as expected in the SQLite database. 105 // Test if data is stored as expected in the SQLite database.
79 TEST_F(SQLiteOriginBoundCertStoreTest, TestPersistence) { 106 TEST_F(SQLiteOriginBoundCertStoreTest, TestPersistence) {
80 store_->AddOriginBoundCert( 107 store_->AddOriginBoundCert(
81 net::DefaultOriginBoundCertStore::OriginBoundCert( 108 net::DefaultOriginBoundCertStore::OriginBoundCert(
82 "https://www.google.com/", net::CLIENT_CERT_ECDSA_SIGN, "c", "d")); 109 "https://www.google.com/",
110 net::CLIENT_CERT_ECDSA_SIGN,
111 base::Time(),
112 "c", "d"));
83 113
84 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs; 114 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs;
85 // Replace the store effectively destroying the current one and forcing it 115 // Replace the store effectively destroying the current one and forcing it
86 // to write it's data to disk. Then we can see if after loading it again it 116 // to write it's data to disk. Then we can see if after loading it again it
87 // is still there. 117 // is still there.
88 store_ = NULL; 118 store_ = NULL;
89 scoped_refptr<base::ThreadTestHelper> helper( 119 scoped_refptr<base::ThreadTestHelper> helper(
90 new base::ThreadTestHelper( 120 new base::ThreadTestHelper(
91 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); 121 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
92 // Make sure we wait until the destructor has run. 122 // Make sure we wait until the destructor has run.
(...skipping 21 matching lines...) Expand all
114 ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, ec_cert->type()); 144 ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, ec_cert->type());
115 ASSERT_STREQ("c", ec_cert->private_key().c_str()); 145 ASSERT_STREQ("c", ec_cert->private_key().c_str());
116 ASSERT_STREQ("d", ec_cert->cert().c_str()); 146 ASSERT_STREQ("d", ec_cert->cert().c_str());
117 147
118 // Now delete the cert and check persistence again. 148 // Now delete the cert and check persistence again.
119 store_->DeleteOriginBoundCert(*certs[0]); 149 store_->DeleteOriginBoundCert(*certs[0]);
120 store_->DeleteOriginBoundCert(*certs[1]); 150 store_->DeleteOriginBoundCert(*certs[1]);
121 store_ = NULL; 151 store_ = NULL;
122 // Make sure we wait until the destructor has run. 152 // Make sure we wait until the destructor has run.
123 ASSERT_TRUE(helper->Run()); 153 ASSERT_TRUE(helper->Run());
124 STLDeleteContainerPointers(certs.begin(), certs.end()); 154 STLDeleteElements(&certs);
125 certs.clear();
126 store_ = new SQLiteOriginBoundCertStore( 155 store_ = new SQLiteOriginBoundCertStore(
127 temp_dir_.path().Append(chrome::kOBCertFilename)); 156 temp_dir_.path().Append(chrome::kOBCertFilename));
128 157
129 // Reload and check if the cert has been removed. 158 // Reload and check if the cert has been removed.
130 ASSERT_TRUE(store_->Load(&certs)); 159 ASSERT_TRUE(store_->Load(&certs));
131 ASSERT_EQ(0U, certs.size()); 160 ASSERT_EQ(0U, certs.size());
132 } 161 }
133 162
134 TEST_F(SQLiteOriginBoundCertStoreTest, TestUpgrade) { 163 TEST_F(SQLiteOriginBoundCertStoreTest, TestUpgradeV1) {
135 // Reset the store. We'll be using a different database for this test. 164 // Reset the store. We'll be using a different database for this test.
136 store_ = NULL; 165 store_ = NULL;
137 166
138 FilePath v1_db_path(temp_dir_.path().AppendASCII("v1db")); 167 FilePath v1_db_path(temp_dir_.path().AppendASCII("v1db"));
139 168
169 std::string key_data;
170 std::string cert_data;
171 ReadTestKeyAndCert(&key_data, &cert_data);
172
140 // Create a version 1 database. 173 // Create a version 1 database.
141 { 174 {
142 sql::Connection db; 175 sql::Connection db;
143 ASSERT_TRUE(db.Open(v1_db_path)); 176 ASSERT_TRUE(db.Open(v1_db_path));
144 ASSERT_TRUE(db.Execute( 177 ASSERT_TRUE(db.Execute(
145 "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY," 178 "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
146 "value LONGVARCHAR);" 179 "value LONGVARCHAR);"
147 "INSERT INTO \"meta\" VALUES('version','1');" 180 "INSERT INTO \"meta\" VALUES('version','1');"
148 "INSERT INTO \"meta\" VALUES('last_compatible_version','1');" 181 "INSERT INTO \"meta\" VALUES('last_compatible_version','1');"
149 "CREATE TABLE origin_bound_certs (" 182 "CREATE TABLE origin_bound_certs ("
150 "origin TEXT NOT NULL UNIQUE PRIMARY KEY," 183 "origin TEXT NOT NULL UNIQUE PRIMARY KEY,"
151 "private_key BLOB NOT NULL,cert BLOB NOT NULL);" 184 "private_key BLOB NOT NULL,cert BLOB NOT NULL);"));
185
186 sql::Statement add_smt(db.GetUniqueStatement(
187 "INSERT INTO origin_bound_certs (origin, private_key, cert) "
188 "VALUES (?,?,?)"));
189 add_smt.BindString(0, "https://www.google.com:443");
190 add_smt.BindBlob(1, key_data.data(), key_data.size());
191 add_smt.BindBlob(2, cert_data.data(), cert_data.size());
192 ASSERT_TRUE(add_smt.Run());
193
194 ASSERT_TRUE(db.Execute(
152 "INSERT INTO \"origin_bound_certs\" VALUES(" 195 "INSERT INTO \"origin_bound_certs\" VALUES("
153 "'https://google.com',X'AA',X'BB');" 196 "'https://foo.com',X'AA',X'BB');"
154 "INSERT INTO \"origin_bound_certs\" VALUES("
155 "'https://foo.com',X'CC',X'DD');"
156 )); 197 ));
157 } 198 }
158 199
159 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs; 200 // Load and test the DB contents twice. First time ensures that we can use
160 store_ = new SQLiteOriginBoundCertStore(v1_db_path); 201 // the updated values immediately. Second time ensures that the updated
202 // values are stored and read correctly on next load.
203 for (int i = 0; i < 2; ++i) {
204 SCOPED_TRACE(i);
161 205
162 // Load the database and ensure the certs can be read and are marked as RSA. 206 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs;
163 ASSERT_TRUE(store_->Load(&certs)); 207 store_ = new SQLiteOriginBoundCertStore(v1_db_path);
164 ASSERT_EQ(2U, certs.size());
165 ASSERT_STREQ("https://google.com", certs[0]->origin().c_str());
166 ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type());
167 ASSERT_STREQ("\xaa", certs[0]->private_key().c_str());
168 ASSERT_STREQ("\xbb", certs[0]->cert().c_str());
169 ASSERT_STREQ("https://foo.com", certs[1]->origin().c_str());
170 ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[1]->type());
171 ASSERT_STREQ("\xcc", certs[1]->private_key().c_str());
172 ASSERT_STREQ("\xdd", certs[1]->cert().c_str());
173 208
174 STLDeleteContainerPointers(certs.begin(), certs.end()); 209 // Load the database and ensure the certs can be read and are marked as RSA.
175 certs.clear(); 210 ASSERT_TRUE(store_->Load(&certs));
211 ASSERT_EQ(2U, certs.size());
176 212
177 store_ = NULL; 213 ASSERT_STREQ("https://www.google.com:443", certs[0]->origin().c_str());
178 // Make sure we wait until the destructor has run. 214 ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type());
179 scoped_refptr<base::ThreadTestHelper> helper( 215 ASSERT_EQ(GetTestCertExpirationTime(),
180 new base::ThreadTestHelper( 216 certs[0]->expiration_time());
181 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); 217 ASSERT_EQ(key_data, certs[0]->private_key());
182 ASSERT_TRUE(helper->Run()); 218 ASSERT_EQ(cert_data, certs[0]->cert());
183 219
184 // Verify the database version is updated. 220 ASSERT_STREQ("https://foo.com", certs[1]->origin().c_str());
185 { 221 ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[1]->type());
186 sql::Connection db; 222 // Undecodable cert, expiration time will be uninitialized.
187 ASSERT_TRUE(db.Open(v1_db_path)); 223 ASSERT_EQ(base::Time(), certs[1]->expiration_time());
188 sql::Statement smt(db.GetUniqueStatement( 224 ASSERT_STREQ("\xaa", certs[1]->private_key().c_str());
189 "SELECT value FROM meta WHERE key = \"version\"")); 225 ASSERT_STREQ("\xbb", certs[1]->cert().c_str());
190 ASSERT_TRUE(smt); 226
191 ASSERT_TRUE(smt.Step()); 227 STLDeleteElements(&certs);
192 EXPECT_EQ(2, smt.ColumnInt(0)); 228
193 EXPECT_FALSE(smt.Step()); 229 store_ = NULL;
230 // Make sure we wait until the destructor has run.
231 scoped_refptr<base::ThreadTestHelper> helper(
232 new base::ThreadTestHelper(
233 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
234 ASSERT_TRUE(helper->Run());
235
236 // Verify the database version is updated.
237 {
238 sql::Connection db;
239 ASSERT_TRUE(db.Open(v1_db_path));
240 sql::Statement smt(db.GetUniqueStatement(
241 "SELECT value FROM meta WHERE key = \"version\""));
242 ASSERT_TRUE(smt);
243 ASSERT_TRUE(smt.Step());
244 EXPECT_EQ(3, smt.ColumnInt(0));
245 EXPECT_FALSE(smt.Step());
246 }
194 } 247 }
195 } 248 }
196 249
250 TEST_F(SQLiteOriginBoundCertStoreTest, TestUpgradeV2) {
251 // Reset the store. We'll be using a different database for this test.
252 store_ = NULL;
253
254 FilePath v2_db_path(temp_dir_.path().AppendASCII("v2db"));
255
256 std::string key_data;
257 std::string cert_data;
258 ReadTestKeyAndCert(&key_data, &cert_data);
259
260 // Create a version 2 database.
261 {
262 sql::Connection db;
263 ASSERT_TRUE(db.Open(v2_db_path));
264 ASSERT_TRUE(db.Execute(
265 "CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
266 "value LONGVARCHAR);"
267 "INSERT INTO \"meta\" VALUES('version','2');"
268 "INSERT INTO \"meta\" VALUES('last_compatible_version','1');"
269 "CREATE TABLE origin_bound_certs ("
270 "origin TEXT NOT NULL UNIQUE PRIMARY KEY,"
271 "private_key BLOB NOT NULL,"
272 "cert BLOB NOT NULL,"
273 "cert_type INTEGER);"
274 ));
275
276 sql::Statement add_smt(db.GetUniqueStatement(
277 "INSERT INTO origin_bound_certs (origin, private_key, cert, cert_type) "
278 "VALUES (?,?,?,?)"));
279 add_smt.BindString(0, "https://www.google.com:443");
280 add_smt.BindBlob(1, key_data.data(), key_data.size());
281 add_smt.BindBlob(2, cert_data.data(), cert_data.size());
282 add_smt.BindInt64(3, 1);
283 ASSERT_TRUE(add_smt.Run());
284
285 ASSERT_TRUE(db.Execute(
286 "INSERT INTO \"origin_bound_certs\" VALUES("
287 "'https://foo.com',X'AA',X'BB',64);"
288 ));
289 }
290
291 // Load and test the DB contents twice. First time ensures that we can use
292 // the updated values immediately. Second time ensures that the updated
293 // values are saved and read correctly on next load.
294 for (int i = 0; i < 2; ++i) {
295 SCOPED_TRACE(i);
296
297 std::vector<net::DefaultOriginBoundCertStore::OriginBoundCert*> certs;
298 store_ = new SQLiteOriginBoundCertStore(v2_db_path);
299
300 // Load the database and ensure the certs can be read and are marked as RSA.
301 ASSERT_TRUE(store_->Load(&certs));
302 ASSERT_EQ(2U, certs.size());
303
304 ASSERT_STREQ("https://www.google.com:443", certs[0]->origin().c_str());
305 ASSERT_EQ(net::CLIENT_CERT_RSA_SIGN, certs[0]->type());
306 ASSERT_EQ(GetTestCertExpirationTime(),
307 certs[0]->expiration_time());
308 ASSERT_EQ(key_data, certs[0]->private_key());
309 ASSERT_EQ(cert_data, certs[0]->cert());
310
311 ASSERT_STREQ("https://foo.com", certs[1]->origin().c_str());
312 ASSERT_EQ(net::CLIENT_CERT_ECDSA_SIGN, certs[1]->type());
313 // Undecodable cert, expiration time will be uninitialized.
314 ASSERT_EQ(base::Time(), certs[1]->expiration_time());
315 ASSERT_STREQ("\xaa", certs[1]->private_key().c_str());
316 ASSERT_STREQ("\xbb", certs[1]->cert().c_str());
317
318 STLDeleteElements(&certs);
319
320 store_ = NULL;
321 // Make sure we wait until the destructor has run.
322 scoped_refptr<base::ThreadTestHelper> helper(
323 new base::ThreadTestHelper(
324 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
325 ASSERT_TRUE(helper->Run());
326
327 // Verify the database version is updated.
328 {
329 sql::Connection db;
330 ASSERT_TRUE(db.Open(v2_db_path));
331 sql::Statement smt(db.GetUniqueStatement(
332 "SELECT value FROM meta WHERE key = \"version\""));
333 ASSERT_TRUE(smt);
334 ASSERT_TRUE(smt.Step());
335 EXPECT_EQ(3, smt.ColumnInt(0));
336 EXPECT_FALSE(smt.Step());
337 }
338 }
339 }
340
197 // Test that we can force the database to be written by calling Flush(). 341 // Test that we can force the database to be written by calling Flush().
198 TEST_F(SQLiteOriginBoundCertStoreTest, TestFlush) { 342 TEST_F(SQLiteOriginBoundCertStoreTest, TestFlush) {
199 // File timestamps don't work well on all platforms, so we'll determine 343 // File timestamps don't work well on all platforms, so we'll determine
200 // whether the DB file has been modified by checking its size. 344 // whether the DB file has been modified by checking its size.
201 FilePath path = temp_dir_.path().Append(chrome::kOBCertFilename); 345 FilePath path = temp_dir_.path().Append(chrome::kOBCertFilename);
202 base::PlatformFileInfo info; 346 base::PlatformFileInfo info;
203 ASSERT_TRUE(file_util::GetFileInfo(path, &info)); 347 ASSERT_TRUE(file_util::GetFileInfo(path, &info));
204 int64 base_size = info.size; 348 int64 base_size = info.size;
205 349
206 // Write some certs, so the DB will have to expand by several KB. 350 // Write some certs, so the DB will have to expand by several KB.
207 for (char c = 'a'; c < 'z'; ++c) { 351 for (char c = 'a'; c < 'z'; ++c) {
208 std::string origin(1, c); 352 std::string origin(1, c);
209 std::string private_key(1000, c); 353 std::string private_key(1000, c);
210 std::string cert(1000, c); 354 std::string cert(1000, c);
211 store_->AddOriginBoundCert( 355 store_->AddOriginBoundCert(
212 net::DefaultOriginBoundCertStore::OriginBoundCert( 356 net::DefaultOriginBoundCertStore::OriginBoundCert(
213 origin, 357 origin,
214 net::CLIENT_CERT_RSA_SIGN, 358 net::CLIENT_CERT_RSA_SIGN,
359 base::Time(),
215 private_key, 360 private_key,
216 cert)); 361 cert));
217 } 362 }
218 363
219 // Call Flush() and wait until the DB thread is idle. 364 // Call Flush() and wait until the DB thread is idle.
220 store_->Flush(base::Closure()); 365 store_->Flush(base::Closure());
221 scoped_refptr<base::ThreadTestHelper> helper( 366 scoped_refptr<base::ThreadTestHelper> helper(
222 new base::ThreadTestHelper( 367 new base::ThreadTestHelper(
223 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); 368 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
224 ASSERT_TRUE(helper->Run()); 369 ASSERT_TRUE(helper->Run());
(...skipping 30 matching lines...) Expand all
255 400
256 store_->Flush(base::Bind(&CallbackCounter::Callback, counter.get())); 401 store_->Flush(base::Bind(&CallbackCounter::Callback, counter.get()));
257 402
258 scoped_refptr<base::ThreadTestHelper> helper( 403 scoped_refptr<base::ThreadTestHelper> helper(
259 new base::ThreadTestHelper( 404 new base::ThreadTestHelper(
260 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB))); 405 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
261 ASSERT_TRUE(helper->Run()); 406 ASSERT_TRUE(helper->Run());
262 407
263 ASSERT_EQ(1, counter->callback_count()); 408 ASSERT_EQ(1, counter->callback_count());
264 } 409 }
OLDNEW
« no previous file with comments | « chrome/browser/net/sqlite_origin_bound_cert_store.cc ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698