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