| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // Unit tests for the SafeBrowsing storage system. | 5 // Unit tests for the SafeBrowsing storage system. |
| 6 | 6 |
| 7 #include "chrome/browser/safe_browsing/safe_browsing_database.h" | 7 #include "chrome/browser/safe_browsing/safe_browsing_database.h" |
| 8 | 8 |
| 9 #include <stddef.h> | 9 #include <stddef.h> |
| 10 |
| 10 #include <utility> | 11 #include <utility> |
| 11 | 12 |
| 12 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" |
| 13 #include "base/files/scoped_temp_dir.h" | 14 #include "base/files/scoped_temp_dir.h" |
| 14 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/memory/ptr_util.h" |
| 15 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
| 16 #include "base/sha1.h" | 18 #include "base/sha1.h" |
| 17 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| 18 #include "base/strings/string_split.h" | 20 #include "base/strings/string_split.h" |
| 19 #include "base/test/test_simple_task_runner.h" | 21 #include "base/test/test_simple_task_runner.h" |
| 20 #include "base/time/time.h" | 22 #include "base/time/time.h" |
| 21 #include "chrome/browser/safe_browsing/chunk.pb.h" | 23 #include "chrome/browser/safe_browsing/chunk.pb.h" |
| 22 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" | 24 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" |
| 23 #include "crypto/sha2.h" | 25 #include "crypto/sha2.h" |
| 24 #include "net/base/ip_address.h" | 26 #include "net/base/ip_address.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 EXPECT_TRUE(ip_address.IsIPv6()); | 60 EXPECT_TRUE(ip_address.IsIPv6()); |
| 59 const std::string hashed_ip_prefix = | 61 const std::string hashed_ip_prefix = |
| 60 base::SHA1HashString(net::IPAddressToPackedString(ip_address)); | 62 base::SHA1HashString(net::IPAddressToPackedString(ip_address)); |
| 61 std::string hash(crypto::kSHA256Length, '\0'); | 63 std::string hash(crypto::kSHA256Length, '\0'); |
| 62 hash.replace(0, hashed_ip_prefix.size(), hashed_ip_prefix); | 64 hash.replace(0, hashed_ip_prefix.size(), hashed_ip_prefix); |
| 63 hash[base::kSHA1Length] = static_cast<char>(prefix_size); | 65 hash[base::kSHA1Length] = static_cast<char>(prefix_size); |
| 64 return hash; | 66 return hash; |
| 65 } | 67 } |
| 66 | 68 |
| 67 // Helper to build a chunk. Caller takes ownership. | 69 // Helper to build a chunk. Caller takes ownership. |
| 68 scoped_ptr<SBChunkData> BuildChunk(int chunk_number, | 70 std::unique_ptr<SBChunkData> BuildChunk( |
| 69 ChunkData::ChunkType chunk_type, | 71 int chunk_number, |
| 70 ChunkData::PrefixType prefix_type, | 72 ChunkData::ChunkType chunk_type, |
| 71 const void* data, | 73 ChunkData::PrefixType prefix_type, |
| 72 size_t data_size, | 74 const void* data, |
| 73 const std::vector<int>& add_chunk_numbers) { | 75 size_t data_size, |
| 74 scoped_ptr<ChunkData> raw_data(new ChunkData); | 76 const std::vector<int>& add_chunk_numbers) { |
| 77 std::unique_ptr<ChunkData> raw_data(new ChunkData); |
| 75 raw_data->set_chunk_number(chunk_number); | 78 raw_data->set_chunk_number(chunk_number); |
| 76 raw_data->set_chunk_type(chunk_type); | 79 raw_data->set_chunk_type(chunk_type); |
| 77 raw_data->set_prefix_type(prefix_type); | 80 raw_data->set_prefix_type(prefix_type); |
| 78 raw_data->set_hashes(data, data_size); | 81 raw_data->set_hashes(data, data_size); |
| 79 raw_data->clear_add_numbers(); | 82 raw_data->clear_add_numbers(); |
| 80 for (size_t i = 0; i < add_chunk_numbers.size(); ++i) { | 83 for (size_t i = 0; i < add_chunk_numbers.size(); ++i) { |
| 81 raw_data->add_add_numbers(add_chunk_numbers[i]); | 84 raw_data->add_add_numbers(add_chunk_numbers[i]); |
| 82 } | 85 } |
| 83 | 86 |
| 84 return make_scoped_ptr(new SBChunkData(std::move(raw_data))); | 87 return base::WrapUnique(new SBChunkData(std::move(raw_data))); |
| 85 } | 88 } |
| 86 | 89 |
| 87 // Create add chunk with a single prefix. | 90 // Create add chunk with a single prefix. |
| 88 scoped_ptr<SBChunkData> AddChunkPrefix(int chunk_number, SBPrefix prefix) { | 91 std::unique_ptr<SBChunkData> AddChunkPrefix(int chunk_number, SBPrefix prefix) { |
| 89 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::PREFIX_4B, &prefix, | 92 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::PREFIX_4B, &prefix, |
| 90 sizeof(prefix), std::vector<int>()); | 93 sizeof(prefix), std::vector<int>()); |
| 91 } | 94 } |
| 92 | 95 |
| 93 // Create add chunk with a single prefix generated from |value|. | 96 // Create add chunk with a single prefix generated from |value|. |
| 94 scoped_ptr<SBChunkData> AddChunkPrefixValue(int chunk_number, | 97 std::unique_ptr<SBChunkData> AddChunkPrefixValue(int chunk_number, |
| 95 const std::string& value) { | 98 const std::string& value) { |
| 96 return AddChunkPrefix(chunk_number, SBPrefixForString(value)); | 99 return AddChunkPrefix(chunk_number, SBPrefixForString(value)); |
| 97 } | 100 } |
| 98 | 101 |
| 99 // Generate an add chunk with two prefixes. | 102 // Generate an add chunk with two prefixes. |
| 100 scoped_ptr<SBChunkData> AddChunkPrefix2Value(int chunk_number, | 103 std::unique_ptr<SBChunkData> AddChunkPrefix2Value(int chunk_number, |
| 101 const std::string& value1, | 104 const std::string& value1, |
| 102 const std::string& value2) { | 105 const std::string& value2) { |
| 103 const SBPrefix prefixes[2] = { | 106 const SBPrefix prefixes[2] = { |
| 104 SBPrefixForString(value1), | 107 SBPrefixForString(value1), |
| 105 SBPrefixForString(value2), | 108 SBPrefixForString(value2), |
| 106 }; | 109 }; |
| 107 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::PREFIX_4B, | 110 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::PREFIX_4B, |
| 108 &prefixes[0], sizeof(prefixes), std::vector<int>()); | 111 &prefixes[0], sizeof(prefixes), std::vector<int>()); |
| 109 } | 112 } |
| 110 | 113 |
| 111 // Generate an add chunk with four prefixes. | 114 // Generate an add chunk with four prefixes. |
| 112 scoped_ptr<SBChunkData> AddChunkPrefix4Value(int chunk_number, | 115 std::unique_ptr<SBChunkData> AddChunkPrefix4Value(int chunk_number, |
| 113 const std::string& value1, | 116 const std::string& value1, |
| 114 const std::string& value2, | 117 const std::string& value2, |
| 115 const std::string& value3, | 118 const std::string& value3, |
| 116 const std::string& value4) { | 119 const std::string& value4) { |
| 117 const SBPrefix prefixes[4] = { | 120 const SBPrefix prefixes[4] = { |
| 118 SBPrefixForString(value1), | 121 SBPrefixForString(value1), |
| 119 SBPrefixForString(value2), | 122 SBPrefixForString(value2), |
| 120 SBPrefixForString(value3), | 123 SBPrefixForString(value3), |
| 121 SBPrefixForString(value4), | 124 SBPrefixForString(value4), |
| 122 }; | 125 }; |
| 123 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::PREFIX_4B, | 126 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::PREFIX_4B, |
| 124 &prefixes[0], sizeof(prefixes), std::vector<int>()); | 127 &prefixes[0], sizeof(prefixes), std::vector<int>()); |
| 125 } | 128 } |
| 126 | 129 |
| 127 // Generate an add chunk with a full hash. | 130 // Generate an add chunk with a full hash. |
| 128 scoped_ptr<SBChunkData> AddChunkFullHash(int chunk_number, | 131 std::unique_ptr<SBChunkData> AddChunkFullHash(int chunk_number, |
| 129 SBFullHash full_hash) { | 132 SBFullHash full_hash) { |
| 130 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, | 133 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, |
| 131 &full_hash, sizeof(full_hash), std::vector<int>()); | 134 &full_hash, sizeof(full_hash), std::vector<int>()); |
| 132 } | 135 } |
| 133 | 136 |
| 134 // Generate an add chunk with a full hash generated from |value|. | 137 // Generate an add chunk with a full hash generated from |value|. |
| 135 scoped_ptr<SBChunkData> AddChunkFullHashValue(int chunk_number, | 138 std::unique_ptr<SBChunkData> AddChunkFullHashValue(int chunk_number, |
| 136 const std::string& value) { | 139 const std::string& value) { |
| 137 return AddChunkFullHash(chunk_number, | 140 return AddChunkFullHash(chunk_number, |
| 138 SBFullHashForString(value)); | 141 SBFullHashForString(value)); |
| 139 } | 142 } |
| 140 | 143 |
| 141 // Generate an add chunk with two full hashes. | 144 // Generate an add chunk with two full hashes. |
| 142 scoped_ptr<SBChunkData> AddChunkFullHash2Value(int chunk_number, | 145 std::unique_ptr<SBChunkData> AddChunkFullHash2Value(int chunk_number, |
| 143 const std::string& value1, | 146 const std::string& value1, |
| 144 const std::string& value2) { | 147 const std::string& value2) { |
| 145 const SBFullHash full_hashes[2] = { | 148 const SBFullHash full_hashes[2] = { |
| 146 SBFullHashForString(value1), | 149 SBFullHashForString(value1), |
| 147 SBFullHashForString(value2), | 150 SBFullHashForString(value2), |
| 148 }; | 151 }; |
| 149 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, | 152 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, |
| 150 &full_hashes[0], sizeof(full_hashes), std::vector<int>()); | 153 &full_hashes[0], sizeof(full_hashes), std::vector<int>()); |
| 151 } | 154 } |
| 152 | 155 |
| 153 // Generate a sub chunk with a prefix generated from |value|. | 156 // Generate a sub chunk with a prefix generated from |value|. |
| 154 scoped_ptr<SBChunkData> SubChunkPrefixValue(int chunk_number, | 157 std::unique_ptr<SBChunkData> SubChunkPrefixValue(int chunk_number, |
| 155 const std::string& value, | 158 const std::string& value, |
| 156 int add_chunk_number) { | 159 int add_chunk_number) { |
| 157 const SBPrefix prefix = SBPrefixForString(value); | 160 const SBPrefix prefix = SBPrefixForString(value); |
| 158 return BuildChunk(chunk_number, ChunkData::SUB, ChunkData::PREFIX_4B, &prefix, | 161 return BuildChunk(chunk_number, ChunkData::SUB, ChunkData::PREFIX_4B, &prefix, |
| 159 sizeof(prefix), std::vector<int>(1, add_chunk_number)); | 162 sizeof(prefix), std::vector<int>(1, add_chunk_number)); |
| 160 } | 163 } |
| 161 | 164 |
| 162 // Generate a sub chunk with two prefixes. | 165 // Generate a sub chunk with two prefixes. |
| 163 scoped_ptr<SBChunkData> SubChunkPrefix2Value(int chunk_number, | 166 std::unique_ptr<SBChunkData> SubChunkPrefix2Value(int chunk_number, |
| 164 const std::string& value1, | 167 const std::string& value1, |
| 165 int add_chunk_number1, | 168 int add_chunk_number1, |
| 166 const std::string& value2, | 169 const std::string& value2, |
| 167 int add_chunk_number2) { | 170 int add_chunk_number2) { |
| 168 const SBPrefix prefixes[2] = { | 171 const SBPrefix prefixes[2] = { |
| 169 SBPrefixForString(value1), | 172 SBPrefixForString(value1), |
| 170 SBPrefixForString(value2), | 173 SBPrefixForString(value2), |
| 171 }; | 174 }; |
| 172 std::vector<int> add_chunk_numbers; | 175 std::vector<int> add_chunk_numbers; |
| 173 add_chunk_numbers.push_back(add_chunk_number1); | 176 add_chunk_numbers.push_back(add_chunk_number1); |
| 174 add_chunk_numbers.push_back(add_chunk_number2); | 177 add_chunk_numbers.push_back(add_chunk_number2); |
| 175 return BuildChunk(chunk_number, ChunkData::SUB, ChunkData::PREFIX_4B, | 178 return BuildChunk(chunk_number, ChunkData::SUB, ChunkData::PREFIX_4B, |
| 176 &prefixes[0], sizeof(prefixes), add_chunk_numbers); | 179 &prefixes[0], sizeof(prefixes), add_chunk_numbers); |
| 177 } | 180 } |
| 178 | 181 |
| 179 // Generate a sub chunk with a full hash. | 182 // Generate a sub chunk with a full hash. |
| 180 scoped_ptr<SBChunkData> SubChunkFullHash(int chunk_number, | 183 std::unique_ptr<SBChunkData> SubChunkFullHash(int chunk_number, |
| 181 SBFullHash full_hash, | 184 SBFullHash full_hash, |
| 182 int add_chunk_number) { | 185 int add_chunk_number) { |
| 183 return BuildChunk(chunk_number, ChunkData::SUB, ChunkData::FULL_32B, | 186 return BuildChunk(chunk_number, ChunkData::SUB, ChunkData::FULL_32B, |
| 184 &full_hash, sizeof(full_hash), | 187 &full_hash, sizeof(full_hash), |
| 185 std::vector<int>(1, add_chunk_number)); | 188 std::vector<int>(1, add_chunk_number)); |
| 186 } | 189 } |
| 187 | 190 |
| 188 // Generate a sub chunk with a full hash generated from |value|. | 191 // Generate a sub chunk with a full hash generated from |value|. |
| 189 scoped_ptr<SBChunkData> SubChunkFullHashValue(int chunk_number, | 192 std::unique_ptr<SBChunkData> SubChunkFullHashValue(int chunk_number, |
| 190 const std::string& value, | 193 const std::string& value, |
| 191 int add_chunk_number) { | 194 int add_chunk_number) { |
| 192 return SubChunkFullHash(chunk_number, | 195 return SubChunkFullHash(chunk_number, |
| 193 SBFullHashForString(value), | 196 SBFullHashForString(value), |
| 194 add_chunk_number); | 197 add_chunk_number); |
| 195 } | 198 } |
| 196 | 199 |
| 197 // Generate an add chunk with a single full hash for the ip blacklist. | 200 // Generate an add chunk with a single full hash for the ip blacklist. |
| 198 scoped_ptr<SBChunkData> AddChunkHashedIpValue(int chunk_number, | 201 std::unique_ptr<SBChunkData> AddChunkHashedIpValue(int chunk_number, |
| 199 const std::string& ip_str, | 202 const std::string& ip_str, |
| 200 size_t prefix_size) { | 203 size_t prefix_size) { |
| 201 const std::string full_hash_str = HashedIpPrefix(ip_str, prefix_size); | 204 const std::string full_hash_str = HashedIpPrefix(ip_str, prefix_size); |
| 202 EXPECT_EQ(sizeof(SBFullHash), full_hash_str.size()); | 205 EXPECT_EQ(sizeof(SBFullHash), full_hash_str.size()); |
| 203 SBFullHash full_hash; | 206 SBFullHash full_hash; |
| 204 std::memcpy(&(full_hash.full_hash), full_hash_str.data(), sizeof(SBFullHash)); | 207 std::memcpy(&(full_hash.full_hash), full_hash_str.data(), sizeof(SBFullHash)); |
| 205 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, | 208 return BuildChunk(chunk_number, ChunkData::ADD, ChunkData::FULL_32B, |
| 206 &full_hash, sizeof(full_hash), std::vector<int>()); | 209 &full_hash, sizeof(full_hash), std::vector<int>()); |
| 207 } | 210 } |
| 208 | 211 |
| 209 // Prevent DCHECK from killing tests. | 212 // Prevent DCHECK from killing tests. |
| 210 // TODO(shess): Pawel disputes the use of this, so the test which uses | 213 // TODO(shess): Pawel disputes the use of this, so the test which uses |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 } | 337 } |
| 335 | 338 |
| 336 void SubDelChunk(const std::string& list, int chunk_id) { | 339 void SubDelChunk(const std::string& list, int chunk_id) { |
| 337 DelChunk(list, chunk_id, true); | 340 DelChunk(list, chunk_id, true); |
| 338 } | 341 } |
| 339 | 342 |
| 340 // Utility function for setting up the database for the caching test. | 343 // Utility function for setting up the database for the caching test. |
| 341 void PopulateDatabaseForCacheTest(); | 344 void PopulateDatabaseForCacheTest(); |
| 342 | 345 |
| 343 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 346 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 344 scoped_ptr<SafeBrowsingDatabaseNew> database_; | 347 std::unique_ptr<SafeBrowsingDatabaseNew> database_; |
| 345 base::FilePath database_filename_; | 348 base::FilePath database_filename_; |
| 346 base::ScopedTempDir temp_dir_; | 349 base::ScopedTempDir temp_dir_; |
| 347 }; | 350 }; |
| 348 | 351 |
| 349 // Tests retrieving list name information. | 352 // Tests retrieving list name information. |
| 350 TEST_F(SafeBrowsingDatabaseTest, BrowseListsInfo) { | 353 TEST_F(SafeBrowsingDatabaseTest, BrowseListsInfo) { |
| 351 std::vector<SBListChunkRanges> lists; | 354 std::vector<SBListChunkRanges> lists; |
| 352 std::vector<scoped_ptr<SBChunkData>> chunks; | 355 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 353 | 356 |
| 354 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); | 357 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); |
| 355 chunks.push_back(AddChunkPrefixValue(2, "www.foo.com/malware.html")); | 358 chunks.push_back(AddChunkPrefixValue(2, "www.foo.com/malware.html")); |
| 356 chunks.push_back(AddChunkPrefixValue(3, "www.whatever.com/malware.html")); | 359 chunks.push_back(AddChunkPrefixValue(3, "www.whatever.com/malware.html")); |
| 357 | 360 |
| 358 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 361 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 359 database_->InsertChunks(kMalwareList, chunks); | 362 database_->InsertChunks(kMalwareList, chunks); |
| 360 database_->UpdateFinished(true); | 363 database_->UpdateFinished(true); |
| 361 | 364 |
| 362 GetListsInfo(&lists); | 365 GetListsInfo(&lists); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 ASSERT_LE(2U, lists.size()); | 406 ASSERT_LE(2U, lists.size()); |
| 404 EXPECT_EQ(kMalwareList, lists[0].name); | 407 EXPECT_EQ(kMalwareList, lists[0].name); |
| 405 EXPECT_EQ("1-3", lists[0].adds); | 408 EXPECT_EQ("1-3", lists[0].adds); |
| 406 EXPECT_EQ("7", lists[0].subs); | 409 EXPECT_EQ("7", lists[0].subs); |
| 407 EXPECT_EQ(kPhishingList, lists[1].name); | 410 EXPECT_EQ(kPhishingList, lists[1].name); |
| 408 EXPECT_EQ("47", lists[1].adds); | 411 EXPECT_EQ("47", lists[1].adds); |
| 409 EXPECT_EQ("200-201", lists[1].subs); | 412 EXPECT_EQ("200-201", lists[1].subs); |
| 410 } | 413 } |
| 411 | 414 |
| 412 TEST_F(SafeBrowsingDatabaseTest, ListNames) { | 415 TEST_F(SafeBrowsingDatabaseTest, ListNames) { |
| 413 std::vector<scoped_ptr<SBChunkData>> chunks; | 416 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 414 | 417 |
| 415 std::vector<SBListChunkRanges> lists; | 418 std::vector<SBListChunkRanges> lists; |
| 416 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 419 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 417 | 420 |
| 418 // Insert malware, phish, binurl and bindownload add chunks. | 421 // Insert malware, phish, binurl and bindownload add chunks. |
| 419 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); | 422 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); |
| 420 database_->InsertChunks(kMalwareList, chunks); | 423 database_->InsertChunks(kMalwareList, chunks); |
| 421 | 424 |
| 422 chunks.clear(); | 425 chunks.clear(); |
| 423 chunks.push_back(AddChunkPrefixValue(2, "www.foo.com/malware.html")); | 426 chunks.push_back(AddChunkPrefixValue(2, "www.foo.com/malware.html")); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl, | 571 &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl, |
| 569 &SafeBrowsingDatabase::ContainsUnwantedSoftwareHashes | 572 &SafeBrowsingDatabase::ContainsUnwantedSoftwareHashes |
| 570 }, | 573 }, |
| 571 }; | 574 }; |
| 572 | 575 |
| 573 for (const auto& test_case : kTestCases) { | 576 for (const auto& test_case : kTestCases) { |
| 574 SCOPED_TRACE(std::string("Tested list at fault => ") + | 577 SCOPED_TRACE(std::string("Tested list at fault => ") + |
| 575 test_case.test_list_name); | 578 test_case.test_list_name); |
| 576 | 579 |
| 577 std::vector<SBListChunkRanges> lists; | 580 std::vector<SBListChunkRanges> lists; |
| 578 std::vector<scoped_ptr<SBChunkData>> chunks; | 581 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 579 | 582 |
| 580 chunks.push_back(AddChunkPrefix2Value(1, | 583 chunks.push_back(AddChunkPrefix2Value(1, |
| 581 "www.evil.com/phishing.html", | 584 "www.evil.com/phishing.html", |
| 582 "www.evil.com/malware.html")); | 585 "www.evil.com/malware.html")); |
| 583 chunks.push_back(AddChunkPrefix4Value(2, | 586 chunks.push_back(AddChunkPrefix4Value(2, |
| 584 "www.evil.com/notevil1.html", | 587 "www.evil.com/notevil1.html", |
| 585 "www.evil.com/notevil2.html", | 588 "www.evil.com/notevil2.html", |
| 586 "www.good.com/good1.html", | 589 "www.good.com/good1.html", |
| 587 "www.good.com/good2.html")); | 590 "www.good.com/good2.html")); |
| 588 chunks.push_back(AddChunkPrefixValue(3, "192.168.0.1/malware.html")); | 591 chunks.push_back(AddChunkPrefixValue(3, "192.168.0.1/malware.html")); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 test_case.TestContainsFunctions(*database_, true, | 808 test_case.TestContainsFunctions(*database_, true, |
| 806 GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits); | 809 GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits); |
| 807 ASSERT_EQ(1U, prefix_hits.size()); | 810 ASSERT_EQ(1U, prefix_hits.size()); |
| 808 EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]); | 811 EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]); |
| 809 } | 812 } |
| 810 } | 813 } |
| 811 | 814 |
| 812 // Test adding zero length chunks to the database. | 815 // Test adding zero length chunks to the database. |
| 813 TEST_F(SafeBrowsingDatabaseTest, ZeroSizeChunk) { | 816 TEST_F(SafeBrowsingDatabaseTest, ZeroSizeChunk) { |
| 814 std::vector<SBListChunkRanges> lists; | 817 std::vector<SBListChunkRanges> lists; |
| 815 std::vector<scoped_ptr<SBChunkData>> chunks; | 818 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 816 | 819 |
| 817 // Populate with a couple of normal chunks. | 820 // Populate with a couple of normal chunks. |
| 818 chunks.push_back(AddChunkPrefix2Value(1, | 821 chunks.push_back(AddChunkPrefix2Value(1, |
| 819 "www.test.com/test1.html", | 822 "www.test.com/test1.html", |
| 820 "www.test.com/test2.html")); | 823 "www.test.com/test2.html")); |
| 821 chunks.push_back(AddChunkPrefix2Value(10, | 824 chunks.push_back(AddChunkPrefix2Value(10, |
| 822 "www.random.com/random1.html", | 825 "www.random.com/random1.html", |
| 823 "www.random.com/random2.html")); | 826 "www.random.com/random2.html")); |
| 824 | 827 |
| 825 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 828 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 GetListsInfo(&lists); | 895 GetListsInfo(&lists); |
| 893 ASSERT_LE(1U, lists.size()); | 896 ASSERT_LE(1U, lists.size()); |
| 894 EXPECT_EQ(kMalwareList, lists[0].name); | 897 EXPECT_EQ(kMalwareList, lists[0].name); |
| 895 EXPECT_EQ("1,10,19-20,22", lists[0].adds); | 898 EXPECT_EQ("1,10,19-20,22", lists[0].adds); |
| 896 EXPECT_TRUE(lists[0].subs.empty()); | 899 EXPECT_TRUE(lists[0].subs.empty()); |
| 897 } | 900 } |
| 898 | 901 |
| 899 // Utility function for setting up the database for the caching test. | 902 // Utility function for setting up the database for the caching test. |
| 900 void SafeBrowsingDatabaseTest::PopulateDatabaseForCacheTest() { | 903 void SafeBrowsingDatabaseTest::PopulateDatabaseForCacheTest() { |
| 901 // Add a couple prefixes. | 904 // Add a couple prefixes. |
| 902 std::vector<scoped_ptr<SBChunkData>> chunks; | 905 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 903 chunks.push_back(AddChunkPrefix2Value(1, | 906 chunks.push_back(AddChunkPrefix2Value(1, |
| 904 "www.evil.com/phishing.html", | 907 "www.evil.com/phishing.html", |
| 905 "www.evil.com/malware.html")); | 908 "www.evil.com/malware.html")); |
| 906 | 909 |
| 907 std::vector<SBListChunkRanges> lists; | 910 std::vector<SBListChunkRanges> lists; |
| 908 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 911 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 909 database_->InsertChunks(kMalwareList, chunks); | 912 database_->InsertChunks(kMalwareList, chunks); |
| 910 database_->UpdateFinished(true); | 913 database_->UpdateFinished(true); |
| 911 | 914 |
| 912 // Cache should be cleared after updating. | 915 // Cache should be cleared after updating. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 EXPECT_TRUE(prefix_hits.empty()); | 963 EXPECT_TRUE(prefix_hits.empty()); |
| 961 ASSERT_EQ(1U, cache_hits.size()); | 964 ASSERT_EQ(1U, cache_hits.size()); |
| 962 EXPECT_TRUE(SBFullHashEqual( | 965 EXPECT_TRUE(SBFullHashEqual( |
| 963 cache_hits[0].hash, | 966 cache_hits[0].hash, |
| 964 SBFullHashForString("www.evil.com/malware.html"))); | 967 SBFullHashForString("www.evil.com/malware.html"))); |
| 965 | 968 |
| 966 prefix_hits.clear(); | 969 prefix_hits.clear(); |
| 967 cache_hits.clear(); | 970 cache_hits.clear(); |
| 968 | 971 |
| 969 // Test removing a prefix via a sub chunk. | 972 // Test removing a prefix via a sub chunk. |
| 970 std::vector<scoped_ptr<SBChunkData>> chunks; | 973 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 971 chunks.push_back(SubChunkPrefixValue(2, "www.evil.com/phishing.html", 1)); | 974 chunks.push_back(SubChunkPrefixValue(2, "www.evil.com/phishing.html", 1)); |
| 972 | 975 |
| 973 std::vector<SBListChunkRanges> lists; | 976 std::vector<SBListChunkRanges> lists; |
| 974 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 977 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 975 database_->InsertChunks(kMalwareList, chunks); | 978 database_->InsertChunks(kMalwareList, chunks); |
| 976 database_->UpdateFinished(true); | 979 database_->UpdateFinished(true); |
| 977 | 980 |
| 978 // This prefix should still be there, but cached fullhash should be gone. | 981 // This prefix should still be there, but cached fullhash should be gone. |
| 979 EXPECT_TRUE(database_->ContainsBrowseUrl( | 982 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| 980 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 983 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 GURL("http://www.fullevil.com/bad2.html"), &prefix_hits, &cache_hits)); | 1137 GURL("http://www.fullevil.com/bad2.html"), &prefix_hits, &cache_hits)); |
| 1135 | 1138 |
| 1136 // Add a fullhash which has a prefix collision for a known url. | 1139 // Add a fullhash which has a prefix collision for a known url. |
| 1137 static const char kExampleFine[] = "www.example.com/fine.html"; | 1140 static const char kExampleFine[] = "www.example.com/fine.html"; |
| 1138 static const char kExampleCollision[] = | 1141 static const char kExampleCollision[] = |
| 1139 "www.example.com/3123364814/malware.htm"; | 1142 "www.example.com/3123364814/malware.htm"; |
| 1140 ASSERT_EQ(SBPrefixForString(kExampleFine), | 1143 ASSERT_EQ(SBPrefixForString(kExampleFine), |
| 1141 SBPrefixForString(kExampleCollision)); | 1144 SBPrefixForString(kExampleCollision)); |
| 1142 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1145 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1143 { | 1146 { |
| 1144 std::vector<scoped_ptr<SBChunkData>> chunks; | 1147 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1145 chunks.push_back(AddChunkPrefixValue(21, kExampleCollision)); | 1148 chunks.push_back(AddChunkPrefixValue(21, kExampleCollision)); |
| 1146 database_->InsertChunks(kMalwareList, chunks); | 1149 database_->InsertChunks(kMalwareList, chunks); |
| 1147 } | 1150 } |
| 1148 database_->UpdateFinished(true); | 1151 database_->UpdateFinished(true); |
| 1149 | 1152 |
| 1150 // Expect a prefix hit due to the collision between |kExampleFine| and | 1153 // Expect a prefix hit due to the collision between |kExampleFine| and |
| 1151 // |kExampleCollision|. | 1154 // |kExampleCollision|. |
| 1152 EXPECT_TRUE(database_->ContainsBrowseUrl( | 1155 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| 1153 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); | 1156 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); |
| 1154 ASSERT_EQ(1U, prefix_hits.size()); | 1157 ASSERT_EQ(1U, prefix_hits.size()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1185 task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 1188 task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 1186 NULL)); | 1189 NULL)); |
| 1187 database_->Init(database_filename_); | 1190 database_->Init(database_filename_); |
| 1188 | 1191 |
| 1189 // This will cause an empty database to be created. | 1192 // This will cause an empty database to be created. |
| 1190 std::vector<SBListChunkRanges> lists; | 1193 std::vector<SBListChunkRanges> lists; |
| 1191 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1194 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1192 database_->UpdateFinished(true); | 1195 database_->UpdateFinished(true); |
| 1193 | 1196 |
| 1194 // Create a sub chunk to insert. | 1197 // Create a sub chunk to insert. |
| 1195 std::vector<scoped_ptr<SBChunkData>> chunks; | 1198 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1196 chunks.push_back(SubChunkPrefixValue(7, | 1199 chunks.push_back(SubChunkPrefixValue(7, |
| 1197 "www.subbed.com/notevil1.html", | 1200 "www.subbed.com/notevil1.html", |
| 1198 19)); | 1201 19)); |
| 1199 | 1202 |
| 1200 // Corrupt the file by corrupting the checksum, which is not checked | 1203 // Corrupt the file by corrupting the checksum, which is not checked |
| 1201 // until the entire table is read in |UpdateFinished()|. | 1204 // until the entire table is read in |UpdateFinished()|. |
| 1202 FILE* fp = base::OpenFile(database_filename_, "r+"); | 1205 FILE* fp = base::OpenFile(database_filename_, "r+"); |
| 1203 ASSERT_TRUE(fp); | 1206 ASSERT_TRUE(fp); |
| 1204 ASSERT_NE(-1, fseek(fp, -8, SEEK_END)); | 1207 ASSERT_NE(-1, fseek(fp, -8, SEEK_END)); |
| 1205 for (size_t i = 0; i < 8; ++i) { | 1208 for (size_t i = 0; i < 8; ++i) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1235 | 1238 |
| 1236 database_.reset(); | 1239 database_.reset(); |
| 1237 } | 1240 } |
| 1238 | 1241 |
| 1239 // Checks database reading and writing. | 1242 // Checks database reading and writing. |
| 1240 TEST_F(SafeBrowsingDatabaseTest, ContainsDownloadUrlPrefixes) { | 1243 TEST_F(SafeBrowsingDatabaseTest, ContainsDownloadUrlPrefixes) { |
| 1241 const char kEvil1Url1[] = "www.evil1.com/download1/"; | 1244 const char kEvil1Url1[] = "www.evil1.com/download1/"; |
| 1242 const char kEvil1Url2[] = "www.evil1.com/download2.html"; | 1245 const char kEvil1Url2[] = "www.evil1.com/download2.html"; |
| 1243 | 1246 |
| 1244 // Add a simple chunk with one hostkey for download url list. | 1247 // Add a simple chunk with one hostkey for download url list. |
| 1245 std::vector<scoped_ptr<SBChunkData>> chunks; | 1248 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1246 chunks.push_back(AddChunkPrefix2Value(1, kEvil1Url1, kEvil1Url2)); | 1249 chunks.push_back(AddChunkPrefix2Value(1, kEvil1Url1, kEvil1Url2)); |
| 1247 | 1250 |
| 1248 std::vector<SBListChunkRanges> lists; | 1251 std::vector<SBListChunkRanges> lists; |
| 1249 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1252 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1250 database_->InsertChunks(kBinUrlList, chunks); | 1253 database_->InsertChunks(kBinUrlList, chunks); |
| 1251 database_->UpdateFinished(true); | 1254 database_->UpdateFinished(true); |
| 1252 | 1255 |
| 1253 std::vector<SBPrefix> prefix_hits; | 1256 std::vector<SBPrefix> prefix_hits; |
| 1254 std::vector<GURL> urls(1); | 1257 std::vector<GURL> urls(1); |
| 1255 | 1258 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 database_.reset(); | 1327 database_.reset(); |
| 1325 } | 1328 } |
| 1326 | 1329 |
| 1327 TEST_F(SafeBrowsingDatabaseTest, ContainsResourceUrlPrefixes) { | 1330 TEST_F(SafeBrowsingDatabaseTest, ContainsResourceUrlPrefixes) { |
| 1328 const char* kBadUrl1 = "bad1.com/"; | 1331 const char* kBadUrl1 = "bad1.com/"; |
| 1329 const char* kBadUrl2 = "bad2.com/script.js"; | 1332 const char* kBadUrl2 = "bad2.com/script.js"; |
| 1330 const SBPrefix kBadPrefix1 = SBPrefixForString(kBadUrl1); | 1333 const SBPrefix kBadPrefix1 = SBPrefixForString(kBadUrl1); |
| 1331 const SBPrefix kBadPrefix2 = SBPrefixForString(kBadUrl2); | 1334 const SBPrefix kBadPrefix2 = SBPrefixForString(kBadUrl2); |
| 1332 | 1335 |
| 1333 // Populate database | 1336 // Populate database |
| 1334 std::vector<scoped_ptr<SBChunkData>> chunks; | 1337 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1335 chunks.push_back(AddChunkPrefix2Value(1, kBadUrl1, kBadUrl2)); | 1338 chunks.push_back(AddChunkPrefix2Value(1, kBadUrl1, kBadUrl2)); |
| 1336 | 1339 |
| 1337 std::vector<SBListChunkRanges> lists; | 1340 std::vector<SBListChunkRanges> lists; |
| 1338 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1341 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1339 database_->InsertChunks(kResourceBlacklist, chunks); | 1342 database_->InsertChunks(kResourceBlacklist, chunks); |
| 1340 database_->UpdateFinished(true); | 1343 database_->UpdateFinished(true); |
| 1341 | 1344 |
| 1342 struct { | 1345 struct { |
| 1343 std::string url; | 1346 std::string url; |
| 1344 bool found_in_db; | 1347 bool found_in_db; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1467 EXPECT_TRUE( | 1470 EXPECT_TRUE( |
| 1468 (database_.get()->*test_case.test_list_contains_whitelisted_string)( | 1471 (database_.get()->*test_case.test_list_contains_whitelisted_string)( |
| 1469 "asdf")); | 1472 "asdf")); |
| 1470 } else { | 1473 } else { |
| 1471 EXPECT_FALSE( | 1474 EXPECT_FALSE( |
| 1472 (database_.get()->*test_case.test_list_contains_whitelisted_string)( | 1475 (database_.get()->*test_case.test_list_contains_whitelisted_string)( |
| 1473 kGoodString)); | 1476 kGoodString)); |
| 1474 } | 1477 } |
| 1475 } | 1478 } |
| 1476 | 1479 |
| 1477 std::vector<scoped_ptr<SBChunkData>> chunks; | 1480 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1478 | 1481 |
| 1479 // Add a few test chunks to the whitelist under test. | 1482 // Add a few test chunks to the whitelist under test. |
| 1480 if (test_case.TestUrls()) { | 1483 if (test_case.TestUrls()) { |
| 1481 chunks.push_back(AddChunkFullHash2Value(1, kGood1Url1, kGood1Url2)); | 1484 chunks.push_back(AddChunkFullHash2Value(1, kGood1Url1, kGood1Url2)); |
| 1482 chunks.push_back(AddChunkFullHashValue(2, kGood2Url1)); | 1485 chunks.push_back(AddChunkFullHashValue(2, kGood2Url1)); |
| 1483 chunks.push_back(AddChunkFullHashValue(4, kGood3Url1)); | 1486 chunks.push_back(AddChunkFullHashValue(4, kGood3Url1)); |
| 1484 } | 1487 } |
| 1485 if (test_case.TestStrings()) | 1488 if (test_case.TestStrings()) |
| 1486 chunks.push_back(AddChunkFullHashValue(3, kGoodString)); | 1489 chunks.push_back(AddChunkFullHashValue(3, kGoodString)); |
| 1487 | 1490 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 EXPECT_FALSE( | 1646 EXPECT_FALSE( |
| 1644 (database_.get()->*test_case.test_list_contains_whitelisted_string)( | 1647 (database_.get()->*test_case.test_list_contains_whitelisted_string)( |
| 1645 "asdf")); | 1648 "asdf")); |
| 1646 } | 1649 } |
| 1647 } | 1650 } |
| 1648 } | 1651 } |
| 1649 | 1652 |
| 1650 // Test to make sure we could insert chunk list that | 1653 // Test to make sure we could insert chunk list that |
| 1651 // contains entries for the same host. | 1654 // contains entries for the same host. |
| 1652 TEST_F(SafeBrowsingDatabaseTest, SameHostEntriesOkay) { | 1655 TEST_F(SafeBrowsingDatabaseTest, SameHostEntriesOkay) { |
| 1653 std::vector<scoped_ptr<SBChunkData>> chunks; | 1656 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1654 | 1657 |
| 1655 // Add a malware add chunk with two entries of the same host. | 1658 // Add a malware add chunk with two entries of the same host. |
| 1656 chunks.push_back(AddChunkPrefix2Value(1, | 1659 chunks.push_back(AddChunkPrefix2Value(1, |
| 1657 "www.evil.com/malware1.html", | 1660 "www.evil.com/malware1.html", |
| 1658 "www.evil.com/malware2.html")); | 1661 "www.evil.com/malware2.html")); |
| 1659 | 1662 |
| 1660 // Insert the testing chunks into database. | 1663 // Insert the testing chunks into database. |
| 1661 std::vector<SBListChunkRanges> lists; | 1664 std::vector<SBListChunkRanges> lists; |
| 1662 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1665 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1663 database_->InsertChunks(kMalwareList, chunks); | 1666 database_->InsertChunks(kMalwareList, chunks); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 EXPECT_TRUE(database_->ContainsBrowseUrl( | 1726 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| 1724 GURL("http://www.evil.com/phishing1.html"), &prefix_hits, &cache_hits)); | 1727 GURL("http://www.evil.com/phishing1.html"), &prefix_hits, &cache_hits)); |
| 1725 EXPECT_FALSE(database_->ContainsBrowseUrl( | 1728 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 1726 GURL("http://www.evil.com/phishing2.html"), &prefix_hits, &cache_hits)); | 1729 GURL("http://www.evil.com/phishing2.html"), &prefix_hits, &cache_hits)); |
| 1727 } | 1730 } |
| 1728 | 1731 |
| 1729 // Test that an empty update doesn't actually update the database. | 1732 // Test that an empty update doesn't actually update the database. |
| 1730 // This isn't a functionality requirement, but it is a useful | 1733 // This isn't a functionality requirement, but it is a useful |
| 1731 // optimization. | 1734 // optimization. |
| 1732 TEST_F(SafeBrowsingDatabaseTest, EmptyUpdate) { | 1735 TEST_F(SafeBrowsingDatabaseTest, EmptyUpdate) { |
| 1733 std::vector<scoped_ptr<SBChunkData>> chunks; | 1736 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1734 | 1737 |
| 1735 base::FilePath filename = database_->BrowseDBFilename(database_filename_); | 1738 base::FilePath filename = database_->BrowseDBFilename(database_filename_); |
| 1736 | 1739 |
| 1737 // Prime the database. | 1740 // Prime the database. |
| 1738 std::vector<SBListChunkRanges> lists; | 1741 std::vector<SBListChunkRanges> lists; |
| 1739 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1742 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1740 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); | 1743 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); |
| 1741 database_->InsertChunks(kMalwareList, chunks); | 1744 database_->InsertChunks(kMalwareList, chunks); |
| 1742 database_->UpdateFinished(true); | 1745 database_->UpdateFinished(true); |
| 1743 | 1746 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 | 1784 |
| 1782 // Test that a filter file is written out during update and read back | 1785 // Test that a filter file is written out during update and read back |
| 1783 // in during setup. | 1786 // in during setup. |
| 1784 TEST_F(SafeBrowsingDatabaseTest, FilterFile) { | 1787 TEST_F(SafeBrowsingDatabaseTest, FilterFile) { |
| 1785 // Create a database with trivial example data and write it out. | 1788 // Create a database with trivial example data and write it out. |
| 1786 { | 1789 { |
| 1787 // Prime the database. | 1790 // Prime the database. |
| 1788 std::vector<SBListChunkRanges> lists; | 1791 std::vector<SBListChunkRanges> lists; |
| 1789 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1792 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1790 | 1793 |
| 1791 std::vector<scoped_ptr<SBChunkData>> chunks; | 1794 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1792 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); | 1795 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); |
| 1793 database_->InsertChunks(kMalwareList, chunks); | 1796 database_->InsertChunks(kMalwareList, chunks); |
| 1794 database_->UpdateFinished(true); | 1797 database_->UpdateFinished(true); |
| 1795 } | 1798 } |
| 1796 | 1799 |
| 1797 // Find the malware url in the database, don't find a good url. | 1800 // Find the malware url in the database, don't find a good url. |
| 1798 std::vector<SBPrefix> prefix_hits; | 1801 std::vector<SBPrefix> prefix_hits; |
| 1799 std::vector<SBFullHashResult> cache_hits; | 1802 std::vector<SBFullHashResult> cache_hits; |
| 1800 EXPECT_TRUE(database_->ContainsBrowseUrl( | 1803 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| 1801 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 1804 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1827 TEST_F(SafeBrowsingDatabaseTest, CachedFullMiss) { | 1830 TEST_F(SafeBrowsingDatabaseTest, CachedFullMiss) { |
| 1828 const SBPrefix kPrefix1 = 1001U; | 1831 const SBPrefix kPrefix1 = 1001U; |
| 1829 const SBFullHash kFullHash1_1 = | 1832 const SBFullHash kFullHash1_1 = |
| 1830 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); | 1833 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); |
| 1831 | 1834 |
| 1832 const SBPrefix kPrefix2 = 1002U; | 1835 const SBPrefix kPrefix2 = 1002U; |
| 1833 const SBFullHash kFullHash2_1 = | 1836 const SBFullHash kFullHash2_1 = |
| 1834 SBFullHashForPrefixAndSuffix(kPrefix2, "\x01"); | 1837 SBFullHashForPrefixAndSuffix(kPrefix2, "\x01"); |
| 1835 | 1838 |
| 1836 // Insert prefix kPrefix1 and kPrefix2 into database. | 1839 // Insert prefix kPrefix1 and kPrefix2 into database. |
| 1837 std::vector<scoped_ptr<SBChunkData>> chunks; | 1840 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1838 chunks.push_back(AddChunkPrefix(1, kPrefix1)); | 1841 chunks.push_back(AddChunkPrefix(1, kPrefix1)); |
| 1839 chunks.push_back(AddChunkPrefix(2, kPrefix2)); | 1842 chunks.push_back(AddChunkPrefix(2, kPrefix2)); |
| 1840 | 1843 |
| 1841 std::vector<SBListChunkRanges> lists; | 1844 std::vector<SBListChunkRanges> lists; |
| 1842 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1845 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1843 database_->InsertChunks(kMalwareList, chunks); | 1846 database_->InsertChunks(kMalwareList, chunks); |
| 1844 database_->UpdateFinished(true); | 1847 database_->UpdateFinished(true); |
| 1845 | 1848 |
| 1846 { | 1849 { |
| 1847 // Cache a full miss result for kPrefix1. | 1850 // Cache a full miss result for kPrefix1. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 | 1885 |
| 1883 const SBPrefix kPrefix2 = 1002U; | 1886 const SBPrefix kPrefix2 = 1002U; |
| 1884 const SBFullHash kFullHash2_1 = | 1887 const SBFullHash kFullHash2_1 = |
| 1885 SBFullHashForPrefixAndSuffix(kPrefix2, "\x01"); | 1888 SBFullHashForPrefixAndSuffix(kPrefix2, "\x01"); |
| 1886 | 1889 |
| 1887 const SBPrefix kPrefix3 = 1003U; | 1890 const SBPrefix kPrefix3 = 1003U; |
| 1888 const SBFullHash kFullHash3_1 = | 1891 const SBFullHash kFullHash3_1 = |
| 1889 SBFullHashForPrefixAndSuffix(kPrefix3, "\x01"); | 1892 SBFullHashForPrefixAndSuffix(kPrefix3, "\x01"); |
| 1890 | 1893 |
| 1891 // Insert prefix kPrefix1 and kPrefix2 into database. | 1894 // Insert prefix kPrefix1 and kPrefix2 into database. |
| 1892 std::vector<scoped_ptr<SBChunkData>> chunks; | 1895 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 1893 chunks.push_back(AddChunkPrefix(1, kPrefix1)); | 1896 chunks.push_back(AddChunkPrefix(1, kPrefix1)); |
| 1894 chunks.push_back(AddChunkPrefix(2, kPrefix2)); | 1897 chunks.push_back(AddChunkPrefix(2, kPrefix2)); |
| 1895 | 1898 |
| 1896 std::vector<SBListChunkRanges> lists; | 1899 std::vector<SBListChunkRanges> lists; |
| 1897 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1900 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1898 database_->InsertChunks(kMalwareList, chunks); | 1901 database_->InsertChunks(kMalwareList, chunks); |
| 1899 database_->UpdateFinished(true); | 1902 database_->UpdateFinished(true); |
| 1900 | 1903 |
| 1901 { | 1904 { |
| 1902 // kFullHash1_1 has a prefix hit of kPrefix1. | 1905 // kFullHash1_1 has a prefix hit of kPrefix1. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2027 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashMatching) { | 2030 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashMatching) { |
| 2028 const SBPrefix kPrefix1 = 1001U; | 2031 const SBPrefix kPrefix1 = 1001U; |
| 2029 const SBFullHash kFullHash1_1 = | 2032 const SBFullHash kFullHash1_1 = |
| 2030 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); | 2033 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); |
| 2031 const SBFullHash kFullHash1_2 = | 2034 const SBFullHash kFullHash1_2 = |
| 2032 SBFullHashForPrefixAndSuffix(kPrefix1, "\x02"); | 2035 SBFullHashForPrefixAndSuffix(kPrefix1, "\x02"); |
| 2033 const SBFullHash kFullHash1_3 = | 2036 const SBFullHash kFullHash1_3 = |
| 2034 SBFullHashForPrefixAndSuffix(kPrefix1, "\x03"); | 2037 SBFullHashForPrefixAndSuffix(kPrefix1, "\x03"); |
| 2035 | 2038 |
| 2036 // Insert two full hashes with a shared prefix. | 2039 // Insert two full hashes with a shared prefix. |
| 2037 std::vector<scoped_ptr<SBChunkData>> chunks; | 2040 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 2038 chunks.push_back(AddChunkFullHash(1, kFullHash1_1)); | 2041 chunks.push_back(AddChunkFullHash(1, kFullHash1_1)); |
| 2039 chunks.push_back(AddChunkFullHash(2, kFullHash1_2)); | 2042 chunks.push_back(AddChunkFullHash(2, kFullHash1_2)); |
| 2040 | 2043 |
| 2041 std::vector<SBListChunkRanges> lists; | 2044 std::vector<SBListChunkRanges> lists; |
| 2042 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 2045 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 2043 database_->InsertChunks(kMalwareList, chunks); | 2046 database_->InsertChunks(kMalwareList, chunks); |
| 2044 database_->UpdateFinished(true); | 2047 database_->UpdateFinished(true); |
| 2045 | 2048 |
| 2046 { | 2049 { |
| 2047 // Check a full hash which isn't present. | 2050 // Check a full hash which isn't present. |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2176 } | 2179 } |
| 2177 } | 2180 } |
| 2178 | 2181 |
| 2179 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashAndPrefixMatching) { | 2182 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashAndPrefixMatching) { |
| 2180 const SBPrefix kPrefix1 = 1001U; | 2183 const SBPrefix kPrefix1 = 1001U; |
| 2181 const SBFullHash kFullHash1_1 = | 2184 const SBFullHash kFullHash1_1 = |
| 2182 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); | 2185 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); |
| 2183 const SBFullHash kFullHash1_2 = | 2186 const SBFullHash kFullHash1_2 = |
| 2184 SBFullHashForPrefixAndSuffix(kPrefix1, "\x02"); | 2187 SBFullHashForPrefixAndSuffix(kPrefix1, "\x02"); |
| 2185 | 2188 |
| 2186 std::vector<scoped_ptr<SBChunkData>> chunks; | 2189 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 2187 chunks.push_back(AddChunkFullHash(1, kFullHash1_1)); | 2190 chunks.push_back(AddChunkFullHash(1, kFullHash1_1)); |
| 2188 | 2191 |
| 2189 std::vector<SBListChunkRanges> lists; | 2192 std::vector<SBListChunkRanges> lists; |
| 2190 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 2193 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 2191 database_->InsertChunks(kMalwareList, chunks); | 2194 database_->InsertChunks(kMalwareList, chunks); |
| 2192 database_->UpdateFinished(true); | 2195 database_->UpdateFinished(true); |
| 2193 | 2196 |
| 2194 { | 2197 { |
| 2195 // kFullHash1_2 does not match kFullHash1_1. | 2198 // kFullHash1_2 does not match kFullHash1_1. |
| 2196 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); | 2199 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2238 ASSERT_EQ(1U, prefix_hits.size()); | 2241 ASSERT_EQ(1U, prefix_hits.size()); |
| 2239 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 2242 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 2240 EXPECT_TRUE(cache_hits.empty()); | 2243 EXPECT_TRUE(cache_hits.empty()); |
| 2241 } | 2244 } |
| 2242 } | 2245 } |
| 2243 | 2246 |
| 2244 TEST_F(SafeBrowsingDatabaseTest, MalwareIpBlacklist) { | 2247 TEST_F(SafeBrowsingDatabaseTest, MalwareIpBlacklist) { |
| 2245 std::vector<SBListChunkRanges> lists; | 2248 std::vector<SBListChunkRanges> lists; |
| 2246 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 2249 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 2247 | 2250 |
| 2248 std::vector<scoped_ptr<SBChunkData>> chunks; | 2251 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 2249 | 2252 |
| 2250 // IPv4 prefix match for ::ffff:192.168.1.0/120. | 2253 // IPv4 prefix match for ::ffff:192.168.1.0/120. |
| 2251 chunks.push_back(AddChunkHashedIpValue(1, "::ffff:192.168.1.0", 120)); | 2254 chunks.push_back(AddChunkHashedIpValue(1, "::ffff:192.168.1.0", 120)); |
| 2252 | 2255 |
| 2253 // IPv4 exact match for ::ffff:192.1.1.1. | 2256 // IPv4 exact match for ::ffff:192.1.1.1. |
| 2254 chunks.push_back(AddChunkHashedIpValue(2, "::ffff:192.1.1.1", 128)); | 2257 chunks.push_back(AddChunkHashedIpValue(2, "::ffff:192.1.1.1", 128)); |
| 2255 | 2258 |
| 2256 // IPv6 exact match for: fe80::31a:a0ff:fe10:786e/128. | 2259 // IPv6 exact match for: fe80::31a:a0ff:fe10:786e/128. |
| 2257 chunks.push_back(AddChunkHashedIpValue(3, "fe80::31a:a0ff:fe10:786e", 128)); | 2260 chunks.push_back(AddChunkHashedIpValue(3, "fe80::31a:a0ff:fe10:786e", 128)); |
| 2258 | 2261 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2306 EXPECT_TRUE(database_->ContainsMalwareIP("192.1.255.255")); | 2309 EXPECT_TRUE(database_->ContainsMalwareIP("192.1.255.255")); |
| 2307 EXPECT_FALSE(database_->ContainsMalwareIP("192.2.0.0")); | 2310 EXPECT_FALSE(database_->ContainsMalwareIP("192.2.0.0")); |
| 2308 } | 2311 } |
| 2309 | 2312 |
| 2310 TEST_F(SafeBrowsingDatabaseTest, ContainsBrowseURL) { | 2313 TEST_F(SafeBrowsingDatabaseTest, ContainsBrowseURL) { |
| 2311 std::vector<SBListChunkRanges> lists; | 2314 std::vector<SBListChunkRanges> lists; |
| 2312 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 2315 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 2313 | 2316 |
| 2314 // Add a host-level hit. | 2317 // Add a host-level hit. |
| 2315 { | 2318 { |
| 2316 std::vector<scoped_ptr<SBChunkData>> chunks; | 2319 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 2317 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/")); | 2320 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/")); |
| 2318 database_->InsertChunks(kMalwareList, chunks); | 2321 database_->InsertChunks(kMalwareList, chunks); |
| 2319 } | 2322 } |
| 2320 | 2323 |
| 2321 // Add a specific fullhash. | 2324 // Add a specific fullhash. |
| 2322 static const char kWhateverMalware[] = "www.whatever.com/malware.html"; | 2325 static const char kWhateverMalware[] = "www.whatever.com/malware.html"; |
| 2323 { | 2326 { |
| 2324 std::vector<scoped_ptr<SBChunkData>> chunks; | 2327 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 2325 chunks.push_back(AddChunkFullHashValue(2, kWhateverMalware)); | 2328 chunks.push_back(AddChunkFullHashValue(2, kWhateverMalware)); |
| 2326 database_->InsertChunks(kMalwareList, chunks); | 2329 database_->InsertChunks(kMalwareList, chunks); |
| 2327 } | 2330 } |
| 2328 | 2331 |
| 2329 // Add a fullhash which has a prefix collision for a known url. | 2332 // Add a fullhash which has a prefix collision for a known url. |
| 2330 static const char kExampleFine[] = "www.example.com/fine.html"; | 2333 static const char kExampleFine[] = "www.example.com/fine.html"; |
| 2331 static const char kExampleCollision[] = | 2334 static const char kExampleCollision[] = |
| 2332 "www.example.com/3123364814/malware.htm"; | 2335 "www.example.com/3123364814/malware.htm"; |
| 2333 ASSERT_EQ(SBPrefixForString(kExampleFine), | 2336 ASSERT_EQ(SBPrefixForString(kExampleFine), |
| 2334 SBPrefixForString(kExampleCollision)); | 2337 SBPrefixForString(kExampleCollision)); |
| 2335 { | 2338 { |
| 2336 std::vector<scoped_ptr<SBChunkData>> chunks; | 2339 std::vector<std::unique_ptr<SBChunkData>> chunks; |
| 2337 chunks.push_back(AddChunkFullHashValue(3, kExampleCollision)); | 2340 chunks.push_back(AddChunkFullHashValue(3, kExampleCollision)); |
| 2338 database_->InsertChunks(kMalwareList, chunks); | 2341 database_->InsertChunks(kMalwareList, chunks); |
| 2339 } | 2342 } |
| 2340 | 2343 |
| 2341 database_->UpdateFinished(true); | 2344 database_->UpdateFinished(true); |
| 2342 | 2345 |
| 2343 std::vector<SBPrefix> prefix_hits; | 2346 std::vector<SBPrefix> prefix_hits; |
| 2344 std::vector<SBFullHashResult> cache_hits; | 2347 std::vector<SBFullHashResult> cache_hits; |
| 2345 | 2348 |
| 2346 // Anything will hit the host prefix. | 2349 // Anything will hit the host prefix. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2371 ASSERT_EQ(1U, prefix_hits.size()); | 2374 ASSERT_EQ(1U, prefix_hits.size()); |
| 2372 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); | 2375 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); |
| 2373 EXPECT_TRUE(cache_hits.empty()); | 2376 EXPECT_TRUE(cache_hits.empty()); |
| 2374 | 2377 |
| 2375 // This prefix collides, but no full hash match. | 2378 // This prefix collides, but no full hash match. |
| 2376 EXPECT_FALSE(database_->ContainsBrowseUrl( | 2379 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 2377 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); | 2380 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); |
| 2378 } | 2381 } |
| 2379 | 2382 |
| 2380 } // namespace safe_browsing | 2383 } // namespace safe_browsing |
| OLD | NEW |