1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Program to test the SafeBrowsing protocol parsing v2.1.
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/safe_browsing/protocol_parser.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/safe_browsing/safe_browsing_util.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one add chunk.
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddChunk) {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_chunk("a:1:4:35\naaaax1111\0032222333344447777\00288889999");
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk[13] = '\0';
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run the parse.
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "",  &re_key, &chunks);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 3U);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161);
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBEntry* entry = chunks[0].hosts[0].entry;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 0);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[1].host, 0x31313131);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[0].hosts[1].entry;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 3);
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x32323232);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x33333333);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(2), 0x34343434);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[2].host, 0x37373737);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[0].hosts[2].entry;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 2);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x38383838);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x39393939);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one add chunk with full hashes.
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddFullChunk) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_chunk("a:1:32:69\naaaa");
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk.push_back(2);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBFullHash full_hash1, full_hash2;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < 32; ++i) {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    full_hash1.full_hash[i] = i % 2 ? 1 : 2;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    full_hash2.full_hash[i] = i % 2 ? 3 : 4;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk.append(full_hash1.full_hash, 32);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk.append(full_hash2.full_hash, 32);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run the parse.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 1U);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBEntry* entry = chunks[0].hosts[0].entry;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(entry->IsPrefix());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 2);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->FullHashAt(0) == full_hash1);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->FullHashAt(1) == full_hash2);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing multiple add chunks. We'll use the same chunk as above, and add
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// one more after it.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddChunks) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_chunk("a:1:4:35\naaaax1111\0032222333344447777\00288889999"
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "a:2:4:13\n5555\002ppppgggg");
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk[13] = '\0';
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run the parse.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 2U);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 3U);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBEntry* entry = chunks[0].hosts[0].entry;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 0);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[1].host, 0x31313131);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[0].hosts[1].entry;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 3);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x32323232);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x33333333);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(2), 0x34343434);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[2].host, 0x37373737);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[0].hosts[2].entry;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 2);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x38383838);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x39393939);
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[1].chunk_number, 2);
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[1].hosts.size(), 1U);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[1].hosts[0].host, 0x35353535);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[1].hosts[0].entry;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsAdd());
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 2);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x70707070);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x67676767);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one add chunk where a hostkey spans several entries.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddBigChunk) {
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_chunk("a:1:4:1050\naaaaX");
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk[add_chunk.size() - 1] |= 0xFF;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < 255; ++i)
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    add_chunk.append(StringPrintf("%04d", i));
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk.append("aaaa");
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_chunk.push_back(5);
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < 5; ++i)
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    add_chunk.append(StringPrintf("001%d", i));
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 2U);
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const SBChunkHost& host0 = chunks[0].hosts[0];
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(host0.host, 0x61616161);
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(host0.entry->prefix_count(), 255);
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const SBChunkHost& host1 = chunks[0].hosts[1];
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(host1.host, 0x61616161);
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(host1.entry->prefix_count(), 5);
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test to make sure we could deal with truncated bin hash chunk.
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestTruncatedBinHashChunk) {
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This chunk delares there are 4 prefixes but actually only contains 2.
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char add_chunk[] = "a:1:4:16\n11112222";
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SafeBrowsingProtocolParser parser;
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool re_key = false;
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBChunkList chunks;
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(add_chunk,
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  safe_browsing_util::kBinHashList,
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  static_cast<int>(sizeof(add_chunk)),
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  "", "", &re_key, &chunks);
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(result);
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 0U);
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test to make sure we could deal with truncated malwarelist chunk.
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestTruncatedUrlHashChunk) {
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // This chunk delares there are 4 prefixes but actually only contains 2.
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const char add_chunk[] = "a:1:4:21\naaaa\00411112222";
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SafeBrowsingProtocolParser parser;
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool re_key = false;
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBChunkList chunks;
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // For safe_browsing_util::kMalwareList.
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(add_chunk,
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  safe_browsing_util::kMalwareList,
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  static_cast<int>(sizeof(add_chunk)),
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  "", "", &re_key, &chunks);
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(result);
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 0U);
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // For safe_browsing_util::kPhishingList.
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  result = parser.ParseChunk(add_chunk,
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             safe_browsing_util::kPhishingList,
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             static_cast<int>(sizeof(add_chunk)),
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             "", "", &re_key, &chunks);
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(result);
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 0U);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // For safe_browsing_util::kBinUrlList.
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  result = parser.ParseChunk(add_chunk,
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             safe_browsing_util::kBinUrlList,
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             static_cast<int>(sizeof(add_chunk)),
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                             "", "", &re_key, &chunks);
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(result);
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 0U);
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one sub chunk.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestSubChunk) {
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string sub_chunk("s:9:4:59\naaaaxkkkk1111\003"
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "zzzz2222zzzz3333zzzz4444"
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "7777\002yyyy8888yyyy9999");
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunk[13] = '\0';
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run the parse.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      sub_chunk.data(),
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(sub_chunk.length()),
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 9);
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 3U);
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBEntry* entry = chunks[0].hosts[0].entry;
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsSub());
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->chunk_id(), 0x6b6b6b6b);
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 0);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[1].host, 0x31313131);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[0].hosts[1].entry;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsSub());
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 3);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x7a7a7a7a);
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x32323232);
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x7a7a7a7a);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x33333333);
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(2), 0x7a7a7a7a);
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(2), 0x34343434);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[2].host, 0x37373737);
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry = chunks[0].hosts[2].entry;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsSub());
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsPrefix());
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 2);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x79797979);
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(0), 0x38383838);
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x79797979);
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->PrefixAt(1), 0x39393939);
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one sub chunk with full hashes.
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestSubFullChunk) {
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string sub_chunk("s:1:32:77\naaaa");
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunk.push_back(2);
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBFullHash full_hash1, full_hash2;
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < 32; ++i) {
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    full_hash1.full_hash[i] = i % 2 ? 1 : 2;
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    full_hash2.full_hash[i] = i % 2 ? 3 : 4;
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunk.append("yyyy");
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunk.append(full_hash1.full_hash, 32);
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunk.append("zzzz");
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunk.append(full_hash2.full_hash, 32);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run the parse.
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      sub_chunk.data(),
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(sub_chunk.length()),
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 1U);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161);
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBEntry* entry = chunks[0].hosts[0].entry;
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->IsSub());
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(entry->IsPrefix());
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->prefix_count(), 2);
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x79797979);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->FullHashAt(0) == full_hash1);
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x7a7a7a7a);
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(entry->FullHashAt(1) == full_hash2);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing the SafeBrowsing update response.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestChunkDelete) {
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_del("n:1700\ni:phishy\nad:1-7,43-597,44444,99999\n"
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      "i:malware\nsd:21-27,42,171717\n");
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_query_sec = 0;
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(add_del.data(),
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(add_del.length()), "",
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_query_sec, &re_key,
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(urls.empty());
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(reset);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(next_query_sec, 1700);
35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(deletes.size(), 2U);
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(deletes[0].chunk_del.size(), 4U);
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[0].chunk_del[0] == ChunkRange(1, 7));
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[0].chunk_del[1] == ChunkRange(43, 597));
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[0].chunk_del[2] == ChunkRange(44444));
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[0].chunk_del[3] == ChunkRange(99999));
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(deletes[1].chunk_del.size(), 3U);
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[1].chunk_del[0] == ChunkRange(21, 27));
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[1].chunk_del[1] == ChunkRange(42));
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes[1].chunk_del[2] == ChunkRange(171717));
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // An update response with missing list name.
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  next_query_sec = 0;
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  deletes.clear();
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  urls.clear();
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  add_del = "n:1700\nad:1-7,43-597,44444,99999\ni:malware\nsd:4,21-27171717\n";
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(parser.ParseUpdate(add_del.data(),
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  static_cast<int>(add_del.length()), "",
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &next_query_sec, &re_key,
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &reset, &deletes, &urls));
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing the SafeBrowsing update response.
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestRedirects) {
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string redirects("i:goog-malware-shavar\n"
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1\n"
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2\n"
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3\n"
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689,"
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "8691-8731,8733-8786\n");
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_query_sec = 0;
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(redirects.data(),
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(redirects.length()), "",
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_query_sec, &re_key,
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(reset);
40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(urls.size(), 4U);
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[0].url,
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1");
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[1].url,
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2");
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[2].url,
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3");
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[3].url,
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689,"
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "8691-8731,8733-8786");
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(next_query_sec, 0);
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes.empty());
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestRedirectsWithMac) {
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string redirects("i:goog-phish-shavar\n"
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6501-6505:6501-6505,"
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "pcY6iVeT9-CBQ3fdAF0rpnKjR1Y=\n"
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8001-8160:8001-8024,"
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "8026-8045,8048-8049,8051-8134,8136-8152,8155-8160,"
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "j6XXAEWnjYk9tVVLBSdQvIEq2Wg=\n");
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_query_sec = 0;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string key("58Lqn5WIP961x3zuLGo5Uw==");
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(redirects.data(),
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(redirects.length()), key,
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_query_sec, &re_key,
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(reset);
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(urls.size(), 2U);
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[0].url,
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6501-6505:6501-6505");
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[0].mac, "pcY6iVeT9-CBQ3fdAF0rpnKjR1Y=");
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[1].url,
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8001-8160:8001-8024,"
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "8026-8045,8048-8049,8051-8134,8136-8152,8155-8160");
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(urls[1].mac, "j6XXAEWnjYk9tVVLBSdQvIEq2Wg=");
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing various SafeBrowsing protocol headers.
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestNextQueryTime) {
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string headers("n:1800\ni:goog-white-shavar\n");
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_query_sec = 0;
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(headers.data(),
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(headers.length()), "",
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_query_sec, &re_key,
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(next_query_sec, 1800);
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(reset);
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(deletes.empty());
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(urls.empty());
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing data from a GetHashRequest
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetHash) {
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string get_hash("goog-phish-shavar:19:96\n"
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       "00112233445566778899aabbccddeeff"
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       "00001111222233334444555566667777"
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       "ffffeeeeddddccccbbbbaaaa99998888");
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBFullHashResult> full_hashes;
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseGetHash(get_hash.data(),
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  static_cast<int>(get_hash.length()), "",
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &re_key,
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &full_hashes));
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(full_hashes.size(), 3U);
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(&full_hashes[0].hash,
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "00112233445566778899aabbccddeeff",
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof(SBFullHash)), 0);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar");
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(&full_hashes[1].hash,
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "00001111222233334444555566667777",
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof(SBFullHash)), 0);
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[1].list_name, "goog-phish-shavar");
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(&full_hashes[2].hash,
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "ffffeeeeddddccccbbbbaaaa99998888",
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof(SBFullHash)), 0);
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[2].list_name, "goog-phish-shavar");
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test multiple lists in the GetHash results.
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string get_hash2("goog-phish-shavar:19:32\n"
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "00112233445566778899aabbccddeeff"
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "goog-malware-shavar:19:64\n"
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "cafebeefcafebeefdeaddeaddeaddead"
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        "zzzzyyyyxxxxwwwwvvvvuuuuttttssss");
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseGetHash(get_hash2.data(),
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  static_cast<int>(get_hash2.length()), "",
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &re_key,
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &full_hashes));
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(full_hashes.size(), 3U);
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(&full_hashes[0].hash,
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "00112233445566778899aabbccddeeff",
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof(SBFullHash)), 0);
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar");
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(&full_hashes[1].hash,
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "cafebeefcafebeefdeaddeaddeaddead",
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof(SBFullHash)), 0);
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[1].list_name, "goog-malware-shavar");
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(&full_hashes[2].hash,
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "zzzzyyyyxxxxwwwwvvvvuuuuttttssss",
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof(SBFullHash)), 0);
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[2].list_name, "goog-malware-shavar");
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetHashWithMac) {
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const unsigned char get_hash[] = {
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x32, 0x56, 0x74, 0x6f, 0x6b, 0x36, 0x64, 0x41,
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x51, 0x72, 0x65, 0x51, 0x62, 0x38, 0x51, 0x68,
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x59, 0x45, 0x57, 0x51, 0x57, 0x4d, 0x52, 0x65,
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x42, 0x63, 0x41, 0x3d, 0x0a, 0x67, 0x6f, 0x6f,
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x67, 0x2d, 0x70, 0x68, 0x69, 0x73, 0x68, 0x2d,
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x73, 0x68, 0x61, 0x76, 0x61, 0x72, 0x3a, 0x36,
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x31, 0x36, 0x39, 0x3a, 0x33, 0x32, 0x0a, 0x17,
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x7f, 0x03, 0x42, 0x28, 0x1c, 0x31, 0xb9, 0x0b,
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x1c, 0x7b, 0x9d, 0xaf, 0x7b, 0x43, 0x99, 0x10,
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xc1, 0xab, 0xe3, 0x1b, 0x35, 0x80, 0x38, 0x96,
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0xf9, 0x44, 0x4f, 0x28, 0xb4, 0xeb, 0x45
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const unsigned char hash_result[] = {
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x17, 0x7f, 0x03, 0x42, 0x28, 0x1c, 0x31, 0xb9,
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x0b, 0x1c, 0x7b, 0x9d, 0xaf, 0x7b, 0x43, 0x99,
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x10, 0xc1, 0xab, 0xe3, 0x1b, 0x35, 0x80, 0x38,
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x96, 0xf9, 0x44, 0x4f, 0x28, 0xb4, 0xeb, 0x45
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string key = "58Lqn5WIP961x3zuLGo5Uw==";
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBFullHashResult> full_hashes;
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseGetHash(reinterpret_cast<const char*>(get_hash),
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  sizeof(get_hash),
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  key,
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &re_key,
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &full_hashes));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(full_hashes.size(), 1U);
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp(hash_result, &full_hashes[0].hash, sizeof(SBFullHash)), 0);
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) {
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string hash_response = "goog-phish-shavar:1:32\n"
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "12345678901234567890123456789012"
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "googpub-phish-shavar:19:32\n"
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              "09876543210987654321098765432109";
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string key = "";
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBFullHashResult> full_hashes;
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseGetHash(hash_response.data(),
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  hash_response.size(),
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  key,
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &re_key,
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &full_hashes));
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(full_hashes.size(), 1U);
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp("12345678901234567890123456789012",
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   &full_hashes[0].hash, sizeof(SBFullHash)), 0);
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar");
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[0].add_chunk_id, 1);
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  hash_response += "goog-malware-shavar:7:32\n"
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   "abcdefghijklmnopqrstuvwxyz123457";
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  full_hashes.clear();
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseGetHash(hash_response.data(),
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  hash_response.size(),
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  key,
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &re_key,
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  &full_hashes));
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(full_hashes.size(), 2U);
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp("12345678901234567890123456789012",
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   &full_hashes[0].hash, sizeof(SBFullHash)), 0);
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar");
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[0].add_chunk_id, 1);
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(memcmp("abcdefghijklmnopqrstuvwxyz123457",
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   &full_hashes[1].hash, sizeof(SBFullHash)), 0);
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[1].list_name, "goog-malware-shavar");
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(full_hashes[1].add_chunk_id, 7);
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestFormatHash) {
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBPrefix> prefixes;
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string get_hash;
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  prefixes.push_back(0x34333231);
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  prefixes.push_back(0x64636261);
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  prefixes.push_back(0x73727170);
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  parser.FormatGetHash(prefixes, &get_hash);
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(get_hash, "4:12\n1234abcdpqrs");
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetKey) {
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string key_response("clientkey:10:0123456789\n"
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           "wrappedkey:20:abcdefghijklmnopqrst\n");
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string client_key, wrapped_key;
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseNewKey(key_response.data(),
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(key_response.length()),
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &client_key,
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &wrapped_key));
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(client_key, "0123456789");
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(wrapped_key, "abcdefghijklmnopqrst");
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestReKey) {
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string update("n:1800\ni:phishy\ne:pleaserekey\n");
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_update = -1;
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(update.data(),
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(update.size()), "",
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_update, &re_key,
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(re_key);
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestReset) {
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string update("n:1800\ni:phishy\nr:pleasereset\n");
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_update = -1;
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(update.data(),
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(update.size()), "",
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_update, &re_key,
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(reset);
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The SafeBrowsing service will occasionally send zero length chunks so that
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// client requests will have longer contiguous chunk number ranges, and thus
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// reduce the request size.
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestZeroSizeAddChunk) {
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_chunk("a:1:4:0\n");
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
67172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
67272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
67372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
67472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
67672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
67872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 0U);
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now test a zero size chunk in between normal chunks.
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.clear();
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string add_chunks("a:1:4:18\n1234\001abcd5678\001wxyz"
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         "a:2:4:0\n"
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         "a:3:4:9\ncafe\001beef");
68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  result = parser.ParseChunk(
68672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
68772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunks.data(),
68872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunks.length()),
68972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
69172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 3U);
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See that each chunk has the right content.
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
69572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 2U);
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x34333231);
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].entry->PrefixAt(0), 0x64636261);
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[1].host, 0x38373635);
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[1].entry->PrefixAt(0), 0x7a797877);
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[1].chunk_number, 2);
70272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[1].hosts.size(), 0U);
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].chunk_number, 3);
70572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[2].hosts.size(), 1U);
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[0].host, 0x65666163);
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[0].entry->PrefixAt(0), 0x66656562);
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing a zero sized sub chunk.
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestZeroSizeSubChunk) {
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string sub_chunk("s:9:4:0\n");
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
71872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
71972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      sub_chunk.data(),
72072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(sub_chunk.length()),
72172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
72372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 9);
72572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 0U);
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.clear();
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test parsing a zero sized sub chunk mixed in with content carrying chunks.
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string sub_chunks("s:1:4:9\nabcdxwxyz"
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         "s:2:4:0\n"
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         "s:3:4:26\nefgh\0011234pqrscafe\0015678lmno");
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sub_chunks[12] = '\0';
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  result = parser.ParseChunk(
73572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
73672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      sub_chunks.data(),
73772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(sub_chunks.length()),
73872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(result);
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].chunk_number, 1);
74272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 1U);
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].host, 0x64636261);
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0].hosts[0].entry->prefix_count(), 0);
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[1].chunk_number, 2);
74772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[1].hosts.size(), 0U);
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].chunk_number, 3);
75072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[2].hosts.size(), 2U);
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[0].host, 0x68676665);
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[0].entry->prefix_count(), 1);
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[0].entry->PrefixAt(0), 0x73727170);
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[0].entry->ChunkIdAtPrefix(0), 0x31323334);
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[1].host, 0x65666163);
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[1].entry->prefix_count(), 1);
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[1].entry->PrefixAt(0), 0x6f6e6d6c);
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2].hosts[1].entry->ChunkIdAtPrefix(0), 0x35363738);
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestVerifyUpdateMac) {
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string update =
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "m:XIU0LiQhAPJq6dynXwHbygjS5tw=\n"
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "n:1895\n"
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "i:goog-phish-shavar\n"
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6501-6505:6501-6505,"
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "pcY6iVeT9-CBQ3fdAF0rpnKjR1Y=\n"
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6506-6510:6506-6510,"
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "SDBrYC3rX3KEPe72LOypnP6QYac=\n"
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6511-6520:6511-6520,"
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "9UQo-e7OkcsXT2wFWTAhOuWOsUs=\n"
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6521-6560:6521-6560,"
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "qVNw6JIpR1q6PIXST7J4LJ9n3Zg=\n"
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6561-6720:6561-6720,"
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "7OiJvCbiwvpzPITW-hQohY5NHuc=\n"
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6721-6880:6721-6880,"
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "oBS3svhoi9deIa0sWZ_gnD0ujj8=\n"
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6881-7040:6881-7040,"
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "a0r8Xit4VvH39xgyQHZTPczKBIE=\n"
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_7041-7200:7041-7163,"
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "q538LChutGknBw55s6kcE2wTcvU=\n"
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8001-8160:8001-8024,"
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8026-8045,8048-8049,8051-8134,8136-8152,8155-8160,"
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "j6XXAEWnjYk9tVVLBSdQvIEq2Wg=\n"
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8161-8320:8161-8215,"
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8217-8222,8224-8320,YaNfiqdQOt-uLCLWVLj46AZpAjQ=\n"
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8321-8480:8321-8391,"
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8393-8399,8402,8404-8419,8421-8425,8427,8431-8433,8435-8439,8441-8443,"
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8445-8446,8448-8480,ALj31GQMwGiIeU3bM2ZYKITfU-U=\n"
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8481-8640:8481-8500,"
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8502-8508,8510-8511,8513-8517,8519-8525,8527-8531,8533,8536-8539,"
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8541-8576,8578-8638,8640,TlQYRmS_kZ5PBAUIUyNQDq0Jprs=\n"
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689,"
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "8691-8731,8733-8786,x1Qf7hdNrO8b6yym03ZzNydDS1o=\n";
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool reset = false;
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_update = -1;
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<SBChunkDelete> deletes;
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkUrl> urls;
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string key("58Lqn5WIP961x3zuLGo5Uw==");
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(parser.ParseUpdate(update.data(),
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 static_cast<int>(update.size()), key,
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &next_update, &re_key,
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 &reset, &deletes, &urls));
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(next_update, 1895);
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestVerifyChunkMac) {
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SafeBrowsingProtocolParser parser;
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const unsigned char chunk[] = {
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x73, 0x3a, 0x32, 0x30, 0x30, 0x32, 0x3a, 0x34,
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x3a, 0x32, 0x32, 0x0a, 0x2f, 0x4f, 0x89, 0x7a,
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x01, 0x00, 0x00, 0x0a, 0x59, 0xc8, 0x71, 0xdf,
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x9d, 0x29, 0x0c, 0xba, 0xd7, 0x00, 0x00, 0x00,
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    0x0a, 0x59
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool re_key = false;
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SBChunkList chunks;
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string key("v_aDSz6jI92WeHCOoZ07QA==");
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string mac("W9Xp2fUcQ9V66If6Cvsrstpa4Kk=");
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(parser.ParseChunk(
82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kMalwareList,
83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      reinterpret_cast<const char*>(chunk),
83172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      sizeof(chunk), key, mac,
83272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      &re_key, &chunks));
83372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
83472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
83572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
83672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestAddBinHashChunks) {
83772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string add_chunk("a:1:4:16\naaaabbbbccccdddd"
83872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                        "a:2:4:8\n11112222");
83972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Run the parse.
84072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SafeBrowsingProtocolParser parser;
84172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool re_key = false;
84272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBChunkList chunks;
84372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
84472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kBinHashList,
84572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
84672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
84772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
84872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(result);
84972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
85072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 2U);
85172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].chunk_number, 1);
85272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 1U);
85372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
85472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts[0].host, 0);
85572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBEntry* entry = chunks[0].hosts[0].entry;
85672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(entry->IsAdd());
85772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(entry->IsPrefix());
85872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->prefix_count(), 4);
85972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
86072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[1].chunk_number, 2);
86172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[1].hosts.size(), 1U);
86272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
86372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[1].hosts[0].host, 0);
86472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  entry = chunks[1].hosts[0].entry;
86572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(entry->IsAdd());
86672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(entry->IsPrefix());
86772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->prefix_count(), 2);
86872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->PrefixAt(0), 0x31313131);
86972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->PrefixAt(1), 0x32323232);
87072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
87172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
87272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test parsing one add chunk where a hostkey spans several entries.
87372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestAddBigBinHashChunk) {
87472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string add_chunk("a:1:4:1028\n");
87572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (int i = 0; i < 257; ++i)
87672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    add_chunk.append(StringPrintf("%04d", i));
87772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
87872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SafeBrowsingProtocolParser parser;
87972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool re_key = false;
88072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBChunkList chunks;
88172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
88272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kBinHashList,
88372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      add_chunk.data(),
88472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(add_chunk.length()),
88572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
88672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(result);
88772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(re_key);
88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
88972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].chunk_number, 1);
89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 1U);
89272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const SBChunkHost& host0 = chunks[0].hosts[0];
89472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(host0.host, 0);
89572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(host0.entry->prefix_count(), 257);
89672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
89772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
89872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test parsing one sub chunk.
89972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestSubBinHashChunk) {
90072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string sub_chunk("s:9:4:16\n1111mmmm2222nnnn");
90172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
90272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Run the parser.
90372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SafeBrowsingProtocolParser parser;
90472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool re_key = false;
90572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBChunkList chunks;
90672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool result = parser.ParseChunk(
90772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      safe_browsing_util::kBinHashList,
90872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      sub_chunk.data(),
90972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      static_cast<int>(sub_chunk.length()),
91072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      "", "", &re_key, &chunks);
91172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(result);
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(re_key);
91372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks.size(), 1U);
91472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].chunk_number, 9);
91572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts.size(), 1U);
91672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
91772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(chunks[0].hosts[0].host, 0);
91872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SBEntry* entry = chunks[0].hosts[0].entry;
91972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(entry->IsSub());
92072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(entry->IsPrefix());
92172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->prefix_count(), 2);
92272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x31313131);
92372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->PrefixAt(0), 0x6d6d6d6d);
92472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x32323232);
92572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(entry->PrefixAt(1), 0x6e6e6e6e);
926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
927