| 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
| 9 #include "chrome/browser/safe_browsing/protocol_parser.h" | 9 #include "chrome/browser/safe_browsing/protocol_parser.h" |
| 10 #include "chrome/browser/safe_browsing/safe_browsing_util.h" | 10 #include "chrome/browser/safe_browsing/safe_browsing_util.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 | 12 |
| 13 namespace safe_browsing { |
| 14 |
| 13 namespace { | 15 namespace { |
| 14 | 16 |
| 15 const char kDefaultPhishList[] = "goog-phish-shavar"; | 17 const char kDefaultPhishList[] = "goog-phish-shavar"; |
| 16 const char kDefaultMalwareList[] = "goog-malware-shavar"; | 18 const char kDefaultMalwareList[] = "goog-malware-shavar"; |
| 17 | 19 |
| 20 } // namespace |
| 21 |
| 18 // Test parsing one add chunk. | 22 // Test parsing one add chunk. |
| 19 TEST(SafeBrowsingProtocolParsingTest, TestAddChunk) { | 23 TEST(SafeBrowsingProtocolParsingTest, TestAddChunk) { |
| 20 const char kRawAddChunk[] = { | 24 const char kRawAddChunk[] = { |
| 21 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. | 25 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. |
| 22 '\x08', // field 1, wire format varint | 26 '\x08', // field 1, wire format varint |
| 23 '\x01', // chunk_number varint 1 | 27 '\x01', // chunk_number varint 1 |
| 24 '\x22', // field 4, wire format length-delimited | 28 '\x22', // field 4, wire format length-delimited |
| 25 '\x18', // varint length 24 | 29 '\x18', // varint length 24 |
| 26 '1', '1', '1', '1', // 4-byte prefixes | 30 '1', '1', '1', '1', // 4-byte prefixes |
| 27 '2', '2', '2', '2', | 31 '2', '2', '2', '2', |
| 28 '3', '3', '3', '3', | 32 '3', '3', '3', '3', |
| 29 '4', '4', '4', '4', | 33 '4', '4', '4', '4', |
| 30 '8', '8', '8', '8', | 34 '8', '8', '8', '8', |
| 31 '9', '9', '9', '9', | 35 '9', '9', '9', '9', |
| 32 }; | 36 }; |
| 33 | 37 |
| 34 ScopedVector<SBChunkData> chunks; | 38 ScopedVector<SBChunkData> chunks; |
| 35 EXPECT_TRUE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 39 EXPECT_TRUE(ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), &chunks)); |
| 36 &chunks)); | |
| 37 ASSERT_EQ(1U, chunks.size()); | 40 ASSERT_EQ(1U, chunks.size()); |
| 38 EXPECT_EQ(1, chunks[0]->ChunkNumber()); | 41 EXPECT_EQ(1, chunks[0]->ChunkNumber()); |
| 39 EXPECT_TRUE(chunks[0]->IsAdd()); | 42 EXPECT_TRUE(chunks[0]->IsAdd()); |
| 40 EXPECT_FALSE(chunks[0]->IsSub()); | 43 EXPECT_FALSE(chunks[0]->IsSub()); |
| 41 EXPECT_TRUE(chunks[0]->IsPrefix()); | 44 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 42 EXPECT_FALSE(chunks[0]->IsFullHash()); | 45 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 43 ASSERT_EQ(6U, chunks[0]->PrefixCount()); | 46 ASSERT_EQ(6U, chunks[0]->PrefixCount()); |
| 44 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 | 47 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 |
| 45 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 | 48 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 |
| 46 EXPECT_EQ(0x33333333U, chunks[0]->PrefixAt(2)); // 3333 | 49 EXPECT_EQ(0x33333333U, chunks[0]->PrefixAt(2)); // 3333 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 71 '2', '3', '2', '3', '2', '3', '2', '3', | 74 '2', '3', '2', '3', '2', '3', '2', '3', |
| 72 }; | 75 }; |
| 73 | 76 |
| 74 SBFullHash full_hash1, full_hash2; | 77 SBFullHash full_hash1, full_hash2; |
| 75 for (int i = 0; i < 32; ++i) { | 78 for (int i = 0; i < 32; ++i) { |
| 76 full_hash1.full_hash[i] = (i % 2) ? '1' : '0'; | 79 full_hash1.full_hash[i] = (i % 2) ? '1' : '0'; |
| 77 full_hash2.full_hash[i] = (i % 2) ? '3' : '2'; | 80 full_hash2.full_hash[i] = (i % 2) ? '3' : '2'; |
| 78 } | 81 } |
| 79 | 82 |
| 80 ScopedVector<SBChunkData> chunks; | 83 ScopedVector<SBChunkData> chunks; |
| 81 EXPECT_TRUE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 84 EXPECT_TRUE(ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), &chunks)); |
| 82 &chunks)); | |
| 83 ASSERT_EQ(1U, chunks.size()); | 85 ASSERT_EQ(1U, chunks.size()); |
| 84 EXPECT_EQ(1, chunks[0]->ChunkNumber()); | 86 EXPECT_EQ(1, chunks[0]->ChunkNumber()); |
| 85 EXPECT_TRUE(chunks[0]->IsAdd()); | 87 EXPECT_TRUE(chunks[0]->IsAdd()); |
| 86 EXPECT_FALSE(chunks[0]->IsSub()); | 88 EXPECT_FALSE(chunks[0]->IsSub()); |
| 87 EXPECT_FALSE(chunks[0]->IsPrefix()); | 89 EXPECT_FALSE(chunks[0]->IsPrefix()); |
| 88 EXPECT_TRUE(chunks[0]->IsFullHash()); | 90 EXPECT_TRUE(chunks[0]->IsFullHash()); |
| 89 | 91 |
| 90 ASSERT_EQ(2U, chunks[0]->FullHashCount()); | 92 ASSERT_EQ(2U, chunks[0]->FullHashCount()); |
| 91 EXPECT_TRUE( | 93 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); |
| 92 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); | 94 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); |
| 93 EXPECT_TRUE( | |
| 94 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); | |
| 95 } | 95 } |
| 96 | 96 |
| 97 // Test parsing multiple add chunks. We'll use the same chunk as above, and add | 97 // Test parsing multiple add chunks. We'll use the same chunk as above, and add |
| 98 // one more after it. | 98 // one more after it. |
| 99 TEST(SafeBrowsingProtocolParsingTest, TestAddChunks) { | 99 TEST(SafeBrowsingProtocolParsingTest, TestAddChunks) { |
| 100 const char kRawAddChunk[] = { | 100 const char kRawAddChunk[] = { |
| 101 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. | 101 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. |
| 102 '\x08', // field 1, wire format varint | 102 '\x08', // field 1, wire format varint |
| 103 '\x01', // chunk_number varint 1 | 103 '\x01', // chunk_number varint 1 |
| 104 '\x22', // field 4, wire format length-delimited | 104 '\x22', // field 4, wire format length-delimited |
| 105 '\x18', // varint length 24 | 105 '\x18', // varint length 24 |
| 106 | 106 |
| 107 '1', '1', '1', '1', // 4-byte prefixes | 107 '1', '1', '1', '1', // 4-byte prefixes |
| 108 '2', '2', '2', '2', | 108 '2', '2', '2', '2', |
| 109 '3', '3', '3', '3', | 109 '3', '3', '3', '3', |
| 110 '4', '4', '4', '4', | 110 '4', '4', '4', '4', |
| 111 '8', '8', '8', '8', | 111 '8', '8', '8', '8', |
| 112 '9', '9', '9', '9', | 112 '9', '9', '9', '9', |
| 113 | 113 |
| 114 '\0', '\0', '\0', '\x0C', // 32-bit payload length in network byte order. | 114 '\0', '\0', '\0', '\x0C', // 32-bit payload length in network byte order. |
| 115 '\x08', // field 1, wire format varint | 115 '\x08', // field 1, wire format varint |
| 116 '\x02', // chunk_number varint 1 | 116 '\x02', // chunk_number varint 1 |
| 117 '\x22', // field 4, wire format length-delimited | 117 '\x22', // field 4, wire format length-delimited |
| 118 '\x08', // varint length 8 | 118 '\x08', // varint length 8 |
| 119 'p', 'p', 'p', 'p', // 4-byte prefixes | 119 'p', 'p', 'p', 'p', // 4-byte prefixes |
| 120 'g', 'g', 'g', 'g', | 120 'g', 'g', 'g', 'g', |
| 121 }; | 121 }; |
| 122 | 122 |
| 123 ScopedVector<SBChunkData> chunks; | 123 ScopedVector<SBChunkData> chunks; |
| 124 EXPECT_TRUE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 124 EXPECT_TRUE(ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), &chunks)); |
| 125 &chunks)); | |
| 126 ASSERT_EQ(2U, chunks.size()); | 125 ASSERT_EQ(2U, chunks.size()); |
| 127 | 126 |
| 128 EXPECT_EQ(1, chunks[0]->ChunkNumber()); | 127 EXPECT_EQ(1, chunks[0]->ChunkNumber()); |
| 129 EXPECT_TRUE(chunks[0]->IsAdd()); | 128 EXPECT_TRUE(chunks[0]->IsAdd()); |
| 130 EXPECT_FALSE(chunks[0]->IsSub()); | 129 EXPECT_FALSE(chunks[0]->IsSub()); |
| 131 EXPECT_TRUE(chunks[0]->IsPrefix()); | 130 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 132 EXPECT_FALSE(chunks[0]->IsFullHash()); | 131 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 133 ASSERT_EQ(6U, chunks[0]->PrefixCount()); | 132 ASSERT_EQ(6U, chunks[0]->PrefixCount()); |
| 134 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 | 133 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 |
| 135 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 | 134 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 155 '\x08', // field 1, wire format varint | 154 '\x08', // field 1, wire format varint |
| 156 '\x01', // chunk_number varint 1 | 155 '\x01', // chunk_number varint 1 |
| 157 '\x22', // field 4, wire format length-delimited | 156 '\x22', // field 4, wire format length-delimited |
| 158 '\x18', // varint length 24 | 157 '\x18', // varint length 24 |
| 159 '1', '1', '1', '1', // 4-byte prefixes | 158 '1', '1', '1', '1', // 4-byte prefixes |
| 160 '2', '2', '2', '2', | 159 '2', '2', '2', '2', |
| 161 '3', '3', '3', '3', | 160 '3', '3', '3', '3', |
| 162 }; | 161 }; |
| 163 | 162 |
| 164 ScopedVector<SBChunkData> chunks; | 163 ScopedVector<SBChunkData> chunks; |
| 165 EXPECT_FALSE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 164 EXPECT_FALSE(ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), &chunks)); |
| 166 &chunks)); | |
| 167 } | 165 } |
| 168 | 166 |
| 169 TEST(SafeBrowsingProtocolParsingTest, TestTruncatedFullHashChunk) { | 167 TEST(SafeBrowsingProtocolParsingTest, TestTruncatedFullHashChunk) { |
| 170 // This chunk delares there are two full hashes but there is only one. | 168 // This chunk delares there are two full hashes but there is only one. |
| 171 const char kRawAddChunk[] = { | 169 const char kRawAddChunk[] = { |
| 172 '\0', '\0', '\0', '\x46', // 32-bit payload length in network byte order. | 170 '\0', '\0', '\0', '\x46', // 32-bit payload length in network byte order. |
| 173 '\x08', // field 1, wire format varint | 171 '\x08', // field 1, wire format varint |
| 174 '\x01', // chunk_number varint 1 | 172 '\x01', // chunk_number varint 1 |
| 175 '\x18', // field 3, wire format varint | 173 '\x18', // field 3, wire format varint |
| 176 '\x01', // enum PrefixType == FULL_32B | 174 '\x01', // enum PrefixType == FULL_32B |
| 177 '\x22', // field 4, wire format length-delimited | 175 '\x22', // field 4, wire format length-delimited |
| 178 '\x40', // varint length 64 (2 full hashes) | 176 '\x40', // varint length 64 (2 full hashes) |
| 179 | 177 |
| 180 '0', '1', '0', '1', '0', '1', '0', '1', | 178 '0', '1', '0', '1', '0', '1', '0', '1', |
| 181 '0', '1', '0', '1', '0', '1', '0', '1', | 179 '0', '1', '0', '1', '0', '1', '0', '1', |
| 182 '0', '1', '0', '1', '0', '1', '0', '1', | 180 '0', '1', '0', '1', '0', '1', '0', '1', |
| 183 '0', '1', '0', '1', '0', '1', '0', '1', | 181 '0', '1', '0', '1', '0', '1', '0', '1', |
| 184 }; | 182 }; |
| 185 | 183 |
| 186 ScopedVector<SBChunkData> chunks; | 184 ScopedVector<SBChunkData> chunks; |
| 187 EXPECT_FALSE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 185 EXPECT_FALSE(ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), &chunks)); |
| 188 &chunks)); | |
| 189 } | 186 } |
| 190 | 187 |
| 191 TEST(SafeBrowsingProtocolParsingTest, TestHugeChunk) { | 188 TEST(SafeBrowsingProtocolParsingTest, TestHugeChunk) { |
| 192 // This chunk delares there are 6 prefixes but actually only contains 3. | 189 // This chunk delares there are 6 prefixes but actually only contains 3. |
| 193 const char kRawAddChunk[] = { | 190 const char kRawAddChunk[] = { |
| 194 '\x1', '\0', '\0', '\0', // 32-bit payload length in network byte order. | 191 '\x1', '\0', '\0', '\0', // 32-bit payload length in network byte order. |
| 195 '\x08', // field 1, wire format varint | 192 '\x08', // field 1, wire format varint |
| 196 '\x01', // chunk_number varint 1 | 193 '\x01', // chunk_number varint 1 |
| 197 '\x22', // field 4, wire format length-delimited | 194 '\x22', // field 4, wire format length-delimited |
| 198 '\x18', // varint length 24 | 195 '\x18', // varint length 24 |
| 199 '1', '1', '1', '1', // 4-byte prefixes | 196 '1', '1', '1', '1', // 4-byte prefixes |
| 200 '2', '2', '2', '2', | 197 '2', '2', '2', '2', |
| 201 '3', '3', '3', '3', | 198 '3', '3', '3', '3', |
| 202 }; | 199 }; |
| 203 | 200 |
| 204 ScopedVector<SBChunkData> chunks; | 201 ScopedVector<SBChunkData> chunks; |
| 205 EXPECT_FALSE(safe_browsing::ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), | 202 EXPECT_FALSE(ParseChunk(kRawAddChunk, sizeof(kRawAddChunk), &chunks)); |
| 206 &chunks)); | |
| 207 } | 203 } |
| 208 | 204 |
| 209 // Test parsing one sub chunk. | 205 // Test parsing one sub chunk. |
| 210 TEST(SafeBrowsingProtocolParsingTest, TestSubChunk) { | 206 TEST(SafeBrowsingProtocolParsingTest, TestSubChunk) { |
| 211 const char kRawSubChunk[] = { | 207 const char kRawSubChunk[] = { |
| 212 '\0', '\0', '\0', '\x12', // 32-bit payload length in network byte order | 208 '\0', '\0', '\0', '\x12', // 32-bit payload length in network byte order |
| 213 '\x08', // field 1, wire format varint | 209 '\x08', // field 1, wire format varint |
| 214 '\x03', // chunk_number varint 3 | 210 '\x03', // chunk_number varint 3 |
| 215 '\x10', // field 2, wire format varint | 211 '\x10', // field 2, wire format varint |
| 216 '\x01', // enum ChunkType == SUB | 212 '\x01', // enum ChunkType == SUB |
| 217 '\x22', // field 4, wire format length-delimited | 213 '\x22', // field 4, wire format length-delimited |
| 218 '\x08', // varint length 8 (2 prefixes) | 214 '\x08', // varint length 8 (2 prefixes) |
| 219 '1', '1', '1', '1', // 4-byte prefixes | 215 '1', '1', '1', '1', // 4-byte prefixes |
| 220 '2', '2', '2', '2', | 216 '2', '2', '2', '2', |
| 221 '\x2a', // field 5, wire format length-delimited | 217 '\x2a', // field 5, wire format length-delimited |
| 222 '\x02', // varint length 2 (2 add-chunk numbers) | 218 '\x02', // varint length 2 (2 add-chunk numbers) |
| 223 '\x07', '\x09', // varint 7, varint 9 | 219 '\x07', '\x09', // varint 7, varint 9 |
| 224 }; | 220 }; |
| 225 | 221 |
| 226 ScopedVector<SBChunkData> chunks; | 222 ScopedVector<SBChunkData> chunks; |
| 227 EXPECT_TRUE(safe_browsing::ParseChunk(kRawSubChunk, sizeof(kRawSubChunk), | 223 EXPECT_TRUE(ParseChunk(kRawSubChunk, sizeof(kRawSubChunk), &chunks)); |
| 228 &chunks)); | |
| 229 ASSERT_EQ(1U, chunks.size()); | 224 ASSERT_EQ(1U, chunks.size()); |
| 230 EXPECT_EQ(3, chunks[0]->ChunkNumber()); | 225 EXPECT_EQ(3, chunks[0]->ChunkNumber()); |
| 231 EXPECT_FALSE(chunks[0]->IsAdd()); | 226 EXPECT_FALSE(chunks[0]->IsAdd()); |
| 232 EXPECT_TRUE(chunks[0]->IsSub()); | 227 EXPECT_TRUE(chunks[0]->IsSub()); |
| 233 EXPECT_TRUE(chunks[0]->IsPrefix()); | 228 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 234 EXPECT_FALSE(chunks[0]->IsFullHash()); | 229 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 235 ASSERT_EQ(2U, chunks[0]->PrefixCount()); | 230 ASSERT_EQ(2U, chunks[0]->PrefixCount()); |
| 236 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 | 231 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 |
| 237 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); | 232 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); |
| 238 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 | 233 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 267 '\x07', '\x09', // varint 7, varint 9 | 262 '\x07', '\x09', // varint 7, varint 9 |
| 268 }; | 263 }; |
| 269 | 264 |
| 270 SBFullHash full_hash1, full_hash2; | 265 SBFullHash full_hash1, full_hash2; |
| 271 for (int i = 0; i < 32; ++i) { | 266 for (int i = 0; i < 32; ++i) { |
| 272 full_hash1.full_hash[i] = i % 2 ? '1' : '0'; | 267 full_hash1.full_hash[i] = i % 2 ? '1' : '0'; |
| 273 full_hash2.full_hash[i] = i % 2 ? '3' : '2'; | 268 full_hash2.full_hash[i] = i % 2 ? '3' : '2'; |
| 274 } | 269 } |
| 275 | 270 |
| 276 ScopedVector<SBChunkData> chunks; | 271 ScopedVector<SBChunkData> chunks; |
| 277 EXPECT_TRUE(safe_browsing::ParseChunk(kRawSubChunk, sizeof(kRawSubChunk), | 272 EXPECT_TRUE(ParseChunk(kRawSubChunk, sizeof(kRawSubChunk), &chunks)); |
| 278 &chunks)); | |
| 279 ASSERT_EQ(1U, chunks.size()); | 273 ASSERT_EQ(1U, chunks.size()); |
| 280 EXPECT_EQ(2, chunks[0]->ChunkNumber()); | 274 EXPECT_EQ(2, chunks[0]->ChunkNumber()); |
| 281 EXPECT_FALSE(chunks[0]->IsAdd()); | 275 EXPECT_FALSE(chunks[0]->IsAdd()); |
| 282 EXPECT_TRUE(chunks[0]->IsSub()); | 276 EXPECT_TRUE(chunks[0]->IsSub()); |
| 283 EXPECT_FALSE(chunks[0]->IsPrefix()); | 277 EXPECT_FALSE(chunks[0]->IsPrefix()); |
| 284 EXPECT_TRUE(chunks[0]->IsFullHash()); | 278 EXPECT_TRUE(chunks[0]->IsFullHash()); |
| 285 | 279 |
| 286 ASSERT_EQ(2U, chunks[0]->FullHashCount()); | 280 ASSERT_EQ(2U, chunks[0]->FullHashCount()); |
| 287 EXPECT_TRUE( | 281 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); |
| 288 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(0), full_hash1)); | |
| 289 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); | 282 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); |
| 290 EXPECT_TRUE( | 283 EXPECT_TRUE(SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); |
| 291 safe_browsing::SBFullHashEqual(chunks[0]->FullHashAt(1), full_hash2)); | |
| 292 EXPECT_EQ(9, chunks[0]->AddChunkNumberAt(1)); | 284 EXPECT_EQ(9, chunks[0]->AddChunkNumberAt(1)); |
| 293 } | 285 } |
| 294 | 286 |
| 295 // Test parsing the SafeBrowsing update response. | 287 // Test parsing the SafeBrowsing update response. |
| 296 TEST(SafeBrowsingProtocolParsingTest, TestChunkDelete) { | 288 TEST(SafeBrowsingProtocolParsingTest, TestChunkDelete) { |
| 297 std::string add_del("n:1700\ni:phishy\nad:1-7,43-597,44444,99999\n" | 289 std::string add_del("n:1700\ni:phishy\nad:1-7,43-597,44444,99999\n" |
| 298 "i:malware\nsd:21-27,42,171717\n"); | 290 "i:malware\nsd:21-27,42,171717\n"); |
| 299 | 291 |
| 300 size_t next_query_sec = 0; | 292 size_t next_query_sec = 0; |
| 301 bool reset = false; | 293 bool reset = false; |
| 302 std::vector<SBChunkDelete> deletes; | 294 std::vector<SBChunkDelete> deletes; |
| 303 std::vector<ChunkUrl> urls; | 295 std::vector<ChunkUrl> urls; |
| 304 EXPECT_TRUE(safe_browsing::ParseUpdate(add_del.data(), add_del.length(), | 296 EXPECT_TRUE(ParseUpdate(add_del.data(), add_del.length(), |
| 305 &next_query_sec, &reset, | 297 &next_query_sec, &reset, |
| 306 &deletes, &urls)); | 298 &deletes, &urls)); |
| 307 | 299 |
| 308 EXPECT_TRUE(urls.empty()); | 300 EXPECT_TRUE(urls.empty()); |
| 309 EXPECT_FALSE(reset); | 301 EXPECT_FALSE(reset); |
| 310 EXPECT_EQ(1700U, next_query_sec); | 302 EXPECT_EQ(1700U, next_query_sec); |
| 311 ASSERT_EQ(2U, deletes.size()); | 303 ASSERT_EQ(2U, deletes.size()); |
| 312 | 304 |
| 313 ASSERT_EQ(4U, deletes[0].chunk_del.size()); | 305 ASSERT_EQ(4U, deletes[0].chunk_del.size()); |
| 314 EXPECT_TRUE(deletes[0].chunk_del[0] == ChunkRange(1, 7)); | 306 EXPECT_TRUE(deletes[0].chunk_del[0] == ChunkRange(1, 7)); |
| 315 EXPECT_TRUE(deletes[0].chunk_del[1] == ChunkRange(43, 597)); | 307 EXPECT_TRUE(deletes[0].chunk_del[1] == ChunkRange(43, 597)); |
| 316 EXPECT_TRUE(deletes[0].chunk_del[2] == ChunkRange(44444)); | 308 EXPECT_TRUE(deletes[0].chunk_del[2] == ChunkRange(44444)); |
| 317 EXPECT_TRUE(deletes[0].chunk_del[3] == ChunkRange(99999)); | 309 EXPECT_TRUE(deletes[0].chunk_del[3] == ChunkRange(99999)); |
| 318 | 310 |
| 319 ASSERT_EQ(3U, deletes[1].chunk_del.size()); | 311 ASSERT_EQ(3U, deletes[1].chunk_del.size()); |
| 320 EXPECT_TRUE(deletes[1].chunk_del[0] == ChunkRange(21, 27)); | 312 EXPECT_TRUE(deletes[1].chunk_del[0] == ChunkRange(21, 27)); |
| 321 EXPECT_TRUE(deletes[1].chunk_del[1] == ChunkRange(42)); | 313 EXPECT_TRUE(deletes[1].chunk_del[1] == ChunkRange(42)); |
| 322 EXPECT_TRUE(deletes[1].chunk_del[2] == ChunkRange(171717)); | 314 EXPECT_TRUE(deletes[1].chunk_del[2] == ChunkRange(171717)); |
| 323 | 315 |
| 324 // An update response with missing list name. | 316 // An update response with missing list name. |
| 325 next_query_sec = 0; | 317 next_query_sec = 0; |
| 326 deletes.clear(); | 318 deletes.clear(); |
| 327 urls.clear(); | 319 urls.clear(); |
| 328 add_del = "n:1700\nad:1-7,43-597,44444,99999\ni:malware\nsd:4,21-27171717\n"; | 320 add_del = "n:1700\nad:1-7,43-597,44444,99999\ni:malware\nsd:4,21-27171717\n"; |
| 329 EXPECT_FALSE(safe_browsing::ParseUpdate(add_del.data(), add_del.length(), | 321 EXPECT_FALSE(ParseUpdate(add_del.data(), add_del.length(), |
| 330 &next_query_sec, &reset, | 322 &next_query_sec, &reset, |
| 331 &deletes, &urls)); | 323 &deletes, &urls)); |
| 332 } | 324 } |
| 333 | 325 |
| 334 // Test parsing the SafeBrowsing update response. | 326 // Test parsing the SafeBrowsing update response. |
| 335 TEST(SafeBrowsingProtocolParsingTest, TestRedirects) { | 327 TEST(SafeBrowsingProtocolParsingTest, TestRedirects) { |
| 336 const std::string redirects(base::StringPrintf( | 328 const std::string redirects(base::StringPrintf( |
| 337 "i:%s\n" | 329 "i:%s\n" |
| 338 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1\n" | 330 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1\n" |
| 339 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2\n" | 331 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2\n" |
| 340 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3\n" | 332 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3\n" |
| 341 "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," | 333 "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," |
| 342 "8691-8731,8733-8786\n", | 334 "8691-8731,8733-8786\n", |
| 343 kDefaultMalwareList)); | 335 kDefaultMalwareList)); |
| 344 | 336 |
| 345 size_t next_query_sec = 0; | 337 size_t next_query_sec = 0; |
| 346 bool reset = false; | 338 bool reset = false; |
| 347 std::vector<SBChunkDelete> deletes; | 339 std::vector<SBChunkDelete> deletes; |
| 348 std::vector<ChunkUrl> urls; | 340 std::vector<ChunkUrl> urls; |
| 349 EXPECT_TRUE(safe_browsing::ParseUpdate(redirects.data(), redirects.length(), | 341 EXPECT_TRUE(ParseUpdate(redirects.data(), redirects.length(), |
| 350 &next_query_sec, &reset, | 342 &next_query_sec, &reset, |
| 351 &deletes, &urls)); | 343 &deletes, &urls)); |
| 352 EXPECT_FALSE(reset); | 344 EXPECT_FALSE(reset); |
| 353 EXPECT_EQ(0U, next_query_sec); | 345 EXPECT_EQ(0U, next_query_sec); |
| 354 EXPECT_TRUE(deletes.empty()); | 346 EXPECT_TRUE(deletes.empty()); |
| 355 | 347 |
| 356 ASSERT_EQ(4U, urls.size()); | 348 ASSERT_EQ(4U, urls.size()); |
| 357 EXPECT_EQ("cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1", | 349 EXPECT_EQ("cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1", |
| 358 urls[0].url); | 350 urls[0].url); |
| 359 EXPECT_EQ("cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2", | 351 EXPECT_EQ("cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2", |
| 360 urls[1].url); | 352 urls[1].url); |
| 361 EXPECT_EQ("cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3", | 353 EXPECT_EQ("cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3", |
| 362 urls[2].url); | 354 urls[2].url); |
| 363 EXPECT_EQ("s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:" | 355 EXPECT_EQ("s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:" |
| 364 "8641-8689,8691-8731,8733-8786", | 356 "8641-8689,8691-8731,8733-8786", |
| 365 urls[3].url); | 357 urls[3].url); |
| 366 } | 358 } |
| 367 | 359 |
| 368 // Test parsing various SafeBrowsing protocol headers. | 360 // Test parsing various SafeBrowsing protocol headers. |
| 369 TEST(SafeBrowsingProtocolParsingTest, TestNextQueryTime) { | 361 TEST(SafeBrowsingProtocolParsingTest, TestNextQueryTime) { |
| 370 std::string headers("n:1800\ni:goog-white-shavar\n"); | 362 std::string headers("n:1800\ni:goog-white-shavar\n"); |
| 371 size_t next_query_sec = 0; | 363 size_t next_query_sec = 0; |
| 372 bool reset = false; | 364 bool reset = false; |
| 373 std::vector<SBChunkDelete> deletes; | 365 std::vector<SBChunkDelete> deletes; |
| 374 std::vector<ChunkUrl> urls; | 366 std::vector<ChunkUrl> urls; |
| 375 EXPECT_TRUE(safe_browsing::ParseUpdate(headers.data(), headers.length(), | 367 EXPECT_TRUE(ParseUpdate(headers.data(), headers.length(), |
| 376 &next_query_sec, &reset, | 368 &next_query_sec, &reset, |
| 377 &deletes, &urls)); | 369 &deletes, &urls)); |
| 378 | 370 |
| 379 EXPECT_EQ(1800U, next_query_sec); | 371 EXPECT_EQ(1800U, next_query_sec); |
| 380 EXPECT_FALSE(reset); | 372 EXPECT_FALSE(reset); |
| 381 EXPECT_TRUE(deletes.empty()); | 373 EXPECT_TRUE(deletes.empty()); |
| 382 EXPECT_TRUE(urls.empty()); | 374 EXPECT_TRUE(urls.empty()); |
| 383 } | 375 } |
| 384 | 376 |
| 385 // Test parsing data from a GetHashRequest | 377 // Test parsing data from a GetHashRequest |
| 386 TEST(SafeBrowsingProtocolParsingTest, TestGetHash) { | 378 TEST(SafeBrowsingProtocolParsingTest, TestGetHash) { |
| 387 const std::string get_hash(base::StringPrintf( | 379 const std::string get_hash(base::StringPrintf( |
| 388 "45\n" | 380 "45\n" |
| 389 "%s:32:3\n" | 381 "%s:32:3\n" |
| 390 "00112233445566778899aabbccddeeff" | 382 "00112233445566778899aabbccddeeff" |
| 391 "00001111222233334444555566667777" | 383 "00001111222233334444555566667777" |
| 392 "ffffeeeeddddccccbbbbaaaa99998888", | 384 "ffffeeeeddddccccbbbbaaaa99998888", |
| 393 kDefaultPhishList)); | 385 kDefaultPhishList)); |
| 394 std::vector<SBFullHashResult> full_hashes; | 386 std::vector<SBFullHashResult> full_hashes; |
| 395 base::TimeDelta cache_lifetime; | 387 base::TimeDelta cache_lifetime; |
| 396 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash.data(), get_hash.length(), | 388 EXPECT_TRUE(ParseGetHash(get_hash.data(), get_hash.length(), &cache_lifetime, |
| 397 &cache_lifetime, &full_hashes)); | 389 &full_hashes)); |
| 398 | 390 |
| 399 ASSERT_EQ(3U, full_hashes.size()); | 391 ASSERT_EQ(3U, full_hashes.size()); |
| 400 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 392 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 401 "00112233445566778899aabbccddeeff", | 393 "00112233445566778899aabbccddeeff", |
| 402 sizeof(SBFullHash)), 0); | 394 sizeof(SBFullHash)), 0); |
| 403 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); | 395 EXPECT_EQ(PHISH, full_hashes[0].list_id); |
| 404 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 396 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
| 405 "00001111222233334444555566667777", | 397 "00001111222233334444555566667777", |
| 406 sizeof(SBFullHash)), 0); | 398 sizeof(SBFullHash)), 0); |
| 407 EXPECT_EQ(safe_browsing::PHISH, full_hashes[1].list_id); | 399 EXPECT_EQ(PHISH, full_hashes[1].list_id); |
| 408 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 400 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
| 409 "ffffeeeeddddccccbbbbaaaa99998888", | 401 "ffffeeeeddddccccbbbbaaaa99998888", |
| 410 sizeof(SBFullHash)), 0); | 402 sizeof(SBFullHash)), 0); |
| 411 EXPECT_EQ(safe_browsing::PHISH, full_hashes[2].list_id); | 403 EXPECT_EQ(PHISH, full_hashes[2].list_id); |
| 412 | 404 |
| 413 // Test multiple lists in the GetHash results. | 405 // Test multiple lists in the GetHash results. |
| 414 const std::string get_hash2(base::StringPrintf( | 406 const std::string get_hash2(base::StringPrintf( |
| 415 "45\n" | 407 "45\n" |
| 416 "%s:32:1\n" | 408 "%s:32:1\n" |
| 417 "00112233445566778899aabbccddeeff" | 409 "00112233445566778899aabbccddeeff" |
| 418 "%s:32:2\n" | 410 "%s:32:2\n" |
| 419 "cafebeefcafebeefdeaddeaddeaddead" | 411 "cafebeefcafebeefdeaddeaddeaddead" |
| 420 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 412 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
| 421 kDefaultPhishList, | 413 kDefaultPhishList, |
| 422 kDefaultMalwareList)); | 414 kDefaultMalwareList)); |
| 423 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash2.data(), get_hash2.length(), | 415 EXPECT_TRUE(ParseGetHash(get_hash2.data(), get_hash2.length(), |
| 424 &cache_lifetime, &full_hashes)); | 416 &cache_lifetime, &full_hashes)); |
| 425 | 417 |
| 426 ASSERT_EQ(3U, full_hashes.size()); | 418 ASSERT_EQ(3U, full_hashes.size()); |
| 427 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 419 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 428 "00112233445566778899aabbccddeeff", | 420 "00112233445566778899aabbccddeeff", |
| 429 sizeof(SBFullHash)), 0); | 421 sizeof(SBFullHash)), 0); |
| 430 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); | 422 EXPECT_EQ(PHISH, full_hashes[0].list_id); |
| 431 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 423 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
| 432 "cafebeefcafebeefdeaddeaddeaddead", | 424 "cafebeefcafebeefdeaddeaddeaddead", |
| 433 sizeof(SBFullHash)), 0); | 425 sizeof(SBFullHash)), 0); |
| 434 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[1].list_id); | 426 EXPECT_EQ(MALWARE, full_hashes[1].list_id); |
| 435 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 427 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
| 436 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 428 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
| 437 sizeof(SBFullHash)), 0); | 429 sizeof(SBFullHash)), 0); |
| 438 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[2].list_id); | 430 EXPECT_EQ(MALWARE, full_hashes[2].list_id); |
| 439 | 431 |
| 440 // Test metadata parsing. | 432 // Test metadata parsing. |
| 441 const std::string get_hash3(base::StringPrintf( | 433 const std::string get_hash3(base::StringPrintf( |
| 442 "45\n" | 434 "45\n" |
| 443 "%s:32:2:m\n" | 435 "%s:32:2:m\n" |
| 444 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss" | 436 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss" |
| 445 "00112233445566778899aabbccddeeff" | 437 "00112233445566778899aabbccddeeff" |
| 446 "2\nab2\nxy" | 438 "2\nab2\nxy" |
| 447 "%s:32:1\n" | 439 "%s:32:1\n" |
| 448 "cafebeefcafebeefdeaddeaddeaddead", | 440 "cafebeefcafebeefdeaddeaddeaddead", |
| 449 kDefaultMalwareList, | 441 kDefaultMalwareList, |
| 450 kDefaultPhishList)); | 442 kDefaultPhishList)); |
| 451 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), | 443 EXPECT_TRUE(ParseGetHash(get_hash3.data(), get_hash3.length(), |
| 452 &cache_lifetime, &full_hashes)); | 444 &cache_lifetime, &full_hashes)); |
| 453 | 445 |
| 454 ASSERT_EQ(3U, full_hashes.size()); | 446 ASSERT_EQ(3U, full_hashes.size()); |
| 455 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 447 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 456 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 448 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
| 457 sizeof(SBFullHash)), 0); | 449 sizeof(SBFullHash)), 0); |
| 458 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[0].list_id); | 450 EXPECT_EQ(MALWARE, full_hashes[0].list_id); |
| 459 EXPECT_EQ(std::string("ab"), full_hashes[0].metadata); | 451 EXPECT_EQ(std::string("ab"), full_hashes[0].metadata); |
| 460 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 452 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
| 461 "00112233445566778899aabbccddeeff", | 453 "00112233445566778899aabbccddeeff", |
| 462 sizeof(SBFullHash)), 0); | 454 sizeof(SBFullHash)), 0); |
| 463 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[1].list_id); | 455 EXPECT_EQ(MALWARE, full_hashes[1].list_id); |
| 464 EXPECT_EQ(std::string("xy"), full_hashes[1].metadata); | 456 EXPECT_EQ(std::string("xy"), full_hashes[1].metadata); |
| 465 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 457 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
| 466 "cafebeefcafebeefdeaddeaddeaddead", | 458 "cafebeefcafebeefdeaddeaddeaddead", |
| 467 sizeof(SBFullHash)), 0); | 459 sizeof(SBFullHash)), 0); |
| 468 EXPECT_EQ(safe_browsing::PHISH, full_hashes[2].list_id); | 460 EXPECT_EQ(PHISH, full_hashes[2].list_id); |
| 469 EXPECT_EQ(std::string(), full_hashes[2].metadata); | 461 EXPECT_EQ(std::string(), full_hashes[2].metadata); |
| 470 } | 462 } |
| 471 | 463 |
| 472 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { | 464 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { |
| 473 std::string hash_response(base::StringPrintf( | 465 std::string hash_response(base::StringPrintf( |
| 474 "45\n" | 466 "45\n" |
| 475 "%s:32:1\n" | 467 "%s:32:1\n" |
| 476 "12345678901234567890123456789012" | 468 "12345678901234567890123456789012" |
| 477 "googpub-phish-shavar:32:1\n" | 469 "googpub-phish-shavar:32:1\n" |
| 478 "09876543210987654321098765432109", | 470 "09876543210987654321098765432109", |
| 479 kDefaultPhishList)); | 471 kDefaultPhishList)); |
| 480 std::vector<SBFullHashResult> full_hashes; | 472 std::vector<SBFullHashResult> full_hashes; |
| 481 base::TimeDelta cache_lifetime; | 473 base::TimeDelta cache_lifetime; |
| 482 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), | 474 EXPECT_TRUE(ParseGetHash(hash_response.data(), hash_response.size(), |
| 483 hash_response.size(), | 475 &cache_lifetime, &full_hashes)); |
| 484 &cache_lifetime, | |
| 485 &full_hashes)); | |
| 486 | 476 |
| 487 ASSERT_EQ(1U, full_hashes.size()); | 477 ASSERT_EQ(1U, full_hashes.size()); |
| 488 EXPECT_EQ(memcmp("12345678901234567890123456789012", | 478 EXPECT_EQ(memcmp("12345678901234567890123456789012", |
| 489 &full_hashes[0].hash, sizeof(SBFullHash)), 0); | 479 &full_hashes[0].hash, sizeof(SBFullHash)), 0); |
| 490 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); | 480 EXPECT_EQ(PHISH, full_hashes[0].list_id); |
| 491 | 481 |
| 492 hash_response += base::StringPrintf( | 482 hash_response += base::StringPrintf( |
| 493 "%s:32:1\n" | 483 "%s:32:1\n" |
| 494 "abcdefghijklmnopqrstuvwxyz123457", | 484 "abcdefghijklmnopqrstuvwxyz123457", |
| 495 kDefaultMalwareList); | 485 kDefaultMalwareList); |
| 496 full_hashes.clear(); | 486 full_hashes.clear(); |
| 497 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), | 487 EXPECT_TRUE(ParseGetHash(hash_response.data(), hash_response.size(), |
| 498 hash_response.size(), | 488 &cache_lifetime, &full_hashes)); |
| 499 &cache_lifetime, | |
| 500 &full_hashes)); | |
| 501 | 489 |
| 502 EXPECT_EQ(2U, full_hashes.size()); | 490 EXPECT_EQ(2U, full_hashes.size()); |
| 503 EXPECT_EQ(memcmp("12345678901234567890123456789012", | 491 EXPECT_EQ(memcmp("12345678901234567890123456789012", |
| 504 &full_hashes[0].hash, sizeof(SBFullHash)), 0); | 492 &full_hashes[0].hash, sizeof(SBFullHash)), 0); |
| 505 EXPECT_EQ(safe_browsing::PHISH, full_hashes[0].list_id); | 493 EXPECT_EQ(PHISH, full_hashes[0].list_id); |
| 506 EXPECT_EQ(memcmp("abcdefghijklmnopqrstuvwxyz123457", | 494 EXPECT_EQ(memcmp("abcdefghijklmnopqrstuvwxyz123457", |
| 507 &full_hashes[1].hash, sizeof(SBFullHash)), 0); | 495 &full_hashes[1].hash, sizeof(SBFullHash)), 0); |
| 508 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[1].list_id); | 496 EXPECT_EQ(MALWARE, full_hashes[1].list_id); |
| 509 } | 497 } |
| 510 | 498 |
| 511 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownListAndMetadata) { | 499 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownListAndMetadata) { |
| 512 std::vector<SBFullHashResult> full_hashes; | 500 std::vector<SBFullHashResult> full_hashes; |
| 513 base::TimeDelta cache_lifetime; | 501 base::TimeDelta cache_lifetime; |
| 514 // Test skipping over a hashentry with an unrecognized listname that also has | 502 // Test skipping over a hashentry with an unrecognized listname that also has |
| 515 // metadata. | 503 // metadata. |
| 516 const std::string get_hash3(base::StringPrintf( | 504 const std::string get_hash3(base::StringPrintf( |
| 517 "600\n" | 505 "600\n" |
| 518 "BADLISTNAME:32:1:m\n" | 506 "BADLISTNAME:32:1:m\n" |
| 519 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" | 507 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" |
| 520 "8\nMETADATA" | 508 "8\nMETADATA" |
| 521 "%s:32:1\n" | 509 "%s:32:1\n" |
| 522 "0123456789hashhashhashhashhashha", | 510 "0123456789hashhashhashhashhashha", |
| 523 kDefaultMalwareList)); | 511 kDefaultMalwareList)); |
| 524 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), | 512 EXPECT_TRUE(ParseGetHash(get_hash3.data(), get_hash3.length(), |
| 525 &cache_lifetime, &full_hashes)); | 513 &cache_lifetime, &full_hashes)); |
| 526 ASSERT_EQ(1U, full_hashes.size()); | 514 ASSERT_EQ(1U, full_hashes.size()); |
| 527 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 515 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 528 "0123456789hashhashhashhashhashha", | 516 "0123456789hashhashhashhashhashha", |
| 529 sizeof(SBFullHash)), 0); | 517 sizeof(SBFullHash)), 0); |
| 530 EXPECT_EQ(safe_browsing::MALWARE, full_hashes[0].list_id); | 518 EXPECT_EQ(MALWARE, full_hashes[0].list_id); |
| 531 EXPECT_EQ(std::string(), full_hashes[0].metadata); | 519 EXPECT_EQ(std::string(), full_hashes[0].metadata); |
| 532 } | 520 } |
| 533 | 521 |
| 534 TEST(SafeBrowsingProtocolParsingTest, TestFormatHash) { | 522 TEST(SafeBrowsingProtocolParsingTest, TestFormatHash) { |
| 535 std::vector<SBPrefix> prefixes; | 523 std::vector<SBPrefix> prefixes; |
| 536 prefixes.push_back(0x34333231); | 524 prefixes.push_back(0x34333231); |
| 537 prefixes.push_back(0x64636261); | 525 prefixes.push_back(0x64636261); |
| 538 prefixes.push_back(0x73727170); | 526 prefixes.push_back(0x73727170); |
| 539 | 527 |
| 540 EXPECT_EQ("4:12\n1234abcdpqrs", safe_browsing::FormatGetHash(prefixes)); | 528 EXPECT_EQ("4:12\n1234abcdpqrs", FormatGetHash(prefixes)); |
| 541 } | 529 } |
| 542 | 530 |
| 543 TEST(SafeBrowsingProtocolParsingTest, TestReset) { | 531 TEST(SafeBrowsingProtocolParsingTest, TestReset) { |
| 544 std::string update("n:1800\ni:phishy\nr:pleasereset\n"); | 532 std::string update("n:1800\ni:phishy\nr:pleasereset\n"); |
| 545 | 533 |
| 546 bool reset = false; | 534 bool reset = false; |
| 547 size_t next_update = 0; | 535 size_t next_update = 0; |
| 548 std::vector<SBChunkDelete> deletes; | 536 std::vector<SBChunkDelete> deletes; |
| 549 std::vector<ChunkUrl> urls; | 537 std::vector<ChunkUrl> urls; |
| 550 EXPECT_TRUE(safe_browsing::ParseUpdate(update.data(), update.size(), | 538 EXPECT_TRUE(ParseUpdate(update.data(), update.size(), |
| 551 &next_update, &reset, | 539 &next_update, &reset, |
| 552 &deletes, &urls)); | 540 &deletes, &urls)); |
| 553 EXPECT_TRUE(reset); | 541 EXPECT_TRUE(reset); |
| 554 } | 542 } |
| 555 | 543 |
| 556 // The SafeBrowsing service will occasionally send zero length chunks so that | 544 // The SafeBrowsing service will occasionally send zero length chunks so that |
| 557 // client requests will have longer contiguous chunk number ranges, and thus | 545 // client requests will have longer contiguous chunk number ranges, and thus |
| 558 // reduce the request size. | 546 // reduce the request size. |
| 559 TEST(SafeBrowsingProtocolParsingTest, TestZeroSizeAddChunk) { | 547 TEST(SafeBrowsingProtocolParsingTest, TestZeroSizeAddChunk) { |
| 560 const char kEmptyAddChunk[] = { | 548 const char kEmptyAddChunk[] = { |
| 561 '\0', '\0', '\0', '\x02', // 32-bit payload length in network byte order. | 549 '\0', '\0', '\0', '\x02', // 32-bit payload length in network byte order. |
| 562 '\x08', // field 1, wire format varint | 550 '\x08', // field 1, wire format varint |
| 563 '\x02', // chunk_number varint 2 | 551 '\x02', // chunk_number varint 2 |
| 564 }; | 552 }; |
| 565 | 553 |
| 566 ScopedVector<SBChunkData> chunks; | 554 ScopedVector<SBChunkData> chunks; |
| 567 EXPECT_TRUE(safe_browsing::ParseChunk(kEmptyAddChunk, sizeof(kEmptyAddChunk), | 555 EXPECT_TRUE(ParseChunk(kEmptyAddChunk, sizeof(kEmptyAddChunk), &chunks)); |
| 568 &chunks)); | |
| 569 ASSERT_EQ(1U, chunks.size()); | 556 ASSERT_EQ(1U, chunks.size()); |
| 570 EXPECT_EQ(2, chunks[0]->ChunkNumber()); | 557 EXPECT_EQ(2, chunks[0]->ChunkNumber()); |
| 571 EXPECT_TRUE(chunks[0]->IsAdd()); | 558 EXPECT_TRUE(chunks[0]->IsAdd()); |
| 572 EXPECT_FALSE(chunks[0]->IsSub()); | 559 EXPECT_FALSE(chunks[0]->IsSub()); |
| 573 EXPECT_TRUE(chunks[0]->IsPrefix()); | 560 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 574 EXPECT_FALSE(chunks[0]->IsFullHash()); | 561 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 575 EXPECT_EQ(0U, chunks[0]->PrefixCount()); | 562 EXPECT_EQ(0U, chunks[0]->PrefixCount()); |
| 576 | 563 |
| 577 // Now test a zero size chunk in between normal chunks. | 564 // Now test a zero size chunk in between normal chunks. |
| 578 chunks.clear(); | 565 chunks.clear(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 590 '\x08', // field 1, wire format varint | 577 '\x08', // field 1, wire format varint |
| 591 '\x02', // chunk_number varint 2 | 578 '\x02', // chunk_number varint 2 |
| 592 | 579 |
| 593 '\0', '\0', '\0', '\x08', // 32-bit payload length in network byte order. | 580 '\0', '\0', '\0', '\x08', // 32-bit payload length in network byte order. |
| 594 '\x08', // field 1, wire format varint | 581 '\x08', // field 1, wire format varint |
| 595 '\x03', // chunk_number varint 3 | 582 '\x03', // chunk_number varint 3 |
| 596 '\x22', // field 4, wire format length-delimited | 583 '\x22', // field 4, wire format length-delimited |
| 597 '\x04', // varint length 8 | 584 '\x04', // varint length 8 |
| 598 'p', 'p', 'p', 'p', // 4-byte prefixes | 585 'p', 'p', 'p', 'p', // 4-byte prefixes |
| 599 }; | 586 }; |
| 600 EXPECT_TRUE(safe_browsing::ParseChunk(kAddChunks, sizeof(kAddChunks), | 587 EXPECT_TRUE(ParseChunk(kAddChunks, sizeof(kAddChunks), &chunks)); |
| 601 &chunks)); | |
| 602 ASSERT_EQ(3U, chunks.size()); | 588 ASSERT_EQ(3U, chunks.size()); |
| 603 | 589 |
| 604 EXPECT_EQ(1, chunks[0]->ChunkNumber()); | 590 EXPECT_EQ(1, chunks[0]->ChunkNumber()); |
| 605 EXPECT_TRUE(chunks[0]->IsAdd()); | 591 EXPECT_TRUE(chunks[0]->IsAdd()); |
| 606 EXPECT_FALSE(chunks[0]->IsSub()); | 592 EXPECT_FALSE(chunks[0]->IsSub()); |
| 607 EXPECT_TRUE(chunks[0]->IsPrefix()); | 593 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 608 EXPECT_FALSE(chunks[0]->IsFullHash()); | 594 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 609 ASSERT_EQ(2U, chunks[0]->PrefixCount()); | 595 ASSERT_EQ(2U, chunks[0]->PrefixCount()); |
| 610 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 | 596 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 |
| 611 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 | 597 EXPECT_EQ(0x32323232U, chunks[0]->PrefixAt(1)); // 2222 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 630 TEST(SafeBrowsingProtocolParsingTest, TestZeroSizeSubChunk) { | 616 TEST(SafeBrowsingProtocolParsingTest, TestZeroSizeSubChunk) { |
| 631 const char kEmptySubChunk[] = { | 617 const char kEmptySubChunk[] = { |
| 632 '\0', '\0', '\0', '\x04', // 32-bit payload length in network byte order. | 618 '\0', '\0', '\0', '\x04', // 32-bit payload length in network byte order. |
| 633 '\x08', // field 1, wire format varint | 619 '\x08', // field 1, wire format varint |
| 634 '\x02', // chunk_number varint 2 | 620 '\x02', // chunk_number varint 2 |
| 635 '\x10', // field 2, wire format varint | 621 '\x10', // field 2, wire format varint |
| 636 '\x01', // enum ChunkType == SUB | 622 '\x01', // enum ChunkType == SUB |
| 637 }; | 623 }; |
| 638 | 624 |
| 639 ScopedVector<SBChunkData> chunks; | 625 ScopedVector<SBChunkData> chunks; |
| 640 EXPECT_TRUE(safe_browsing::ParseChunk(kEmptySubChunk, sizeof(kEmptySubChunk), | 626 EXPECT_TRUE(ParseChunk(kEmptySubChunk, sizeof(kEmptySubChunk), &chunks)); |
| 641 &chunks)); | |
| 642 ASSERT_EQ(1U, chunks.size()); | 627 ASSERT_EQ(1U, chunks.size()); |
| 643 EXPECT_EQ(2, chunks[0]->ChunkNumber()); | 628 EXPECT_EQ(2, chunks[0]->ChunkNumber()); |
| 644 EXPECT_FALSE(chunks[0]->IsAdd()); | 629 EXPECT_FALSE(chunks[0]->IsAdd()); |
| 645 EXPECT_TRUE(chunks[0]->IsSub()); | 630 EXPECT_TRUE(chunks[0]->IsSub()); |
| 646 EXPECT_TRUE(chunks[0]->IsPrefix()); | 631 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 647 EXPECT_FALSE(chunks[0]->IsFullHash()); | 632 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 648 EXPECT_EQ(0U, chunks[0]->PrefixCount()); | 633 EXPECT_EQ(0U, chunks[0]->PrefixCount()); |
| 649 | 634 |
| 650 // Test parsing a zero sized sub chunk mixed in with content carrying chunks. | 635 // Test parsing a zero sized sub chunk mixed in with content carrying chunks. |
| 651 chunks.clear(); | 636 chunks.clear(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 675 '\x10', // field 2, wire format varint | 660 '\x10', // field 2, wire format varint |
| 676 '\x01', // enum ChunkType == SUB | 661 '\x01', // enum ChunkType == SUB |
| 677 '\x22', // field 4, wire format length-delimited | 662 '\x22', // field 4, wire format length-delimited |
| 678 '\x04', // varint length 8 | 663 '\x04', // varint length 8 |
| 679 'p', 'p', 'p', 'p', // 4-byte prefix | 664 'p', 'p', 'p', 'p', // 4-byte prefix |
| 680 '\x2a', // field 5, wire format length-delimited | 665 '\x2a', // field 5, wire format length-delimited |
| 681 '\x01', // varint length 1 (1 add-chunk numbers) | 666 '\x01', // varint length 1 (1 add-chunk numbers) |
| 682 '\x0B', // varint 11 | 667 '\x0B', // varint 11 |
| 683 }; | 668 }; |
| 684 | 669 |
| 685 EXPECT_TRUE(safe_browsing::ParseChunk(kSubChunks, sizeof(kSubChunks), | 670 EXPECT_TRUE(ParseChunk(kSubChunks, sizeof(kSubChunks), &chunks)); |
| 686 &chunks)); | |
| 687 ASSERT_EQ(3U, chunks.size()); | 671 ASSERT_EQ(3U, chunks.size()); |
| 688 | 672 |
| 689 EXPECT_EQ(1, chunks[0]->ChunkNumber()); | 673 EXPECT_EQ(1, chunks[0]->ChunkNumber()); |
| 690 EXPECT_FALSE(chunks[0]->IsAdd()); | 674 EXPECT_FALSE(chunks[0]->IsAdd()); |
| 691 EXPECT_TRUE(chunks[0]->IsSub()); | 675 EXPECT_TRUE(chunks[0]->IsSub()); |
| 692 EXPECT_TRUE(chunks[0]->IsPrefix()); | 676 EXPECT_TRUE(chunks[0]->IsPrefix()); |
| 693 EXPECT_FALSE(chunks[0]->IsFullHash()); | 677 EXPECT_FALSE(chunks[0]->IsFullHash()); |
| 694 ASSERT_EQ(2U, chunks[0]->PrefixCount()); | 678 ASSERT_EQ(2U, chunks[0]->PrefixCount()); |
| 695 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 | 679 EXPECT_EQ(0x31313131U, chunks[0]->PrefixAt(0)); // 1111 |
| 696 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); | 680 EXPECT_EQ(7, chunks[0]->AddChunkNumberAt(0)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 707 EXPECT_EQ(3, chunks[2]->ChunkNumber()); | 691 EXPECT_EQ(3, chunks[2]->ChunkNumber()); |
| 708 EXPECT_FALSE(chunks[0]->IsAdd()); | 692 EXPECT_FALSE(chunks[0]->IsAdd()); |
| 709 EXPECT_TRUE(chunks[0]->IsSub()); | 693 EXPECT_TRUE(chunks[0]->IsSub()); |
| 710 EXPECT_TRUE(chunks[2]->IsPrefix()); | 694 EXPECT_TRUE(chunks[2]->IsPrefix()); |
| 711 EXPECT_FALSE(chunks[2]->IsFullHash()); | 695 EXPECT_FALSE(chunks[2]->IsFullHash()); |
| 712 ASSERT_EQ(1U, chunks[2]->PrefixCount()); | 696 ASSERT_EQ(1U, chunks[2]->PrefixCount()); |
| 713 EXPECT_EQ(0x70707070U, chunks[2]->PrefixAt(0)); // pppp | 697 EXPECT_EQ(0x70707070U, chunks[2]->PrefixAt(0)); // pppp |
| 714 EXPECT_EQ(11, chunks[2]->AddChunkNumberAt(0)); | 698 EXPECT_EQ(11, chunks[2]->AddChunkNumberAt(0)); |
| 715 } | 699 } |
| 716 | 700 |
| 717 } // namespace | 701 } // namespace safe_browsing |
| OLD | NEW |