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

Side by Side Diff: chrome/browser/safe_browsing/safe_browsing_store_file_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) 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 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" 5 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/scoped_file.h" 9 #include "base/files/scoped_file.h"
10 #include "base/files/scoped_temp_dir.h" 10 #include "base/files/scoped_temp_dir.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 store_.reset(); 55 store_.reset();
56 56
57 PlatformTest::TearDown(); 57 PlatformTest::TearDown();
58 } 58 }
59 59
60 void OnCorruptionDetected() { 60 void OnCorruptionDetected() {
61 corruption_detected_ = true; 61 corruption_detected_ = true;
62 } 62 }
63 63
64 // Populate the store with some testing data. 64 // Populate the store with some testing data.
65 void PopulateStore(const base::Time& now) { 65 void PopulateStore() {
66 ASSERT_TRUE(store_->BeginUpdate()); 66 ASSERT_TRUE(store_->BeginUpdate());
67 67
68 EXPECT_TRUE(store_->BeginChunk()); 68 EXPECT_TRUE(store_->BeginChunk());
69 store_->SetAddChunk(kAddChunk1); 69 store_->SetAddChunk(kAddChunk1);
70 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); 70 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1));
71 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix)); 71 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix));
72 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix)); 72 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix));
73 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, now, kHash2)); 73 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, kHash2));
74 74
75 store_->SetSubChunk(kSubChunk1); 75 store_->SetSubChunk(kSubChunk1);
76 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); 76 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1));
77 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix)); 77 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix));
78 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk3, kHash3)); 78 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk3, kHash3));
79 EXPECT_TRUE(store_->FinishChunk()); 79 EXPECT_TRUE(store_->FinishChunk());
80 80
81 // Chunk numbers shouldn't leak over. 81 // Chunk numbers shouldn't leak over.
82 EXPECT_FALSE(store_->CheckAddChunk(kSubChunk1)); 82 EXPECT_FALSE(store_->CheckAddChunk(kSubChunk1));
83 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3)); 83 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3));
84 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk1)); 84 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk1));
85 85
86 std::vector<SBAddFullHash> pending_adds;
87 safe_browsing::PrefixSetBuilder builder; 86 safe_browsing::PrefixSetBuilder builder;
88 std::vector<SBAddFullHash> add_full_hashes_result; 87 std::vector<SBAddFullHash> add_full_hashes_result;
89 88
90 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 89 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
91 &builder,
92 &add_full_hashes_result));
93 } 90 }
94 91
95 // Manually read the shard stride info from the file. 92 // Manually read the shard stride info from the file.
96 uint32 ReadStride() { 93 uint32 ReadStride() {
97 base::ScopedFILE file(base::OpenFile(filename_, "rb")); 94 base::ScopedFILE file(base::OpenFile(filename_, "rb"));
98 const long kOffset = 4 * sizeof(uint32); 95 const long kOffset = 4 * sizeof(uint32);
99 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); 96 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0);
100 uint32 shard_stride = 0; 97 uint32 shard_stride = 0;
101 EXPECT_EQ(fread(&shard_stride, sizeof(shard_stride), 1, file.get()), 1U); 98 EXPECT_EQ(fread(&shard_stride, sizeof(shard_stride), 1, file.get()), 1U);
102 return shard_stride; 99 return shard_stride;
(...skipping 17 matching lines...) Expand all
120 117
121 // Shouldn't see anything, but anything is a big set to test. 118 // Shouldn't see anything, but anything is a big set to test.
122 EXPECT_FALSE(store_->CheckAddChunk(0)); 119 EXPECT_FALSE(store_->CheckAddChunk(0));
123 EXPECT_FALSE(store_->CheckAddChunk(1)); 120 EXPECT_FALSE(store_->CheckAddChunk(1));
124 EXPECT_FALSE(store_->CheckAddChunk(-1)); 121 EXPECT_FALSE(store_->CheckAddChunk(-1));
125 122
126 EXPECT_FALSE(store_->CheckSubChunk(0)); 123 EXPECT_FALSE(store_->CheckSubChunk(0));
127 EXPECT_FALSE(store_->CheckSubChunk(1)); 124 EXPECT_FALSE(store_->CheckSubChunk(1));
128 EXPECT_FALSE(store_->CheckSubChunk(-1)); 125 EXPECT_FALSE(store_->CheckSubChunk(-1));
129 126
130 std::vector<SBAddFullHash> pending_adds;
131 safe_browsing::PrefixSetBuilder builder; 127 safe_browsing::PrefixSetBuilder builder;
132 std::vector<SBAddFullHash> add_full_hashes_result; 128 std::vector<SBAddFullHash> add_full_hashes_result;
133 129
134 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 130 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
135 &builder,
136 &add_full_hashes_result));
137 EXPECT_TRUE(add_full_hashes_result.empty()); 131 EXPECT_TRUE(add_full_hashes_result.empty());
138 132
139 std::vector<SBPrefix> prefixes_result; 133 std::vector<SBPrefix> prefixes_result;
140 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 134 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
141 EXPECT_TRUE(prefixes_result.empty()); 135 EXPECT_TRUE(prefixes_result.empty());
142 } 136 }
143 137
144 // Write some prefix data to the store and verify that it looks like 138 // Write some prefix data to the store and verify that it looks like
145 // it is still there after the transaction completes. 139 // it is still there after the transaction completes.
146 TEST_F(SafeBrowsingStoreFileTest, StorePrefix) { 140 TEST_F(SafeBrowsingStoreFileTest, StorePrefix) {
147 const base::Time now = base::Time::Now(); 141 PopulateStore();
148 PopulateStore(now);
149 142
150 ASSERT_TRUE(store_->BeginUpdate()); 143 ASSERT_TRUE(store_->BeginUpdate());
151 144
152 std::vector<int> chunks; 145 std::vector<int> chunks;
153 store_->GetAddChunks(&chunks); 146 store_->GetAddChunks(&chunks);
154 ASSERT_EQ(1U, chunks.size()); 147 ASSERT_EQ(1U, chunks.size());
155 EXPECT_EQ(kAddChunk1, chunks[0]); 148 EXPECT_EQ(kAddChunk1, chunks[0]);
156 149
157 store_->GetSubChunks(&chunks); 150 store_->GetSubChunks(&chunks);
158 ASSERT_EQ(1U, chunks.size()); 151 ASSERT_EQ(1U, chunks.size());
159 EXPECT_EQ(kSubChunk1, chunks[0]); 152 EXPECT_EQ(kSubChunk1, chunks[0]);
160 153
161 { 154 {
162 std::vector<SBAddFullHash> pending_adds;
163 safe_browsing::PrefixSetBuilder builder; 155 safe_browsing::PrefixSetBuilder builder;
164 std::vector<SBAddFullHash> add_full_hashes_result; 156 std::vector<SBAddFullHash> add_full_hashes_result;
165 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 157 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
166 &builder,
167 &add_full_hashes_result));
168 158
169 std::vector<SBPrefix> prefixes_result; 159 std::vector<SBPrefix> prefixes_result;
170 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 160 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
171 ASSERT_EQ(2U, prefixes_result.size()); 161 ASSERT_EQ(2U, prefixes_result.size());
172 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 162 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
173 EXPECT_EQ(kHash2.prefix, prefixes_result[1]); 163 EXPECT_EQ(kHash2.prefix, prefixes_result[1]);
174 164
175 ASSERT_EQ(1U, add_full_hashes_result.size()); 165 ASSERT_EQ(1U, add_full_hashes_result.size());
176 EXPECT_EQ(kAddChunk1, add_full_hashes_result[0].chunk_id); 166 EXPECT_EQ(kAddChunk1, add_full_hashes_result[0].chunk_id);
177 // EXPECT_TRUE(add_full_hashes_result[0].received == now)?
178 EXPECT_EQ(now.ToTimeT(), add_full_hashes_result[0].received);
179 EXPECT_TRUE(SBFullHashEqual(kHash2, add_full_hashes_result[0].full_hash)); 167 EXPECT_TRUE(SBFullHashEqual(kHash2, add_full_hashes_result[0].full_hash));
180 } 168 }
181 169
182 ASSERT_TRUE(store_->BeginUpdate()); 170 ASSERT_TRUE(store_->BeginUpdate());
183 171
184 // Still has the chunks expected in the next update. 172 // Still has the chunks expected in the next update.
185 store_->GetAddChunks(&chunks); 173 store_->GetAddChunks(&chunks);
186 ASSERT_EQ(1U, chunks.size()); 174 ASSERT_EQ(1U, chunks.size());
187 EXPECT_EQ(kAddChunk1, chunks[0]); 175 EXPECT_EQ(kAddChunk1, chunks[0]);
188 176
189 store_->GetSubChunks(&chunks); 177 store_->GetSubChunks(&chunks);
190 ASSERT_EQ(1U, chunks.size()); 178 ASSERT_EQ(1U, chunks.size());
191 EXPECT_EQ(kSubChunk1, chunks[0]); 179 EXPECT_EQ(kSubChunk1, chunks[0]);
192 180
193 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); 181 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1));
194 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); 182 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1));
195 183
196 { 184 {
197 std::vector<SBAddFullHash> pending_adds;
198 safe_browsing::PrefixSetBuilder builder; 185 safe_browsing::PrefixSetBuilder builder;
199 std::vector<SBAddFullHash> add_full_hashes_result; 186 std::vector<SBAddFullHash> add_full_hashes_result;
200 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 187 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
201 &builder,
202 &add_full_hashes_result));
203 188
204 // Still has the expected contents. 189 // Still has the expected contents.
205 std::vector<SBPrefix> prefixes_result; 190 std::vector<SBPrefix> prefixes_result;
206 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 191 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
207 ASSERT_EQ(2U, prefixes_result.size()); 192 ASSERT_EQ(2U, prefixes_result.size());
208 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 193 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
209 EXPECT_EQ(kHash2.prefix, prefixes_result[1]); 194 EXPECT_EQ(kHash2.prefix, prefixes_result[1]);
210 195
211 ASSERT_EQ(1U, add_full_hashes_result.size()); 196 ASSERT_EQ(1U, add_full_hashes_result.size());
212 EXPECT_EQ(kAddChunk1, add_full_hashes_result[0].chunk_id); 197 EXPECT_EQ(kAddChunk1, add_full_hashes_result[0].chunk_id);
213 EXPECT_EQ(now.ToTimeT(), add_full_hashes_result[0].received);
214 EXPECT_TRUE(SBFullHashEqual(kHash2, add_full_hashes_result[0].full_hash)); 198 EXPECT_TRUE(SBFullHashEqual(kHash2, add_full_hashes_result[0].full_hash));
215 } 199 }
216 } 200 }
217 201
218 // Verify that the min and max prefixes are stored and operated on. 202 // Verify that the min and max prefixes are stored and operated on.
219 TEST_F(SafeBrowsingStoreFileTest, PrefixMinMax) { 203 TEST_F(SafeBrowsingStoreFileTest, PrefixMinMax) {
220 const base::Time now = base::Time::Now(); 204 PopulateStore();
221 PopulateStore(now);
222 205
223 ASSERT_TRUE(store_->BeginUpdate()); 206 ASSERT_TRUE(store_->BeginUpdate());
224 207
225 EXPECT_TRUE(store_->BeginChunk()); 208 EXPECT_TRUE(store_->BeginChunk());
226 store_->SetAddChunk(kAddChunk2); 209 store_->SetAddChunk(kAddChunk2);
227 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk2, kMinSBPrefix)); 210 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk2, kMinSBPrefix));
228 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk2, kMaxSBPrefix)); 211 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk2, kMaxSBPrefix));
229 EXPECT_TRUE(store_->FinishChunk()); 212 EXPECT_TRUE(store_->FinishChunk());
230 213
231 { 214 {
232 std::vector<SBAddFullHash> pending_adds;
233 safe_browsing::PrefixSetBuilder builder; 215 safe_browsing::PrefixSetBuilder builder;
234 std::vector<SBAddFullHash> add_full_hashes_result; 216 std::vector<SBAddFullHash> add_full_hashes_result;
235 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 217 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
236 &builder,
237 &add_full_hashes_result));
238 218
239 std::vector<SBPrefix> prefixes_result; 219 std::vector<SBPrefix> prefixes_result;
240 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 220 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
241 ASSERT_EQ(4U, prefixes_result.size()); 221 ASSERT_EQ(4U, prefixes_result.size());
242 EXPECT_EQ(kMinSBPrefix, prefixes_result[0]); 222 EXPECT_EQ(kMinSBPrefix, prefixes_result[0]);
243 EXPECT_EQ(kHash1.prefix, prefixes_result[1]); 223 EXPECT_EQ(kHash1.prefix, prefixes_result[1]);
244 EXPECT_EQ(kHash2.prefix, prefixes_result[2]); 224 EXPECT_EQ(kHash2.prefix, prefixes_result[2]);
245 EXPECT_EQ(kMaxSBPrefix, prefixes_result[3]); 225 EXPECT_EQ(kMaxSBPrefix, prefixes_result[3]);
246 } 226 }
247 227
248 ASSERT_TRUE(store_->BeginUpdate()); 228 ASSERT_TRUE(store_->BeginUpdate());
249 229
250 EXPECT_TRUE(store_->BeginChunk()); 230 EXPECT_TRUE(store_->BeginChunk());
251 store_->SetAddChunk(kSubChunk2); 231 store_->SetAddChunk(kSubChunk2);
252 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk2, kMinSBPrefix)); 232 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk2, kMinSBPrefix));
253 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk2, kMaxSBPrefix)); 233 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk2, kMaxSBPrefix));
254 EXPECT_TRUE(store_->FinishChunk()); 234 EXPECT_TRUE(store_->FinishChunk());
255 235
256 { 236 {
257 std::vector<SBAddFullHash> pending_adds;
258 safe_browsing::PrefixSetBuilder builder; 237 safe_browsing::PrefixSetBuilder builder;
259 std::vector<SBAddFullHash> add_full_hashes_result; 238 std::vector<SBAddFullHash> add_full_hashes_result;
260 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 239 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
261 &builder,
262 &add_full_hashes_result));
263 240
264 std::vector<SBPrefix> prefixes_result; 241 std::vector<SBPrefix> prefixes_result;
265 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 242 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
266 ASSERT_EQ(2U, prefixes_result.size()); 243 ASSERT_EQ(2U, prefixes_result.size());
267 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 244 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
268 EXPECT_EQ(kHash2.prefix, prefixes_result[1]); 245 EXPECT_EQ(kHash2.prefix, prefixes_result[1]);
269 } 246 }
270 } 247 }
271 248
272 // Test that subs knockout adds. 249 // Test that subs knockout adds.
273 TEST_F(SafeBrowsingStoreFileTest, SubKnockout) { 250 TEST_F(SafeBrowsingStoreFileTest, SubKnockout) {
274 ASSERT_TRUE(store_->BeginUpdate()); 251 ASSERT_TRUE(store_->BeginUpdate());
275 252
276 const base::Time now = base::Time::Now();
277
278 EXPECT_TRUE(store_->BeginChunk()); 253 EXPECT_TRUE(store_->BeginChunk());
279 store_->SetAddChunk(kAddChunk1); 254 store_->SetAddChunk(kAddChunk1);
280 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix)); 255 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix));
281 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix)); 256 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix));
282 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, now, kHash2)); 257 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, kHash2));
283 258
284 store_->SetSubChunk(kSubChunk1); 259 store_->SetSubChunk(kSubChunk1);
285 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix)); 260 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix));
286 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix)); 261 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix));
287 EXPECT_TRUE(store_->FinishChunk()); 262 EXPECT_TRUE(store_->FinishChunk());
288 263
289 { 264 {
290 std::vector<SBAddFullHash> pending_adds;
291 safe_browsing::PrefixSetBuilder builder; 265 safe_browsing::PrefixSetBuilder builder;
292 std::vector<SBAddFullHash> add_full_hashes_result; 266 std::vector<SBAddFullHash> add_full_hashes_result;
293 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 267 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
294 &builder,
295 &add_full_hashes_result));
296 268
297 // Knocked out the chunk expected. 269 // Knocked out the chunk expected.
298 std::vector<SBPrefix> prefixes_result; 270 std::vector<SBPrefix> prefixes_result;
299 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 271 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
300 ASSERT_EQ(1U, prefixes_result.size()); 272 ASSERT_EQ(1U, prefixes_result.size());
301 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 273 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
302 EXPECT_TRUE(add_full_hashes_result.empty()); 274 EXPECT_TRUE(add_full_hashes_result.empty());
303 } 275 }
304 276
305 ASSERT_TRUE(store_->BeginUpdate()); 277 ASSERT_TRUE(store_->BeginUpdate());
306 278
307 // This add should be knocked out by an existing sub. 279 // This add should be knocked out by an existing sub.
308 EXPECT_TRUE(store_->BeginChunk()); 280 EXPECT_TRUE(store_->BeginChunk());
309 store_->SetAddChunk(kAddChunk3); 281 store_->SetAddChunk(kAddChunk3);
310 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix)); 282 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix));
311 EXPECT_TRUE(store_->FinishChunk()); 283 EXPECT_TRUE(store_->FinishChunk());
312 284
313 { 285 {
314 std::vector<SBAddFullHash> pending_adds;
315 safe_browsing::PrefixSetBuilder builder; 286 safe_browsing::PrefixSetBuilder builder;
316 std::vector<SBAddFullHash> add_full_hashes_result; 287 std::vector<SBAddFullHash> add_full_hashes_result;
317 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 288 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
318 &builder,
319 &add_full_hashes_result));
320 289
321 std::vector<SBPrefix> prefixes_result; 290 std::vector<SBPrefix> prefixes_result;
322 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 291 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
323 EXPECT_EQ(1U, prefixes_result.size()); 292 EXPECT_EQ(1U, prefixes_result.size());
324 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 293 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
325 EXPECT_TRUE(add_full_hashes_result.empty()); 294 EXPECT_TRUE(add_full_hashes_result.empty());
326 } 295 }
327 296
328 ASSERT_TRUE(store_->BeginUpdate()); 297 ASSERT_TRUE(store_->BeginUpdate());
329 298
330 // But by here the sub should be gone, so it should stick this time. 299 // But by here the sub should be gone, so it should stick this time.
331 EXPECT_TRUE(store_->BeginChunk()); 300 EXPECT_TRUE(store_->BeginChunk());
332 store_->SetAddChunk(kAddChunk3); 301 store_->SetAddChunk(kAddChunk3);
333 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix)); 302 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix));
334 EXPECT_TRUE(store_->FinishChunk()); 303 EXPECT_TRUE(store_->FinishChunk());
335 304
336 { 305 {
337 std::vector<SBAddFullHash> pending_adds;
338 safe_browsing::PrefixSetBuilder builder; 306 safe_browsing::PrefixSetBuilder builder;
339 std::vector<SBAddFullHash> add_full_hashes_result; 307 std::vector<SBAddFullHash> add_full_hashes_result;
340 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 308 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
341 &builder,
342 &add_full_hashes_result));
343 309
344 std::vector<SBPrefix> prefixes_result; 310 std::vector<SBPrefix> prefixes_result;
345 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 311 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
346 ASSERT_EQ(2U, prefixes_result.size()); 312 ASSERT_EQ(2U, prefixes_result.size());
347 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 313 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
348 EXPECT_EQ(kHash3.prefix, prefixes_result[1]); 314 EXPECT_EQ(kHash3.prefix, prefixes_result[1]);
349 EXPECT_TRUE(add_full_hashes_result.empty()); 315 EXPECT_TRUE(add_full_hashes_result.empty());
350 } 316 }
351 } 317 }
352 318
353 // Test that deletes delete the chunk's data. 319 // Test that deletes delete the chunk's data.
354 TEST_F(SafeBrowsingStoreFileTest, DeleteChunks) { 320 TEST_F(SafeBrowsingStoreFileTest, DeleteChunks) {
355 ASSERT_TRUE(store_->BeginUpdate()); 321 ASSERT_TRUE(store_->BeginUpdate());
356 322
357 const base::Time now = base::Time::Now();
358
359 // A chunk which will be deleted. 323 // A chunk which will be deleted.
360 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); 324 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1));
361 store_->SetAddChunk(kAddChunk1); 325 store_->SetAddChunk(kAddChunk1);
362 EXPECT_TRUE(store_->BeginChunk()); 326 EXPECT_TRUE(store_->BeginChunk());
363 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix)); 327 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix));
364 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix)); 328 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix));
365 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, now, kHash2)); 329 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, kHash2));
366 EXPECT_TRUE(store_->FinishChunk()); 330 EXPECT_TRUE(store_->FinishChunk());
367 331
368 // Another which won't. 332 // Another which won't.
369 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk2)); 333 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk2));
370 store_->SetAddChunk(kAddChunk2); 334 store_->SetAddChunk(kAddChunk2);
371 EXPECT_TRUE(store_->BeginChunk()); 335 EXPECT_TRUE(store_->BeginChunk());
372 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk2, kHash3.prefix)); 336 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk2, kHash3.prefix));
373 EXPECT_TRUE(store_->WriteAddHash(kAddChunk2, now, kHash3)); 337 EXPECT_TRUE(store_->WriteAddHash(kAddChunk2, kHash3));
374 EXPECT_TRUE(store_->FinishChunk()); 338 EXPECT_TRUE(store_->FinishChunk());
375 339
376 // A sub chunk to delete. 340 // A sub chunk to delete.
377 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); 341 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1));
378 store_->SetSubChunk(kSubChunk1); 342 store_->SetSubChunk(kSubChunk1);
379 EXPECT_TRUE(store_->BeginChunk()); 343 EXPECT_TRUE(store_->BeginChunk());
380 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash4.prefix)); 344 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash4.prefix));
381 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk3, kHash4)); 345 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk3, kHash4));
382 EXPECT_TRUE(store_->FinishChunk()); 346 EXPECT_TRUE(store_->FinishChunk());
383 347
384 // A sub chunk to keep. 348 // A sub chunk to keep.
385 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk2)); 349 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk2));
386 store_->SetSubChunk(kSubChunk2); 350 store_->SetSubChunk(kSubChunk2);
387 EXPECT_TRUE(store_->BeginChunk()); 351 EXPECT_TRUE(store_->BeginChunk());
388 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk4, kHash5.prefix)); 352 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk4, kHash5.prefix));
389 EXPECT_TRUE(store_->WriteSubHash(kSubChunk2, kAddChunk4, kHash5)); 353 EXPECT_TRUE(store_->WriteSubHash(kSubChunk2, kAddChunk4, kHash5));
390 EXPECT_TRUE(store_->FinishChunk()); 354 EXPECT_TRUE(store_->FinishChunk());
391 355
392 store_->DeleteAddChunk(kAddChunk1); 356 store_->DeleteAddChunk(kAddChunk1);
393 store_->DeleteSubChunk(kSubChunk1); 357 store_->DeleteSubChunk(kSubChunk1);
394 358
395 // Not actually deleted until finish. 359 // Not actually deleted until finish.
396 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); 360 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1));
397 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); 361 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2));
398 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); 362 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1));
399 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2)); 363 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2));
400 364
401 { 365 {
402 std::vector<SBAddFullHash> pending_adds;
403 safe_browsing::PrefixSetBuilder builder; 366 safe_browsing::PrefixSetBuilder builder;
404 std::vector<SBAddFullHash> add_full_hashes_result; 367 std::vector<SBAddFullHash> add_full_hashes_result;
405 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 368 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
406 &builder,
407 &add_full_hashes_result));
408 369
409 std::vector<SBPrefix> prefixes_result; 370 std::vector<SBPrefix> prefixes_result;
410 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 371 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
411 EXPECT_EQ(1U, prefixes_result.size()); 372 EXPECT_EQ(1U, prefixes_result.size());
412 EXPECT_EQ(kHash3.prefix, prefixes_result[0]); 373 EXPECT_EQ(kHash3.prefix, prefixes_result[0]);
413 374
414 EXPECT_EQ(1U, add_full_hashes_result.size()); 375 EXPECT_EQ(1U, add_full_hashes_result.size());
415 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); 376 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id);
416 EXPECT_EQ(now.ToTimeT(), add_full_hashes_result[0].received);
417 EXPECT_TRUE(SBFullHashEqual(kHash3, add_full_hashes_result[0].full_hash)); 377 EXPECT_TRUE(SBFullHashEqual(kHash3, add_full_hashes_result[0].full_hash));
418 } 378 }
419 379
420 // Expected chunks are there in another update. 380 // Expected chunks are there in another update.
421 ASSERT_TRUE(store_->BeginUpdate()); 381 ASSERT_TRUE(store_->BeginUpdate());
422 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); 382 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1));
423 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); 383 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2));
424 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); 384 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1));
425 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2)); 385 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2));
426 386
427 // Delete them, too. 387 // Delete them, too.
428 store_->DeleteAddChunk(kAddChunk2); 388 store_->DeleteAddChunk(kAddChunk2);
429 store_->DeleteSubChunk(kSubChunk2); 389 store_->DeleteSubChunk(kSubChunk2);
430 390
431 { 391 {
432 std::vector<SBAddFullHash> pending_adds;
433 safe_browsing::PrefixSetBuilder builder; 392 safe_browsing::PrefixSetBuilder builder;
434 std::vector<SBAddFullHash> add_full_hashes_result; 393 std::vector<SBAddFullHash> add_full_hashes_result;
435 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 394 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
436 &builder,
437 &add_full_hashes_result));
438 } 395 }
439 396
440 // Expect no more chunks. 397 // Expect no more chunks.
441 ASSERT_TRUE(store_->BeginUpdate()); 398 ASSERT_TRUE(store_->BeginUpdate());
442 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); 399 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1));
443 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk2)); 400 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk2));
444 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); 401 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1));
445 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk2)); 402 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk2));
446 403
447 { 404 {
448 std::vector<SBAddFullHash> pending_adds;
449 safe_browsing::PrefixSetBuilder builder; 405 safe_browsing::PrefixSetBuilder builder;
450 std::vector<SBAddFullHash> add_full_hashes_result; 406 std::vector<SBAddFullHash> add_full_hashes_result;
451 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 407 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
452 &builder,
453 &add_full_hashes_result));
454 408
455 std::vector<SBPrefix> prefixes_result; 409 std::vector<SBPrefix> prefixes_result;
456 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 410 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
457 EXPECT_TRUE(prefixes_result.empty()); 411 EXPECT_TRUE(prefixes_result.empty());
458 EXPECT_TRUE(add_full_hashes_result.empty()); 412 EXPECT_TRUE(add_full_hashes_result.empty());
459 } 413 }
460 } 414 }
461 415
462 // Test that deleting the store deletes the store. 416 // Test that deleting the store deletes the store.
463 TEST_F(SafeBrowsingStoreFileTest, Delete) { 417 TEST_F(SafeBrowsingStoreFileTest, Delete) {
464 // Delete should work if the file wasn't there in the first place. 418 // Delete should work if the file wasn't there in the first place.
465 EXPECT_FALSE(base::PathExists(filename_)); 419 EXPECT_FALSE(base::PathExists(filename_));
466 EXPECT_TRUE(store_->Delete()); 420 EXPECT_TRUE(store_->Delete());
467 421
468 // Create a store file. 422 // Create a store file.
469 PopulateStore(base::Time::Now()); 423 PopulateStore();
470 424
471 EXPECT_TRUE(base::PathExists(filename_)); 425 EXPECT_TRUE(base::PathExists(filename_));
472 EXPECT_TRUE(store_->Delete()); 426 EXPECT_TRUE(store_->Delete());
473 EXPECT_FALSE(base::PathExists(filename_)); 427 EXPECT_FALSE(base::PathExists(filename_));
474 } 428 }
475 429
476 // Test that Delete() deletes the temporary store, if present. 430 // Test that Delete() deletes the temporary store, if present.
477 TEST_F(SafeBrowsingStoreFileTest, DeleteTemp) { 431 TEST_F(SafeBrowsingStoreFileTest, DeleteTemp) {
478 const base::FilePath temp_file = 432 const base::FilePath temp_file =
479 SafeBrowsingStoreFile::TemporaryFileForFilename(filename_); 433 SafeBrowsingStoreFile::TemporaryFileForFilename(filename_);
(...skipping 14 matching lines...) Expand all
494 448
495 // Make sure the temporary file is deleted. 449 // Make sure the temporary file is deleted.
496 EXPECT_TRUE(store_->Delete()); 450 EXPECT_TRUE(store_->Delete());
497 EXPECT_FALSE(base::PathExists(filename_)); 451 EXPECT_FALSE(base::PathExists(filename_));
498 EXPECT_FALSE(base::PathExists(temp_file)); 452 EXPECT_FALSE(base::PathExists(temp_file));
499 } 453 }
500 454
501 // Test basic corruption-handling. 455 // Test basic corruption-handling.
502 TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) { 456 TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) {
503 // Load a store with some data. 457 // Load a store with some data.
504 PopulateStore(base::Time::Now()); 458 PopulateStore();
505 459
506 // Can successfully open and read the store. 460 // Can successfully open and read the store.
507 { 461 {
508 std::vector<SBAddFullHash> pending_adds;
509 std::vector<SBPrefix> orig_prefixes; 462 std::vector<SBPrefix> orig_prefixes;
510 std::vector<SBAddFullHash> orig_hashes; 463 std::vector<SBAddFullHash> orig_hashes;
511 safe_browsing::PrefixSetBuilder builder; 464 safe_browsing::PrefixSetBuilder builder;
512 ASSERT_TRUE(store_->BeginUpdate()); 465 ASSERT_TRUE(store_->BeginUpdate());
513 EXPECT_TRUE(store_->FinishUpdate(pending_adds, &builder, &orig_hashes)); 466 EXPECT_TRUE(store_->FinishUpdate(&builder, &orig_hashes));
514 builder.GetPrefixSet()->GetPrefixes(&orig_prefixes); 467 builder.GetPrefixSet()->GetPrefixes(&orig_prefixes);
515 EXPECT_GT(orig_prefixes.size(), 0U); 468 EXPECT_GT(orig_prefixes.size(), 0U);
516 EXPECT_GT(orig_hashes.size(), 0U); 469 EXPECT_GT(orig_hashes.size(), 0U);
517 EXPECT_FALSE(corruption_detected_); 470 EXPECT_FALSE(corruption_detected_);
518 } 471 }
519 472
520 // Corrupt the store. 473 // Corrupt the store.
521 base::ScopedFILE file(base::OpenFile(filename_, "rb+")); 474 base::ScopedFILE file(base::OpenFile(filename_, "rb+"));
522 const long kOffset = 60; 475 const long kOffset = 60;
523 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); 476 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0);
524 const uint32 kZero = 0; 477 const uint32 kZero = 0;
525 uint32 previous = kZero; 478 uint32 previous = kZero;
526 EXPECT_EQ(fread(&previous, sizeof(previous), 1, file.get()), 1U); 479 EXPECT_EQ(fread(&previous, sizeof(previous), 1, file.get()), 1U);
527 EXPECT_NE(previous, kZero); 480 EXPECT_NE(previous, kZero);
528 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); 481 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0);
529 EXPECT_EQ(fwrite(&kZero, sizeof(kZero), 1, file.get()), 1U); 482 EXPECT_EQ(fwrite(&kZero, sizeof(kZero), 1, file.get()), 1U);
530 file.reset(); 483 file.reset();
531 484
532 // Update fails and corruption callback is called. 485 // Update fails and corruption callback is called.
533 std::vector<SBAddFullHash> add_hashes; 486 std::vector<SBAddFullHash> add_hashes;
534 corruption_detected_ = false; 487 corruption_detected_ = false;
535 { 488 {
536 std::vector<SBAddFullHash> pending_adds;
537 safe_browsing::PrefixSetBuilder builder; 489 safe_browsing::PrefixSetBuilder builder;
538 ASSERT_TRUE(store_->BeginUpdate()); 490 ASSERT_TRUE(store_->BeginUpdate());
539 EXPECT_FALSE(store_->FinishUpdate(pending_adds, &builder, &add_hashes)); 491 EXPECT_FALSE(store_->FinishUpdate(&builder, &add_hashes));
540 EXPECT_TRUE(corruption_detected_); 492 EXPECT_TRUE(corruption_detected_);
541 } 493 }
542 494
543 // Make it look like there is a lot of add-chunks-seen data. 495 // Make it look like there is a lot of add-chunks-seen data.
544 const long kAddChunkCountOffset = 2 * sizeof(int32); 496 const long kAddChunkCountOffset = 2 * sizeof(int32);
545 const int32 kLargeCount = 1000 * 1000 * 1000; 497 const int32 kLargeCount = 1000 * 1000 * 1000;
546 file.reset(base::OpenFile(filename_, "rb+")); 498 file.reset(base::OpenFile(filename_, "rb+"));
547 EXPECT_EQ(fseek(file.get(), kAddChunkCountOffset, SEEK_SET), 0); 499 EXPECT_EQ(fseek(file.get(), kAddChunkCountOffset, SEEK_SET), 0);
548 EXPECT_EQ(fwrite(&kLargeCount, sizeof(kLargeCount), 1, file.get()), 1U); 500 EXPECT_EQ(fwrite(&kLargeCount, sizeof(kLargeCount), 1, file.get()), 1U);
549 file.reset(); 501 file.reset();
550 502
551 // Detects corruption and fails to even begin the update. 503 // Detects corruption and fails to even begin the update.
552 corruption_detected_ = false; 504 corruption_detected_ = false;
553 EXPECT_FALSE(store_->BeginUpdate()); 505 EXPECT_FALSE(store_->BeginUpdate());
554 EXPECT_TRUE(corruption_detected_); 506 EXPECT_TRUE(corruption_detected_);
555 } 507 }
556 508
557 TEST_F(SafeBrowsingStoreFileTest, CheckValidity) { 509 TEST_F(SafeBrowsingStoreFileTest, CheckValidity) {
558 // Empty store is valid. 510 // Empty store is valid.
559 EXPECT_FALSE(base::PathExists(filename_)); 511 EXPECT_FALSE(base::PathExists(filename_));
560 ASSERT_TRUE(store_->BeginUpdate()); 512 ASSERT_TRUE(store_->BeginUpdate());
561 EXPECT_FALSE(corruption_detected_); 513 EXPECT_FALSE(corruption_detected_);
562 EXPECT_TRUE(store_->CheckValidity()); 514 EXPECT_TRUE(store_->CheckValidity());
563 EXPECT_FALSE(corruption_detected_); 515 EXPECT_FALSE(corruption_detected_);
564 EXPECT_TRUE(store_->CancelUpdate()); 516 EXPECT_TRUE(store_->CancelUpdate());
565 517
566 // A store with some data is valid. 518 // A store with some data is valid.
567 EXPECT_FALSE(base::PathExists(filename_)); 519 EXPECT_FALSE(base::PathExists(filename_));
568 PopulateStore(base::Time::Now()); 520 PopulateStore();
569 EXPECT_TRUE(base::PathExists(filename_)); 521 EXPECT_TRUE(base::PathExists(filename_));
570 ASSERT_TRUE(store_->BeginUpdate()); 522 ASSERT_TRUE(store_->BeginUpdate());
571 EXPECT_FALSE(corruption_detected_); 523 EXPECT_FALSE(corruption_detected_);
572 EXPECT_TRUE(store_->CheckValidity()); 524 EXPECT_TRUE(store_->CheckValidity());
573 EXPECT_FALSE(corruption_detected_); 525 EXPECT_FALSE(corruption_detected_);
574 EXPECT_TRUE(store_->CancelUpdate()); 526 EXPECT_TRUE(store_->CancelUpdate());
575 } 527 }
576 528
577 // Corrupt the header. 529 // Corrupt the header.
578 TEST_F(SafeBrowsingStoreFileTest, CheckValidityHeader) { 530 TEST_F(SafeBrowsingStoreFileTest, CheckValidityHeader) {
579 PopulateStore(base::Time::Now()); 531 PopulateStore();
580 EXPECT_TRUE(base::PathExists(filename_)); 532 EXPECT_TRUE(base::PathExists(filename_));
581 533
582 // 37 is the most random prime number. It's also past the initial header 534 // 37 is the most random prime number. It's also past the initial header
583 // struct, somewhere in the chunk list. 535 // struct, somewhere in the chunk list.
584 const size_t kOffset = 37; 536 const size_t kOffset = 37;
585 537
586 { 538 {
587 base::ScopedFILE file(base::OpenFile(filename_, "rb+")); 539 base::ScopedFILE file(base::OpenFile(filename_, "rb+"));
588 EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_SET)); 540 EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_SET));
589 EXPECT_GE(fputs("hello", file.get()), 0); 541 EXPECT_GE(fputs("hello", file.get()), 0);
590 } 542 }
591 ASSERT_FALSE(store_->BeginUpdate()); 543 ASSERT_FALSE(store_->BeginUpdate());
592 EXPECT_TRUE(corruption_detected_); 544 EXPECT_TRUE(corruption_detected_);
593 } 545 }
594 546
595 // Corrupt the prefix payload. 547 // Corrupt the prefix payload.
596 TEST_F(SafeBrowsingStoreFileTest, CheckValidityPayload) { 548 TEST_F(SafeBrowsingStoreFileTest, CheckValidityPayload) {
597 PopulateStore(base::Time::Now()); 549 PopulateStore();
598 EXPECT_TRUE(base::PathExists(filename_)); 550 EXPECT_TRUE(base::PathExists(filename_));
599 551
600 // 137 is the second most random prime number. It's also past the header and 552 // 137 is the second most random prime number. It's also past the header and
601 // chunk-id area. Corrupting the header would fail BeginUpdate() in which 553 // chunk-id area. Corrupting the header would fail BeginUpdate() in which
602 // case CheckValidity() cannot be called. 554 // case CheckValidity() cannot be called.
603 const size_t kOffset = 137; 555 const size_t kOffset = 137;
604 556
605 { 557 {
606 base::ScopedFILE file(base::OpenFile(filename_, "rb+")); 558 base::ScopedFILE file(base::OpenFile(filename_, "rb+"));
607 EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_SET)); 559 EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_SET));
608 EXPECT_GE(fputs("hello", file.get()), 0); 560 EXPECT_GE(fputs("hello", file.get()), 0);
609 } 561 }
610 ASSERT_TRUE(store_->BeginUpdate()); 562 ASSERT_TRUE(store_->BeginUpdate());
611 EXPECT_FALSE(corruption_detected_); 563 EXPECT_FALSE(corruption_detected_);
612 EXPECT_FALSE(store_->CheckValidity()); 564 EXPECT_FALSE(store_->CheckValidity());
613 EXPECT_TRUE(corruption_detected_); 565 EXPECT_TRUE(corruption_detected_);
614 EXPECT_TRUE(store_->CancelUpdate()); 566 EXPECT_TRUE(store_->CancelUpdate());
615 } 567 }
616 568
617 // Corrupt the checksum. 569 // Corrupt the checksum.
618 TEST_F(SafeBrowsingStoreFileTest, CheckValidityChecksum) { 570 TEST_F(SafeBrowsingStoreFileTest, CheckValidityChecksum) {
619 PopulateStore(base::Time::Now()); 571 PopulateStore();
620 EXPECT_TRUE(base::PathExists(filename_)); 572 EXPECT_TRUE(base::PathExists(filename_));
621 573
622 // An offset from the end of the file which is in the checksum. 574 // An offset from the end of the file which is in the checksum.
623 const int kOffset = -static_cast<int>(sizeof(base::MD5Digest)); 575 const int kOffset = -static_cast<int>(sizeof(base::MD5Digest));
624 576
625 { 577 {
626 base::ScopedFILE file(base::OpenFile(filename_, "rb+")); 578 base::ScopedFILE file(base::OpenFile(filename_, "rb+"));
627 EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_END)); 579 EXPECT_EQ(0, fseek(file.get(), kOffset, SEEK_END));
628 EXPECT_GE(fputs("hello", file.get()), 0); 580 EXPECT_GE(fputs("hello", file.get()), 0);
629 } 581 }
630 ASSERT_TRUE(store_->BeginUpdate()); 582 ASSERT_TRUE(store_->BeginUpdate());
631 EXPECT_FALSE(corruption_detected_); 583 EXPECT_FALSE(corruption_detected_);
632 EXPECT_FALSE(store_->CheckValidity()); 584 EXPECT_FALSE(store_->CheckValidity());
633 EXPECT_TRUE(corruption_detected_); 585 EXPECT_TRUE(corruption_detected_);
634 EXPECT_TRUE(store_->CancelUpdate()); 586 EXPECT_TRUE(store_->CancelUpdate());
635 } 587 }
636 588
637 TEST_F(SafeBrowsingStoreFileTest, GetAddPrefixesAndHashes) { 589 TEST_F(SafeBrowsingStoreFileTest, GetAddPrefixesAndHashes) {
638 ASSERT_TRUE(store_->BeginUpdate()); 590 ASSERT_TRUE(store_->BeginUpdate());
639 591
640 const base::Time now = base::Time::Now();
641
642 EXPECT_TRUE(store_->BeginChunk()); 592 EXPECT_TRUE(store_->BeginChunk());
643 store_->SetAddChunk(kAddChunk1); 593 store_->SetAddChunk(kAddChunk1);
644 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); 594 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1));
645 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix)); 595 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash1.prefix));
646 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix)); 596 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk1, kHash2.prefix));
647 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, now, kHash2)); 597 EXPECT_TRUE(store_->WriteAddHash(kAddChunk1, kHash2));
648 598
649 store_->SetSubChunk(kSubChunk1); 599 store_->SetSubChunk(kSubChunk1);
650 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); 600 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1));
651 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix)); 601 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix));
652 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk3, kHash3)); 602 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk3, kHash3));
653 EXPECT_TRUE(store_->FinishChunk()); 603 EXPECT_TRUE(store_->FinishChunk());
654 604
655 // Chunk numbers shouldn't leak over. 605 // Chunk numbers shouldn't leak over.
656 EXPECT_FALSE(store_->CheckAddChunk(kSubChunk1)); 606 EXPECT_FALSE(store_->CheckAddChunk(kSubChunk1));
657 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3)); 607 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3));
658 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk1)); 608 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk1));
659 609
660 std::vector<int> chunks; 610 std::vector<int> chunks;
661 store_->GetAddChunks(&chunks); 611 store_->GetAddChunks(&chunks);
662 ASSERT_EQ(1U, chunks.size()); 612 ASSERT_EQ(1U, chunks.size());
663 EXPECT_EQ(kAddChunk1, chunks[0]); 613 EXPECT_EQ(kAddChunk1, chunks[0]);
664 614
665 store_->GetSubChunks(&chunks); 615 store_->GetSubChunks(&chunks);
666 ASSERT_EQ(1U, chunks.size()); 616 ASSERT_EQ(1U, chunks.size());
667 EXPECT_EQ(kSubChunk1, chunks[0]); 617 EXPECT_EQ(kSubChunk1, chunks[0]);
668 618
669 safe_browsing::PrefixSetBuilder builder; 619 safe_browsing::PrefixSetBuilder builder;
670 std::vector<SBAddFullHash> add_full_hashes_result; 620 std::vector<SBAddFullHash> add_full_hashes_result;
671 EXPECT_TRUE(store_->FinishUpdate(std::vector<SBAddFullHash>(), 621 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
672 &builder,
673 &add_full_hashes_result));
674 622
675 SBAddPrefixes add_prefixes; 623 SBAddPrefixes add_prefixes;
676 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes)); 624 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes));
677 ASSERT_EQ(2U, add_prefixes.size()); 625 ASSERT_EQ(2U, add_prefixes.size());
678 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); 626 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id);
679 EXPECT_EQ(kHash1.prefix, add_prefixes[0].prefix); 627 EXPECT_EQ(kHash1.prefix, add_prefixes[0].prefix);
680 EXPECT_EQ(kAddChunk1, add_prefixes[1].chunk_id); 628 EXPECT_EQ(kAddChunk1, add_prefixes[1].chunk_id);
681 EXPECT_EQ(kHash2.prefix, add_prefixes[1].prefix); 629 EXPECT_EQ(kHash2.prefix, add_prefixes[1].prefix);
682 630
683 std::vector<SBAddFullHash> add_hashes; 631 std::vector<SBAddFullHash> add_hashes;
(...skipping 24 matching lines...) Expand all
708 ASSERT_TRUE(store_->BeginUpdate()); 656 ASSERT_TRUE(store_->BeginUpdate());
709 657
710 EXPECT_TRUE(store_->BeginChunk()); 658 EXPECT_TRUE(store_->BeginChunk());
711 store_->SetAddChunk(chunk_id); 659 store_->SetAddChunk(chunk_id);
712 EXPECT_TRUE(store_->CheckAddChunk(chunk_id)); 660 EXPECT_TRUE(store_->CheckAddChunk(chunk_id));
713 for (size_t i = 0; i < kPrefixesPerChunk; ++i) { 661 for (size_t i = 0; i < kPrefixesPerChunk; ++i) {
714 EXPECT_TRUE(store_->WriteAddPrefix(chunk_id, static_cast<SBPrefix>(i))); 662 EXPECT_TRUE(store_->WriteAddPrefix(chunk_id, static_cast<SBPrefix>(i)));
715 } 663 }
716 EXPECT_TRUE(store_->FinishChunk()); 664 EXPECT_TRUE(store_->FinishChunk());
717 665
718 std::vector<SBAddFullHash> pending_adds;
719 safe_browsing::PrefixSetBuilder builder; 666 safe_browsing::PrefixSetBuilder builder;
720 std::vector<SBAddFullHash> add_full_hashes_result; 667 std::vector<SBAddFullHash> add_full_hashes_result;
721 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 668 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
722 &builder,
723 &add_full_hashes_result));
724 669
725 SBAddPrefixes add_prefixes; 670 SBAddPrefixes add_prefixes;
726 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes)); 671 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes));
727 ASSERT_EQ(chunk_id * kPrefixesPerChunk, add_prefixes.size()); 672 ASSERT_EQ(chunk_id * kPrefixesPerChunk, add_prefixes.size());
728 673
729 // New stride should be the same, or shifted one right. 674 // New stride should be the same, or shifted one right.
730 const uint32 new_shard_stride = ReadStride(); 675 const uint32 new_shard_stride = ReadStride();
731 EXPECT_TRUE((new_shard_stride == shard_stride) || 676 EXPECT_TRUE((new_shard_stride == shard_stride) ||
732 ((new_shard_stride << 1) == shard_stride)); 677 ((new_shard_stride << 1) == shard_stride));
733 shard_stride = new_shard_stride; 678 shard_stride = new_shard_stride;
734 ++chunk_id; 679 ++chunk_id;
735 } while (!shard_stride || shard_stride > kTargetStride); 680 } while (!shard_stride || shard_stride > kTargetStride);
736 681
737 // Guard against writing too many chunks. If this gets too big, adjust 682 // Guard against writing too many chunks. If this gets too big, adjust
738 // |kPrefixesPerChunk|. 683 // |kPrefixesPerChunk|.
739 EXPECT_LT(chunk_id, 20); 684 EXPECT_LT(chunk_id, 20);
740 685
741 // Remove each chunk and check that the stride goes back to 0. 686 // Remove each chunk and check that the stride goes back to 0.
742 while (--chunk_id) { 687 while (--chunk_id) {
743 ASSERT_TRUE(store_->BeginUpdate()); 688 ASSERT_TRUE(store_->BeginUpdate());
744 EXPECT_TRUE(store_->CheckAddChunk(chunk_id)); 689 EXPECT_TRUE(store_->CheckAddChunk(chunk_id));
745 EXPECT_FALSE(store_->CheckAddChunk(chunk_id + 1)); 690 EXPECT_FALSE(store_->CheckAddChunk(chunk_id + 1));
746 store_->DeleteAddChunk(chunk_id); 691 store_->DeleteAddChunk(chunk_id);
747 692
748 std::vector<SBAddFullHash> pending_adds;
749 safe_browsing::PrefixSetBuilder builder; 693 safe_browsing::PrefixSetBuilder builder;
750 std::vector<SBAddFullHash> add_full_hashes_result; 694 std::vector<SBAddFullHash> add_full_hashes_result;
751 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 695 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
752 &builder,
753 &add_full_hashes_result));
754 696
755 // New stride should be the same, or shifted one left. 697 // New stride should be the same, or shifted one left.
756 const uint32 new_shard_stride = ReadStride(); 698 const uint32 new_shard_stride = ReadStride();
757 EXPECT_TRUE((new_shard_stride == shard_stride) || 699 EXPECT_TRUE((new_shard_stride == shard_stride) ||
758 (new_shard_stride == (shard_stride << 1))); 700 (new_shard_stride == (shard_stride << 1)));
759 shard_stride = new_shard_stride; 701 shard_stride = new_shard_stride;
760 } 702 }
761 EXPECT_EQ(0u, shard_stride); 703 EXPECT_EQ(0u, shard_stride);
762 } 704 }
763 705
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); 758 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1));
817 759
818 // Sub chunk kAddChunk1 hash kHash2. 760 // Sub chunk kAddChunk1 hash kHash2.
819 store_->SetSubChunk(kSubChunk2); 761 store_->SetSubChunk(kSubChunk2);
820 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); 762 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1));
821 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix)); 763 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix));
822 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk1, kHash2)); 764 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk1, kHash2));
823 EXPECT_TRUE(store_->FinishChunk()); 765 EXPECT_TRUE(store_->FinishChunk());
824 766
825 { 767 {
826 std::vector<SBAddFullHash> pending_adds;
827 safe_browsing::PrefixSetBuilder builder; 768 safe_browsing::PrefixSetBuilder builder;
828 std::vector<SBAddFullHash> add_full_hashes_result; 769 std::vector<SBAddFullHash> add_full_hashes_result;
829 EXPECT_TRUE(store_->FinishUpdate(pending_adds, 770 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result));
830 &builder,
831 &add_full_hashes_result));
832 771
833 // The sub'ed prefix and hash are gone. 772 // The sub'ed prefix and hash are gone.
834 std::vector<SBPrefix> prefixes_result; 773 std::vector<SBPrefix> prefixes_result;
835 builder.GetPrefixSet()->GetPrefixes(&prefixes_result); 774 builder.GetPrefixSet()->GetPrefixes(&prefixes_result);
836 ASSERT_EQ(1U, prefixes_result.size()); 775 ASSERT_EQ(1U, prefixes_result.size());
837 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); 776 EXPECT_EQ(kHash1.prefix, prefixes_result[0]);
838 EXPECT_TRUE(add_full_hashes_result.empty()); 777 EXPECT_TRUE(add_full_hashes_result.empty());
839 } 778 }
840 } 779 }
841 #endif 780 #endif
842 781
843 } // namespace 782 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698