1 //===- MsgPackReaderTest.cpp ------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/BinaryFormat/MsgPackReader.h"
10 #include "llvm/BinaryFormat/MsgPack.h"
11 #include "gtest/gtest.h"
14 using namespace llvm::msgpack
;
16 struct MsgPackReader
: testing::Test
{
21 TEST_F(MsgPackReader
, TestReadMultiple
) {
23 Reader
MPReader(Buffer
);
25 auto ContinueOrErr
= MPReader
.read(Obj
);
26 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
27 EXPECT_TRUE(*ContinueOrErr
);
28 EXPECT_EQ(Obj
.Kind
, Type::Nil
);
31 auto ContinueOrErr
= MPReader
.read(Obj
);
32 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
33 EXPECT_TRUE(*ContinueOrErr
);
34 EXPECT_EQ(Obj
.Kind
, Type::Boolean
);
35 EXPECT_EQ(Obj
.Bool
, false);
38 auto ContinueOrErr
= MPReader
.read(Obj
);
39 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
40 EXPECT_FALSE(*ContinueOrErr
);
44 TEST_F(MsgPackReader
, TestReadNil
) {
46 Reader
MPReader(Buffer
);
47 auto ContinueOrErr
= MPReader
.read(Obj
);
48 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
49 EXPECT_TRUE(*ContinueOrErr
);
50 EXPECT_EQ(Obj
.Kind
, Type::Nil
);
53 TEST_F(MsgPackReader
, TestReadBoolFalse
) {
55 Reader
MPReader(Buffer
);
56 auto ContinueOrErr
= MPReader
.read(Obj
);
57 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
58 EXPECT_TRUE(*ContinueOrErr
);
59 EXPECT_EQ(Obj
.Kind
, Type::Boolean
);
60 EXPECT_EQ(Obj
.Bool
, false);
63 TEST_F(MsgPackReader
, TestReadBoolTrue
) {
65 Reader
MPReader(Buffer
);
66 auto ContinueOrErr
= MPReader
.read(Obj
);
67 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
68 EXPECT_TRUE(*ContinueOrErr
);
69 EXPECT_EQ(Obj
.Kind
, Type::Boolean
);
70 EXPECT_EQ(Obj
.Bool
, true);
73 TEST_F(MsgPackReader
, TestReadFixNegativeInt
) {
74 // Positive values will be written in a UInt form, so max FixNegativeInt is -1
76 // FixNegativeInt form bitpattern starts with 111, so min FixNegativeInt
78 for (int8_t i
= -1; i
>= -32; --i
) {
79 Buffer
.assign(1, static_cast<char>(i
));
80 Reader
MPReader(Buffer
);
81 auto ContinueOrErr
= MPReader
.read(Obj
);
82 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
83 EXPECT_TRUE(*ContinueOrErr
);
84 EXPECT_EQ(Obj
.Kind
, Type::Int
);
85 EXPECT_EQ(Obj
.Int
, i
);
89 TEST_F(MsgPackReader
, TestReadInt8Max
) {
91 Reader
MPReader(Buffer
);
92 auto ContinueOrErr
= MPReader
.read(Obj
);
93 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
94 EXPECT_TRUE(*ContinueOrErr
);
95 EXPECT_EQ(Obj
.Kind
, Type::Int
);
96 EXPECT_EQ(Obj
.Int
, INT8_MAX
);
99 TEST_F(MsgPackReader
, TestReadInt8Zero
) {
100 Buffer
.assign("\xd0\x00", 2);
101 Reader
MPReader(Buffer
);
102 auto ContinueOrErr
= MPReader
.read(Obj
);
103 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
104 EXPECT_TRUE(*ContinueOrErr
);
105 EXPECT_EQ(Obj
.Kind
, Type::Int
);
106 EXPECT_EQ(Obj
.Int
, 0);
109 TEST_F(MsgPackReader
, TestReadInt8Min
) {
111 Reader
MPReader(Buffer
);
112 auto ContinueOrErr
= MPReader
.read(Obj
);
113 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
114 EXPECT_TRUE(*ContinueOrErr
);
115 EXPECT_EQ(Obj
.Kind
, Type::Int
);
116 EXPECT_EQ(Obj
.Int
, INT8_MIN
);
119 TEST_F(MsgPackReader
, TestReadInt16Max
) {
120 Buffer
= "\xd1\x7f\xff";
121 Reader
MPReader(Buffer
);
122 auto ContinueOrErr
= MPReader
.read(Obj
);
123 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
124 EXPECT_TRUE(*ContinueOrErr
);
125 EXPECT_EQ(Obj
.Kind
, Type::Int
);
126 EXPECT_EQ(Obj
.Int
, INT16_MAX
);
129 TEST_F(MsgPackReader
, TestReadInt16Zero
) {
130 Buffer
.assign("\xd1\x00\x00", 3);
131 Reader
MPReader(Buffer
);
132 auto ContinueOrErr
= MPReader
.read(Obj
);
133 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
134 EXPECT_TRUE(*ContinueOrErr
);
135 EXPECT_EQ(Obj
.Kind
, Type::Int
);
136 EXPECT_EQ(Obj
.Int
, 0);
139 TEST_F(MsgPackReader
, TestReadInt16Min
) {
140 Buffer
.assign("\xd1\x80\x00", 3);
141 Reader
MPReader(Buffer
);
142 auto ContinueOrErr
= MPReader
.read(Obj
);
143 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
144 EXPECT_TRUE(*ContinueOrErr
);
145 EXPECT_EQ(Obj
.Kind
, Type::Int
);
146 EXPECT_EQ(Obj
.Int
, INT16_MIN
);
149 TEST_F(MsgPackReader
, TestReadInt32Max
) {
150 Buffer
= "\xd2\x7f\xff\xff\xff";
151 Reader
MPReader(Buffer
);
152 auto ContinueOrErr
= MPReader
.read(Obj
);
153 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
154 EXPECT_TRUE(*ContinueOrErr
);
155 EXPECT_EQ(Obj
.Kind
, Type::Int
);
156 EXPECT_EQ(Obj
.Int
, INT32_MAX
);
159 TEST_F(MsgPackReader
, TestReadInt32Zero
) {
160 Buffer
.assign("\xd2\x00\x00\x00\x00", 5);
161 Reader
MPReader(Buffer
);
162 auto ContinueOrErr
= MPReader
.read(Obj
);
163 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
164 EXPECT_TRUE(*ContinueOrErr
);
165 EXPECT_EQ(Obj
.Kind
, Type::Int
);
166 EXPECT_EQ(Obj
.Int
, 0);
169 TEST_F(MsgPackReader
, TestReadInt32Min
) {
170 Buffer
.assign("\xd2\x80\x00\x00\x00", 5);
171 Reader
MPReader(Buffer
);
172 auto ContinueOrErr
= MPReader
.read(Obj
);
173 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
174 EXPECT_TRUE(*ContinueOrErr
);
175 EXPECT_EQ(Obj
.Kind
, Type::Int
);
176 EXPECT_EQ(Obj
.Int
, INT32_MIN
);
179 TEST_F(MsgPackReader
, TestReadInt64Max
) {
180 Buffer
= "\xd3\x7f\xff\xff\xff\xff\xff\xff\xff";
181 Reader
MPReader(Buffer
);
182 auto ContinueOrErr
= MPReader
.read(Obj
);
183 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
184 EXPECT_TRUE(*ContinueOrErr
);
185 EXPECT_EQ(Obj
.Kind
, Type::Int
);
186 EXPECT_EQ(Obj
.Int
, INT64_MAX
);
189 TEST_F(MsgPackReader
, TestReadInt64Zero
) {
190 Buffer
.assign("\xd3\x00\x00\x00\x00\x00\x00\x00\x00", 9);
191 Reader
MPReader(Buffer
);
192 auto ContinueOrErr
= MPReader
.read(Obj
);
193 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
194 EXPECT_TRUE(*ContinueOrErr
);
195 EXPECT_EQ(Obj
.Kind
, Type::Int
);
196 EXPECT_EQ(Obj
.Int
, 0);
199 TEST_F(MsgPackReader
, TestReadInt64Min
) {
200 Buffer
.assign("\xd3\x80\x00\x00\x00\x00\x00\x00\x00", 9);
201 Reader
MPReader(Buffer
);
202 auto ContinueOrErr
= MPReader
.read(Obj
);
203 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
204 EXPECT_TRUE(*ContinueOrErr
);
205 EXPECT_EQ(Obj
.Kind
, Type::Int
);
206 EXPECT_EQ(Obj
.Int
, INT64_MIN
);
209 TEST_F(MsgPackReader
, TestReadFixPositiveInt
) {
210 // FixPositiveInt form bitpattern starts with 0, so max FixPositiveInt
212 for (uint64_t u
= 0; u
<= 127; ++u
) {
213 Buffer
.assign(1, static_cast<char>(u
));
214 Reader
MPReader(Buffer
);
215 auto ContinueOrErr
= MPReader
.read(Obj
);
216 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
217 EXPECT_TRUE(*ContinueOrErr
);
218 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
219 EXPECT_EQ(Obj
.UInt
, u
);
223 TEST_F(MsgPackReader
, TestReadUInt8Zero
) {
224 Buffer
.assign("\xcc\x00", 2);
225 Reader
MPReader(Buffer
);
226 auto ContinueOrErr
= MPReader
.read(Obj
);
227 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
228 EXPECT_TRUE(*ContinueOrErr
);
229 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
230 EXPECT_EQ(Obj
.UInt
, 0u);
233 TEST_F(MsgPackReader
, TestReadUInt8One
) {
235 Reader
MPReader(Buffer
);
236 auto ContinueOrErr
= MPReader
.read(Obj
);
237 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
238 EXPECT_TRUE(*ContinueOrErr
);
239 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
240 EXPECT_EQ(Obj
.UInt
, 1u);
243 TEST_F(MsgPackReader
, TestReadUInt8Max
) {
245 Reader
MPReader(Buffer
);
246 auto ContinueOrErr
= MPReader
.read(Obj
);
247 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
248 EXPECT_TRUE(*ContinueOrErr
);
249 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
250 EXPECT_EQ(Obj
.UInt
, static_cast<uint8_t>(UINT8_MAX
));
253 TEST_F(MsgPackReader
, TestReadUInt16Zero
) {
254 Buffer
.assign("\xcd\x00\x00", 3);
255 Reader
MPReader(Buffer
);
256 auto ContinueOrErr
= MPReader
.read(Obj
);
257 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
258 EXPECT_TRUE(*ContinueOrErr
);
259 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
260 EXPECT_EQ(Obj
.UInt
, 0u);
263 TEST_F(MsgPackReader
, TestReadUInt16One
) {
264 Buffer
.assign("\xcd\x00\x01", 3);
265 Reader
MPReader(Buffer
);
266 auto ContinueOrErr
= MPReader
.read(Obj
);
267 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
268 EXPECT_TRUE(*ContinueOrErr
);
269 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
270 EXPECT_EQ(Obj
.UInt
, 1u);
273 TEST_F(MsgPackReader
, TestReadUInt16Max
) {
274 Buffer
= "\xcd\xff\xff";
275 Reader
MPReader(Buffer
);
276 auto ContinueOrErr
= MPReader
.read(Obj
);
277 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
278 EXPECT_TRUE(*ContinueOrErr
);
279 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
280 EXPECT_EQ(Obj
.UInt
, static_cast<uint16_t>(UINT16_MAX
));
283 TEST_F(MsgPackReader
, TestReadUInt32Zero
) {
284 Buffer
.assign("\xce\x00\x00\x00\x00", 5);
285 Reader
MPReader(Buffer
);
286 auto ContinueOrErr
= MPReader
.read(Obj
);
287 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
288 EXPECT_TRUE(*ContinueOrErr
);
289 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
290 EXPECT_EQ(Obj
.UInt
, 0u);
293 TEST_F(MsgPackReader
, TestReadUInt32One
) {
294 Buffer
.assign("\xce\x00\x00\x00\x01", 5);
295 Reader
MPReader(Buffer
);
296 auto ContinueOrErr
= MPReader
.read(Obj
);
297 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
298 EXPECT_TRUE(*ContinueOrErr
);
299 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
300 EXPECT_EQ(Obj
.UInt
, 1u);
303 TEST_F(MsgPackReader
, TestReadUInt32Max
) {
304 Buffer
= "\xce\xff\xff\xff\xff";
305 Reader
MPReader(Buffer
);
306 auto ContinueOrErr
= MPReader
.read(Obj
);
307 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
308 EXPECT_TRUE(*ContinueOrErr
);
309 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
310 EXPECT_EQ(Obj
.UInt
, static_cast<uint32_t>(UINT32_MAX
));
313 TEST_F(MsgPackReader
, TestReadUInt64Zero
) {
314 Buffer
.assign("\xcf\x00\x00\x00\x00\x00\x00\x00\x00", 9);
315 Reader
MPReader(Buffer
);
316 auto ContinueOrErr
= MPReader
.read(Obj
);
317 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
318 EXPECT_TRUE(*ContinueOrErr
);
319 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
320 EXPECT_EQ(Obj
.UInt
, 0u);
323 TEST_F(MsgPackReader
, TestReadUInt64One
) {
324 Buffer
.assign("\xcf\x00\x00\x00\x00\x00\x00\x00\x01", 9);
325 Reader
MPReader(Buffer
);
326 auto ContinueOrErr
= MPReader
.read(Obj
);
327 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
328 EXPECT_TRUE(*ContinueOrErr
);
329 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
330 EXPECT_EQ(Obj
.UInt
, 1u);
333 TEST_F(MsgPackReader
, TestReadUInt64Max
) {
334 Buffer
= "\xcf\xff\xff\xff\xff\xff\xff\xff\xff";
335 Reader
MPReader(Buffer
);
336 auto ContinueOrErr
= MPReader
.read(Obj
);
337 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
338 EXPECT_TRUE(*ContinueOrErr
);
339 EXPECT_EQ(Obj
.Kind
, Type::UInt
);
340 EXPECT_EQ(Obj
.UInt
, static_cast<uint64_t>(UINT64_MAX
));
343 TEST_F(MsgPackReader
, TestReadFloat32
) {
344 Buffer
= "\xca\xee\xee\xee\xef";
345 Reader
MPReader(Buffer
);
346 auto ContinueOrErr
= MPReader
.read(Obj
);
347 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
348 EXPECT_TRUE(*ContinueOrErr
);
349 EXPECT_EQ(Obj
.Kind
, Type::Float
);
350 EXPECT_EQ(Obj
.Float
, -3.6973142664068907e+28f
);
353 TEST_F(MsgPackReader
, TestReadFloat64
) {
354 Buffer
= "\xcb\xee\xee\xee\xee\xee\xee\xee\xef";
355 Reader
MPReader(Buffer
);
356 auto ContinueOrErr
= MPReader
.read(Obj
);
357 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
358 EXPECT_TRUE(*ContinueOrErr
);
359 EXPECT_EQ(Obj
.Kind
, Type::Float
);
360 EXPECT_EQ(Obj
.Float
, -2.2899894549927042e+226);
363 TEST_F(MsgPackReader
, TestReadFixStrZero
) {
365 Reader
MPReader(Buffer
);
366 auto ContinueOrErr
= MPReader
.read(Obj
);
367 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
368 EXPECT_TRUE(*ContinueOrErr
);
369 EXPECT_EQ(Obj
.Kind
, Type::String
);
370 EXPECT_EQ(Obj
.Raw
, StringRef());
373 TEST_F(MsgPackReader
, TestReadFixStrOne
) {
374 std::string
Result(1, 'a');
375 Buffer
= std::string("\xa1") + Result
;
376 Reader
MPReader(Buffer
);
377 auto ContinueOrErr
= MPReader
.read(Obj
);
378 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
379 EXPECT_TRUE(*ContinueOrErr
);
380 EXPECT_EQ(Obj
.Kind
, Type::String
);
381 EXPECT_EQ(Obj
.Raw
, Result
);
384 TEST_F(MsgPackReader
, TestReadFixStrMax
) {
385 // FixStr format's size is a 5 bit unsigned integer, so max is 11111 = 31
386 std::string
Result(31, 'a');
387 Buffer
= std::string("\xbf") + Result
;
388 Reader
MPReader(Buffer
);
389 auto ContinueOrErr
= MPReader
.read(Obj
);
390 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
391 EXPECT_TRUE(*ContinueOrErr
);
392 EXPECT_EQ(Obj
.Kind
, Type::String
);
393 EXPECT_EQ(Obj
.Raw
, Result
);
396 TEST_F(MsgPackReader
, TestReadStr8Zero
) {
397 Buffer
.assign("\xd9\x00", 2);
398 Reader
MPReader(Buffer
);
399 auto ContinueOrErr
= MPReader
.read(Obj
);
400 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
401 EXPECT_TRUE(*ContinueOrErr
);
402 EXPECT_EQ(Obj
.Kind
, Type::String
);
403 EXPECT_EQ(Obj
.Raw
, StringRef());
406 TEST_F(MsgPackReader
, TestReadStr8One
) {
407 std::string
Result(1, 'a');
408 Buffer
= std::string("\xd9\x01") + Result
;
409 Reader
MPReader(Buffer
);
410 auto ContinueOrErr
= MPReader
.read(Obj
);
411 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
412 EXPECT_TRUE(*ContinueOrErr
);
413 EXPECT_EQ(Obj
.Kind
, Type::String
);
414 EXPECT_EQ(Obj
.Raw
, Result
);
417 TEST_F(MsgPackReader
, TestReadStr8Max
) {
418 std::string
Result(UINT8_MAX
, 'a');
419 Buffer
= std::string("\xd9\xff") + Result
;
420 Reader
MPReader(Buffer
);
421 auto ContinueOrErr
= MPReader
.read(Obj
);
422 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
423 EXPECT_TRUE(*ContinueOrErr
);
424 EXPECT_EQ(Obj
.Kind
, Type::String
);
425 EXPECT_EQ(Obj
.Raw
, Result
);
428 TEST_F(MsgPackReader
, TestReadStr16Zero
) {
429 Buffer
.assign("\xda\x00\x00", 3);
430 Reader
MPReader(Buffer
);
431 auto ContinueOrErr
= MPReader
.read(Obj
);
432 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
433 EXPECT_TRUE(*ContinueOrErr
);
434 EXPECT_EQ(Obj
.Kind
, Type::String
);
435 EXPECT_EQ(Obj
.Raw
, StringRef());
438 TEST_F(MsgPackReader
, TestReadStr16One
) {
439 std::string
Result(1, 'a');
440 Buffer
= std::string("\xda\x00\x01", 3) + Result
;
441 Reader
MPReader(Buffer
);
442 auto ContinueOrErr
= MPReader
.read(Obj
);
443 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
444 EXPECT_TRUE(*ContinueOrErr
);
445 EXPECT_EQ(Obj
.Kind
, Type::String
);
446 EXPECT_EQ(Obj
.Raw
, Result
);
449 TEST_F(MsgPackReader
, TestReadStr16Max
) {
450 std::string
Result(UINT16_MAX
, 'a');
451 Buffer
= std::string("\xda\xff\xff") + Result
;
452 Reader
MPReader(Buffer
);
453 auto ContinueOrErr
= MPReader
.read(Obj
);
454 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
455 EXPECT_TRUE(*ContinueOrErr
);
456 EXPECT_EQ(Obj
.Kind
, Type::String
);
457 EXPECT_EQ(Obj
.Raw
, Result
);
460 TEST_F(MsgPackReader
, TestReadStr32Zero
) {
461 Buffer
.assign("\xdb\x00\x00\x00\x00", 5);
462 Reader
MPReader(Buffer
);
463 auto ContinueOrErr
= MPReader
.read(Obj
);
464 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
465 EXPECT_TRUE(*ContinueOrErr
);
466 EXPECT_EQ(Obj
.Kind
, Type::String
);
467 EXPECT_EQ(Obj
.Raw
, StringRef());
470 TEST_F(MsgPackReader
, TestReadStr32One
) {
471 std::string
Result(1, 'a');
472 Buffer
= std::string("\xdb\x00\x00\x00\x01", 5) + Result
;
473 Reader
MPReader(Buffer
);
474 auto ContinueOrErr
= MPReader
.read(Obj
);
475 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
476 EXPECT_TRUE(*ContinueOrErr
);
477 EXPECT_EQ(Obj
.Kind
, Type::String
);
478 EXPECT_EQ(Obj
.Raw
, Result
);
481 TEST_F(MsgPackReader
, TestReadStr32Max
) {
482 std::string
Result(static_cast<uint32_t>(UINT16_MAX
) + 1, 'a');
483 Buffer
= std::string("\xdb\x00\x01\x00\x00", 5) + Result
;
484 Reader
MPReader(Buffer
);
485 auto ContinueOrErr
= MPReader
.read(Obj
);
486 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
487 EXPECT_TRUE(*ContinueOrErr
);
488 EXPECT_EQ(Obj
.Kind
, Type::String
);
489 EXPECT_EQ(Obj
.Raw
, Result
);
492 TEST_F(MsgPackReader
, TestReadBin8Zero
) {
493 Buffer
.assign("\xc4\x00", 2);
494 Reader
MPReader(Buffer
);
495 auto ContinueOrErr
= MPReader
.read(Obj
);
496 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
497 EXPECT_TRUE(*ContinueOrErr
);
498 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
499 EXPECT_EQ(Obj
.Raw
, StringRef());
502 TEST_F(MsgPackReader
, TestReadBin8One
) {
503 std::string
Result(1, 'a');
504 Buffer
= std::string("\xc4\x01") + Result
;
505 Reader
MPReader(Buffer
);
506 auto ContinueOrErr
= MPReader
.read(Obj
);
507 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
508 EXPECT_TRUE(*ContinueOrErr
);
509 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
510 EXPECT_EQ(Obj
.Raw
, Result
);
513 TEST_F(MsgPackReader
, TestReadBin8Max
) {
514 std::string
Result(UINT8_MAX
, 'a');
515 Buffer
= std::string("\xc4\xff") + Result
;
516 Reader
MPReader(Buffer
);
517 auto ContinueOrErr
= MPReader
.read(Obj
);
518 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
519 EXPECT_TRUE(*ContinueOrErr
);
520 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
521 EXPECT_EQ(Obj
.Raw
, Result
);
524 TEST_F(MsgPackReader
, TestReadBin16Zero
) {
525 Buffer
.assign("\xc5\x00\x00", 3);
526 Reader
MPReader(Buffer
);
527 auto ContinueOrErr
= MPReader
.read(Obj
);
528 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
529 EXPECT_TRUE(*ContinueOrErr
);
530 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
531 EXPECT_EQ(Obj
.Raw
, StringRef());
534 TEST_F(MsgPackReader
, TestReadBin16One
) {
535 std::string
Result(1, 'a');
536 Buffer
= std::string("\xc5\x00\x01", 3) + Result
;
537 Reader
MPReader(Buffer
);
538 auto ContinueOrErr
= MPReader
.read(Obj
);
539 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
540 EXPECT_TRUE(*ContinueOrErr
);
541 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
542 EXPECT_EQ(Obj
.Raw
, Result
);
545 TEST_F(MsgPackReader
, TestReadBin16Max
) {
546 std::string
Result(UINT16_MAX
, 'a');
547 Buffer
= std::string("\xc5\xff\xff") + Result
;
548 Reader
MPReader(Buffer
);
549 auto ContinueOrErr
= MPReader
.read(Obj
);
550 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
551 EXPECT_TRUE(*ContinueOrErr
);
552 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
553 EXPECT_EQ(Obj
.Raw
, Result
);
556 TEST_F(MsgPackReader
, TestReadBin32Zero
) {
557 Buffer
.assign("\xc6\x00\x00\x00\x00", 5);
558 Reader
MPReader(Buffer
);
559 auto ContinueOrErr
= MPReader
.read(Obj
);
560 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
561 EXPECT_TRUE(*ContinueOrErr
);
562 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
563 EXPECT_EQ(Obj
.Raw
, StringRef());
566 TEST_F(MsgPackReader
, TestReadBin32One
) {
567 std::string
Result(1, 'a');
568 Buffer
= std::string("\xc6\x00\x00\x00\x01", 5) + Result
;
569 Reader
MPReader(Buffer
);
570 auto ContinueOrErr
= MPReader
.read(Obj
);
571 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
572 EXPECT_TRUE(*ContinueOrErr
);
573 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
574 EXPECT_EQ(Obj
.Raw
, Result
);
577 TEST_F(MsgPackReader
, TestReadBin32Max
) {
578 std::string
Result(static_cast<uint32_t>(UINT16_MAX
) + 1, 'a');
579 Buffer
= std::string("\xc6\x00\x01\x00\x00", 5) + Result
;
580 Reader
MPReader(Buffer
);
581 auto ContinueOrErr
= MPReader
.read(Obj
);
582 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
583 EXPECT_TRUE(*ContinueOrErr
);
584 EXPECT_EQ(Obj
.Kind
, Type::Binary
);
585 EXPECT_EQ(Obj
.Raw
, Result
);
588 TEST_F(MsgPackReader
, TestReadFixArrayZero
) {
590 Reader
MPReader(Buffer
);
591 auto ContinueOrErr
= MPReader
.read(Obj
);
592 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
593 EXPECT_TRUE(*ContinueOrErr
);
594 EXPECT_EQ(Obj
.Kind
, Type::Array
);
595 EXPECT_EQ(Obj
.Length
, 0u);
598 TEST_F(MsgPackReader
, TestReadFixArrayOne
) {
600 Reader
MPReader(Buffer
);
601 auto ContinueOrErr
= MPReader
.read(Obj
);
602 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
603 EXPECT_TRUE(*ContinueOrErr
);
604 EXPECT_EQ(Obj
.Kind
, Type::Array
);
605 EXPECT_EQ(Obj
.Length
, 1u);
608 TEST_F(MsgPackReader
, TestReadFixArrayMax
) {
610 Reader
MPReader(Buffer
);
611 auto ContinueOrErr
= MPReader
.read(Obj
);
612 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
613 EXPECT_TRUE(*ContinueOrErr
);
614 EXPECT_EQ(Obj
.Kind
, Type::Array
);
615 // FixArray format's size is a 4 bit unsigned integer, so max is 1111 = 15
616 EXPECT_EQ(Obj
.Length
, 15u);
619 TEST_F(MsgPackReader
, TestReadArray16Zero
) {
620 Buffer
.assign("\xdc\x00\x00", 3);
621 Reader
MPReader(Buffer
);
622 auto ContinueOrErr
= MPReader
.read(Obj
);
623 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
624 EXPECT_TRUE(*ContinueOrErr
);
625 EXPECT_EQ(Obj
.Kind
, Type::Array
);
626 EXPECT_EQ(Obj
.Length
, 0u);
629 TEST_F(MsgPackReader
, TestReadArray16One
) {
630 Buffer
.assign("\xdc\x00\x01", 3);
631 Reader
MPReader(Buffer
);
632 auto ContinueOrErr
= MPReader
.read(Obj
);
633 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
634 EXPECT_TRUE(*ContinueOrErr
);
635 EXPECT_EQ(Obj
.Kind
, Type::Array
);
636 EXPECT_EQ(Obj
.Length
, 1u);
639 TEST_F(MsgPackReader
, TestReadArray16Max
) {
640 Buffer
= "\xdc\xff\xff";
641 Reader
MPReader(Buffer
);
642 auto ContinueOrErr
= MPReader
.read(Obj
);
643 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
644 EXPECT_TRUE(*ContinueOrErr
);
645 EXPECT_EQ(Obj
.Kind
, Type::Array
);
646 EXPECT_EQ(Obj
.Length
, static_cast<uint16_t>(UINT16_MAX
));
649 TEST_F(MsgPackReader
, TestReadArray32Zero
) {
650 Buffer
.assign("\xdd\x00\x00\x00\x00", 5);
651 Reader
MPReader(Buffer
);
652 auto ContinueOrErr
= MPReader
.read(Obj
);
653 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
654 EXPECT_TRUE(*ContinueOrErr
);
655 EXPECT_EQ(Obj
.Kind
, Type::Array
);
656 EXPECT_EQ(Obj
.Length
, 0u);
659 TEST_F(MsgPackReader
, TestReadArray32One
) {
660 Buffer
.assign("\xdd\x00\x00\x00\x01", 5);
661 Reader
MPReader(Buffer
);
662 auto ContinueOrErr
= MPReader
.read(Obj
);
663 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
664 EXPECT_TRUE(*ContinueOrErr
);
665 EXPECT_EQ(Obj
.Kind
, Type::Array
);
666 EXPECT_EQ(Obj
.Length
, 1u);
669 TEST_F(MsgPackReader
, TestReadArray32Max
) {
670 Buffer
= "\xdd\xff\xff\xff\xff";
671 Reader
MPReader(Buffer
);
672 auto ContinueOrErr
= MPReader
.read(Obj
);
673 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
674 EXPECT_TRUE(*ContinueOrErr
);
675 EXPECT_EQ(Obj
.Kind
, Type::Array
);
676 EXPECT_EQ(Obj
.Length
, static_cast<uint32_t>(UINT32_MAX
));
679 TEST_F(MsgPackReader
, TestReadFixMapZero
) {
681 Reader
MPReader(Buffer
);
682 auto ContinueOrErr
= MPReader
.read(Obj
);
683 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
684 EXPECT_TRUE(*ContinueOrErr
);
685 EXPECT_EQ(Obj
.Kind
, Type::Map
);
686 EXPECT_EQ(Obj
.Length
, 0u);
689 TEST_F(MsgPackReader
, TestReadFixMapOne
) {
691 Reader
MPReader(Buffer
);
692 auto ContinueOrErr
= MPReader
.read(Obj
);
693 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
694 EXPECT_TRUE(*ContinueOrErr
);
695 EXPECT_EQ(Obj
.Kind
, Type::Map
);
696 EXPECT_EQ(Obj
.Length
, 1u);
699 TEST_F(MsgPackReader
, TestReadFixMapMax
) {
701 Reader
MPReader(Buffer
);
702 auto ContinueOrErr
= MPReader
.read(Obj
);
703 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
704 EXPECT_TRUE(*ContinueOrErr
);
705 EXPECT_EQ(Obj
.Kind
, Type::Map
);
706 // FixMap format's size is a 4 bit unsigned integer, so max is 1111 = 15
707 EXPECT_EQ(Obj
.Length
, 15u);
710 TEST_F(MsgPackReader
, TestReadMap16Zero
) {
711 Buffer
.assign("\xde\x00\x00", 3);
712 Reader
MPReader(Buffer
);
713 auto ContinueOrErr
= MPReader
.read(Obj
);
714 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
715 EXPECT_TRUE(*ContinueOrErr
);
716 EXPECT_EQ(Obj
.Kind
, Type::Map
);
717 EXPECT_EQ(Obj
.Length
, 0u);
720 TEST_F(MsgPackReader
, TestReadMap16One
) {
721 Buffer
.assign("\xde\x00\x01", 3);
722 Reader
MPReader(Buffer
);
723 auto ContinueOrErr
= MPReader
.read(Obj
);
724 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
725 EXPECT_TRUE(*ContinueOrErr
);
726 EXPECT_EQ(Obj
.Kind
, Type::Map
);
727 EXPECT_EQ(Obj
.Length
, 1u);
730 TEST_F(MsgPackReader
, TestReadMap16Max
) {
731 Buffer
= "\xde\xff\xff";
732 Reader
MPReader(Buffer
);
733 auto ContinueOrErr
= MPReader
.read(Obj
);
734 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
735 EXPECT_TRUE(*ContinueOrErr
);
736 EXPECT_EQ(Obj
.Kind
, Type::Map
);
737 EXPECT_EQ(Obj
.Length
, static_cast<uint16_t>(UINT16_MAX
));
740 TEST_F(MsgPackReader
, TestReadMap32Zero
) {
741 Buffer
.assign("\xdf\x00\x00\x00\x00", 5);
742 Reader
MPReader(Buffer
);
743 auto ContinueOrErr
= MPReader
.read(Obj
);
744 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
745 EXPECT_TRUE(*ContinueOrErr
);
746 EXPECT_EQ(Obj
.Kind
, Type::Map
);
747 EXPECT_EQ(Obj
.Length
, 0u);
750 TEST_F(MsgPackReader
, TestReadMap32One
) {
751 Buffer
.assign("\xdf\x00\x00\x00\x01", 5);
752 Reader
MPReader(Buffer
);
753 auto ContinueOrErr
= MPReader
.read(Obj
);
754 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
755 EXPECT_TRUE(*ContinueOrErr
);
756 EXPECT_EQ(Obj
.Kind
, Type::Map
);
757 EXPECT_EQ(Obj
.Length
, 1u);
760 TEST_F(MsgPackReader
, TestReadMap32Max
) {
761 Buffer
= "\xdf\xff\xff\xff\xff";
762 Reader
MPReader(Buffer
);
763 auto ContinueOrErr
= MPReader
.read(Obj
);
764 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
765 EXPECT_TRUE(*ContinueOrErr
);
766 EXPECT_EQ(Obj
.Kind
, Type::Map
);
767 EXPECT_EQ(Obj
.Length
, static_cast<uint32_t>(UINT32_MAX
));
770 // FixExt formats are only available for these specific lengths: 1, 2, 4, 8, 16
772 TEST_F(MsgPackReader
, TestReadFixExt1
) {
773 std::string
Result(1, 'a');
774 Buffer
= std::string("\xd4\x01") + Result
;
775 Reader
MPReader(Buffer
);
776 auto ContinueOrErr
= MPReader
.read(Obj
);
777 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
778 EXPECT_TRUE(*ContinueOrErr
);
779 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
780 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
781 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
784 TEST_F(MsgPackReader
, TestReadFixExt2
) {
785 std::string
Result(2, 'a');
786 Buffer
= std::string("\xd5\x01") + Result
;
787 Reader
MPReader(Buffer
);
788 auto ContinueOrErr
= MPReader
.read(Obj
);
789 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
790 EXPECT_TRUE(*ContinueOrErr
);
791 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
792 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
793 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
796 TEST_F(MsgPackReader
, TestReadFixExt4
) {
797 std::string
Result(4, 'a');
798 Buffer
= std::string("\xd6\x01") + Result
;
799 Reader
MPReader(Buffer
);
800 auto ContinueOrErr
= MPReader
.read(Obj
);
801 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
802 EXPECT_TRUE(*ContinueOrErr
);
803 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
804 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
805 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
808 TEST_F(MsgPackReader
, TestReadFixExt8
) {
809 std::string
Result(8, 'a');
810 Buffer
= std::string("\xd7\x01") + Result
;
811 Reader
MPReader(Buffer
);
812 auto ContinueOrErr
= MPReader
.read(Obj
);
813 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
814 EXPECT_TRUE(*ContinueOrErr
);
815 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
816 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
817 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
820 TEST_F(MsgPackReader
, TestReadFixExt16
) {
821 std::string
Result(16, 'a');
822 Buffer
= std::string("\xd8\x01") + Result
;
823 Reader
MPReader(Buffer
);
824 auto ContinueOrErr
= MPReader
.read(Obj
);
825 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
826 EXPECT_TRUE(*ContinueOrErr
);
827 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
828 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
829 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
832 TEST_F(MsgPackReader
, TestReadExt8Min
) {
833 // There are fix variants for sizes 1 and 2
834 Buffer
.assign("\xc7\x00\x01", 3);
835 Reader
MPReader(Buffer
);
836 auto ContinueOrErr
= MPReader
.read(Obj
);
837 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
838 EXPECT_TRUE(*ContinueOrErr
);
839 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
840 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
841 EXPECT_EQ(Obj
.Extension
.Bytes
, StringRef());
844 TEST_F(MsgPackReader
, TestReadExt8Max
) {
845 std::string
Result(UINT8_MAX
, 'a');
846 Buffer
= std::string("\xc7\xff\x01", 3) + Result
;
847 Reader
MPReader(Buffer
);
848 auto ContinueOrErr
= MPReader
.read(Obj
);
849 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
850 EXPECT_TRUE(*ContinueOrErr
);
851 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
852 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
853 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
856 TEST_F(MsgPackReader
, TestReadExt16Min
) {
857 std::string
Result(static_cast<uint16_t>(UINT8_MAX
) + 1, 'a');
858 Buffer
= std::string("\xc8\x01\x00\x01", 4) + Result
;
859 Reader
MPReader(Buffer
);
860 auto ContinueOrErr
= MPReader
.read(Obj
);
861 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
862 EXPECT_TRUE(*ContinueOrErr
);
863 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
864 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
865 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
868 TEST_F(MsgPackReader
, TestReadExt16Max
) {
869 std::string
Result(UINT16_MAX
, 'a');
870 Buffer
= std::string("\xc8\xff\xff\x01") + Result
;
871 Reader
MPReader(Buffer
);
872 auto ContinueOrErr
= MPReader
.read(Obj
);
873 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
874 EXPECT_TRUE(*ContinueOrErr
);
875 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
876 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
877 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);
880 TEST_F(MsgPackReader
, TestReadExt32Min
) {
881 std::string
Result(static_cast<uint32_t>(UINT16_MAX
) + 1, 'a');
882 Buffer
= std::string("\xc9\x00\x01\x00\x00\x01", 6) + Result
;
883 Reader
MPReader(Buffer
);
884 auto ContinueOrErr
= MPReader
.read(Obj
);
885 EXPECT_TRUE(static_cast<bool>(ContinueOrErr
));
886 EXPECT_TRUE(*ContinueOrErr
);
887 EXPECT_EQ(Obj
.Kind
, Type::Extension
);
888 EXPECT_EQ(Obj
.Extension
.Type
, 0x01);
889 EXPECT_EQ(Obj
.Extension
.Bytes
, Result
);