1#include <msgpack.hpp>
2
3#include <string>
4#include <sstream>
5
6#include <gtest/gtest.h>
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif
11
12TEST(MSGPACK_RAW_REF, pack_unpack)
13{
14    std::string s = "ABC";
15
16    msgpack::type::raw_ref rr1(s.data(), s.size());
17    std::stringstream ss;
18    msgpack::pack(ss, rr1);
19    std::string packed_str = ss.str();
20    EXPECT_EQ(packed_str[0], static_cast<char>(0xc4u));
21    EXPECT_EQ(packed_str[1], static_cast<char>(0x03u));
22    EXPECT_EQ(packed_str[2], 'A');
23    EXPECT_EQ(packed_str[3], 'B');
24    EXPECT_EQ(packed_str[4], 'C');
25
26    msgpack::unpacked upd;
27    msgpack::unpack(upd, ss.str().data(), ss.str().size());
28    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
29    EXPECT_TRUE(rr1 == rr2);
30}
31
32TEST(MSGPACK_RAW_REF, pack_unpack_8_l)
33{
34    std::string s;
35
36    msgpack::type::raw_ref rr1(s.data(), s.size());
37    std::stringstream ss;
38    msgpack::pack(ss, rr1);
39    std::string packed_str = ss.str();
40    EXPECT_EQ(packed_str[0], static_cast<char>(0xc4u));
41    EXPECT_EQ(packed_str[1], static_cast<char>(0x00u));
42
43    msgpack::unpacked upd;
44    msgpack::unpack(upd, ss.str().data(), ss.str().size());
45    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
46    EXPECT_TRUE(rr1 == rr2);
47}
48
49TEST(MSGPACK_RAW_REF, pack_unpack_8_h)
50{
51    std::string s(0xff, 'A');
52
53    msgpack::type::raw_ref rr1(s.data(), s.size());
54    std::stringstream ss;
55    msgpack::pack(ss, rr1);
56    std::string packed_str = ss.str();
57    EXPECT_EQ(packed_str[0], static_cast<char>(0xc4u));
58    EXPECT_EQ(packed_str[1], static_cast<char>(0xffu));
59    EXPECT_EQ(packed_str[2], 'A');
60
61    msgpack::unpacked upd;
62    msgpack::unpack(upd, ss.str().data(), ss.str().size());
63    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
64    EXPECT_TRUE(rr1 == rr2);
65}
66
67TEST(MSGPACK_RAW_REF, pack_unpack_16_l)
68{
69    std::string s(0xff+1, 'A');
70
71    msgpack::type::raw_ref rr1(s.data(), s.size());
72    std::stringstream ss;
73    msgpack::pack(ss, rr1);
74    std::string packed_str = ss.str();
75    EXPECT_EQ(packed_str[0], static_cast<char>(0xc5u));
76    EXPECT_EQ(packed_str[1], static_cast<char>(0x01));
77    EXPECT_EQ(packed_str[2], static_cast<char>(0x00));
78    EXPECT_EQ(packed_str[3], 'A');
79
80    msgpack::unpacked upd;
81    msgpack::unpack(upd, ss.str().data(), ss.str().size());
82    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
83    EXPECT_TRUE(rr1 == rr2);
84}
85
86TEST(MSGPACK_RAW_REF, pack_unpack_16_h)
87{
88    std::string s(0xffff, 'A');
89
90    msgpack::type::raw_ref rr1(s.data(), s.size());
91    std::stringstream ss;
92    msgpack::pack(ss, rr1);
93    std::string packed_str = ss.str();
94    EXPECT_EQ(packed_str[0], static_cast<char>(0xc5u));
95    EXPECT_EQ(packed_str[1], static_cast<char>(0xffu));
96    EXPECT_EQ(packed_str[2], static_cast<char>(0xffu));
97    EXPECT_EQ(packed_str[3], 'A');
98
99    msgpack::unpacked upd;
100    msgpack::unpack(upd, ss.str().data(), ss.str().size());
101    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
102    EXPECT_TRUE(rr1 == rr2);
103}
104
105TEST(MSGPACK_RAW_REF, pack_unpack_32_l)
106{
107    std::string s(0xffff+1, 'A');
108
109    msgpack::type::raw_ref rr1(s.data(), s.size());
110    std::stringstream ss;
111    msgpack::pack(ss, rr1);
112    std::string packed_str = ss.str();
113    EXPECT_EQ(packed_str[0], static_cast<char>(0xc6u));
114    EXPECT_EQ(packed_str[1], static_cast<char>(0x00));
115    EXPECT_EQ(packed_str[2], static_cast<char>(0x01));
116    EXPECT_EQ(packed_str[3], static_cast<char>(0x00));
117    EXPECT_EQ(packed_str[4], static_cast<char>(0x00));
118    EXPECT_EQ(packed_str[5], 'A');
119
120    msgpack::unpacked upd;
121    msgpack::unpack(upd, ss.str().data(), ss.str().size());
122    msgpack::type::raw_ref rr2 = upd.get().as<msgpack::type::raw_ref>();
123    EXPECT_TRUE(rr1 == rr2);
124}
125
126TEST(MSGPACK_V4RAW_REF, pack_unpack)
127{
128    std::string s = "ABC";
129
130    msgpack::type::v4raw_ref rr1(s.data(), s.size());
131    std::stringstream ss;
132    msgpack::pack(ss, rr1);
133    std::string packed_str = ss.str();
134    EXPECT_EQ(packed_str[0], static_cast<char>(0xa3u));
135    EXPECT_EQ(packed_str[1], 'A');
136    EXPECT_EQ(packed_str[2], 'B');
137    EXPECT_EQ(packed_str[3], 'C');
138
139    msgpack::unpacked upd;
140    msgpack::unpack(upd, ss.str().data(), ss.str().size());
141    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
142    EXPECT_TRUE(rr1 == rr2);
143}
144
145TEST(MSGPACK_V4RAW_REF, pack_unpack_fix_l)
146{
147    std::string s;
148
149    msgpack::type::v4raw_ref rr1(s.data(), s.size());
150    std::stringstream ss;
151    msgpack::pack(ss, rr1);
152    std::string packed_str = ss.str();
153    EXPECT_EQ(packed_str[0], static_cast<char>(0xa0u));
154
155    msgpack::unpacked upd;
156    msgpack::unpack(upd, ss.str().data(), ss.str().size());
157    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
158    EXPECT_TRUE(rr1 == rr2);
159}
160
161TEST(MSGPACK_V4RAW_REF, pack_unpack_fix_h)
162{
163    std::string s(0x1f, 'A');
164
165    msgpack::type::v4raw_ref rr1(s.data(), s.size());
166    std::stringstream ss;
167    msgpack::pack(ss, rr1);
168    std::string packed_str = ss.str();
169    EXPECT_EQ(packed_str[0], static_cast<char>(0xbfu));
170    EXPECT_EQ(packed_str[1], 'A');
171
172    msgpack::unpacked upd;
173    msgpack::unpack(upd, ss.str().data(), ss.str().size());
174    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
175    EXPECT_TRUE(rr1 == rr2);
176}
177
178TEST(MSGPACK_V4RAW_REF, pack_unpack_16_l)
179{
180    std::string s(0x1f+1, 'A');
181
182    msgpack::type::v4raw_ref rr1(s.data(), s.size());
183    std::stringstream ss;
184    msgpack::pack(ss, rr1);
185    std::string packed_str = ss.str();
186    EXPECT_EQ(packed_str[0], static_cast<char>(0xdau));
187    EXPECT_EQ(packed_str[1], static_cast<char>(0x00u));
188    EXPECT_EQ(packed_str[2], static_cast<char>(0x20u));
189    EXPECT_EQ(packed_str[3], 'A');
190
191    msgpack::unpacked upd;
192    msgpack::unpack(upd, ss.str().data(), ss.str().size());
193    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
194    EXPECT_TRUE(rr1 == rr2);
195}
196
197TEST(MSGPACK_V4RAW_REF, pack_unpack_16_h)
198{
199    std::string s(0xffff, 'A');
200
201    msgpack::type::v4raw_ref rr1(s.data(), s.size());
202    std::stringstream ss;
203    msgpack::pack(ss, rr1);
204    std::string packed_str = ss.str();
205    EXPECT_EQ(packed_str[0], static_cast<char>(0xdau));
206    EXPECT_EQ(packed_str[1], static_cast<char>(0xffu));
207    EXPECT_EQ(packed_str[2], static_cast<char>(0xffu));
208    EXPECT_EQ(packed_str[3], 'A');
209
210    msgpack::unpacked upd;
211    msgpack::unpack(upd, ss.str().data(), ss.str().size());
212    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
213    EXPECT_TRUE(rr1 == rr2);
214}
215
216TEST(MSGPACK_V4RAW_REF, pack_unpack_32_l)
217{
218    std::string s(0xffff+1, 'A');
219
220    msgpack::type::v4raw_ref rr1(s.data(), s.size());
221    std::stringstream ss;
222    msgpack::pack(ss, rr1);
223    std::string packed_str = ss.str();
224    EXPECT_EQ(packed_str[0], static_cast<char>(0xdbu));
225    EXPECT_EQ(packed_str[1], static_cast<char>(0x00));
226    EXPECT_EQ(packed_str[2], static_cast<char>(0x01));
227    EXPECT_EQ(packed_str[3], static_cast<char>(0x00));
228    EXPECT_EQ(packed_str[4], static_cast<char>(0x00));
229    EXPECT_EQ(packed_str[5], 'A');
230
231    msgpack::unpacked upd;
232    msgpack::unpack(upd, ss.str().data(), ss.str().size());
233    msgpack::type::v4raw_ref rr2 = upd.get().as<msgpack::type::v4raw_ref>();
234    EXPECT_TRUE(rr1 == rr2);
235}
236