Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Side by Side Diff: sdch/open_vcdiff/depot/opensource/open-vcdiff/src/headerparser_test.cc

Issue 5203: Transition to pulling open-vcdiff from repository, instead of using snapshot... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2008 Google Inc.
2 // Author: Lincoln Smith
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15
16 #include <config.h>
17 #include "headerparser.h"
18 #include <cstdlib> // rand, srand
19 #include <string>
20 #include <vector>
21 #include "testing.h"
22 #include "varint_bigendian.h"
23
24 namespace open_vcdiff {
25 namespace { // anonymous
26
27 using std::string;
28 using std::vector;
29
30 class VCDiffHeaderParserTest : public testing::Test {
31 protected:
32 static const int kTestSize = 1024;
33
34 VCDiffHeaderParserTest() : parser(NULL) { }
35
36 virtual ~VCDiffHeaderParserTest() {
37 delete parser;
38 }
39
40 virtual void SetUp() {
41 srand(1); // make sure each test uses the same data set
42 }
43
44 void StartParsing() {
45 parser = new VCDiffHeaderParser(
46 encoded_buffer_.data(),
47 encoded_buffer_.data() + encoded_buffer_.size());
48 EXPECT_EQ(encoded_buffer_.data(), parser->UnparsedData());
49 }
50
51 void VerifyByte(unsigned char expected_value) {
52 unsigned char decoded_byte = 0;
53 const char* prior_position = parser->UnparsedData();
54 EXPECT_TRUE(parser->ParseByte(&decoded_byte));
55 EXPECT_EQ(expected_value, decoded_byte);
56 EXPECT_EQ(RESULT_SUCCESS, parser->GetResult());
57 EXPECT_EQ(prior_position + sizeof(unsigned char),
58 parser->UnparsedData());
59 }
60
61 void VerifyInt32(int32_t expected_value) {
62 int32_t decoded_integer = 0;
63 const char* prior_position = parser->UnparsedData();
64 EXPECT_TRUE(parser->ParseInt32("decoded int32", &decoded_integer));
65 EXPECT_EQ(expected_value, decoded_integer);
66 EXPECT_EQ(RESULT_SUCCESS, parser->GetResult());
67 EXPECT_EQ(prior_position + VarintBE<int32_t>::Length(decoded_integer),
68 parser->UnparsedData());
69 }
70
71 void VerifyUInt32(uint32_t expected_value) {
72 uint32_t decoded_integer = 0;
73 const char* prior_position = parser->UnparsedData();
74 EXPECT_TRUE(parser->ParseUInt32("decoded uint32", &decoded_integer));
75 EXPECT_EQ(expected_value, decoded_integer);
76 EXPECT_EQ(RESULT_SUCCESS, parser->GetResult());
77 EXPECT_EQ(prior_position + VarintBE<int64_t>::Length(decoded_integer),
78 parser->UnparsedData());
79 }
80
81 void VerifyChecksum(VCDChecksum expected_value) {
82 VCDChecksum decoded_checksum = 0;
83 const char* prior_position = parser->UnparsedData();
84 EXPECT_TRUE(parser->ParseChecksum("decoded checksum", &decoded_checksum));
85 EXPECT_EQ(expected_value, decoded_checksum);
86 EXPECT_EQ(RESULT_SUCCESS, parser->GetResult());
87 EXPECT_EQ(prior_position + VarintBE<int64_t>::Length(decoded_checksum),
88 parser->UnparsedData());
89 }
90
91 string encoded_buffer_;
92 VCDiffHeaderParser* parser;
93 };
94
95 TEST_F(VCDiffHeaderParserTest, ParseRandomBytes) {
96 vector<unsigned char> byte_values;
97 for (int i = 0; i < kTestSize; ++i) {
98 unsigned char random_byte = PortableRandomInRange<unsigned char>(0xFF);
99 encoded_buffer_.push_back(random_byte);
100 byte_values.push_back(random_byte);
101 }
102 StartParsing();
103 for (int position = 0; position < kTestSize; ++position) {
104 VerifyByte(byte_values[position]);
105 }
106 unsigned char decoded_byte = 0;
107 EXPECT_FALSE(parser->ParseByte(&decoded_byte));
108 EXPECT_EQ(RESULT_END_OF_DATA, parser->GetResult());
109 EXPECT_EQ(encoded_buffer_.data() + encoded_buffer_.size(),
110 parser->UnparsedData());
111 }
112
113 TEST_F(VCDiffHeaderParserTest, ParseRandomInt32) {
114 vector<int32_t> integer_values;
115 for (int i = 0; i < kTestSize; ++i) {
116 int32_t random_integer = PortableRandomInRange<int32_t>(0x7FFFFFFF);
117 VarintBE<int32_t>::AppendToString(random_integer, &encoded_buffer_);
118 integer_values.push_back(random_integer);
119 }
120 StartParsing();
121 for (int i = 0; i < kTestSize; ++i) {
122 VerifyInt32(integer_values[i]);
123 }
124 int32_t decoded_integer = 0;
125 EXPECT_FALSE(parser->ParseInt32("decoded integer", &decoded_integer));
126 EXPECT_EQ(RESULT_END_OF_DATA, parser->GetResult());
127 EXPECT_EQ(encoded_buffer_.data() + encoded_buffer_.size(),
128 parser->UnparsedData());
129 }
130
131 TEST_F(VCDiffHeaderParserTest, ParseRandomUInt32) {
132 vector<uint32_t> integer_values;
133 for (int i = 0; i < kTestSize; ++i) {
134 uint32_t random_integer = PortableRandomInRange<uint32_t>(0xFFFFFFFF);
135 VarintBE<int64_t>::AppendToString(random_integer, &encoded_buffer_);
136 integer_values.push_back(random_integer);
137 }
138 StartParsing();
139 uint32_t decoded_integer = 0;
140 for (int i = 0; i < kTestSize; ++i) {
141 VerifyUInt32(integer_values[i]);
142 }
143 EXPECT_FALSE(parser->ParseUInt32("decoded integer", &decoded_integer));
144 EXPECT_EQ(RESULT_END_OF_DATA, parser->GetResult());
145 EXPECT_EQ(encoded_buffer_.data() + encoded_buffer_.size(),
146 parser->UnparsedData());
147 }
148
149 TEST_F(VCDiffHeaderParserTest, ParseRandomChecksum) {
150 vector<VCDChecksum> checksum_values;
151 for (int i = 0; i < kTestSize; ++i) {
152 VCDChecksum random_checksum =
153 PortableRandomInRange<VCDChecksum>(0xFFFFFFFF);
154 VarintBE<int64_t>::AppendToString(random_checksum, &encoded_buffer_);
155 checksum_values.push_back(random_checksum);
156 }
157 StartParsing();
158 for (int i = 0; i < kTestSize; ++i) {
159 VerifyChecksum(checksum_values[i]);
160 }
161 VCDChecksum decoded_checksum = 0;
162 EXPECT_FALSE(parser->ParseChecksum("decoded checksum", &decoded_checksum));
163 EXPECT_EQ(RESULT_END_OF_DATA, parser->GetResult());
164 EXPECT_EQ(encoded_buffer_.data() + encoded_buffer_.size(),
165 parser->UnparsedData());
166 }
167
168 TEST_F(VCDiffHeaderParserTest, ParseMixed) {
169 VarintBE<int64_t>::AppendToString(0xCAFECAFE, &encoded_buffer_);
170 encoded_buffer_.push_back(0xFF);
171 VarintBE<int32_t>::AppendToString(0x02020202, &encoded_buffer_);
172 VarintBE<int64_t>::AppendToString(0xCAFECAFE, &encoded_buffer_);
173 encoded_buffer_.push_back(0xFF);
174 encoded_buffer_.push_back(0xFF);
175 StartParsing();
176 VerifyUInt32(0xCAFECAFE);
177 VerifyByte(0xFF);
178 VerifyInt32(0x02020202);
179 VerifyChecksum(0xCAFECAFE);
180 int32_t incomplete_int32 = 0;
181 EXPECT_FALSE(parser->ParseInt32("incomplete Varint", &incomplete_int32));
182 EXPECT_EQ(0, incomplete_int32);
183 EXPECT_EQ(RESULT_END_OF_DATA, parser->GetResult());
184 EXPECT_EQ(encoded_buffer_.data() + encoded_buffer_.size() - 2,
185 parser->UnparsedData());
186 }
187
188 TEST_F(VCDiffHeaderParserTest, ParseInvalidVarint) {
189 // Start with a byte that has the continuation bit plus a high-order bit set
190 encoded_buffer_.append(1, static_cast<char>(0xC0));
191 // Add too many bytes with continuation bits
192 encoded_buffer_.append(6, static_cast<char>(0x80));
193 StartParsing();
194 int32_t invalid_int32 = 0;
195 EXPECT_FALSE(parser->ParseInt32("invalid Varint", &invalid_int32));
196 EXPECT_EQ(0, invalid_int32);
197 EXPECT_EQ(RESULT_ERROR, parser->GetResult());
198 EXPECT_EQ(encoded_buffer_.data(), parser->UnparsedData());
199 // After the parse failure, any other call to Parse... should return an error,
200 // even though there is still a byte that could be read as valid.
201 unsigned char decoded_byte = 0;
202 EXPECT_FALSE(parser->ParseByte(&decoded_byte));
203 EXPECT_EQ(0, decoded_byte);
204 EXPECT_EQ(RESULT_ERROR, parser->GetResult());
205 EXPECT_EQ(encoded_buffer_.data(), parser->UnparsedData());
206 }
207
208 } // namespace open_vcdiff
209 } // anonymous namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698