| 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 "chrome/browser/safe_browsing/safe_browsing_store.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_store.h" |
| 6 | 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 SBFullHash one, onetwo, two; | 29 SBFullHash one, onetwo, two; |
| 30 memset(&one, 0, sizeof(one)); | 30 memset(&one, 0, sizeof(one)); |
| 31 memset(&onetwo, 0, sizeof(onetwo)); | 31 memset(&onetwo, 0, sizeof(onetwo)); |
| 32 memset(&two, 0, sizeof(two)); | 32 memset(&two, 0, sizeof(two)); |
| 33 one.prefix = 1; | 33 one.prefix = 1; |
| 34 one.full_hash[sizeof(SBPrefix)] = 1; | 34 one.full_hash[sizeof(SBPrefix)] = 1; |
| 35 onetwo.prefix = 1; | 35 onetwo.prefix = 1; |
| 36 onetwo.full_hash[sizeof(SBPrefix)] = 2; | 36 onetwo.full_hash[sizeof(SBPrefix)] = 2; |
| 37 two.prefix = 2; | 37 two.prefix = 2; |
| 38 | 38 |
| 39 const base::Time now = base::Time::Now(); | |
| 40 | |
| 41 // prefix dominates. | 39 // prefix dominates. |
| 42 EXPECT_TRUE(SBAddPrefixHashLess(SBAddFullHash(11, now, one), | 40 EXPECT_TRUE(SBAddPrefixHashLess(SBAddFullHash(11, one), |
| 43 SBAddFullHash(10, now, two))); | 41 SBAddFullHash(10, two))); |
| 44 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(11, now, two), | 42 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(11, two), |
| 45 SBAddFullHash(10, now, one))); | 43 SBAddFullHash(10, one))); |
| 46 | 44 |
| 47 // After prefix, add_id. | 45 // After prefix, add_id. |
| 48 EXPECT_TRUE(SBAddPrefixHashLess(SBAddFullHash(10, now, one), | 46 EXPECT_TRUE(SBAddPrefixHashLess(SBAddFullHash(10, one), |
| 49 SBAddFullHash(11, now, onetwo))); | 47 SBAddFullHash(11, onetwo))); |
| 50 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(11, now, one), | 48 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(11, one), |
| 51 SBAddFullHash(10, now, onetwo))); | 49 SBAddFullHash(10, onetwo))); |
| 52 | 50 |
| 53 // After add_id, full hash. | 51 // After add_id, full hash. |
| 54 EXPECT_TRUE(SBAddPrefixHashLess(SBAddFullHash(10, now, one), | 52 EXPECT_TRUE(SBAddPrefixHashLess(SBAddFullHash(10, one), |
| 55 SBAddFullHash(10, now, onetwo))); | 53 SBAddFullHash(10, onetwo))); |
| 56 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(10, now, onetwo), | 54 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(10, onetwo), |
| 57 SBAddFullHash(10, now, one))); | 55 SBAddFullHash(10, one))); |
| 58 | 56 |
| 59 // Equal is not less-than. | 57 // Equal is not less-than. |
| 60 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(10, now, one), | 58 EXPECT_FALSE(SBAddPrefixHashLess(SBAddFullHash(10, one), |
| 61 SBAddFullHash(10, now, one))); | 59 SBAddFullHash(10, one))); |
| 62 } | 60 } |
| 63 | 61 |
| 64 TEST(SafeBrowsingStoreTest, SBSubPrefixLess) { | 62 TEST(SafeBrowsingStoreTest, SBSubPrefixLess) { |
| 65 // prefix dominates. | 63 // prefix dominates. |
| 66 EXPECT_TRUE(SBAddPrefixLess(SBSubPrefix(12, 11, 1), SBSubPrefix(9, 10, 2))); | 64 EXPECT_TRUE(SBAddPrefixLess(SBSubPrefix(12, 11, 1), SBSubPrefix(9, 10, 2))); |
| 67 EXPECT_FALSE(SBAddPrefixLess(SBSubPrefix(12, 11, 2), SBSubPrefix(9, 10, 1))); | 65 EXPECT_FALSE(SBAddPrefixLess(SBSubPrefix(12, 11, 2), SBSubPrefix(9, 10, 1))); |
| 68 | 66 |
| 69 // After prefix, add_id. | 67 // After prefix, add_id. |
| 70 EXPECT_TRUE(SBAddPrefixLess(SBSubPrefix(12, 9, 1), SBSubPrefix(9, 10, 1))); | 68 EXPECT_TRUE(SBAddPrefixLess(SBSubPrefix(12, 9, 1), SBSubPrefix(9, 10, 1))); |
| 71 EXPECT_FALSE(SBAddPrefixLess(SBSubPrefix(12, 10, 1), SBSubPrefix(9, 9, 1))); | 69 EXPECT_FALSE(SBAddPrefixLess(SBSubPrefix(12, 10, 1), SBSubPrefix(9, 9, 1))); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 SBProcessSubs(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, | 120 SBProcessSubs(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes, |
| 123 no_deletions, no_deletions); | 121 no_deletions, no_deletions); |
| 124 EXPECT_TRUE(add_prefixes.empty()); | 122 EXPECT_TRUE(add_prefixes.empty()); |
| 125 EXPECT_TRUE(sub_prefixes.empty()); | 123 EXPECT_TRUE(sub_prefixes.empty()); |
| 126 EXPECT_TRUE(add_hashes.empty()); | 124 EXPECT_TRUE(add_hashes.empty()); |
| 127 EXPECT_TRUE(sub_hashes.empty()); | 125 EXPECT_TRUE(sub_hashes.empty()); |
| 128 } | 126 } |
| 129 | 127 |
| 130 // Test that subs knock out adds. | 128 // Test that subs knock out adds. |
| 131 TEST(SafeBrowsingStoreTest, SBProcessSubsKnockout) { | 129 TEST(SafeBrowsingStoreTest, SBProcessSubsKnockout) { |
| 132 const base::Time kNow = base::Time::Now(); | |
| 133 const SBFullHash kHash1(SBFullHashForString("one")); | 130 const SBFullHash kHash1(SBFullHashForString("one")); |
| 134 const SBFullHash kHash2(SBFullHashForString("two")); | 131 const SBFullHash kHash2(SBFullHashForString("two")); |
| 135 const SBFullHash kHash3(SBFullHashForString("three")); | 132 const SBFullHash kHash3(SBFullHashForString("three")); |
| 136 const SBFullHash kHash4(SBFullHashForString("four")); | 133 const SBFullHash kHash4(SBFullHashForString("four")); |
| 137 const int kAddChunk1 = 1; // Use different chunk numbers just in case. | 134 const int kAddChunk1 = 1; // Use different chunk numbers just in case. |
| 138 const int kSubChunk1 = 2; | 135 const int kSubChunk1 = 2; |
| 139 | 136 |
| 140 // Construct some full hashes which share prefix with another. | 137 // Construct some full hashes which share prefix with another. |
| 141 SBFullHash kHash1mod1 = kHash1; | 138 SBFullHash kHash1mod1 = kHash1; |
| 142 kHash1mod1.full_hash[sizeof(kHash1mod1.full_hash) - 1] ++; | 139 kHash1mod1.full_hash[sizeof(kHash1mod1.full_hash) - 1] ++; |
| 143 SBFullHash kHash1mod2 = kHash1mod1; | 140 SBFullHash kHash1mod2 = kHash1mod1; |
| 144 kHash1mod2.full_hash[sizeof(kHash1mod2.full_hash) - 1] ++; | 141 kHash1mod2.full_hash[sizeof(kHash1mod2.full_hash) - 1] ++; |
| 145 SBFullHash kHash1mod3 = kHash1mod2; | 142 SBFullHash kHash1mod3 = kHash1mod2; |
| 146 kHash1mod3.full_hash[sizeof(kHash1mod3.full_hash) - 1] ++; | 143 kHash1mod3.full_hash[sizeof(kHash1mod3.full_hash) - 1] ++; |
| 147 | 144 |
| 148 // A second full-hash for the full-hash-sub test. | 145 // A second full-hash for the full-hash-sub test. |
| 149 SBFullHash kHash4mod = kHash4; | 146 SBFullHash kHash4mod = kHash4; |
| 150 kHash4mod.full_hash[sizeof(kHash4mod.full_hash) - 1] ++; | 147 kHash4mod.full_hash[sizeof(kHash4mod.full_hash) - 1] ++; |
| 151 | 148 |
| 152 SBAddPrefixes add_prefixes; | 149 SBAddPrefixes add_prefixes; |
| 153 std::vector<SBAddFullHash> add_hashes; | 150 std::vector<SBAddFullHash> add_hashes; |
| 154 SBSubPrefixes sub_prefixes; | 151 SBSubPrefixes sub_prefixes; |
| 155 std::vector<SBSubFullHash> sub_hashes; | 152 std::vector<SBSubFullHash> sub_hashes; |
| 156 | 153 |
| 157 // An add with prefix and a couple hashes, plus a sub for the prefix | 154 // An add with prefix and a couple hashes, plus a sub for the prefix |
| 158 // and a couple sub hashes. The sub should knock all of them out. | 155 // and a couple sub hashes. The sub should knock all of them out. |
| 159 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash1.prefix)); | 156 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash1.prefix)); |
| 160 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash1)); | 157 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash1)); |
| 161 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash1mod1)); | 158 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash1mod1)); |
| 162 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash1.prefix)); | 159 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash1.prefix)); |
| 163 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod2)); | 160 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod2)); |
| 164 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod3)); | 161 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod3)); |
| 165 | 162 |
| 166 // An add with no corresponding sub. Both items should be retained. | 163 // An add with no corresponding sub. Both items should be retained. |
| 167 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash2)); | 164 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash2)); |
| 168 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash2.prefix)); | 165 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash2.prefix)); |
| 169 | 166 |
| 170 // A sub with no corresponding add. Both items should be retained. | 167 // A sub with no corresponding add. Both items should be retained. |
| 171 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash3)); | 168 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash3)); |
| 172 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash3.prefix)); | 169 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash3.prefix)); |
| 173 | 170 |
| 174 // An add with prefix and a couple hashes, plus a sub for one of the | 171 // An add with prefix and a couple hashes, plus a sub for one of the |
| 175 // hashes. | 172 // hashes. |
| 176 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash4.prefix)); | 173 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash4.prefix)); |
| 177 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash4)); | 174 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash4)); |
| 178 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash4mod)); | 175 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash4mod)); |
| 179 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash4mod)); | 176 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash4mod)); |
| 180 | 177 |
| 181 std::sort(add_prefixes.begin(), add_prefixes.end(), | 178 std::sort(add_prefixes.begin(), add_prefixes.end(), |
| 182 SBAddPrefixLess<SBAddPrefix,SBAddPrefix>); | 179 SBAddPrefixLess<SBAddPrefix,SBAddPrefix>); |
| 183 std::sort(sub_prefixes.begin(), sub_prefixes.end(), | 180 std::sort(sub_prefixes.begin(), sub_prefixes.end(), |
| 184 SBAddPrefixLess<SBSubPrefix,SBSubPrefix>); | 181 SBAddPrefixLess<SBSubPrefix,SBSubPrefix>); |
| 185 std::sort(add_hashes.begin(), add_hashes.end(), | 182 std::sort(add_hashes.begin(), add_hashes.end(), |
| 186 SBAddPrefixHashLess<SBAddFullHash,SBAddFullHash>); | 183 SBAddPrefixHashLess<SBAddFullHash,SBAddFullHash>); |
| 187 std::sort(sub_hashes.begin(), sub_hashes.end(), | 184 std::sort(sub_hashes.begin(), sub_hashes.end(), |
| 188 SBAddPrefixHashLess<SBSubFullHash,SBSubFullHash>); | 185 SBAddPrefixHashLess<SBSubFullHash,SBSubFullHash>); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 214 ASSERT_LE(1U, sub_hashes.size()); | 211 ASSERT_LE(1U, sub_hashes.size()); |
| 215 EXPECT_EQ(1U, sub_hashes.size()); | 212 EXPECT_EQ(1U, sub_hashes.size()); |
| 216 EXPECT_EQ(kSubChunk1, sub_hashes[0].chunk_id); | 213 EXPECT_EQ(kSubChunk1, sub_hashes[0].chunk_id); |
| 217 EXPECT_EQ(kAddChunk1, sub_hashes[0].add_chunk_id); | 214 EXPECT_EQ(kAddChunk1, sub_hashes[0].add_chunk_id); |
| 218 EXPECT_TRUE(SBFullHashEqual(kHash3, sub_hashes[0].full_hash)); | 215 EXPECT_TRUE(SBFullHashEqual(kHash3, sub_hashes[0].full_hash)); |
| 219 } | 216 } |
| 220 | 217 |
| 221 // Test chunk deletions, and ordering of deletions WRT subs knocking | 218 // Test chunk deletions, and ordering of deletions WRT subs knocking |
| 222 // out adds. | 219 // out adds. |
| 223 TEST(SafeBrowsingStoreTest, SBProcessSubsDeleteChunk) { | 220 TEST(SafeBrowsingStoreTest, SBProcessSubsDeleteChunk) { |
| 224 const base::Time kNow = base::Time::Now(); | |
| 225 const SBFullHash kHash1(SBFullHashForString("one")); | 221 const SBFullHash kHash1(SBFullHashForString("one")); |
| 226 const SBFullHash kHash2(SBFullHashForString("two")); | 222 const SBFullHash kHash2(SBFullHashForString("two")); |
| 227 const SBFullHash kHash3(SBFullHashForString("three")); | 223 const SBFullHash kHash3(SBFullHashForString("three")); |
| 228 const int kAddChunk1 = 1; // Use different chunk numbers just in case. | 224 const int kAddChunk1 = 1; // Use different chunk numbers just in case. |
| 229 const int kSubChunk1 = 2; | 225 const int kSubChunk1 = 2; |
| 230 | 226 |
| 231 // Construct some full hashes which share prefix with another. | 227 // Construct some full hashes which share prefix with another. |
| 232 SBFullHash kHash1mod1 = kHash1; | 228 SBFullHash kHash1mod1 = kHash1; |
| 233 kHash1mod1.full_hash[sizeof(kHash1mod1.full_hash) - 1] ++; | 229 kHash1mod1.full_hash[sizeof(kHash1mod1.full_hash) - 1] ++; |
| 234 SBFullHash kHash1mod2 = kHash1mod1; | 230 SBFullHash kHash1mod2 = kHash1mod1; |
| 235 kHash1mod2.full_hash[sizeof(kHash1mod2.full_hash) - 1] ++; | 231 kHash1mod2.full_hash[sizeof(kHash1mod2.full_hash) - 1] ++; |
| 236 SBFullHash kHash1mod3 = kHash1mod2; | 232 SBFullHash kHash1mod3 = kHash1mod2; |
| 237 kHash1mod3.full_hash[sizeof(kHash1mod3.full_hash) - 1] ++; | 233 kHash1mod3.full_hash[sizeof(kHash1mod3.full_hash) - 1] ++; |
| 238 | 234 |
| 239 SBAddPrefixes add_prefixes; | 235 SBAddPrefixes add_prefixes; |
| 240 std::vector<SBAddFullHash> add_hashes; | 236 std::vector<SBAddFullHash> add_hashes; |
| 241 SBSubPrefixes sub_prefixes; | 237 SBSubPrefixes sub_prefixes; |
| 242 std::vector<SBSubFullHash> sub_hashes; | 238 std::vector<SBSubFullHash> sub_hashes; |
| 243 | 239 |
| 244 // An add with prefix and a couple hashes, plus a sub for the prefix | 240 // An add with prefix and a couple hashes, plus a sub for the prefix |
| 245 // and a couple sub hashes. The sub should knock all of them out. | 241 // and a couple sub hashes. The sub should knock all of them out. |
| 246 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash1.prefix)); | 242 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash1.prefix)); |
| 247 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash1)); | 243 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash1)); |
| 248 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash1mod1)); | 244 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash1mod1)); |
| 249 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash1.prefix)); | 245 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash1.prefix)); |
| 250 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod2)); | 246 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod2)); |
| 251 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod3)); | 247 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash1mod3)); |
| 252 | 248 |
| 253 // An add with no corresponding sub. Both items should be retained. | 249 // An add with no corresponding sub. Both items should be retained. |
| 254 add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash2)); | 250 add_hashes.push_back(SBAddFullHash(kAddChunk1, kHash2)); |
| 255 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash2.prefix)); | 251 add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash2.prefix)); |
| 256 | 252 |
| 257 // A sub with no corresponding add. Both items should be retained. | 253 // A sub with no corresponding add. Both items should be retained. |
| 258 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash3)); | 254 sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash3)); |
| 259 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash3.prefix)); | 255 sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash3.prefix)); |
| 260 | 256 |
| 261 std::sort(add_prefixes.begin(), add_prefixes.end(), | 257 std::sort(add_prefixes.begin(), add_prefixes.end(), |
| 262 SBAddPrefixLess<SBAddPrefix,SBAddPrefix>); | 258 SBAddPrefixLess<SBAddPrefix,SBAddPrefix>); |
| 263 std::sort(sub_prefixes.begin(), sub_prefixes.end(), | 259 std::sort(sub_prefixes.begin(), sub_prefixes.end(), |
| 264 SBAddPrefixLess<SBSubPrefix,SBSubPrefix>); | 260 SBAddPrefixLess<SBSubPrefix,SBSubPrefix>); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 TEST(SafeBrowsingStoreTest, Y2K38) { | 305 TEST(SafeBrowsingStoreTest, Y2K38) { |
| 310 const base::Time now = base::Time::Now(); | 306 const base::Time now = base::Time::Now(); |
| 311 const base::Time future = now + base::TimeDelta::FromDays(3*365); | 307 const base::Time future = now + base::TimeDelta::FromDays(3*365); |
| 312 | 308 |
| 313 // TODO: Fix file format before 2035. | 309 // TODO: Fix file format before 2035. |
| 314 EXPECT_GT(static_cast<int32>(future.ToTimeT()), 0) | 310 EXPECT_GT(static_cast<int32>(future.ToTimeT()), 0) |
| 315 << " (int32)time_t is running out."; | 311 << " (int32)time_t is running out."; |
| 316 } | 312 } |
| 317 | 313 |
| 318 } // namespace | 314 } // namespace |
| OLD | NEW |