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

Side by Side Diff: chrome/browser/safe_browsing/safe_browsing_store_unittest.cc

Issue 220493003: Safebrowsing: change gethash caching to match api 2.3 rules, fix some corner cases. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: changes to fullhash / prefix handling Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698