OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010, Google Inc. | |
2 // All rights reserved. | |
3 // | |
4 // Redistribution and use in source and binary forms, with or without | |
5 // modification, are permitted provided that the following conditions are | |
6 // met: | |
7 // | |
8 // * Redistributions of source code must retain the above copyright | |
9 // notice, this list of conditions and the following disclaimer. | |
10 // * Redistributions in binary form must reproduce the above | |
11 // copyright notice, this list of conditions and the following disclaimer | |
12 // in the documentation and/or other materials provided with the | |
13 // distribution. | |
14 // * Neither the name of Google Inc. nor the names of its | |
15 // contributors may be used to endorse or promote products derived from | |
16 // this software without specific prior written permission. | |
17 // | |
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 | |
30 #include <ios> | |
31 #include <string> | |
32 #include <vector> | |
33 | |
34 #include "breakpad_googletest_includes.h" | |
35 #include "common/using_std_string.h" | |
36 #include "processor/binarystream.h" | |
37 | |
38 namespace { | |
39 using std::ios_base; | |
40 using std::vector; | |
41 using google_breakpad::binarystream; | |
42 | |
43 | |
44 class BinaryStreamBasicTest : public ::testing::Test { | |
45 protected: | |
46 binarystream stream; | |
47 }; | |
48 | |
49 TEST_F(BinaryStreamBasicTest, ReadU8) { | |
50 uint8_t u8 = 0; | |
51 ASSERT_FALSE(stream.eof()); | |
52 stream >> u8; | |
53 ASSERT_TRUE(stream.eof()); | |
54 EXPECT_EQ(0U, u8); | |
55 stream.rewind(); | |
56 stream.clear(); | |
57 stream << (uint8_t)1; | |
58 ASSERT_FALSE(stream.eof()); | |
59 stream >> u8; | |
60 EXPECT_EQ(1, u8); | |
61 EXPECT_FALSE(stream.eof()); | |
62 } | |
63 | |
64 TEST_F(BinaryStreamBasicTest, ReadU16) { | |
65 uint16_t u16 = 0; | |
66 ASSERT_FALSE(stream.eof()); | |
67 stream >> u16; | |
68 ASSERT_TRUE(stream.eof()); | |
69 EXPECT_EQ(0U, u16); | |
70 stream.rewind(); | |
71 stream.clear(); | |
72 stream << (uint16_t)1; | |
73 ASSERT_FALSE(stream.eof()); | |
74 stream >> u16; | |
75 EXPECT_EQ(1, u16); | |
76 EXPECT_FALSE(stream.eof()); | |
77 } | |
78 | |
79 TEST_F(BinaryStreamBasicTest, ReadU32) { | |
80 uint32_t u32 = 0; | |
81 ASSERT_FALSE(stream.eof()); | |
82 stream >> u32; | |
83 ASSERT_TRUE(stream.eof()); | |
84 EXPECT_EQ(0U, u32); | |
85 stream.rewind(); | |
86 stream.clear(); | |
87 stream << (uint32_t)1; | |
88 ASSERT_FALSE(stream.eof()); | |
89 stream >> u32; | |
90 EXPECT_EQ(1U, u32); | |
91 EXPECT_FALSE(stream.eof()); | |
92 } | |
93 | |
94 TEST_F(BinaryStreamBasicTest, ReadU64) { | |
95 uint64_t u64 = 0; | |
96 ASSERT_FALSE(stream.eof()); | |
97 stream >> u64; | |
98 ASSERT_TRUE(stream.eof()); | |
99 EXPECT_EQ(0U, u64); | |
100 stream.rewind(); | |
101 stream.clear(); | |
102 stream << (uint64_t)1; | |
103 ASSERT_FALSE(stream.eof()); | |
104 stream >> u64; | |
105 EXPECT_EQ(1U, u64); | |
106 EXPECT_FALSE(stream.eof()); | |
107 } | |
108 | |
109 TEST_F(BinaryStreamBasicTest, ReadString) { | |
110 string s(""); | |
111 ASSERT_FALSE(stream.eof()); | |
112 stream >> s; | |
113 ASSERT_TRUE(stream.eof()); | |
114 EXPECT_EQ("", s); | |
115 // write an empty string to the stream, read it back | |
116 s = "abcd"; | |
117 stream.rewind(); | |
118 stream.clear(); | |
119 stream << string(""); | |
120 stream >> s; | |
121 EXPECT_EQ("", s); | |
122 EXPECT_FALSE(stream.eof()); | |
123 stream.rewind(); | |
124 stream.clear(); | |
125 stream << string("test"); | |
126 ASSERT_FALSE(stream.eof()); | |
127 stream >> s; | |
128 EXPECT_EQ("test", s); | |
129 EXPECT_FALSE(stream.eof()); | |
130 } | |
131 | |
132 TEST_F(BinaryStreamBasicTest, ReadEmptyString) { | |
133 string s("abc"); | |
134 stream << string(""); | |
135 stream >> s; | |
136 EXPECT_EQ("", s); | |
137 } | |
138 | |
139 TEST_F(BinaryStreamBasicTest, ReadMultiU8) { | |
140 const uint8_t ea = 0, eb = 100, ec = 200, ed = 0xFF; | |
141 uint8_t a, b, c, d, e; | |
142 stream << ea << eb << ec << ed; | |
143 stream >> a >> b >> c >> d; | |
144 ASSERT_FALSE(stream.eof()); | |
145 EXPECT_EQ(ea, a); | |
146 EXPECT_EQ(eb, b); | |
147 EXPECT_EQ(ec, c); | |
148 EXPECT_EQ(ed, d); | |
149 ASSERT_FALSE(stream.eof()); | |
150 e = 0; | |
151 stream >> e; | |
152 EXPECT_EQ(0U, e); | |
153 ASSERT_TRUE(stream.eof()); | |
154 // try reading all at once, including one past eof | |
155 stream.rewind(); | |
156 stream.clear(); | |
157 ASSERT_FALSE(stream.eof()); | |
158 a = b = c = d = e = 0; | |
159 stream << ea << eb << ec << ed; | |
160 stream >> a >> b >> c >> d >> e; | |
161 EXPECT_EQ(ea, a); | |
162 EXPECT_EQ(eb, b); | |
163 EXPECT_EQ(ec, c); | |
164 EXPECT_EQ(ed, d); | |
165 EXPECT_EQ(0U, e); | |
166 EXPECT_TRUE(stream.eof()); | |
167 } | |
168 | |
169 TEST_F(BinaryStreamBasicTest, ReadMultiU16) { | |
170 const uint16_t ea = 0, eb = 0x100, ec = 0x8000, ed = 0xFFFF; | |
171 uint16_t a, b, c, d, e; | |
172 stream << ea << eb << ec << ed; | |
173 stream >> a >> b >> c >> d; | |
174 ASSERT_FALSE(stream.eof()); | |
175 EXPECT_EQ(ea, a); | |
176 EXPECT_EQ(eb, b); | |
177 EXPECT_EQ(ec, c); | |
178 EXPECT_EQ(ed, d); | |
179 ASSERT_FALSE(stream.eof()); | |
180 e = 0; | |
181 stream >> e; | |
182 EXPECT_EQ(0U, e); | |
183 EXPECT_TRUE(stream.eof()); | |
184 // try reading all at once, including one past eof | |
185 stream.rewind(); | |
186 stream.clear(); | |
187 ASSERT_FALSE(stream.eof()); | |
188 a = b = c = d = e = 0; | |
189 stream << ea << eb << ec << ed; | |
190 stream >> a >> b >> c >> d >> e; | |
191 EXPECT_EQ(ea, a); | |
192 EXPECT_EQ(eb, b); | |
193 EXPECT_EQ(ec, c); | |
194 EXPECT_EQ(ed, d); | |
195 EXPECT_EQ(0U, e); | |
196 EXPECT_TRUE(stream.eof()); | |
197 } | |
198 | |
199 TEST_F(BinaryStreamBasicTest, ReadMultiU32) { | |
200 const uint32_t ea = 0, eb = 0x10000, ec = 0x8000000, ed = 0xFFFFFFFF; | |
201 uint32_t a, b, c, d, e; | |
202 stream << ea << eb << ec << ed; | |
203 stream >> a >> b >> c >> d; | |
204 ASSERT_FALSE(stream.eof()); | |
205 EXPECT_EQ(ea, a); | |
206 EXPECT_EQ(eb, b); | |
207 EXPECT_EQ(ec, c); | |
208 EXPECT_EQ(ed, d); | |
209 ASSERT_FALSE(stream.eof()); | |
210 e = 0; | |
211 stream >> e; | |
212 EXPECT_EQ(0U, e); | |
213 EXPECT_TRUE(stream.eof()); | |
214 // try reading all at once, including one past eof | |
215 stream.rewind(); | |
216 stream.clear(); | |
217 ASSERT_FALSE(stream.eof()); | |
218 a = b = c = d = e = 0; | |
219 stream << ea << eb << ec << ed; | |
220 stream >> a >> b >> c >> d >> e; | |
221 EXPECT_EQ(ea, a); | |
222 EXPECT_EQ(eb, b); | |
223 EXPECT_EQ(ec, c); | |
224 EXPECT_EQ(ed, d); | |
225 EXPECT_EQ(0U, e); | |
226 EXPECT_TRUE(stream.eof()); | |
227 } | |
228 | |
229 TEST_F(BinaryStreamBasicTest, ReadMultiU64) { | |
230 const uint64_t ea = 0, eb = 0x10000, ec = 0x100000000ULL, | |
231 ed = 0xFFFFFFFFFFFFFFFFULL; | |
232 uint64_t a, b, c, d, e; | |
233 stream << ea << eb << ec << ed; | |
234 stream >> a >> b >> c >> d; | |
235 ASSERT_FALSE(stream.eof()); | |
236 EXPECT_EQ(ea, a); | |
237 EXPECT_EQ(eb, b); | |
238 EXPECT_EQ(ec, c); | |
239 EXPECT_EQ(ed, d); | |
240 ASSERT_FALSE(stream.eof()); | |
241 e = 0; | |
242 stream >> e; | |
243 EXPECT_EQ(0U, e); | |
244 EXPECT_TRUE(stream.eof()); | |
245 // try reading all at once, including one past eof | |
246 stream.rewind(); | |
247 stream.clear(); | |
248 ASSERT_FALSE(stream.eof()); | |
249 a = b = c = d = e = 0; | |
250 stream << ea << eb << ec << ed; | |
251 stream >> a >> b >> c >> d >> e; | |
252 EXPECT_EQ(ea, a); | |
253 EXPECT_EQ(eb, b); | |
254 EXPECT_EQ(ec, c); | |
255 EXPECT_EQ(ed, d); | |
256 EXPECT_EQ(0U, e); | |
257 EXPECT_TRUE(stream.eof()); | |
258 } | |
259 | |
260 TEST_F(BinaryStreamBasicTest, ReadMixed) { | |
261 const uint8_t e8 = 0x10; | |
262 const uint16_t e16 = 0x2020; | |
263 const uint32_t e32 = 0x30303030; | |
264 const uint64_t e64 = 0x4040404040404040ULL; | |
265 const string es = "test"; | |
266 uint8_t u8 = 0; | |
267 uint16_t u16 = 0; | |
268 uint32_t u32 = 0; | |
269 uint64_t u64 = 0; | |
270 string s("test"); | |
271 stream << e8 << e16 << e32 << e64 << es; | |
272 stream >> u8 >> u16 >> u32 >> u64 >> s; | |
273 EXPECT_FALSE(stream.eof()); | |
274 EXPECT_EQ(e8, u8); | |
275 EXPECT_EQ(e16, u16); | |
276 EXPECT_EQ(e32, u32); | |
277 EXPECT_EQ(e64, u64); | |
278 EXPECT_EQ(es, s); | |
279 } | |
280 | |
281 TEST_F(BinaryStreamBasicTest, ReadStringMissing) { | |
282 // ensure that reading a string where only the length is present fails | |
283 uint16_t u16 = 8; | |
284 stream << u16; | |
285 stream.rewind(); | |
286 string s(""); | |
287 stream >> s; | |
288 EXPECT_EQ("", s); | |
289 EXPECT_TRUE(stream.eof()); | |
290 } | |
291 | |
292 TEST_F(BinaryStreamBasicTest, ReadStringTruncated) { | |
293 // ensure that reading a string where not all the data is present fails | |
294 uint16_t u16 = 8; | |
295 stream << u16; | |
296 stream << (uint8_t)'t' << (uint8_t)'e' << (uint8_t)'s' << (uint8_t)'t'; | |
297 stream.rewind(); | |
298 string s(""); | |
299 stream >> s; | |
300 EXPECT_EQ("", s); | |
301 EXPECT_TRUE(stream.eof()); | |
302 } | |
303 | |
304 TEST_F(BinaryStreamBasicTest, StreamByteLength) { | |
305 // Test that the stream buffer contains the right amount of data | |
306 stream << (uint8_t)0 << (uint16_t)1 << (uint32_t)2 << (uint64_t)3 | |
307 << string("test"); | |
308 string s = stream.str(); | |
309 EXPECT_EQ(21U, s.length()); | |
310 } | |
311 | |
312 TEST_F(BinaryStreamBasicTest, AppendStreamResultsByteLength) { | |
313 // Test that appending the str() results from two streams | |
314 // gives the right byte length | |
315 binarystream stream2; | |
316 stream << (uint8_t)0 << (uint16_t)1; | |
317 stream2 << (uint32_t)0 << (uint64_t)2 | |
318 << string("test"); | |
319 string s = stream.str(); | |
320 string s2 = stream2.str(); | |
321 s.append(s2); | |
322 EXPECT_EQ(21U, s.length()); | |
323 } | |
324 | |
325 TEST_F(BinaryStreamBasicTest, StreamSetStr) { | |
326 const string es("test"); | |
327 stream << es; | |
328 binarystream stream2; | |
329 stream2.str(stream.str()); | |
330 string s; | |
331 stream2 >> s; | |
332 EXPECT_FALSE(stream2.eof()); | |
333 EXPECT_EQ("test", s); | |
334 s = ""; | |
335 stream2.str(stream.str()); | |
336 stream2.rewind(); | |
337 stream2 >> s; | |
338 EXPECT_FALSE(stream2.eof()); | |
339 EXPECT_EQ("test", s); | |
340 } | |
341 | |
342 class BinaryStreamU8Test : public ::testing::Test { | |
343 protected: | |
344 binarystream stream; | |
345 | |
346 void SetUp() { | |
347 stream << (uint8_t)1; | |
348 } | |
349 }; | |
350 | |
351 TEST_F(BinaryStreamU8Test, ReadU16) { | |
352 uint16_t u16 = 0; | |
353 ASSERT_FALSE(stream.eof()); | |
354 stream >> u16; | |
355 ASSERT_TRUE(stream.eof()); | |
356 EXPECT_EQ(0U, u16); | |
357 } | |
358 | |
359 TEST_F(BinaryStreamU8Test, ReadU32) { | |
360 uint32_t u32 = 0; | |
361 ASSERT_FALSE(stream.eof()); | |
362 stream >> u32; | |
363 ASSERT_TRUE(stream.eof()); | |
364 EXPECT_EQ(0U, u32); | |
365 } | |
366 | |
367 TEST_F(BinaryStreamU8Test, ReadU64) { | |
368 uint64_t u64 = 0; | |
369 ASSERT_FALSE(stream.eof()); | |
370 stream >> u64; | |
371 ASSERT_TRUE(stream.eof()); | |
372 EXPECT_EQ(0U, u64); | |
373 } | |
374 | |
375 TEST_F(BinaryStreamU8Test, ReadString) { | |
376 string s(""); | |
377 ASSERT_FALSE(stream.eof()); | |
378 stream >> s; | |
379 ASSERT_TRUE(stream.eof()); | |
380 EXPECT_EQ("", s); | |
381 } | |
382 | |
383 | |
384 TEST(BinaryStreamTest, InitWithData) { | |
385 const char *data = "abcd"; | |
386 binarystream stream(data); | |
387 uint8_t a, b, c, d; | |
388 stream >> a >> b >> c >> d; | |
389 ASSERT_FALSE(stream.eof()); | |
390 EXPECT_EQ('a', a); | |
391 EXPECT_EQ('b', b); | |
392 EXPECT_EQ('c', c); | |
393 EXPECT_EQ('d', d); | |
394 } | |
395 | |
396 TEST(BinaryStreamTest, InitWithDataLeadingNull) { | |
397 const char *data = "\0abcd"; | |
398 binarystream stream(data, 5); | |
399 uint8_t z, a, b, c, d; | |
400 stream >> z >> a >> b >> c >> d; | |
401 ASSERT_FALSE(stream.eof()); | |
402 EXPECT_EQ(0U, z); | |
403 EXPECT_EQ('a', a); | |
404 EXPECT_EQ('b', b); | |
405 EXPECT_EQ('c', c); | |
406 EXPECT_EQ('d', d); | |
407 } | |
408 | |
409 TEST(BinaryStreamTest, InitWithDataVector) { | |
410 vector<char> data; | |
411 data.push_back('a'); | |
412 data.push_back('b'); | |
413 data.push_back('c'); | |
414 data.push_back('d'); | |
415 data.push_back('e'); | |
416 data.resize(4); | |
417 binarystream stream(&data[0], data.size()); | |
418 uint8_t a, b, c, d; | |
419 stream >> a >> b >> c >> d; | |
420 ASSERT_FALSE(stream.eof()); | |
421 EXPECT_EQ('a', a); | |
422 EXPECT_EQ('b', b); | |
423 EXPECT_EQ('c', c); | |
424 EXPECT_EQ('d', d); | |
425 } | |
426 | |
427 } // namespace | |
428 | |
429 int main(int argc, char *argv[]) { | |
430 ::testing::InitGoogleTest(&argc, argv); | |
431 return RUN_ALL_TESTS(); | |
432 } | |
OLD | NEW |