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

Side by Side Diff: components/safe_browsing_db/v4_database_unittest.cc

Issue 2384893002: PVer4: Test checksum on startup outside the hotpath of DB load (Closed)
Patch Set: Verify that the checksum check happens async Created 4 years, 2 months 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/debug/leak_annotations.h" 6 #include "base/debug/leak_annotations.h"
7 #include "base/files/scoped_temp_dir.h" 7 #include "base/files/scoped_temp_dir.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
11 #include "components/safe_browsing_db/v4_database.h" 11 #include "components/safe_browsing_db/v4_database.h"
12 #include "components/safe_browsing_db/v4_store.h" 12 #include "components/safe_browsing_db/v4_store.h"
13 #include "content/public/test/test_browser_thread_bundle.h" 13 #include "content/public/test/test_browser_thread_bundle.h"
14 #include "testing/platform_test.h" 14 #include "testing/platform_test.h"
15 15
16 namespace safe_browsing { 16 namespace safe_browsing {
17 17
18 class FakeV4Store : public V4Store { 18 class FakeV4Store : public V4Store {
19 public: 19 public:
20 FakeV4Store(const scoped_refptr<base::SequencedTaskRunner>& task_runner, 20 FakeV4Store(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
21 const base::FilePath& store_path, 21 const base::FilePath& store_path,
22 const bool reset_succeeds,
23 const bool hash_prefix_matches) 22 const bool hash_prefix_matches)
24 : V4Store( 23 : V4Store(
25 task_runner, 24 task_runner,
26 base::FilePath(store_path.value() + FILE_PATH_LITERAL(".fake"))), 25 base::FilePath(store_path.value() + FILE_PATH_LITERAL(".fake"))),
27 hash_prefix_should_match_(hash_prefix_matches), 26 hash_prefix_should_match_(hash_prefix_matches) {}
28 reset_succeeds_(reset_succeeds) {}
29
30 bool Reset() override { return reset_succeeds_; }
31 27
32 HashPrefix GetMatchingHashPrefix(const FullHash& full_hash) override { 28 HashPrefix GetMatchingHashPrefix(const FullHash& full_hash) override {
33 return hash_prefix_should_match_ ? full_hash : HashPrefix(); 29 return hash_prefix_should_match_ ? full_hash : HashPrefix();
34 } 30 }
35 31
36 void set_hash_prefix_matches(bool hash_prefix_matches) { 32 void set_hash_prefix_matches(bool hash_prefix_matches) {
37 hash_prefix_should_match_ = hash_prefix_matches; 33 hash_prefix_should_match_ = hash_prefix_matches;
38 } 34 }
39 35
40 private: 36 private:
41 bool hash_prefix_should_match_; 37 bool hash_prefix_should_match_;
42 bool reset_succeeds_;
43 }; 38 };
44 39
45 // This factory creates a "fake" store. It allows the caller to specify that the 40 // This factory creates a "fake" store. It allows the caller to specify whether
46 // first store should fail on Reset() i.e. return false. All subsequent stores 41 // the store has a hash prefix matching a full hash. This is used to test the
47 // always return true. This is used to test the Reset() method in V4Database. 42 // |GetStoresMatchingFullHash()| method in |V4Database|.
48 class FakeV4StoreFactory : public V4StoreFactory { 43 class FakeV4StoreFactory : public V4StoreFactory {
49 public: 44 public:
50 FakeV4StoreFactory(bool next_store_reset_fails, bool hash_prefix_matches) 45 FakeV4StoreFactory(bool hash_prefix_matches)
51 : hash_prefix_should_match_(hash_prefix_matches), 46 : hash_prefix_should_match_(hash_prefix_matches) {}
52 next_store_reset_fails_(next_store_reset_fails) {}
53 47
54 V4Store* CreateV4Store( 48 V4Store* CreateV4Store(
55 const scoped_refptr<base::SequencedTaskRunner>& task_runner, 49 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
56 const base::FilePath& store_path) override { 50 const base::FilePath& store_path) override {
57 bool reset_succeeds = !next_store_reset_fails_; 51 return new FakeV4Store(task_runner, store_path, hash_prefix_should_match_);
58 next_store_reset_fails_ = false;
59 return new FakeV4Store(task_runner, store_path, reset_succeeds,
60 hash_prefix_should_match_);
61 } 52 }
62 53
63 private: 54 private:
64 bool hash_prefix_should_match_; 55 bool hash_prefix_should_match_;
65 bool next_store_reset_fails_;
66 }; 56 };
67 57
68 class V4DatabaseTest : public PlatformTest { 58 class V4DatabaseTest : public PlatformTest {
69 public: 59 public:
70 V4DatabaseTest() 60 V4DatabaseTest()
71 : task_runner_(new base::TestSimpleTaskRunner), 61 : task_runner_(new base::TestSimpleTaskRunner),
72 linux_malware_id_(LINUX_PLATFORM, URL, MALWARE_THREAT), 62 linux_malware_id_(LINUX_PLATFORM, URL, MALWARE_THREAT),
73 win_malware_id_(WINDOWS_PLATFORM, URL, MALWARE_THREAT) {} 63 win_malware_id_(WINDOWS_PLATFORM, URL, MALWARE_THREAT) {}
74 64
75 void SetUp() override { 65 void SetUp() override {
76 PlatformTest::SetUp(); 66 PlatformTest::SetUp();
77 67
78 // Setup a database in a temporary directory. 68 // Setup a database in a temporary directory.
79 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 69 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
80 database_dirname_ = temp_dir_.GetPath().AppendASCII("V4DatabaseTest"); 70 database_dirname_ = temp_dir_.GetPath().AppendASCII("V4DatabaseTest");
81 71
82 created_but_not_called_back_ = false; 72 created_but_not_called_back_ = false;
83 created_and_called_back_ = false; 73 created_and_called_back_ = false;
74 verify_checksum_called_back_ = false;
84 75
85 callback_db_updated_ = 76 callback_db_updated_ =
86 base::Bind(&V4DatabaseTest::DatabaseUpdated, base::Unretained(this)); 77 base::Bind(&V4DatabaseTest::DatabaseUpdated, base::Unretained(this));
87 78
88 callback_db_ready_ = base::Bind( 79 callback_db_ready_ = base::Bind(
89 &V4DatabaseTest::NewDatabaseReadyWithExpectedStorePathsAndIds, 80 &V4DatabaseTest::NewDatabaseReadyWithExpectedStorePathsAndIds,
90 base::Unretained(this)); 81 base::Unretained(this));
91 82
92 SetupInfoMapAndExpectedState(); 83 SetupInfoMapAndExpectedState();
93 } 84 }
94 85
95 void TearDown() override { 86 void TearDown() override {
96 V4Database::RegisterStoreFactoryForTest(nullptr); 87 V4Database::RegisterStoreFactoryForTest(nullptr);
97 PlatformTest::TearDown(); 88 PlatformTest::TearDown();
98 } 89 }
99 90
100 void RegisterFactory(bool fails_first_reset, 91 void RegisterFactory(bool hash_prefix_matches = true) {
101 bool hash_prefix_matches = true) { 92 factory_.reset(new FakeV4StoreFactory(hash_prefix_matches));
102 factory_.reset(
103 new FakeV4StoreFactory(fails_first_reset, hash_prefix_matches));
104 V4Database::RegisterStoreFactoryForTest(factory_.get()); 93 V4Database::RegisterStoreFactoryForTest(factory_.get());
105 } 94 }
106 95
107 void SetupInfoMapAndExpectedState() { 96 void SetupInfoMapAndExpectedState() {
108 list_infos_.emplace_back(true, "win_url_malware", win_malware_id_, 97 list_infos_.emplace_back(true, "win_url_malware", win_malware_id_,
109 SB_THREAT_TYPE_URL_MALWARE); 98 SB_THREAT_TYPE_URL_MALWARE);
110 expected_identifiers_.push_back(win_malware_id_); 99 expected_identifiers_.push_back(win_malware_id_);
111 expected_store_paths_.push_back( 100 expected_store_paths_.push_back(
112 database_dirname_.AppendASCII("win_url_malware.fake")); 101 database_dirname_.AppendASCII("win_url_malware.fake"));
113 102
(...skipping 16 matching lines...) Expand all
130 ASSERT_EQ(expected_store_paths_.size(), v4_database->store_map_->size()); 119 ASSERT_EQ(expected_store_paths_.size(), v4_database->store_map_->size());
131 ASSERT_EQ(expected_identifiers_.size(), v4_database->store_map_->size()); 120 ASSERT_EQ(expected_identifiers_.size(), v4_database->store_map_->size());
132 for (size_t i = 0; i < expected_identifiers_.size(); i++) { 121 for (size_t i = 0; i < expected_identifiers_.size(); i++) {
133 const auto& expected_identifier = expected_identifiers_[i]; 122 const auto& expected_identifier = expected_identifiers_[i];
134 const auto& store = (*v4_database->store_map_)[expected_identifier]; 123 const auto& store = (*v4_database->store_map_)[expected_identifier];
135 ASSERT_TRUE(store); 124 ASSERT_TRUE(store);
136 const auto& expected_store_path = expected_store_paths_[i]; 125 const auto& expected_store_path = expected_store_paths_[i];
137 EXPECT_EQ(expected_store_path, store->store_path()); 126 EXPECT_EQ(expected_store_path, store->store_path());
138 } 127 }
139 128
140 EXPECT_EQ(expected_resets_successfully_, v4_database->ResetDatabase());
141
142 EXPECT_FALSE(created_and_called_back_); 129 EXPECT_FALSE(created_and_called_back_);
143 created_and_called_back_ = true; 130 created_and_called_back_ = true;
144 131
145 v4_database_ = std::move(v4_database); 132 v4_database_ = std::move(v4_database);
146 } 133 }
147 134
148 std::unique_ptr<ParsedServerResponse> CreateFakeServerResponse( 135 std::unique_ptr<ParsedServerResponse> CreateFakeServerResponse(
149 StoreStateMap store_state_map, 136 StoreStateMap store_state_map,
150 bool use_valid_response_type) { 137 bool use_valid_response_type) {
151 std::unique_ptr<ParsedServerResponse> parsed_server_response( 138 std::unique_ptr<ParsedServerResponse> parsed_server_response(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 EXPECT_NE(old_stores_map_.at(identifier), 175 EXPECT_NE(old_stores_map_.at(identifier),
189 new_store_map->at(identifier).get()); 176 new_store_map->at(identifier).get());
190 } else { 177 } else {
191 // Verify that NO new store was created. 178 // Verify that NO new store was created.
192 EXPECT_EQ(old_stores_map_.at(identifier), 179 EXPECT_EQ(old_stores_map_.at(identifier),
193 new_store_map->at(identifier).get()); 180 new_store_map->at(identifier).get());
194 } 181 }
195 } 182 }
196 } 183 }
197 184
185 void VerifyChecksumCallback(const std::vector<ListIdentifier>& stores) {
186 EXPECT_FALSE(verify_checksum_called_back_);
187 verify_checksum_called_back_ = true;
188 }
189
198 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 190 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
199 std::unique_ptr<V4Database> v4_database_; 191 std::unique_ptr<V4Database> v4_database_;
200 base::FilePath database_dirname_; 192 base::FilePath database_dirname_;
201 base::ScopedTempDir temp_dir_; 193 base::ScopedTempDir temp_dir_;
202 content::TestBrowserThreadBundle thread_bundle_; 194 content::TestBrowserThreadBundle thread_bundle_;
203 bool created_but_not_called_back_; 195 bool created_but_not_called_back_;
204 bool created_and_called_back_; 196 bool created_and_called_back_;
197 bool verify_checksum_called_back_;
205 ListInfos list_infos_; 198 ListInfos list_infos_;
206 std::vector<ListIdentifier> expected_identifiers_; 199 std::vector<ListIdentifier> expected_identifiers_;
207 std::vector<base::FilePath> expected_store_paths_; 200 std::vector<base::FilePath> expected_store_paths_;
208 bool expected_resets_successfully_;
209 std::unique_ptr<FakeV4StoreFactory> factory_; 201 std::unique_ptr<FakeV4StoreFactory> factory_;
210 DatabaseUpdatedCallback callback_db_updated_; 202 DatabaseUpdatedCallback callback_db_updated_;
211 NewDatabaseReadyCallback callback_db_ready_; 203 NewDatabaseReadyCallback callback_db_ready_;
212 StoreStateMap expected_store_state_map_; 204 StoreStateMap expected_store_state_map_;
213 base::hash_map<ListIdentifier, V4Store*> old_stores_map_; 205 base::hash_map<ListIdentifier, V4Store*> old_stores_map_;
214 const ListIdentifier linux_malware_id_, win_malware_id_; 206 const ListIdentifier linux_malware_id_, win_malware_id_;
215 }; 207 };
216 208
217 // Test to set up the database with fake stores. 209 // Test to set up the database with fake stores.
218 TEST_F(V4DatabaseTest, TestSetupDatabaseWithFakeStores) { 210 TEST_F(V4DatabaseTest, TestSetupDatabaseWithFakeStores) {
219 expected_resets_successfully_ = true; 211 RegisterFactory();
220 RegisterFactory(!expected_resets_successfully_);
221 212
222 V4Database::Create(task_runner_, database_dirname_, list_infos_, 213 V4Database::Create(task_runner_, database_dirname_, list_infos_,
223 callback_db_ready_); 214 callback_db_ready_);
224 created_but_not_called_back_ = true;
225 task_runner_->RunPendingTasks();
226
227 base::RunLoop().RunUntilIdle();
228 EXPECT_EQ(true, created_and_called_back_);
229 }
230
231 // Test to set up the database with fake stores that fail to reset.
232 TEST_F(V4DatabaseTest, TestSetupDatabaseWithFakeStoresFailsReset) {
233 expected_resets_successfully_ = false;
234 RegisterFactory(!expected_resets_successfully_);
235
236 V4Database::Create(task_runner_, database_dirname_, list_infos_,
237 callback_db_ready_);
238 created_but_not_called_back_ = true; 215 created_but_not_called_back_ = true;
239 task_runner_->RunPendingTasks(); 216 task_runner_->RunPendingTasks();
240 217
241 base::RunLoop().RunUntilIdle(); 218 base::RunLoop().RunUntilIdle();
242 EXPECT_EQ(true, created_and_called_back_); 219 EXPECT_EQ(true, created_and_called_back_);
243 } 220 }
244 221
245 // Test to check database updates as expected. 222 // Test to check database updates as expected.
246 TEST_F(V4DatabaseTest, TestApplyUpdateWithNewStates) { 223 TEST_F(V4DatabaseTest, TestApplyUpdateWithNewStates) {
247 expected_resets_successfully_ = true; 224 RegisterFactory();
248 RegisterFactory(!expected_resets_successfully_);
249 225
250 V4Database::Create(task_runner_, database_dirname_, list_infos_, 226 V4Database::Create(task_runner_, database_dirname_, list_infos_,
251 callback_db_ready_); 227 callback_db_ready_);
252 created_but_not_called_back_ = true; 228 created_but_not_called_back_ = true;
253 task_runner_->RunPendingTasks(); 229 task_runner_->RunPendingTasks();
254 base::RunLoop().RunUntilIdle(); 230 base::RunLoop().RunUntilIdle();
255 231
256 // The database has now been created. Time to try to update it. 232 // The database has now been created. Time to try to update it.
257 EXPECT_TRUE(v4_database_); 233 EXPECT_TRUE(v4_database_);
258 const StoreMap* db_stores = v4_database_->store_map_.get(); 234 const StoreMap* db_stores = v4_database_->store_map_.get();
259 EXPECT_EQ(expected_store_paths_.size(), db_stores->size()); 235 EXPECT_EQ(expected_store_paths_.size(), db_stores->size());
260 for (const auto& store_iter : *db_stores) { 236 for (const auto& store_iter : *db_stores) {
261 V4Store* store = store_iter.second.get(); 237 V4Store* store = store_iter.second.get();
262 expected_store_state_map_[store_iter.first] = store->state() + "_fake"; 238 expected_store_state_map_[store_iter.first] = store->state() + "_fake";
263 old_stores_map_[store_iter.first] = store; 239 old_stores_map_[store_iter.first] = store;
264 } 240 }
265 241
266 v4_database_->ApplyUpdate( 242 v4_database_->ApplyUpdate(
267 CreateFakeServerResponse(expected_store_state_map_, true), 243 CreateFakeServerResponse(expected_store_state_map_, true),
268 callback_db_updated_); 244 callback_db_updated_);
269 245
270 task_runner_->RunPendingTasks(); 246 task_runner_->RunPendingTasks();
271 base::RunLoop().RunUntilIdle(); 247 base::RunLoop().RunUntilIdle();
272 248
273 VerifyExpectedStoresState(true); 249 VerifyExpectedStoresState(true);
274 } 250 }
275 251
276 // Test to ensure no state updates leads to no store updates. 252 // Test to ensure no state updates leads to no store updates.
277 TEST_F(V4DatabaseTest, TestApplyUpdateWithNoNewState) { 253 TEST_F(V4DatabaseTest, TestApplyUpdateWithNoNewState) {
278 expected_resets_successfully_ = true; 254 RegisterFactory();
279 RegisterFactory(!expected_resets_successfully_);
280 255
281 V4Database::Create(task_runner_, database_dirname_, list_infos_, 256 V4Database::Create(task_runner_, database_dirname_, list_infos_,
282 callback_db_ready_); 257 callback_db_ready_);
283 created_but_not_called_back_ = true; 258 created_but_not_called_back_ = true;
284 task_runner_->RunPendingTasks(); 259 task_runner_->RunPendingTasks();
285 base::RunLoop().RunUntilIdle(); 260 base::RunLoop().RunUntilIdle();
286 261
287 // The database has now been created. Time to try to update it. 262 // The database has now been created. Time to try to update it.
288 EXPECT_TRUE(v4_database_); 263 EXPECT_TRUE(v4_database_);
289 const StoreMap* db_stores = v4_database_->store_map_.get(); 264 const StoreMap* db_stores = v4_database_->store_map_.get();
290 EXPECT_EQ(expected_store_paths_.size(), db_stores->size()); 265 EXPECT_EQ(expected_store_paths_.size(), db_stores->size());
291 for (const auto& store_iter : *db_stores) { 266 for (const auto& store_iter : *db_stores) {
292 V4Store* store = store_iter.second.get(); 267 V4Store* store = store_iter.second.get();
293 expected_store_state_map_[store_iter.first] = store->state(); 268 expected_store_state_map_[store_iter.first] = store->state();
294 old_stores_map_[store_iter.first] = store; 269 old_stores_map_[store_iter.first] = store;
295 } 270 }
296 271
297 v4_database_->ApplyUpdate( 272 v4_database_->ApplyUpdate(
298 CreateFakeServerResponse(expected_store_state_map_, true), 273 CreateFakeServerResponse(expected_store_state_map_, true),
299 callback_db_updated_); 274 callback_db_updated_);
300 275
301 task_runner_->RunPendingTasks(); 276 task_runner_->RunPendingTasks();
302 base::RunLoop().RunUntilIdle(); 277 base::RunLoop().RunUntilIdle();
303 278
304 VerifyExpectedStoresState(false); 279 VerifyExpectedStoresState(false);
305 } 280 }
306 281
307 // Test to ensure no updates leads to no store updates. 282 // Test to ensure no updates leads to no store updates.
308 TEST_F(V4DatabaseTest, TestApplyUpdateWithEmptyUpdate) { 283 TEST_F(V4DatabaseTest, TestApplyUpdateWithEmptyUpdate) {
309 expected_resets_successfully_ = true; 284 RegisterFactory();
310 RegisterFactory(!expected_resets_successfully_);
311 285
312 V4Database::Create(task_runner_, database_dirname_, list_infos_, 286 V4Database::Create(task_runner_, database_dirname_, list_infos_,
313 callback_db_ready_); 287 callback_db_ready_);
314 created_but_not_called_back_ = true; 288 created_but_not_called_back_ = true;
315 task_runner_->RunPendingTasks(); 289 task_runner_->RunPendingTasks();
316 base::RunLoop().RunUntilIdle(); 290 base::RunLoop().RunUntilIdle();
317 291
318 // The database has now been created. Time to try to update it. 292 // The database has now been created. Time to try to update it.
319 EXPECT_TRUE(v4_database_); 293 EXPECT_TRUE(v4_database_);
320 const StoreMap* db_stores = v4_database_->store_map_.get(); 294 const StoreMap* db_stores = v4_database_->store_map_.get();
(...skipping 10 matching lines...) Expand all
331 callback_db_updated_); 305 callback_db_updated_);
332 306
333 task_runner_->RunPendingTasks(); 307 task_runner_->RunPendingTasks();
334 base::RunLoop().RunUntilIdle(); 308 base::RunLoop().RunUntilIdle();
335 309
336 VerifyExpectedStoresState(false); 310 VerifyExpectedStoresState(false);
337 } 311 }
338 312
339 // Test to ensure invalid update leads to no store changes. 313 // Test to ensure invalid update leads to no store changes.
340 TEST_F(V4DatabaseTest, TestApplyUpdateWithInvalidUpdate) { 314 TEST_F(V4DatabaseTest, TestApplyUpdateWithInvalidUpdate) {
341 expected_resets_successfully_ = true; 315 RegisterFactory();
342 RegisterFactory(!expected_resets_successfully_);
343 316
344 V4Database::Create(task_runner_, database_dirname_, list_infos_, 317 V4Database::Create(task_runner_, database_dirname_, list_infos_,
345 callback_db_ready_); 318 callback_db_ready_);
346 created_but_not_called_back_ = true; 319 created_but_not_called_back_ = true;
347 task_runner_->RunPendingTasks(); 320 task_runner_->RunPendingTasks();
348 base::RunLoop().RunUntilIdle(); 321 base::RunLoop().RunUntilIdle();
349 322
350 // The database has now been created. Time to try to update it. 323 // The database has now been created. Time to try to update it.
351 EXPECT_TRUE(v4_database_); 324 EXPECT_TRUE(v4_database_);
352 const StoreMap* db_stores = v4_database_->store_map_.get(); 325 const StoreMap* db_stores = v4_database_->store_map_.get();
353 EXPECT_EQ(expected_store_paths_.size(), db_stores->size()); 326 EXPECT_EQ(expected_store_paths_.size(), db_stores->size());
354 for (const auto& store_iter : *db_stores) { 327 for (const auto& store_iter : *db_stores) {
355 V4Store* store = store_iter.second.get(); 328 V4Store* store = store_iter.second.get();
356 expected_store_state_map_[store_iter.first] = store->state(); 329 expected_store_state_map_[store_iter.first] = store->state();
357 old_stores_map_[store_iter.first] = store; 330 old_stores_map_[store_iter.first] = store;
358 } 331 }
359 332
360 v4_database_->ApplyUpdate( 333 v4_database_->ApplyUpdate(
361 CreateFakeServerResponse(expected_store_state_map_, false), 334 CreateFakeServerResponse(expected_store_state_map_, false),
362 callback_db_updated_); 335 callback_db_updated_);
363 task_runner_->RunPendingTasks(); 336 task_runner_->RunPendingTasks();
364 base::RunLoop().RunUntilIdle(); 337 base::RunLoop().RunUntilIdle();
365 338
366 VerifyExpectedStoresState(false); 339 VerifyExpectedStoresState(false);
367 } 340 }
368 341
369 // Test to ensure the case that all stores match a given full hash. 342 // Test to ensure the case that all stores match a given full hash.
370 TEST_F(V4DatabaseTest, TestAllStoresMatchFullHash) { 343 TEST_F(V4DatabaseTest, TestAllStoresMatchFullHash) {
371 bool hash_prefix_matches = true; 344 bool hash_prefix_matches = true;
372 expected_resets_successfully_ = true; 345 RegisterFactory(hash_prefix_matches);
373 RegisterFactory(!expected_resets_successfully_, hash_prefix_matches);
374 346
375 V4Database::Create(task_runner_, database_dirname_, list_infos_, 347 V4Database::Create(task_runner_, database_dirname_, list_infos_,
376 callback_db_ready_); 348 callback_db_ready_);
377 created_but_not_called_back_ = true; 349 created_but_not_called_back_ = true;
378 task_runner_->RunPendingTasks(); 350 task_runner_->RunPendingTasks();
379 351
380 base::RunLoop().RunUntilIdle(); 352 base::RunLoop().RunUntilIdle();
381 EXPECT_EQ(true, created_and_called_back_); 353 EXPECT_EQ(true, created_and_called_back_);
382 354
383 StoresToCheck stores_to_check({linux_malware_id_, win_malware_id_}); 355 StoresToCheck stores_to_check({linux_malware_id_, win_malware_id_});
384 StoreAndHashPrefixes store_and_hash_prefixes; 356 StoreAndHashPrefixes store_and_hash_prefixes;
385 v4_database_->GetStoresMatchingFullHash("anything", stores_to_check, 357 v4_database_->GetStoresMatchingFullHash("anything", stores_to_check,
386 &store_and_hash_prefixes); 358 &store_and_hash_prefixes);
387 EXPECT_EQ(2u, store_and_hash_prefixes.size()); 359 EXPECT_EQ(2u, store_and_hash_prefixes.size());
388 StoresToCheck stores_found; 360 StoresToCheck stores_found;
389 for (const auto& it : store_and_hash_prefixes) { 361 for (const auto& it : store_and_hash_prefixes) {
390 stores_found.insert(it.list_id); 362 stores_found.insert(it.list_id);
391 } 363 }
392 EXPECT_EQ(stores_to_check, stores_found); 364 EXPECT_EQ(stores_to_check, stores_found);
393 } 365 }
394 366
395 // Test to ensure the case that no stores match a given full hash. 367 // Test to ensure the case that no stores match a given full hash.
396 TEST_F(V4DatabaseTest, TestNoStoreMatchesFullHash) { 368 TEST_F(V4DatabaseTest, TestNoStoreMatchesFullHash) {
397 bool hash_prefix_matches = false; 369 bool hash_prefix_matches = false;
398 expected_resets_successfully_ = true; 370 RegisterFactory(hash_prefix_matches);
399 RegisterFactory(!expected_resets_successfully_, hash_prefix_matches);
400 371
401 V4Database::Create(task_runner_, database_dirname_, list_infos_, 372 V4Database::Create(task_runner_, database_dirname_, list_infos_,
402 callback_db_ready_); 373 callback_db_ready_);
403 created_but_not_called_back_ = true; 374 created_but_not_called_back_ = true;
404 task_runner_->RunPendingTasks(); 375 task_runner_->RunPendingTasks();
405 376
406 base::RunLoop().RunUntilIdle(); 377 base::RunLoop().RunUntilIdle();
407 EXPECT_EQ(true, created_and_called_back_); 378 EXPECT_EQ(true, created_and_called_back_);
408 379
409 StoreAndHashPrefixes store_and_hash_prefixes; 380 StoreAndHashPrefixes store_and_hash_prefixes;
410 v4_database_->GetStoresMatchingFullHash( 381 v4_database_->GetStoresMatchingFullHash(
411 "anything", StoresToCheck({linux_malware_id_, win_malware_id_}), 382 "anything", StoresToCheck({linux_malware_id_, win_malware_id_}),
412 &store_and_hash_prefixes); 383 &store_and_hash_prefixes);
413 EXPECT_TRUE(store_and_hash_prefixes.empty()); 384 EXPECT_TRUE(store_and_hash_prefixes.empty());
414 } 385 }
415 386
416 // Test to ensure the case that some stores match a given full hash. 387 // Test to ensure the case that some stores match a given full hash.
417 TEST_F(V4DatabaseTest, TestSomeStoresMatchFullHash) { 388 TEST_F(V4DatabaseTest, TestSomeStoresMatchFullHash) {
418 // Setup stores to not match the full hash. 389 // Setup stores to not match the full hash.
419 bool hash_prefix_matches = false; 390 bool hash_prefix_matches = false;
420 expected_resets_successfully_ = true; 391 RegisterFactory(hash_prefix_matches);
421 RegisterFactory(!expected_resets_successfully_, hash_prefix_matches);
422 392
423 V4Database::Create(task_runner_, database_dirname_, list_infos_, 393 V4Database::Create(task_runner_, database_dirname_, list_infos_,
424 callback_db_ready_); 394 callback_db_ready_);
425 created_but_not_called_back_ = true; 395 created_but_not_called_back_ = true;
426 task_runner_->RunPendingTasks(); 396 task_runner_->RunPendingTasks();
427 397
428 base::RunLoop().RunUntilIdle(); 398 base::RunLoop().RunUntilIdle();
429 EXPECT_EQ(true, created_and_called_back_); 399 EXPECT_EQ(true, created_and_called_back_);
430 400
431 // Set the store corresponding to linux_malware_id_ to match the full hash. 401 // Set the store corresponding to linux_malware_id_ to match the full hash.
432 FakeV4Store* store = static_cast<FakeV4Store*>( 402 FakeV4Store* store = static_cast<FakeV4Store*>(
433 v4_database_->store_map_->at(win_malware_id_).get()); 403 v4_database_->store_map_->at(win_malware_id_).get());
434 store->set_hash_prefix_matches(true); 404 store->set_hash_prefix_matches(true);
435 405
436 StoreAndHashPrefixes store_and_hash_prefixes; 406 StoreAndHashPrefixes store_and_hash_prefixes;
437 v4_database_->GetStoresMatchingFullHash( 407 v4_database_->GetStoresMatchingFullHash(
438 "anything", StoresToCheck({linux_malware_id_, win_malware_id_}), 408 "anything", StoresToCheck({linux_malware_id_, win_malware_id_}),
439 &store_and_hash_prefixes); 409 &store_and_hash_prefixes);
440 EXPECT_EQ(1u, store_and_hash_prefixes.size()); 410 EXPECT_EQ(1u, store_and_hash_prefixes.size());
441 EXPECT_EQ(store_and_hash_prefixes.begin()->list_id, win_malware_id_); 411 EXPECT_EQ(store_and_hash_prefixes.begin()->list_id, win_malware_id_);
442 EXPECT_FALSE(store_and_hash_prefixes.begin()->hash_prefix.empty()); 412 EXPECT_FALSE(store_and_hash_prefixes.begin()->hash_prefix.empty());
443 } 413 }
444 414
445 // Test to ensure the case that only some stores are reported to match a given 415 // Test to ensure the case that only some stores are reported to match a given
446 // full hash because of StoresToCheck. 416 // full hash because of StoresToCheck.
447 TEST_F(V4DatabaseTest, TestSomeStoresMatchFullHashBecauseOfStoresToMatch) { 417 TEST_F(V4DatabaseTest, TestSomeStoresMatchFullHashBecauseOfStoresToMatch) {
448 // Setup all stores to match the full hash. 418 // Setup all stores to match the full hash.
449 bool hash_prefix_matches = true; 419 bool hash_prefix_matches = true;
450 expected_resets_successfully_ = true; 420 RegisterFactory(hash_prefix_matches);
451 RegisterFactory(!expected_resets_successfully_, hash_prefix_matches);
452 421
453 V4Database::Create(task_runner_, database_dirname_, list_infos_, 422 V4Database::Create(task_runner_, database_dirname_, list_infos_,
454 callback_db_ready_); 423 callback_db_ready_);
455 created_but_not_called_back_ = true; 424 created_but_not_called_back_ = true;
456 task_runner_->RunPendingTasks(); 425 task_runner_->RunPendingTasks();
457 426
458 base::RunLoop().RunUntilIdle(); 427 base::RunLoop().RunUntilIdle();
459 EXPECT_EQ(true, created_and_called_back_); 428 EXPECT_EQ(true, created_and_called_back_);
460 429
461 // Don't add win_malware_id_ to the StoresToCheck. 430 // Don't add win_malware_id_ to the StoresToCheck.
462 StoreAndHashPrefixes store_and_hash_prefixes; 431 StoreAndHashPrefixes store_and_hash_prefixes;
463 v4_database_->GetStoresMatchingFullHash( 432 v4_database_->GetStoresMatchingFullHash(
464 "anything", StoresToCheck({linux_malware_id_}), &store_and_hash_prefixes); 433 "anything", StoresToCheck({linux_malware_id_}), &store_and_hash_prefixes);
465 EXPECT_EQ(1u, store_and_hash_prefixes.size()); 434 EXPECT_EQ(1u, store_and_hash_prefixes.size());
466 EXPECT_EQ(store_and_hash_prefixes.begin()->list_id, linux_malware_id_); 435 EXPECT_EQ(store_and_hash_prefixes.begin()->list_id, linux_malware_id_);
467 EXPECT_FALSE(store_and_hash_prefixes.begin()->hash_prefix.empty()); 436 EXPECT_FALSE(store_and_hash_prefixes.begin()->hash_prefix.empty());
468 } 437 }
469 438
439 TEST_F(V4DatabaseTest, VerifyChecksumCalledAsync) {
440 bool hash_prefix_matches = true;
441 RegisterFactory(hash_prefix_matches);
442
443 V4Database::Create(task_runner_, database_dirname_, list_infos_,
444 callback_db_ready_);
445 created_but_not_called_back_ = true;
446 task_runner_->RunPendingTasks();
447
448 base::RunLoop().RunUntilIdle();
449 EXPECT_EQ(true, created_and_called_back_);
450
451 // verify_checksum_called_back_ set to false in the constructor.
452 EXPECT_FALSE(verify_checksum_called_back_);
453 // Now call VerifyChecksum and pass the callback that sets
454 // verify_checksum_called_back_ to true.
455 v4_database_->VerifyChecksum(base::Bind(
456 &V4DatabaseTest::VerifyChecksumCallback, base::Unretained(this)));
457 // verify_checksum_called_back_ should still be false since the checksum
458 // verification is async.
459 EXPECT_FALSE(verify_checksum_called_back_);
460 task_runner_->RunPendingTasks();
461 base::RunLoop().RunUntilIdle();
462 EXPECT_TRUE(verify_checksum_called_back_);
463 }
464
470 } // namespace safe_browsing 465 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « components/safe_browsing_db/v4_database.cc ('k') | components/safe_browsing_db/v4_local_database_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698