OLD | NEW |
| (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 | |
OLD | NEW |