120f9cd88SScott Linder //===- MsgPackReaderTest.cpp ------------------------------------*- C++ -*-===//
220f9cd88SScott Linder //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
620f9cd88SScott Linder //
720f9cd88SScott Linder //===----------------------------------------------------------------------===//
820f9cd88SScott Linder
920f9cd88SScott Linder #include "llvm/BinaryFormat/MsgPackReader.h"
1020f9cd88SScott Linder #include "llvm/BinaryFormat/MsgPack.h"
1120f9cd88SScott Linder #include "gtest/gtest.h"
1220f9cd88SScott Linder
1320f9cd88SScott Linder using namespace llvm;
1420f9cd88SScott Linder using namespace llvm::msgpack;
1520f9cd88SScott Linder
1620f9cd88SScott Linder struct MsgPackReader : testing::Test {
1720f9cd88SScott Linder std::string Buffer;
1820f9cd88SScott Linder Object Obj;
1920f9cd88SScott Linder };
2020f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMultiple)2120f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMultiple) {
2220f9cd88SScott Linder Buffer = "\xc0\xc2";
2320f9cd88SScott Linder Reader MPReader(Buffer);
2420f9cd88SScott Linder {
2520f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
2620f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
2720f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
2820f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Nil);
2920f9cd88SScott Linder }
3020f9cd88SScott Linder {
3120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
3220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
3320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
3420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Boolean);
3520f9cd88SScott Linder EXPECT_EQ(Obj.Bool, false);
3620f9cd88SScott Linder }
3720f9cd88SScott Linder {
3820f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
3920f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
4020f9cd88SScott Linder EXPECT_FALSE(*ContinueOrErr);
4120f9cd88SScott Linder }
4220f9cd88SScott Linder }
4320f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadNil)4420f9cd88SScott Linder TEST_F(MsgPackReader, TestReadNil) {
4520f9cd88SScott Linder Buffer = "\xc0";
4620f9cd88SScott Linder Reader MPReader(Buffer);
4720f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
4820f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
4920f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
5020f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Nil);
5120f9cd88SScott Linder }
5220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBoolFalse)5320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBoolFalse) {
5420f9cd88SScott Linder Buffer = "\xc2";
5520f9cd88SScott Linder Reader MPReader(Buffer);
5620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
5720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
5820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
5920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Boolean);
6020f9cd88SScott Linder EXPECT_EQ(Obj.Bool, false);
6120f9cd88SScott Linder }
6220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBoolTrue)6320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBoolTrue) {
6420f9cd88SScott Linder Buffer = "\xc3";
6520f9cd88SScott Linder Reader MPReader(Buffer);
6620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
6720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
6820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
6920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Boolean);
7020f9cd88SScott Linder EXPECT_EQ(Obj.Bool, true);
7120f9cd88SScott Linder }
7220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixNegativeInt)7320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixNegativeInt) {
7420f9cd88SScott Linder // Positive values will be written in a UInt form, so max FixNegativeInt is -1
7520f9cd88SScott Linder //
7620f9cd88SScott Linder // FixNegativeInt form bitpattern starts with 111, so min FixNegativeInt
7720f9cd88SScott Linder // is 11100000 = -32
7820f9cd88SScott Linder for (int8_t i = -1; i >= -32; --i) {
7920f9cd88SScott Linder Buffer.assign(1, static_cast<char>(i));
8020f9cd88SScott Linder Reader MPReader(Buffer);
8120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
8220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
8320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
8420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
8520f9cd88SScott Linder EXPECT_EQ(Obj.Int, i);
8620f9cd88SScott Linder }
8720f9cd88SScott Linder }
8820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt8Max)8920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt8Max) {
9020f9cd88SScott Linder Buffer = "\xd0\x7f";
9120f9cd88SScott Linder Reader MPReader(Buffer);
9220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
9320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
9420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
9520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
9620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT8_MAX);
9720f9cd88SScott Linder }
9820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt8Zero)9920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt8Zero) {
10020f9cd88SScott Linder Buffer.assign("\xd0\x00", 2);
10120f9cd88SScott Linder Reader MPReader(Buffer);
10220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
10320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
10420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
10520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
10620f9cd88SScott Linder EXPECT_EQ(Obj.Int, 0);
10720f9cd88SScott Linder }
10820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt8Min)10920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt8Min) {
11020f9cd88SScott Linder Buffer = "\xd0\x80";
11120f9cd88SScott Linder Reader MPReader(Buffer);
11220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
11320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
11420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
11520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
11620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT8_MIN);
11720f9cd88SScott Linder }
11820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt16Max)11920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt16Max) {
12020f9cd88SScott Linder Buffer = "\xd1\x7f\xff";
12120f9cd88SScott Linder Reader MPReader(Buffer);
12220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
12320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
12420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
12520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
12620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT16_MAX);
12720f9cd88SScott Linder }
12820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt16Zero)12920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt16Zero) {
13020f9cd88SScott Linder Buffer.assign("\xd1\x00\x00", 3);
13120f9cd88SScott Linder Reader MPReader(Buffer);
13220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
13320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
13420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
13520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
13620f9cd88SScott Linder EXPECT_EQ(Obj.Int, 0);
13720f9cd88SScott Linder }
13820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt16Min)13920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt16Min) {
14020f9cd88SScott Linder Buffer.assign("\xd1\x80\x00", 3);
14120f9cd88SScott Linder Reader MPReader(Buffer);
14220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
14320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
14420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
14520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
14620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT16_MIN);
14720f9cd88SScott Linder }
14820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt32Max)14920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt32Max) {
15020f9cd88SScott Linder Buffer = "\xd2\x7f\xff\xff\xff";
15120f9cd88SScott Linder Reader MPReader(Buffer);
15220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
15320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
15420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
15520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
15620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT32_MAX);
15720f9cd88SScott Linder }
15820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt32Zero)15920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt32Zero) {
16020f9cd88SScott Linder Buffer.assign("\xd2\x00\x00\x00\x00", 5);
16120f9cd88SScott Linder Reader MPReader(Buffer);
16220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
16320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
16420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
16520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
16620f9cd88SScott Linder EXPECT_EQ(Obj.Int, 0);
16720f9cd88SScott Linder }
16820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt32Min)16920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt32Min) {
17020f9cd88SScott Linder Buffer.assign("\xd2\x80\x00\x00\x00", 5);
17120f9cd88SScott Linder Reader MPReader(Buffer);
17220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
17320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
17420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
17520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
17620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT32_MIN);
17720f9cd88SScott Linder }
17820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt64Max)17920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt64Max) {
18020f9cd88SScott Linder Buffer = "\xd3\x7f\xff\xff\xff\xff\xff\xff\xff";
18120f9cd88SScott Linder Reader MPReader(Buffer);
18220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
18320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
18420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
18520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
18620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT64_MAX);
18720f9cd88SScott Linder }
18820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt64Zero)18920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt64Zero) {
19020f9cd88SScott Linder Buffer.assign("\xd3\x00\x00\x00\x00\x00\x00\x00\x00", 9);
19120f9cd88SScott Linder Reader MPReader(Buffer);
19220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
19320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
19420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
19520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
19620f9cd88SScott Linder EXPECT_EQ(Obj.Int, 0);
19720f9cd88SScott Linder }
19820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadInt64Min)19920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadInt64Min) {
20020f9cd88SScott Linder Buffer.assign("\xd3\x80\x00\x00\x00\x00\x00\x00\x00", 9);
20120f9cd88SScott Linder Reader MPReader(Buffer);
20220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
20320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
20420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
20520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Int);
20620f9cd88SScott Linder EXPECT_EQ(Obj.Int, INT64_MIN);
20720f9cd88SScott Linder }
20820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixPositiveInt)20920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixPositiveInt) {
21020f9cd88SScott Linder // FixPositiveInt form bitpattern starts with 0, so max FixPositiveInt
21120f9cd88SScott Linder // is 01111111 = 127
21220f9cd88SScott Linder for (uint64_t u = 0; u <= 127; ++u) {
21320f9cd88SScott Linder Buffer.assign(1, static_cast<char>(u));
21420f9cd88SScott Linder Reader MPReader(Buffer);
21520f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
21620f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
21720f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
21820f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
21920f9cd88SScott Linder EXPECT_EQ(Obj.UInt, u);
22020f9cd88SScott Linder }
22120f9cd88SScott Linder }
22220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt8Zero)22320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt8Zero) {
22420f9cd88SScott Linder Buffer.assign("\xcc\x00", 2);
22520f9cd88SScott Linder Reader MPReader(Buffer);
22620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
22720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
22820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
22920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
23020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 0u);
23120f9cd88SScott Linder }
23220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt8One)23320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt8One) {
23420f9cd88SScott Linder Buffer = "\xcc\x01";
23520f9cd88SScott Linder Reader MPReader(Buffer);
23620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
23720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
23820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
23920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
24020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 1u);
24120f9cd88SScott Linder }
24220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt8Max)24320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt8Max) {
24420f9cd88SScott Linder Buffer = "\xcc\xff";
24520f9cd88SScott Linder Reader MPReader(Buffer);
24620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
24720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
24820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
24920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
25020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, static_cast<uint8_t>(UINT8_MAX));
25120f9cd88SScott Linder }
25220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt16Zero)25320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt16Zero) {
25420f9cd88SScott Linder Buffer.assign("\xcd\x00\x00", 3);
25520f9cd88SScott Linder Reader MPReader(Buffer);
25620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
25720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
25820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
25920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
26020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 0u);
26120f9cd88SScott Linder }
26220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt16One)26320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt16One) {
26420f9cd88SScott Linder Buffer.assign("\xcd\x00\x01", 3);
26520f9cd88SScott Linder Reader MPReader(Buffer);
26620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
26720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
26820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
26920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
27020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 1u);
27120f9cd88SScott Linder }
27220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt16Max)27320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt16Max) {
27420f9cd88SScott Linder Buffer = "\xcd\xff\xff";
27520f9cd88SScott Linder Reader MPReader(Buffer);
27620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
27720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
27820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
27920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
28020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, static_cast<uint16_t>(UINT16_MAX));
28120f9cd88SScott Linder }
28220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt32Zero)28320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt32Zero) {
28420f9cd88SScott Linder Buffer.assign("\xce\x00\x00\x00\x00", 5);
28520f9cd88SScott Linder Reader MPReader(Buffer);
28620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
28720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
28820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
28920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
29020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 0u);
29120f9cd88SScott Linder }
29220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt32One)29320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt32One) {
29420f9cd88SScott Linder Buffer.assign("\xce\x00\x00\x00\x01", 5);
29520f9cd88SScott Linder Reader MPReader(Buffer);
29620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
29720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
29820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
29920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
30020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 1u);
30120f9cd88SScott Linder }
30220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt32Max)30320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt32Max) {
30420f9cd88SScott Linder Buffer = "\xce\xff\xff\xff\xff";
30520f9cd88SScott Linder Reader MPReader(Buffer);
30620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
30720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
30820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
30920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
31020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, static_cast<uint32_t>(UINT32_MAX));
31120f9cd88SScott Linder }
31220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt64Zero)31320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt64Zero) {
31420f9cd88SScott Linder Buffer.assign("\xcf\x00\x00\x00\x00\x00\x00\x00\x00", 9);
31520f9cd88SScott Linder Reader MPReader(Buffer);
31620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
31720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
31820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
31920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
32020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 0u);
32120f9cd88SScott Linder }
32220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt64One)32320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt64One) {
32420f9cd88SScott Linder Buffer.assign("\xcf\x00\x00\x00\x00\x00\x00\x00\x01", 9);
32520f9cd88SScott Linder Reader MPReader(Buffer);
32620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
32720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
32820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
32920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
33020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, 1u);
33120f9cd88SScott Linder }
33220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadUInt64Max)33320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadUInt64Max) {
33420f9cd88SScott Linder Buffer = "\xcf\xff\xff\xff\xff\xff\xff\xff\xff";
33520f9cd88SScott Linder Reader MPReader(Buffer);
33620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
33720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
33820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
33920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::UInt);
34020f9cd88SScott Linder EXPECT_EQ(Obj.UInt, static_cast<uint64_t>(UINT64_MAX));
34120f9cd88SScott Linder }
34220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFloat32)34320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFloat32) {
34420f9cd88SScott Linder Buffer = "\xca\xee\xee\xee\xef";
34520f9cd88SScott Linder Reader MPReader(Buffer);
34620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
34720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
34820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
34920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Float);
35020f9cd88SScott Linder EXPECT_EQ(Obj.Float, -3.6973142664068907e+28f);
35120f9cd88SScott Linder }
35220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFloat64)35320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFloat64) {
35420f9cd88SScott Linder Buffer = "\xcb\xee\xee\xee\xee\xee\xee\xee\xef";
35520f9cd88SScott Linder Reader MPReader(Buffer);
35620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
35720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
35820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
35920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Float);
36020f9cd88SScott Linder EXPECT_EQ(Obj.Float, -2.2899894549927042e+226);
36120f9cd88SScott Linder }
36220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixStrZero)36320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixStrZero) {
36420f9cd88SScott Linder Buffer = "\xa0";
36520f9cd88SScott Linder Reader MPReader(Buffer);
36620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
36720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
36820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
36920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
37020f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
37120f9cd88SScott Linder }
37220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixStrOne)37320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixStrOne) {
37420f9cd88SScott Linder std::string Result(1, 'a');
37520f9cd88SScott Linder Buffer = std::string("\xa1") + Result;
37620f9cd88SScott Linder Reader MPReader(Buffer);
37720f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
37820f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
37920f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
38020f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
38120f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
38220f9cd88SScott Linder }
38320f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixStrMax)38420f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixStrMax) {
38520f9cd88SScott Linder // FixStr format's size is a 5 bit unsigned integer, so max is 11111 = 31
38620f9cd88SScott Linder std::string Result(31, 'a');
38720f9cd88SScott Linder Buffer = std::string("\xbf") + Result;
38820f9cd88SScott Linder Reader MPReader(Buffer);
38920f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
39020f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
39120f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
39220f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
39320f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
39420f9cd88SScott Linder }
39520f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr8Zero)39620f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr8Zero) {
39720f9cd88SScott Linder Buffer.assign("\xd9\x00", 2);
39820f9cd88SScott Linder Reader MPReader(Buffer);
39920f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
40020f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
40120f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
40220f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
40320f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
40420f9cd88SScott Linder }
40520f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr8One)40620f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr8One) {
40720f9cd88SScott Linder std::string Result(1, 'a');
40820f9cd88SScott Linder Buffer = std::string("\xd9\x01") + Result;
40920f9cd88SScott Linder Reader MPReader(Buffer);
41020f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
41120f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
41220f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
41320f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
41420f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
41520f9cd88SScott Linder }
41620f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr8Max)41720f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr8Max) {
41820f9cd88SScott Linder std::string Result(UINT8_MAX, 'a');
41920f9cd88SScott Linder Buffer = std::string("\xd9\xff") + Result;
42020f9cd88SScott Linder Reader MPReader(Buffer);
42120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
42220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
42320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
42420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
42520f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
42620f9cd88SScott Linder }
42720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr16Zero)42820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr16Zero) {
42920f9cd88SScott Linder Buffer.assign("\xda\x00\x00", 3);
43020f9cd88SScott Linder Reader MPReader(Buffer);
43120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
43220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
43320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
43420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
43520f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
43620f9cd88SScott Linder }
43720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr16One)43820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr16One) {
43920f9cd88SScott Linder std::string Result(1, 'a');
44020f9cd88SScott Linder Buffer = std::string("\xda\x00\x01", 3) + Result;
44120f9cd88SScott Linder Reader MPReader(Buffer);
44220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
44320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
44420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
44520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
44620f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
44720f9cd88SScott Linder }
44820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr16Max)44920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr16Max) {
45020f9cd88SScott Linder std::string Result(UINT16_MAX, 'a');
45120f9cd88SScott Linder Buffer = std::string("\xda\xff\xff") + Result;
45220f9cd88SScott Linder Reader MPReader(Buffer);
45320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
45420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
45520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
45620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
45720f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
45820f9cd88SScott Linder }
45920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr32Zero)46020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr32Zero) {
46120f9cd88SScott Linder Buffer.assign("\xdb\x00\x00\x00\x00", 5);
46220f9cd88SScott Linder Reader MPReader(Buffer);
46320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
46420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
46520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
46620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
46720f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
46820f9cd88SScott Linder }
46920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr32One)47020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr32One) {
47120f9cd88SScott Linder std::string Result(1, 'a');
47220f9cd88SScott Linder Buffer = std::string("\xdb\x00\x00\x00\x01", 5) + Result;
47320f9cd88SScott Linder Reader MPReader(Buffer);
47420f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
47520f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
47620f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
47720f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
47820f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
47920f9cd88SScott Linder }
48020f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadStr32Max)48120f9cd88SScott Linder TEST_F(MsgPackReader, TestReadStr32Max) {
48220f9cd88SScott Linder std::string Result(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
48320f9cd88SScott Linder Buffer = std::string("\xdb\x00\x01\x00\x00", 5) + Result;
48420f9cd88SScott Linder Reader MPReader(Buffer);
48520f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
48620f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
48720f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
48820f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::String);
48920f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
49020f9cd88SScott Linder }
49120f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin8Zero)49220f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin8Zero) {
49320f9cd88SScott Linder Buffer.assign("\xc4\x00", 2);
49420f9cd88SScott Linder Reader MPReader(Buffer);
49520f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
49620f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
49720f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
49820f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
49920f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
50020f9cd88SScott Linder }
50120f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin8One)50220f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin8One) {
50320f9cd88SScott Linder std::string Result(1, 'a');
50420f9cd88SScott Linder Buffer = std::string("\xc4\x01") + Result;
50520f9cd88SScott Linder Reader MPReader(Buffer);
50620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
50720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
50820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
50920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
51020f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
51120f9cd88SScott Linder }
51220f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin8Max)51320f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin8Max) {
51420f9cd88SScott Linder std::string Result(UINT8_MAX, 'a');
51520f9cd88SScott Linder Buffer = std::string("\xc4\xff") + Result;
51620f9cd88SScott Linder Reader MPReader(Buffer);
51720f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
51820f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
51920f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
52020f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
52120f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
52220f9cd88SScott Linder }
52320f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin16Zero)52420f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin16Zero) {
52520f9cd88SScott Linder Buffer.assign("\xc5\x00\x00", 3);
52620f9cd88SScott Linder Reader MPReader(Buffer);
52720f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
52820f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
52920f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
53020f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
53120f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
53220f9cd88SScott Linder }
53320f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin16One)53420f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin16One) {
53520f9cd88SScott Linder std::string Result(1, 'a');
53620f9cd88SScott Linder Buffer = std::string("\xc5\x00\x01", 3) + Result;
53720f9cd88SScott Linder Reader MPReader(Buffer);
53820f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
53920f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
54020f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
54120f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
54220f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
54320f9cd88SScott Linder }
54420f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin16Max)54520f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin16Max) {
54620f9cd88SScott Linder std::string Result(UINT16_MAX, 'a');
54720f9cd88SScott Linder Buffer = std::string("\xc5\xff\xff") + Result;
54820f9cd88SScott Linder Reader MPReader(Buffer);
54920f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
55020f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
55120f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
55220f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
55320f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
55420f9cd88SScott Linder }
55520f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin32Zero)55620f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin32Zero) {
55720f9cd88SScott Linder Buffer.assign("\xc6\x00\x00\x00\x00", 5);
55820f9cd88SScott Linder Reader MPReader(Buffer);
55920f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
56020f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
56120f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
56220f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
56320f9cd88SScott Linder EXPECT_EQ(Obj.Raw, StringRef());
56420f9cd88SScott Linder }
56520f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin32One)56620f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin32One) {
56720f9cd88SScott Linder std::string Result(1, 'a');
56820f9cd88SScott Linder Buffer = std::string("\xc6\x00\x00\x00\x01", 5) + Result;
56920f9cd88SScott Linder Reader MPReader(Buffer);
57020f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
57120f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
57220f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
57320f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
57420f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
57520f9cd88SScott Linder }
57620f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadBin32Max)57720f9cd88SScott Linder TEST_F(MsgPackReader, TestReadBin32Max) {
57820f9cd88SScott Linder std::string Result(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
57920f9cd88SScott Linder Buffer = std::string("\xc6\x00\x01\x00\x00", 5) + Result;
58020f9cd88SScott Linder Reader MPReader(Buffer);
58120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
58220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
58320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
58420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Binary);
58520f9cd88SScott Linder EXPECT_EQ(Obj.Raw, Result);
58620f9cd88SScott Linder }
58720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixArrayZero)58820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixArrayZero) {
58920f9cd88SScott Linder Buffer = "\x90";
59020f9cd88SScott Linder Reader MPReader(Buffer);
59120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
59220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
59320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
59420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
59520f9cd88SScott Linder EXPECT_EQ(Obj.Length, 0u);
59620f9cd88SScott Linder }
59720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixArrayOne)59820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixArrayOne) {
59920f9cd88SScott Linder Buffer = "\x91";
60020f9cd88SScott Linder Reader MPReader(Buffer);
60120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
60220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
60320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
60420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
60520f9cd88SScott Linder EXPECT_EQ(Obj.Length, 1u);
60620f9cd88SScott Linder }
60720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixArrayMax)60820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixArrayMax) {
60920f9cd88SScott Linder Buffer = "\x9f";
61020f9cd88SScott Linder Reader MPReader(Buffer);
61120f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
61220f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
61320f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
61420f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
61520f9cd88SScott Linder // FixArray format's size is a 4 bit unsigned integer, so max is 1111 = 15
61620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 15u);
61720f9cd88SScott Linder }
61820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadArray16Zero)61920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadArray16Zero) {
62020f9cd88SScott Linder Buffer.assign("\xdc\x00\x00", 3);
62120f9cd88SScott Linder Reader MPReader(Buffer);
62220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
62320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
62420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
62520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
62620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 0u);
62720f9cd88SScott Linder }
62820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadArray16One)62920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadArray16One) {
63020f9cd88SScott Linder Buffer.assign("\xdc\x00\x01", 3);
63120f9cd88SScott Linder Reader MPReader(Buffer);
63220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
63320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
63420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
63520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
63620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 1u);
63720f9cd88SScott Linder }
63820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadArray16Max)63920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadArray16Max) {
64020f9cd88SScott Linder Buffer = "\xdc\xff\xff";
64120f9cd88SScott Linder Reader MPReader(Buffer);
64220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
64320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
64420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
64520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
64620f9cd88SScott Linder EXPECT_EQ(Obj.Length, static_cast<uint16_t>(UINT16_MAX));
64720f9cd88SScott Linder }
64820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadArray32Zero)64920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadArray32Zero) {
65020f9cd88SScott Linder Buffer.assign("\xdd\x00\x00\x00\x00", 5);
65120f9cd88SScott Linder Reader MPReader(Buffer);
65220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
65320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
65420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
65520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
65620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 0u);
65720f9cd88SScott Linder }
65820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadArray32One)65920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadArray32One) {
66020f9cd88SScott Linder Buffer.assign("\xdd\x00\x00\x00\x01", 5);
66120f9cd88SScott Linder Reader MPReader(Buffer);
66220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
66320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
66420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
66520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
66620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 1u);
66720f9cd88SScott Linder }
66820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadArray32Max)66920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadArray32Max) {
67020f9cd88SScott Linder Buffer = "\xdd\xff\xff\xff\xff";
67120f9cd88SScott Linder Reader MPReader(Buffer);
67220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
67320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
67420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
67520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Array);
67620f9cd88SScott Linder EXPECT_EQ(Obj.Length, static_cast<uint32_t>(UINT32_MAX));
67720f9cd88SScott Linder }
67820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixMapZero)67920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixMapZero) {
68020f9cd88SScott Linder Buffer = "\x80";
68120f9cd88SScott Linder Reader MPReader(Buffer);
68220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
68320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
68420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
68520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
68620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 0u);
68720f9cd88SScott Linder }
68820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixMapOne)68920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixMapOne) {
69020f9cd88SScott Linder Buffer = "\x81";
69120f9cd88SScott Linder Reader MPReader(Buffer);
69220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
69320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
69420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
69520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
69620f9cd88SScott Linder EXPECT_EQ(Obj.Length, 1u);
69720f9cd88SScott Linder }
69820f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixMapMax)69920f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixMapMax) {
70020f9cd88SScott Linder Buffer = "\x8f";
70120f9cd88SScott Linder Reader MPReader(Buffer);
70220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
70320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
70420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
70520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
70620f9cd88SScott Linder // FixMap format's size is a 4 bit unsigned integer, so max is 1111 = 15
70720f9cd88SScott Linder EXPECT_EQ(Obj.Length, 15u);
70820f9cd88SScott Linder }
70920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMap16Zero)71020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMap16Zero) {
71120f9cd88SScott Linder Buffer.assign("\xde\x00\x00", 3);
71220f9cd88SScott Linder Reader MPReader(Buffer);
71320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
71420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
71520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
71620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
71720f9cd88SScott Linder EXPECT_EQ(Obj.Length, 0u);
71820f9cd88SScott Linder }
71920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMap16One)72020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMap16One) {
72120f9cd88SScott Linder Buffer.assign("\xde\x00\x01", 3);
72220f9cd88SScott Linder Reader MPReader(Buffer);
72320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
72420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
72520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
72620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
72720f9cd88SScott Linder EXPECT_EQ(Obj.Length, 1u);
72820f9cd88SScott Linder }
72920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMap16Max)73020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMap16Max) {
73120f9cd88SScott Linder Buffer = "\xde\xff\xff";
73220f9cd88SScott Linder Reader MPReader(Buffer);
73320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
73420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
73520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
73620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
73720f9cd88SScott Linder EXPECT_EQ(Obj.Length, static_cast<uint16_t>(UINT16_MAX));
73820f9cd88SScott Linder }
73920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMap32Zero)74020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMap32Zero) {
74120f9cd88SScott Linder Buffer.assign("\xdf\x00\x00\x00\x00", 5);
74220f9cd88SScott Linder Reader MPReader(Buffer);
74320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
74420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
74520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
74620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
74720f9cd88SScott Linder EXPECT_EQ(Obj.Length, 0u);
74820f9cd88SScott Linder }
74920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMap32One)75020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMap32One) {
75120f9cd88SScott Linder Buffer.assign("\xdf\x00\x00\x00\x01", 5);
75220f9cd88SScott Linder Reader MPReader(Buffer);
75320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
75420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
75520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
75620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
75720f9cd88SScott Linder EXPECT_EQ(Obj.Length, 1u);
75820f9cd88SScott Linder }
75920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadMap32Max)76020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadMap32Max) {
76120f9cd88SScott Linder Buffer = "\xdf\xff\xff\xff\xff";
76220f9cd88SScott Linder Reader MPReader(Buffer);
76320f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
76420f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
76520f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
76620f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Map);
76720f9cd88SScott Linder EXPECT_EQ(Obj.Length, static_cast<uint32_t>(UINT32_MAX));
76820f9cd88SScott Linder }
76920f9cd88SScott Linder
77020f9cd88SScott Linder // FixExt formats are only available for these specific lengths: 1, 2, 4, 8, 16
77120f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixExt1)77220f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixExt1) {
77320f9cd88SScott Linder std::string Result(1, 'a');
77420f9cd88SScott Linder Buffer = std::string("\xd4\x01") + Result;
77520f9cd88SScott Linder Reader MPReader(Buffer);
77620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
77720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
77820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
77920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
78020f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
78120f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
78220f9cd88SScott Linder }
78320f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixExt2)78420f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixExt2) {
78520f9cd88SScott Linder std::string Result(2, 'a');
78620f9cd88SScott Linder Buffer = std::string("\xd5\x01") + Result;
78720f9cd88SScott Linder Reader MPReader(Buffer);
78820f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
78920f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
79020f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
79120f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
79220f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
79320f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
79420f9cd88SScott Linder }
79520f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixExt4)79620f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixExt4) {
79720f9cd88SScott Linder std::string Result(4, 'a');
79820f9cd88SScott Linder Buffer = std::string("\xd6\x01") + Result;
79920f9cd88SScott Linder Reader MPReader(Buffer);
80020f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
80120f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
80220f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
80320f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
80420f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
80520f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
80620f9cd88SScott Linder }
80720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixExt8)80820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixExt8) {
80920f9cd88SScott Linder std::string Result(8, 'a');
81020f9cd88SScott Linder Buffer = std::string("\xd7\x01") + Result;
81120f9cd88SScott Linder Reader MPReader(Buffer);
81220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
81320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
81420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
81520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
81620f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
81720f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
81820f9cd88SScott Linder }
81920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadFixExt16)82020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadFixExt16) {
82120f9cd88SScott Linder std::string Result(16, 'a');
82220f9cd88SScott Linder Buffer = std::string("\xd8\x01") + Result;
82320f9cd88SScott Linder Reader MPReader(Buffer);
82420f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
82520f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
82620f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
82720f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
82820f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
82920f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
83020f9cd88SScott Linder }
83120f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadExt8Min)83220f9cd88SScott Linder TEST_F(MsgPackReader, TestReadExt8Min) {
83320f9cd88SScott Linder // There are fix variants for sizes 1 and 2
83420f9cd88SScott Linder Buffer.assign("\xc7\x00\x01", 3);
83520f9cd88SScott Linder Reader MPReader(Buffer);
83620f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
83720f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
83820f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
83920f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
84020f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
84120f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, StringRef());
84220f9cd88SScott Linder }
84320f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadExt8Max)84420f9cd88SScott Linder TEST_F(MsgPackReader, TestReadExt8Max) {
84520f9cd88SScott Linder std::string Result(UINT8_MAX, 'a');
84620f9cd88SScott Linder Buffer = std::string("\xc7\xff\x01", 3) + Result;
84720f9cd88SScott Linder Reader MPReader(Buffer);
84820f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
84920f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
85020f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
85120f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
85220f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
85320f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
85420f9cd88SScott Linder }
85520f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadExt16Min)85620f9cd88SScott Linder TEST_F(MsgPackReader, TestReadExt16Min) {
85720f9cd88SScott Linder std::string Result(static_cast<uint16_t>(UINT8_MAX) + 1, 'a');
85820f9cd88SScott Linder Buffer = std::string("\xc8\x01\x00\x01", 4) + Result;
85920f9cd88SScott Linder Reader MPReader(Buffer);
86020f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
86120f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
86220f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
86320f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
86420f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
86520f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
86620f9cd88SScott Linder }
86720f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadExt16Max)86820f9cd88SScott Linder TEST_F(MsgPackReader, TestReadExt16Max) {
86920f9cd88SScott Linder std::string Result(UINT16_MAX, 'a');
87020f9cd88SScott Linder Buffer = std::string("\xc8\xff\xff\x01") + Result;
87120f9cd88SScott Linder Reader MPReader(Buffer);
87220f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
87320f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
87420f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
87520f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
87620f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
87720f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
87820f9cd88SScott Linder }
87920f9cd88SScott Linder
TEST_F(MsgPackReader,TestReadExt32Min)88020f9cd88SScott Linder TEST_F(MsgPackReader, TestReadExt32Min) {
88120f9cd88SScott Linder std::string Result(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
88220f9cd88SScott Linder Buffer = std::string("\xc9\x00\x01\x00\x00\x01", 6) + Result;
88320f9cd88SScott Linder Reader MPReader(Buffer);
88420f9cd88SScott Linder auto ContinueOrErr = MPReader.read(Obj);
88520f9cd88SScott Linder EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
88620f9cd88SScott Linder EXPECT_TRUE(*ContinueOrErr);
88720f9cd88SScott Linder EXPECT_EQ(Obj.Kind, Type::Extension);
88820f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Type, 0x01);
88920f9cd88SScott Linder EXPECT_EQ(Obj.Extension.Bytes, Result);
89020f9cd88SScott Linder }
891