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 |