blob: 9fd1f0e728087c3e13f476eecf1b335a8b77e4bb [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
5#include <stdio.h>
6#include <stdlib.h>
7
[email protected]d9eb3c42008-12-12 12:00:408#include <limits>
initial.commit09911bf2008-07-26 23:55:299#include <set>
10
[email protected]d9eb3c42008-12-12 12:00:4011#include "base/file_path.h"
initial.commit09911bf2008-07-26 23:55:2912#include "base/file_util.h"
13#include "base/logging.h"
14#include "base/path_service.h"
15#include "base/perftimer.h"
[email protected]d9eb3c42008-12-12 12:00:4016#include "base/rand_util.h"
17#include "base/scoped_ptr.h"
initial.commit09911bf2008-07-26 23:55:2918#include "base/string_util.h"
[email protected]e14b1572008-11-25 23:29:5619#include "base/test_file_util.h"
initial.commit09911bf2008-07-26 23:55:2920#include "chrome/browser/safe_browsing/safe_browsing_database.h"
[email protected]d9eb3c42008-12-12 12:00:4021#include "chrome/browser/safe_browsing/safe_browsing_database_impl.h"
initial.commit09911bf2008-07-26 23:55:2922#include "chrome/common/chrome_paths.h"
23#include "chrome/common/sqlite_compiled_statement.h"
24#include "chrome/common/sqlite_utils.h"
[email protected]d9eb3c42008-12-12 12:00:4025#include "googleurl/src/gurl.h"
initial.commit09911bf2008-07-26 23:55:2926#include "testing/gtest/include/gtest/gtest.h"
27
initial.commit09911bf2008-07-26 23:55:2928namespace {
29
30// Base class for a safebrowsing database. Derived classes can implement
31// different types of tables to compare performance characteristics.
32class Database {
33 public:
34 Database() : db_(NULL) {
35 }
36
37 ~Database() {
38 if (db_) {
initial.commit09911bf2008-07-26 23:55:2939 sqlite3_close(db_);
40 db_ = NULL;
41 }
42 }
43
[email protected]d9eb3c42008-12-12 12:00:4044 bool Init(const FilePath& name, bool create) {
initial.commit09911bf2008-07-26 23:55:2945 // get an empty file for the test DB
[email protected]d9eb3c42008-12-12 12:00:4046 FilePath filename;
initial.commit09911bf2008-07-26 23:55:2947 PathService::Get(base::DIR_TEMP, &filename);
[email protected]d9eb3c42008-12-12 12:00:4048 filename = filename.Append(name);
initial.commit09911bf2008-07-26 23:55:2949
50 if (create) {
[email protected]d9eb3c42008-12-12 12:00:4051 file_util::Delete(filename, false);
initial.commit09911bf2008-07-26 23:55:2952 } else {
[email protected]d9eb3c42008-12-12 12:00:4053 DLOG(INFO) << "evicting " << name.value() << " ...";
54 file_util::EvictFileFromSystemCache(filename);
initial.commit09911bf2008-07-26 23:55:2955 DLOG(INFO) << "... evicted";
56 }
57
[email protected]d9eb3c42008-12-12 12:00:4058 const std::string sqlite_path = WideToUTF8(filename.ToWStringHack());
59 if (sqlite3_open(sqlite_path.c_str(), &db_) != SQLITE_OK)
initial.commit09911bf2008-07-26 23:55:2960 return false;
61
62 statement_cache_.set_db(db_);
63
64 if (!create)
65 return true;
66
67 return CreateTable();
68 }
69
70 virtual bool CreateTable() = 0;
71 virtual bool Add(int host_key, int* prefixes, int count) = 0;
72 virtual bool Read(int host_key, int* prefixes, int size, int* count) = 0;
73 virtual int Count() = 0;
74 virtual std::string GetDBSuffix() = 0;
75
76 sqlite3* db() { return db_; }
77
78 protected:
79 // The database connection.
80 sqlite3* db_;
81
82 // Cache of compiled statements for our database.
83 SqliteStatementCache statement_cache_;
84};
85
86class SimpleDatabase : public Database {
87 public:
88 virtual bool CreateTable() {
89 if (DoesSqliteTableExist(db_, "hosts"))
90 return false;
91
92 return sqlite3_exec(db_, "CREATE TABLE hosts ("
93 "host INTEGER,"
94 "prefixes BLOB)",
95 NULL, NULL, NULL) == SQLITE_OK;
96 }
97
98 virtual bool Add(int host_key, int* prefixes, int count) {
99 SQLITE_UNIQUE_STATEMENT(statement, statement_cache_,
100 "INSERT OR REPLACE INTO hosts"
101 "(host,prefixes)"
102 "VALUES (?,?)");
103 if (!statement.is_valid())
104 return false;
105
106 statement->bind_int(0, host_key);
107 statement->bind_blob(1, prefixes, count*sizeof(int));
108 return statement->step() == SQLITE_DONE;
109 }
110
111 virtual bool Read(int host_key, int* prefixes, int size, int* count) {
112 SQLITE_UNIQUE_STATEMENT(statement, statement_cache_,
113 "SELECT host, prefixes FROM hosts WHERE host=?");
114 if (!statement.is_valid())
115 return false;
116
117 statement->bind_int(0, host_key);
118
119 int rv = statement->step();
120 if (rv == SQLITE_DONE) {
121 // no hostkey found, not an error
122 *count = -1;
123 return true;
124 }
125
126 if (rv != SQLITE_ROW)
127 return false;
128
129 *count = statement->column_bytes(1);
130 if (*count > size)
131 return false;
132
133 memcpy(prefixes, statement->column_blob(0), *count);
134 return true;
135 }
136
137 int Count() {
138 SQLITE_UNIQUE_STATEMENT(statement, statement_cache_,
139 "SELECT COUNT(*) FROM hosts");
140 if (!statement.is_valid()) {
141 EXPECT_TRUE(false);
142 return -1;
143 }
144
145 if (statement->step() != SQLITE_ROW) {
146 EXPECT_TRUE(false);
147 return -1;
148 }
149
150 return statement->column_int(0);
151 }
152
153 std::string GetDBSuffix() {
154 return "Simple";
155 }
156};
157
158class IndexedDatabase : public SimpleDatabase {
159 public:
160 virtual bool CreateTable() {
161 return sqlite3_exec(db_, "CREATE TABLE hosts ("
162 "host INTEGER PRIMARY KEY,"
163 "prefixes BLOB)",
164 NULL, NULL, NULL) == SQLITE_OK;
165 }
166
167 std::string GetDBSuffix() {
168 return "Indexed";
169 }
170};
171
172class IndexedWithIDDatabase : public SimpleDatabase {
173 public:
174 virtual bool CreateTable() {
175 return sqlite3_exec(db_, "CREATE TABLE hosts ("
176 "id INTEGER PRIMARY KEY AUTOINCREMENT,"
177 "host INTEGER UNIQUE,"
178 "prefixes BLOB)",
179 NULL, NULL, NULL) == SQLITE_OK;
180 }
181
182 virtual bool Add(int host_key, int* prefixes, int count) {
183 SQLITE_UNIQUE_STATEMENT(statement, statement_cache_,
184 "INSERT OR REPLACE INTO hosts"
185 "(id,host,prefixes)"
186 "VALUES (NULL,?,?)");
187 if (!statement.is_valid())
188 return false;
189
190 statement->bind_int(0, host_key);
191 statement->bind_blob(1, prefixes, count * sizeof(int));
192 return statement->step() == SQLITE_DONE;
193 }
194
195 std::string GetDBSuffix() {
196 return "IndexedWithID";
197 }
198};
199
[email protected]d9eb3c42008-12-12 12:00:40200} // namespace
initial.commit09911bf2008-07-26 23:55:29201
202class SafeBrowsing: public testing::Test {
203 protected:
204 // Get the test parameters from the test case's name.
205 virtual void SetUp() {
206 logging::InitLogging(
207 NULL, logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG,
208 logging::LOCK_LOG_FILE,
209 logging::DELETE_OLD_LOG_FILE);
210
211 const testing::TestInfo* const test_info =
212 testing::UnitTest::GetInstance()->current_test_info();
213 std::string test_name = test_info->name();
214
215 TestType type;
216 if (test_name.find("Write") != std::string::npos) {
217 type = WRITE;
218 } else if (test_name.find("Read") != std::string::npos) {
219 type = READ;
220 } else {
221 type = COUNT;
222 }
223
224 if (test_name.find("IndexedWithID") != std::string::npos) {
225 db_ = new IndexedWithIDDatabase();
226 } else if (test_name.find("Indexed") != std::string::npos) {
227 db_ = new IndexedDatabase();
228 } else {
229 db_ = new SimpleDatabase();
230 }
231
232
233 char multiplier_letter = test_name[test_name.size() - 1];
234 int multiplier = 0;
235 if (multiplier_letter == 'K') {
236 multiplier = 1000;
237 } else if (multiplier_letter == 'M') {
238 multiplier = 1000000;
239 } else {
240 NOTREACHED();
241 }
242
243 size_t index = test_name.size() - 1;
244 while (index != 0 && test_name[index] != '_')
245 index--;
246
247 DCHECK(index);
248 const char* count_start = test_name.c_str() + ++index;
249 int count = atoi(count_start);
250 int size = count * multiplier;
251
252 db_name_ = StringPrintf("TestSafeBrowsing");
253 db_name_.append(count_start);
254 db_name_.append(db_->GetDBSuffix());
255
[email protected]d9eb3c42008-12-12 12:00:40256 FilePath path = FilePath::FromWStringHack(ASCIIToWide(db_name_));
257 ASSERT_TRUE(db_->Init(path, type == WRITE));
initial.commit09911bf2008-07-26 23:55:29258
259 if (type == WRITE) {
260 WriteEntries(size);
261 } else if (type == READ) {
262 ReadEntries(100);
263 } else {
264 CountEntries();
265 }
266 }
267
268 virtual void TearDown() {
269 delete db_;
270 }
271
272 // This writes the given number of entries to the database.
273 void WriteEntries(int count) {
274 int prefixes[4];
275
276 SQLTransaction transaction(db_->db());
277 transaction.Begin();
278
initial.commit09911bf2008-07-26 23:55:29279 for (int i = 0; i < count; i++) {
[email protected]d9eb3c42008-12-12 12:00:40280 int hostkey = base::RandInt(std::numeric_limits<int>::min(),
281 std::numeric_limits<int>::max());
initial.commit09911bf2008-07-26 23:55:29282 ASSERT_TRUE(db_->Add(hostkey, prefixes, 1));
283 }
284
285 transaction.Commit();
286 }
287
288 // Read the given number of entries from the database.
289 void ReadEntries(int count) {
290 int prefixes[4];
291
292 int64 total_ms = 0;
293
294 for (int i = 0; i < count; ++i) {
[email protected]d9eb3c42008-12-12 12:00:40295 int key = base::RandInt(std::numeric_limits<int>::min(),
296 std::numeric_limits<int>::max());
initial.commit09911bf2008-07-26 23:55:29297
298 PerfTimer timer;
299
300 int read;
301 ASSERT_TRUE(db_->Read(key, prefixes, sizeof(prefixes), &read));
302
303 int64 time_ms = timer.Elapsed().InMilliseconds();
304 total_ms += time_ms;
305 DLOG(INFO) << "Read in " << time_ms << " ms.";
306 }
307
308 DLOG(INFO) << db_name_ << " read " << count << " entries in average of " <<
309 total_ms/count << " ms.";
310 }
311
312 // Counts how many entries are in the database, which effectively does a full
313 // table scan.
314 void CountEntries() {
315 PerfTimer timer;
316
317 int count = db_->Count();
318
319 DLOG(INFO) << db_name_ << " counted " << count << " entries in " <<
320 timer.Elapsed().InMilliseconds() << " ms";
321 }
322
323 enum TestType {
324 WRITE,
325 READ,
326 COUNT,
327 };
328
329 private:
330
331 Database* db_;
332 std::string db_name_;
333};
334
[email protected]d9eb3c42008-12-12 12:00:40335TEST_F(SafeBrowsing, DISABLED_Write_100K) {
initial.commit09911bf2008-07-26 23:55:29336}
337
[email protected]d9eb3c42008-12-12 12:00:40338TEST_F(SafeBrowsing, DISABLED_Read_100K) {
initial.commit09911bf2008-07-26 23:55:29339}
340
[email protected]d9eb3c42008-12-12 12:00:40341TEST_F(SafeBrowsing, DISABLED_WriteIndexed_100K) {
initial.commit09911bf2008-07-26 23:55:29342}
343
[email protected]d9eb3c42008-12-12 12:00:40344TEST_F(SafeBrowsing, DISABLED_ReadIndexed_100K) {
initial.commit09911bf2008-07-26 23:55:29345}
346
[email protected]d9eb3c42008-12-12 12:00:40347TEST_F(SafeBrowsing, DISABLED_WriteIndexed_250K) {
initial.commit09911bf2008-07-26 23:55:29348}
349
[email protected]d9eb3c42008-12-12 12:00:40350TEST_F(SafeBrowsing, DISABLED_ReadIndexed_250K) {
initial.commit09911bf2008-07-26 23:55:29351}
352
[email protected]d9eb3c42008-12-12 12:00:40353TEST_F(SafeBrowsing, DISABLED_WriteIndexed_500K) {
initial.commit09911bf2008-07-26 23:55:29354}
355
[email protected]d9eb3c42008-12-12 12:00:40356TEST_F(SafeBrowsing, DISABLED_ReadIndexed_500K) {
initial.commit09911bf2008-07-26 23:55:29357}
358
[email protected]d9eb3c42008-12-12 12:00:40359TEST_F(SafeBrowsing, DISABLED_WriteIndexedWithID_250K) {
initial.commit09911bf2008-07-26 23:55:29360}
361
[email protected]d9eb3c42008-12-12 12:00:40362TEST_F(SafeBrowsing, DISABLED_ReadIndexedWithID_250K) {
initial.commit09911bf2008-07-26 23:55:29363}
364
[email protected]d9eb3c42008-12-12 12:00:40365TEST_F(SafeBrowsing, DISABLED_WriteIndexedWithID_500K) {
initial.commit09911bf2008-07-26 23:55:29366}
367
[email protected]d9eb3c42008-12-12 12:00:40368TEST_F(SafeBrowsing, DISABLED_ReadIndexedWithID_500K) {
initial.commit09911bf2008-07-26 23:55:29369}
370
[email protected]d9eb3c42008-12-12 12:00:40371TEST_F(SafeBrowsing, DISABLED_CountIndexed_250K) {
initial.commit09911bf2008-07-26 23:55:29372}
373
[email protected]d9eb3c42008-12-12 12:00:40374TEST_F(SafeBrowsing, DISABLED_CountIndexed_500K) {
initial.commit09911bf2008-07-26 23:55:29375}
376
[email protected]d9eb3c42008-12-12 12:00:40377TEST_F(SafeBrowsing, DISABLED_CountIndexedWithID_250K) {
initial.commit09911bf2008-07-26 23:55:29378}
379
[email protected]d9eb3c42008-12-12 12:00:40380TEST_F(SafeBrowsing, DISABLED_CountIndexedWithID_500K) {
initial.commit09911bf2008-07-26 23:55:29381}
382
383
384class SafeBrowsingDatabaseTest {
385 public:
[email protected]d9eb3c42008-12-12 12:00:40386 SafeBrowsingDatabaseTest(const FilePath& filename) {
initial.commit09911bf2008-07-26 23:55:29387 logging::InitLogging(
388 NULL, logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG,
389 logging::LOCK_LOG_FILE,
390 logging::DELETE_OLD_LOG_FILE);
391
[email protected]c870c762009-01-28 05:47:15392 FilePath tmp_path;
[email protected]d9eb3c42008-12-12 12:00:40393 PathService::Get(base::DIR_TEMP, &tmp_path);
[email protected]c870c762009-01-28 05:47:15394 path_ = tmp_path.Append(filename);
initial.commit09911bf2008-07-26 23:55:29395 }
396
397 void Create(int size) {
[email protected]d9eb3c42008-12-12 12:00:40398 file_util::Delete(path_, false);
initial.commit09911bf2008-07-26 23:55:29399
[email protected]d9eb3c42008-12-12 12:00:40400 scoped_ptr<SafeBrowsingDatabase> database(SafeBrowsingDatabase::Create());
401 database->SetSynchronous();
[email protected]c870c762009-01-28 05:47:15402 EXPECT_TRUE(database->Init(path_, NULL));
initial.commit09911bf2008-07-26 23:55:29403
404 int chunk_id = 0;
405 int total_host_keys = size;
406 int host_keys_per_chunk = 100;
407
408 std::deque<SBChunk>* chunks = new std::deque<SBChunk>;
409
410 for (int i = 0; i < total_host_keys / host_keys_per_chunk; ++i) {
411 chunks->push_back(SBChunk());
412 chunks->back().chunk_number = ++chunk_id;
413
414 for (int j = 0; j < host_keys_per_chunk; ++j) {
415 SBChunkHost host;
[email protected]d9eb3c42008-12-12 12:00:40416 host.host = base::RandInt(std::numeric_limits<int>::min(),
417 std::numeric_limits<int>::max());
initial.commit09911bf2008-07-26 23:55:29418 host.entry = SBEntry::Create(SBEntry::ADD_PREFIX, 2);
419 host.entry->SetPrefixAt(0, 0x2425525);
420 host.entry->SetPrefixAt(1, 0x1536366);
421
422 chunks->back().hosts.push_back(host);
423 }
424 }
425
[email protected]d9eb3c42008-12-12 12:00:40426 database->InsertChunks("goog-malware", chunks);
initial.commit09911bf2008-07-26 23:55:29427 }
428
429 void Read(bool use_bloom_filter) {
430 int keys_to_read = 500;
[email protected]d9eb3c42008-12-12 12:00:40431 file_util::EvictFileFromSystemCache(path_);
initial.commit09911bf2008-07-26 23:55:29432
[email protected]d9eb3c42008-12-12 12:00:40433 scoped_ptr<SafeBrowsingDatabase> database(SafeBrowsingDatabase::Create());
434 database->SetSynchronous();
[email protected]c870c762009-01-28 05:47:15435 EXPECT_TRUE(database->Init(path_, NULL));
initial.commit09911bf2008-07-26 23:55:29436
437 PerfTimer total_timer;
438 int64 db_ms = 0;
439 int keys_from_db = 0;
440 for (int i = 0; i < keys_to_read; ++i) {
[email protected]d9eb3c42008-12-12 12:00:40441 int key = base::RandInt(std::numeric_limits<int>::min(),
442 std::numeric_limits<int>::max());
initial.commit09911bf2008-07-26 23:55:29443
444 std::string url = StringPrintf("http://www.%d.com/blah.html", key);
445
446 std::string matching_list;
447 std::vector<SBPrefix> prefix_hits;
[email protected]d9eb3c42008-12-12 12:00:40448 std::vector<SBFullHashResult> full_hits;
initial.commit09911bf2008-07-26 23:55:29449 GURL gurl(url);
[email protected]d9eb3c42008-12-12 12:00:40450 if (!use_bloom_filter || database->NeedToCheckUrl(gurl)) {
initial.commit09911bf2008-07-26 23:55:29451 PerfTimer timer;
[email protected]d9eb3c42008-12-12 12:00:40452 database->ContainsUrl(gurl,
453 &matching_list,
454 &prefix_hits,
455 &full_hits,
456 base::Time::Now());
initial.commit09911bf2008-07-26 23:55:29457
458 int64 time_ms = timer.Elapsed().InMilliseconds();
459
460 DLOG(INFO) << "Read from db in " << time_ms << " ms.";
461
462 db_ms += time_ms;
463 keys_from_db++;
464 }
465 }
466
467 int64 total_ms = total_timer.Elapsed().InMilliseconds();
468
[email protected]5e207882009-01-05 23:59:36469 DLOG(INFO) << path_.BaseName().value() << " read " << keys_to_read <<
[email protected]d9eb3c42008-12-12 12:00:40470 " entries in " << total_ms << " ms. " << keys_from_db <<
471 " keys were read from the db, with average read taking " <<
initial.commit09911bf2008-07-26 23:55:29472 db_ms / keys_from_db << " ms";
473 }
474
475 void BuildBloomFilter() {
[email protected]d9eb3c42008-12-12 12:00:40476 file_util::EvictFileFromSystemCache(path_);
[email protected]c870c762009-01-28 05:47:15477 file_util::Delete(SafeBrowsingDatabase::BloomFilterFilename(path_), false);
initial.commit09911bf2008-07-26 23:55:29478
479 PerfTimer total_timer;
480
[email protected]d9eb3c42008-12-12 12:00:40481 scoped_ptr<SafeBrowsingDatabase> database(SafeBrowsingDatabase::Create());
482 database->SetSynchronous();
[email protected]c870c762009-01-28 05:47:15483 EXPECT_TRUE(database->Init(path_, NULL));
initial.commit09911bf2008-07-26 23:55:29484
485 int64 total_ms = total_timer.Elapsed().InMilliseconds();
486
[email protected]5e207882009-01-05 23:59:36487 DLOG(INFO) << path_.BaseName().value() <<
initial.commit09911bf2008-07-26 23:55:29488 " built bloom filter in " << total_ms << " ms.";
489 }
490
491 private:
[email protected]d9eb3c42008-12-12 12:00:40492 FilePath path_;
initial.commit09911bf2008-07-26 23:55:29493};
494
495// Adds 100K host records.
[email protected]d9eb3c42008-12-12 12:00:40496TEST(SafeBrowsingDatabase, DISABLED_FillUp100K) {
497 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing100K")));
initial.commit09911bf2008-07-26 23:55:29498 db.Create(100000);
499}
500
501// Adds 250K host records.
[email protected]d9eb3c42008-12-12 12:00:40502TEST(SafeBrowsingDatabase, DISABLED_FillUp250K) {
503 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing250K")));
initial.commit09911bf2008-07-26 23:55:29504 db.Create(250000);
505}
506
507// Adds 500K host records.
[email protected]d9eb3c42008-12-12 12:00:40508TEST(SafeBrowsingDatabase, DISABLED_FillUp500K) {
509 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing500K")));
initial.commit09911bf2008-07-26 23:55:29510 db.Create(500000);
511}
512
513// Reads 500 entries and prints the timing.
[email protected]d9eb3c42008-12-12 12:00:40514TEST(SafeBrowsingDatabase, DISABLED_ReadFrom250K) {
515 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing250K")));
initial.commit09911bf2008-07-26 23:55:29516 db.Read(false);
517}
518
[email protected]d9eb3c42008-12-12 12:00:40519TEST(SafeBrowsingDatabase, DISABLED_ReadFrom500K) {
520 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing500K")));
initial.commit09911bf2008-07-26 23:55:29521 db.Read(false);
522}
523
524// Read 500 entries with a bloom filter and print the timing.
[email protected]d9eb3c42008-12-12 12:00:40525TEST(SafeBrowsingDatabase, DISABLED_BloomReadFrom250K) {
526 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing250K")));
initial.commit09911bf2008-07-26 23:55:29527 db.Read(true);
528}
529
[email protected]d9eb3c42008-12-12 12:00:40530TEST(SafeBrowsingDatabase, DISABLED_BloomReadFrom500K) {
531 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing500K")));
initial.commit09911bf2008-07-26 23:55:29532 db.Read(true);
533}
534
535// Test how long bloom filter creation takes.
[email protected]d9eb3c42008-12-12 12:00:40536TEST(SafeBrowsingDatabase, DISABLED_BuildBloomFilter250K) {
537 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing250K")));
initial.commit09911bf2008-07-26 23:55:29538 db.BuildBloomFilter();
539}
540
[email protected]d9eb3c42008-12-12 12:00:40541TEST(SafeBrowsingDatabase, DISABLED_BuildBloomFilter500K) {
542 SafeBrowsingDatabaseTest db(FilePath(FILE_PATH_LITERAL("SafeBrowsing500K")));
initial.commit09911bf2008-07-26 23:55:29543 db.BuildBloomFilter();
544}