OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |