| 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 |