| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdint.h> |
| 6 #include <string.h> |
| 7 |
| 5 #include "chrome/browser/safe_browsing/safe_browsing_store.h" | 8 #include "chrome/browser/safe_browsing/safe_browsing_store.h" |
| 6 #include "components/safe_browsing_db/util.h" | 9 #include "components/safe_browsing_db/util.h" |
| 7 | 10 |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 12 |
| 10 namespace safe_browsing { | 13 namespace safe_browsing { |
| 11 | 14 |
| 12 namespace { | 15 namespace { |
| 13 | 16 |
| 14 const SBFullHash kHash1 = SBFullHashForString("one"); | 17 const SBFullHash kHash1 = SBFullHashForString("one"); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 34 | 37 |
| 35 SBFullHash ModifyHashAfterPrefix(SBFullHash hash, unsigned char mask) { | 38 SBFullHash ModifyHashAfterPrefix(SBFullHash hash, unsigned char mask) { |
| 36 hash.full_hash[sizeof(hash.full_hash) - 1] ^= mask; | 39 hash.full_hash[sizeof(hash.full_hash) - 1] ^= mask; |
| 37 return hash; | 40 return hash; |
| 38 } | 41 } |
| 39 | 42 |
| 40 void ProcessHelper(SBAddPrefixes* add_prefixes, | 43 void ProcessHelper(SBAddPrefixes* add_prefixes, |
| 41 SBSubPrefixes* sub_prefixes, | 44 SBSubPrefixes* sub_prefixes, |
| 42 std::vector<SBAddFullHash>* add_full_hashes, | 45 std::vector<SBAddFullHash>* add_full_hashes, |
| 43 std::vector<SBSubFullHash>* sub_full_hashes, | 46 std::vector<SBSubFullHash>* sub_full_hashes, |
| 44 const base::hash_set<int32>& add_chunks_deleted, | 47 const base::hash_set<int32_t>& add_chunks_deleted, |
| 45 const base::hash_set<int32>& sub_chunks_deleted) { | 48 const base::hash_set<int32_t>& sub_chunks_deleted) { |
| 46 std::sort(add_prefixes->begin(), add_prefixes->end(), | 49 std::sort(add_prefixes->begin(), add_prefixes->end(), |
| 47 SBAddPrefixLess<SBAddPrefix,SBAddPrefix>); | 50 SBAddPrefixLess<SBAddPrefix,SBAddPrefix>); |
| 48 std::sort(sub_prefixes->begin(), sub_prefixes->end(), | 51 std::sort(sub_prefixes->begin(), sub_prefixes->end(), |
| 49 SBAddPrefixLess<SBSubPrefix,SBSubPrefix>); | 52 SBAddPrefixLess<SBSubPrefix,SBSubPrefix>); |
| 50 std::sort(add_full_hashes->begin(), add_full_hashes->end(), | 53 std::sort(add_full_hashes->begin(), add_full_hashes->end(), |
| 51 SBAddPrefixHashLess<SBAddFullHash,SBAddFullHash>); | 54 SBAddPrefixHashLess<SBAddFullHash,SBAddFullHash>); |
| 52 std::sort(sub_full_hashes->begin(), sub_full_hashes->end(), | 55 std::sort(sub_full_hashes->begin(), sub_full_hashes->end(), |
| 53 SBAddPrefixHashLess<SBSubFullHash,SBSubFullHash>); | 56 SBAddPrefixHashLess<SBSubFullHash,SBSubFullHash>); |
| 54 | 57 |
| 55 SBProcessSubs(add_prefixes, sub_prefixes, add_full_hashes, sub_full_hashes, | 58 SBProcessSubs(add_prefixes, sub_prefixes, add_full_hashes, sub_full_hashes, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 } | 162 } |
| 160 | 163 |
| 161 // SBProcessSubs does a lot of iteration, run through empty just to | 164 // SBProcessSubs does a lot of iteration, run through empty just to |
| 162 // make sure degenerate cases work. | 165 // make sure degenerate cases work. |
| 163 TEST(SafeBrowsingStoreTest, SBProcessSubsEmpty) { | 166 TEST(SafeBrowsingStoreTest, SBProcessSubsEmpty) { |
| 164 SBAddPrefixes add_prefixes; | 167 SBAddPrefixes add_prefixes; |
| 165 std::vector<SBAddFullHash> add_hashes; | 168 std::vector<SBAddFullHash> add_hashes; |
| 166 SBSubPrefixes sub_prefixes; | 169 SBSubPrefixes sub_prefixes; |
| 167 std::vector<SBSubFullHash> sub_hashes; | 170 std::vector<SBSubFullHash> sub_hashes; |
| 168 | 171 |
| 169 const base::hash_set<int32> no_deletions; | 172 const base::hash_set<int32_t> no_deletions; |
| 170 SBProcessSubs(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, | 173 SBProcessSubs(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, |
| 171 no_deletions, no_deletions); | 174 no_deletions, no_deletions); |
| 172 EXPECT_TRUE(add_prefixes.empty()); | 175 EXPECT_TRUE(add_prefixes.empty()); |
| 173 EXPECT_TRUE(sub_prefixes.empty()); | 176 EXPECT_TRUE(sub_prefixes.empty()); |
| 174 EXPECT_TRUE(add_hashes.empty()); | 177 EXPECT_TRUE(add_hashes.empty()); |
| 175 EXPECT_TRUE(sub_hashes.empty()); | 178 EXPECT_TRUE(sub_hashes.empty()); |
| 176 } | 179 } |
| 177 | 180 |
| 178 // Test that subs knock out adds. | 181 // Test that subs knock out adds. |
| 179 TEST(SafeBrowsingStoreTest, SBProcessSubsKnockout) { | 182 TEST(SafeBrowsingStoreTest, SBProcessSubsKnockout) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 205 // Subs with no corresponding add. Both items should be retained. | 208 // Subs with no corresponding add. Both items should be retained. |
| 206 sub_hashes.push_back(SBSubFullHash(kSubChunk3, kAddChunk3, kHash7)); | 209 sub_hashes.push_back(SBSubFullHash(kSubChunk3, kAddChunk3, kHash7)); |
| 207 sub_prefixes.push_back(SBSubPrefix(kSubChunk4, kAddChunk4, kHash3.prefix)); | 210 sub_prefixes.push_back(SBSubPrefix(kSubChunk4, kAddChunk4, kHash3.prefix)); |
| 208 | 211 |
| 209 // Add hashes with the same prefix, with a sub that will knock one of them | 212 // Add hashes with the same prefix, with a sub that will knock one of them |
| 210 // out. | 213 // out. |
| 211 add_hashes.push_back(SBAddFullHash(kAddChunk5, kHash4)); | 214 add_hashes.push_back(SBAddFullHash(kAddChunk5, kHash4)); |
| 212 add_hashes.push_back(SBAddFullHash(kAddChunk5, kHash4mod)); | 215 add_hashes.push_back(SBAddFullHash(kAddChunk5, kHash4mod)); |
| 213 sub_hashes.push_back(SBSubFullHash(kSubChunk5, kAddChunk5, kHash4mod)); | 216 sub_hashes.push_back(SBSubFullHash(kSubChunk5, kAddChunk5, kHash4mod)); |
| 214 | 217 |
| 215 const base::hash_set<int32> no_deletions; | 218 const base::hash_set<int32_t> no_deletions; |
| 216 ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, | 219 ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, |
| 217 no_deletions, no_deletions); | 220 no_deletions, no_deletions); |
| 218 | 221 |
| 219 ASSERT_EQ(1U, add_prefixes.size()); | 222 ASSERT_EQ(1U, add_prefixes.size()); |
| 220 EXPECT_EQ(kAddChunk7, add_prefixes[0].chunk_id); | 223 EXPECT_EQ(kAddChunk7, add_prefixes[0].chunk_id); |
| 221 EXPECT_EQ(kHash2.prefix, add_prefixes[0].prefix); | 224 EXPECT_EQ(kHash2.prefix, add_prefixes[0].prefix); |
| 222 | 225 |
| 223 ASSERT_EQ(2U, add_hashes.size()); | 226 ASSERT_EQ(2U, add_hashes.size()); |
| 224 EXPECT_EQ(kAddChunk5, add_hashes[0].chunk_id); | 227 EXPECT_EQ(kAddChunk5, add_hashes[0].chunk_id); |
| 225 EXPECT_TRUE(SBFullHashEqual(kHash4, add_hashes[0].full_hash)); | 228 EXPECT_TRUE(SBFullHashEqual(kHash4, add_hashes[0].full_hash)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 263 |
| 261 // Adds with no corresponding sub. Both items should be retained. | 264 // Adds with no corresponding sub. Both items should be retained. |
| 262 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash6)); | 265 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash6)); |
| 263 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash2.prefix)); | 266 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash2.prefix)); |
| 264 | 267 |
| 265 // Subs with no corresponding add. Both items should be retained. | 268 // Subs with no corresponding add. Both items should be retained. |
| 266 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash7)); | 269 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash7)); |
| 267 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash3.prefix)); | 270 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash3.prefix)); |
| 268 | 271 |
| 269 // Subs apply before being deleted. | 272 // Subs apply before being deleted. |
| 270 const base::hash_set<int32> no_deletions; | 273 const base::hash_set<int32_t> no_deletions; |
| 271 base::hash_set<int32> sub_deletions; | 274 base::hash_set<int32_t> sub_deletions; |
| 272 sub_deletions.insert(kSubChunk1); | 275 sub_deletions.insert(kSubChunk1); |
| 273 ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, | 276 ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, |
| 274 no_deletions, sub_deletions); | 277 no_deletions, sub_deletions); |
| 275 | 278 |
| 276 ASSERT_EQ(1U, add_prefixes.size()); | 279 ASSERT_EQ(1U, add_prefixes.size()); |
| 277 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); | 280 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); |
| 278 EXPECT_EQ(kHash2.prefix, add_prefixes[0].prefix); | 281 EXPECT_EQ(kHash2.prefix, add_prefixes[0].prefix); |
| 279 | 282 |
| 280 ASSERT_EQ(1U, add_hashes.size()); | 283 ASSERT_EQ(1U, add_hashes.size()); |
| 281 EXPECT_EQ(kAddChunk1, add_hashes[0].chunk_id); | 284 EXPECT_EQ(kAddChunk1, add_hashes[0].chunk_id); |
| 282 EXPECT_TRUE(SBFullHashEqual(kHash6, add_hashes[0].full_hash)); | 285 EXPECT_TRUE(SBFullHashEqual(kHash6, add_hashes[0].full_hash)); |
| 283 | 286 |
| 284 EXPECT_TRUE(sub_prefixes.empty()); | 287 EXPECT_TRUE(sub_prefixes.empty()); |
| 285 EXPECT_TRUE(sub_hashes.empty()); | 288 EXPECT_TRUE(sub_hashes.empty()); |
| 286 | 289 |
| 287 // Delete the adds, also. | 290 // Delete the adds, also. |
| 288 base::hash_set<int32> add_deletions; | 291 base::hash_set<int32_t> add_deletions; |
| 289 add_deletions.insert(kAddChunk1); | 292 add_deletions.insert(kAddChunk1); |
| 290 ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, | 293 ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, |
| 291 add_deletions, no_deletions); | 294 add_deletions, no_deletions); |
| 292 | 295 |
| 293 EXPECT_TRUE(add_prefixes.empty()); | 296 EXPECT_TRUE(add_prefixes.empty()); |
| 294 EXPECT_TRUE(add_hashes.empty()); | 297 EXPECT_TRUE(add_hashes.empty()); |
| 295 EXPECT_TRUE(sub_prefixes.empty()); | 298 EXPECT_TRUE(sub_prefixes.empty()); |
| 296 EXPECT_TRUE(sub_hashes.empty()); | 299 EXPECT_TRUE(sub_hashes.empty()); |
| 297 } | 300 } |
| 298 | 301 |
| 299 TEST(SafeBrowsingStoreTest, Y2K38) { | 302 TEST(SafeBrowsingStoreTest, Y2K38) { |
| 300 const base::Time now = base::Time::Now(); | 303 const base::Time now = base::Time::Now(); |
| 301 const base::Time future = now + base::TimeDelta::FromDays(3*365); | 304 const base::Time future = now + base::TimeDelta::FromDays(3*365); |
| 302 | 305 |
| 303 // TODO: Fix file format before 2035. | 306 // TODO: Fix file format before 2035. |
| 304 EXPECT_GT(static_cast<int32>(future.ToTimeT()), 0) | 307 EXPECT_GT(static_cast<int32_t>(future.ToTimeT()), 0) |
| 305 << " (int32)time_t is running out."; | 308 << " (int32_t)time_t is running out."; |
| 306 } | 309 } |
| 307 | 310 |
| 308 } // namespace safe_browsing | 311 } // namespace safe_browsing |
| OLD | NEW |