msgpack_c.cpp 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  1. #include "msgpack.h"
  2. #include <math.h>
  3. #include <vector>
  4. #include <limits>
  5. #include <gtest/gtest.h>
  6. #if defined(_MSC_VER) || defined(__MINGW32__)
  7. #define msgpack_rand() ((double)rand() / RAND_MAX)
  8. #else // _MSC_VER || __MINGW32__
  9. #define msgpack_rand() drand48()
  10. #endif // _MSC_VER || __MINGW32__
  11. using namespace std;
  12. const unsigned int kLoop = 10000;
  13. const double kEPS = 1e-10;
  14. #define GEN_TEST_SIGNED(test_type, func_type) \
  15. do { \
  16. vector<test_type> v; \
  17. v.push_back(0); \
  18. v.push_back(1); \
  19. v.push_back(-1); \
  20. v.push_back(numeric_limits<test_type>::min()); \
  21. v.push_back(numeric_limits<test_type>::max()); \
  22. for (unsigned int i = 0; i < kLoop; i++) \
  23. v.push_back(rand()); \
  24. for (unsigned int i = 0; i < v.size() ; i++) { \
  25. test_type val = v[i]; \
  26. msgpack_sbuffer sbuf; \
  27. msgpack_sbuffer_init(&sbuf); \
  28. msgpack_packer pk; \
  29. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); \
  30. msgpack_pack_##func_type(&pk, val); \
  31. msgpack_zone z; \
  32. msgpack_zone_init(&z, 2048); \
  33. msgpack_object obj; \
  34. msgpack_unpack_return ret = \
  35. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); \
  36. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); \
  37. if (val < 0) { \
  38. EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, obj.type); \
  39. EXPECT_EQ(val, obj.via.i64); \
  40. } else { \
  41. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type); \
  42. EXPECT_EQ(static_cast<uint64_t>(val), obj.via.u64); \
  43. } \
  44. msgpack_zone_destroy(&z); \
  45. msgpack_sbuffer_destroy(&sbuf); \
  46. } \
  47. } while(0)
  48. #define GEN_TEST_UNSIGNED(test_type, func_type) \
  49. do { \
  50. vector<test_type> v; \
  51. v.push_back(0); \
  52. v.push_back(1); \
  53. v.push_back(2); \
  54. v.push_back(numeric_limits<test_type>::min()); \
  55. v.push_back(numeric_limits<test_type>::max()); \
  56. for (unsigned int i = 0; i < kLoop; i++) \
  57. v.push_back(rand()); \
  58. for (unsigned int i = 0; i < v.size() ; i++) { \
  59. test_type val = v[i]; \
  60. msgpack_sbuffer sbuf; \
  61. msgpack_sbuffer_init(&sbuf); \
  62. msgpack_packer pk; \
  63. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); \
  64. msgpack_pack_##func_type(&pk, val); \
  65. msgpack_zone z; \
  66. msgpack_zone_init(&z, 2048); \
  67. msgpack_object obj; \
  68. msgpack_unpack_return ret = \
  69. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); \
  70. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); \
  71. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type); \
  72. EXPECT_EQ(val, obj.via.u64); \
  73. msgpack_zone_destroy(&z); \
  74. msgpack_sbuffer_destroy(&sbuf); \
  75. } \
  76. } while(0)
  77. TEST(MSGPACKC, simple_buffer_char)
  78. {
  79. #if defined(CHAR_MIN)
  80. #if CHAR_MIN < 0
  81. GEN_TEST_SIGNED(char, char);
  82. #else
  83. GEN_TEST_UNSIGNED(char, char);
  84. #endif
  85. #else
  86. #error CHAR_MIN is not defined
  87. #endif
  88. }
  89. TEST(MSGPACKC, simple_buffer_singed_char)
  90. {
  91. GEN_TEST_SIGNED(signed char, signed_char);
  92. }
  93. TEST(MSGPACKC, simple_buffer_short)
  94. {
  95. GEN_TEST_SIGNED(short, short);
  96. }
  97. TEST(MSGPACKC, simple_buffer_int)
  98. {
  99. GEN_TEST_SIGNED(int, int);
  100. }
  101. TEST(MSGPACKC, simple_buffer_long)
  102. {
  103. GEN_TEST_SIGNED(long, long);
  104. }
  105. TEST(MSGPACKC, simple_buffer_long_long)
  106. {
  107. GEN_TEST_SIGNED(long long, long_long);
  108. }
  109. TEST(MSGPACKC, simple_buffer_unsigned_char)
  110. {
  111. GEN_TEST_UNSIGNED(unsigned char, unsigned_char);
  112. }
  113. TEST(MSGPACKC, simple_buffer_unsigned_short)
  114. {
  115. GEN_TEST_UNSIGNED(unsigned short, unsigned_short);
  116. }
  117. TEST(MSGPACKC, simple_buffer_unsigned_int)
  118. {
  119. GEN_TEST_UNSIGNED(unsigned int, unsigned_int);
  120. }
  121. TEST(MSGPACKC, simple_buffer_unsigned_long)
  122. {
  123. GEN_TEST_UNSIGNED(unsigned long, unsigned_long);
  124. }
  125. TEST(MSGPACKC, simple_buffer_unsigned_long_long)
  126. {
  127. GEN_TEST_UNSIGNED(unsigned long long, unsigned_long_long);
  128. }
  129. TEST(MSGPACKC, simple_buffer_uint8)
  130. {
  131. GEN_TEST_UNSIGNED(uint8_t, uint8);
  132. }
  133. TEST(MSGPACKC, simple_buffer_uint16)
  134. {
  135. GEN_TEST_UNSIGNED(uint16_t, uint16);
  136. }
  137. TEST(MSGPACKC, simple_buffer_uint32)
  138. {
  139. GEN_TEST_UNSIGNED(uint32_t, uint32);
  140. }
  141. TEST(MSGPACKC, simple_buffer_uint64)
  142. {
  143. GEN_TEST_UNSIGNED(uint64_t, uint64);
  144. }
  145. TEST(MSGPACKC, simple_buffer_int8)
  146. {
  147. GEN_TEST_SIGNED(int8_t, int8);
  148. }
  149. TEST(MSGPACKC, simple_buffer_int16)
  150. {
  151. GEN_TEST_SIGNED(int16_t, int16);
  152. }
  153. TEST(MSGPACKC, simple_buffer_int32)
  154. {
  155. GEN_TEST_SIGNED(int32_t, int32);
  156. }
  157. TEST(MSGPACKC, simple_buffer_int64)
  158. {
  159. GEN_TEST_SIGNED(int64_t, int64);
  160. }
  161. #if !defined(_MSC_VER) || _MSC_VER >=1800
  162. TEST(MSGPACKC, simple_buffer_float)
  163. {
  164. vector<float> v;
  165. v.push_back(0.0);
  166. v.push_back(1.0);
  167. v.push_back(-1.0);
  168. v.push_back(numeric_limits<float>::min());
  169. v.push_back(numeric_limits<float>::max());
  170. v.push_back(nanf("tag"));
  171. if (numeric_limits<float>::has_infinity) {
  172. v.push_back(numeric_limits<float>::infinity());
  173. v.push_back(-numeric_limits<float>::infinity());
  174. }
  175. if (numeric_limits<float>::has_quiet_NaN) {
  176. v.push_back(numeric_limits<float>::quiet_NaN());
  177. }
  178. if (numeric_limits<float>::has_signaling_NaN) {
  179. v.push_back(numeric_limits<float>::signaling_NaN());
  180. }
  181. for (unsigned int i = 0; i < kLoop; i++) {
  182. v.push_back(static_cast<float>(msgpack_rand()));
  183. v.push_back(static_cast<float>(-msgpack_rand()));
  184. }
  185. for (unsigned int i = 0; i < v.size() ; i++) {
  186. float val = v[i];
  187. msgpack_sbuffer sbuf;
  188. msgpack_sbuffer_init(&sbuf);
  189. msgpack_packer pk;
  190. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  191. msgpack_pack_float(&pk, val);
  192. msgpack_zone z;
  193. msgpack_zone_init(&z, 2048);
  194. msgpack_object obj;
  195. msgpack_unpack_return ret =
  196. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  197. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  198. EXPECT_EQ(MSGPACK_OBJECT_FLOAT32, obj.type);
  199. if (isnan(val)) {
  200. EXPECT_TRUE(isnan(obj.via.f64));
  201. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  202. EXPECT_TRUE(isnan(obj.via.dec));
  203. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  204. }
  205. else if (isinf(val)) {
  206. EXPECT_TRUE(isinf(obj.via.f64));
  207. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  208. EXPECT_TRUE(isinf(obj.via.dec));
  209. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  210. }
  211. else {
  212. EXPECT_TRUE(fabs(obj.via.f64 - val) <= kEPS);
  213. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  214. EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS);
  215. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  216. }
  217. msgpack_zone_destroy(&z);
  218. msgpack_sbuffer_destroy(&sbuf);
  219. }
  220. }
  221. TEST(MSGPACKC, simple_buffer_double)
  222. {
  223. vector<double> v;
  224. v.push_back(0.0);
  225. v.push_back(-0.0);
  226. v.push_back(1.0);
  227. v.push_back(-1.0);
  228. v.push_back(numeric_limits<double>::min());
  229. v.push_back(numeric_limits<double>::max());
  230. v.push_back(nan("tag"));
  231. if (numeric_limits<double>::has_infinity) {
  232. v.push_back(numeric_limits<double>::infinity());
  233. v.push_back(-numeric_limits<double>::infinity());
  234. }
  235. if (numeric_limits<double>::has_quiet_NaN) {
  236. v.push_back(numeric_limits<double>::quiet_NaN());
  237. }
  238. if (numeric_limits<double>::has_signaling_NaN) {
  239. v.push_back(numeric_limits<double>::signaling_NaN());
  240. }
  241. for (unsigned int i = 0; i < kLoop; i++) {
  242. v.push_back(msgpack_rand());
  243. v.push_back(-msgpack_rand());
  244. }
  245. for (unsigned int i = 0; i < v.size() ; i++) {
  246. double val = v[i];
  247. msgpack_sbuffer sbuf;
  248. msgpack_sbuffer_init(&sbuf);
  249. msgpack_packer pk;
  250. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  251. msgpack_pack_double(&pk, val);
  252. msgpack_zone z;
  253. msgpack_zone_init(&z, 2048);
  254. msgpack_object obj;
  255. msgpack_unpack_return ret =
  256. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  257. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  258. EXPECT_EQ(MSGPACK_OBJECT_FLOAT64, obj.type);
  259. EXPECT_EQ(MSGPACK_OBJECT_FLOAT, obj.type);
  260. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  261. EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type);
  262. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  263. if (isnan(val)) {
  264. EXPECT_TRUE(isnan(obj.via.f64));
  265. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  266. EXPECT_TRUE(isnan(obj.via.dec));
  267. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  268. }
  269. else if (isinf(val)) {
  270. EXPECT_TRUE(isinf(obj.via.f64));
  271. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  272. EXPECT_TRUE(isinf(obj.via.dec));
  273. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  274. }
  275. else {
  276. EXPECT_TRUE(fabs(obj.via.f64 - val) <= kEPS);
  277. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  278. EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS);
  279. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  280. }
  281. msgpack_zone_destroy(&z);
  282. msgpack_sbuffer_destroy(&sbuf);
  283. }
  284. }
  285. #endif // !defined(_MSC_VER) || _MSC_VER >=1800
  286. TEST(MSGPACKC, simple_buffer_nil)
  287. {
  288. msgpack_sbuffer sbuf;
  289. msgpack_sbuffer_init(&sbuf);
  290. msgpack_packer pk;
  291. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  292. msgpack_pack_nil(&pk);
  293. msgpack_zone z;
  294. msgpack_zone_init(&z, 2048);
  295. msgpack_object obj;
  296. msgpack_unpack_return ret =
  297. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  298. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  299. EXPECT_EQ(MSGPACK_OBJECT_NIL, obj.type);
  300. msgpack_zone_destroy(&z);
  301. msgpack_sbuffer_destroy(&sbuf);
  302. }
  303. TEST(MSGPACKC, simple_buffer_true)
  304. {
  305. msgpack_sbuffer sbuf;
  306. msgpack_sbuffer_init(&sbuf);
  307. msgpack_packer pk;
  308. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  309. msgpack_pack_true(&pk);
  310. msgpack_zone z;
  311. msgpack_zone_init(&z, 2048);
  312. msgpack_object obj;
  313. msgpack_unpack_return ret =
  314. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  315. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  316. EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
  317. EXPECT_EQ(true, obj.via.boolean);
  318. msgpack_zone_destroy(&z);
  319. msgpack_sbuffer_destroy(&sbuf);
  320. }
  321. TEST(MSGPACKC, simple_buffer_false)
  322. {
  323. msgpack_sbuffer sbuf;
  324. msgpack_sbuffer_init(&sbuf);
  325. msgpack_packer pk;
  326. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  327. msgpack_pack_false(&pk);
  328. msgpack_zone z;
  329. msgpack_zone_init(&z, 2048);
  330. msgpack_object obj;
  331. msgpack_unpack_return ret =
  332. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  333. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  334. EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
  335. EXPECT_FALSE(obj.via.boolean);
  336. msgpack_zone_destroy(&z);
  337. msgpack_sbuffer_destroy(&sbuf);
  338. }
  339. TEST(MSGPACKC, simple_buffer_fixext1)
  340. {
  341. msgpack_sbuffer sbuf;
  342. msgpack_sbuffer_init(&sbuf);
  343. msgpack_packer pk;
  344. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  345. char const buf[] = { 2 };
  346. msgpack_pack_ext(&pk, sizeof(buf), 1);
  347. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  348. msgpack_zone z;
  349. msgpack_zone_init(&z, 2048);
  350. msgpack_object obj;
  351. msgpack_unpack_return ret =
  352. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  353. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  354. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  355. EXPECT_EQ(1u, obj.via.ext.size);
  356. EXPECT_EQ(1, obj.via.ext.type);
  357. EXPECT_EQ(2, obj.via.ext.ptr[0]);
  358. msgpack_zone_destroy(&z);
  359. msgpack_sbuffer_destroy(&sbuf);
  360. }
  361. TEST(MSGPACKC, simple_buffer_fixext2)
  362. {
  363. msgpack_sbuffer sbuf;
  364. msgpack_sbuffer_init(&sbuf);
  365. msgpack_packer pk;
  366. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  367. char const buf[] = { 2, 3 };
  368. msgpack_pack_ext(&pk, sizeof(buf), 0);
  369. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  370. msgpack_zone z;
  371. msgpack_zone_init(&z, 2048);
  372. msgpack_object obj;
  373. msgpack_unpack_return ret =
  374. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  375. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  376. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  377. EXPECT_EQ(2u, obj.via.ext.size);
  378. EXPECT_EQ(0, obj.via.ext.type);
  379. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  380. msgpack_zone_destroy(&z);
  381. msgpack_sbuffer_destroy(&sbuf);
  382. }
  383. TEST(MSGPACKC, simple_buffer_fixext4)
  384. {
  385. msgpack_sbuffer sbuf;
  386. msgpack_sbuffer_init(&sbuf);
  387. msgpack_packer pk;
  388. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  389. char const buf[] = { 2, 3, 4, 5 };
  390. msgpack_pack_ext(&pk, sizeof(buf), 1);
  391. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  392. msgpack_zone z;
  393. msgpack_zone_init(&z, 2048);
  394. msgpack_object obj;
  395. msgpack_unpack_return ret =
  396. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  397. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  398. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  399. EXPECT_EQ(4u, obj.via.ext.size);
  400. EXPECT_EQ(1, obj.via.ext.type);
  401. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  402. msgpack_zone_destroy(&z);
  403. msgpack_sbuffer_destroy(&sbuf);
  404. }
  405. TEST(MSGPACKC, simple_buffer_fixext8)
  406. {
  407. msgpack_sbuffer sbuf;
  408. msgpack_sbuffer_init(&sbuf);
  409. msgpack_packer pk;
  410. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  411. char const buf [] = { 2, 3, 4, 5, 6, 7, 8, 9 };
  412. msgpack_pack_ext(&pk, sizeof(buf), 1);
  413. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  414. msgpack_zone z;
  415. msgpack_zone_init(&z, 2048);
  416. msgpack_object obj;
  417. msgpack_unpack_return ret =
  418. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  419. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  420. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  421. EXPECT_EQ(8u, obj.via.ext.size);
  422. EXPECT_EQ(1, obj.via.ext.type);
  423. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  424. msgpack_zone_destroy(&z);
  425. msgpack_sbuffer_destroy(&sbuf);
  426. }
  427. TEST(MSGPACKC, simple_buffer_fixext16)
  428. {
  429. msgpack_sbuffer sbuf;
  430. msgpack_sbuffer_init(&sbuf);
  431. msgpack_packer pk;
  432. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  433. char const buf [] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
  434. msgpack_pack_ext(&pk, sizeof(buf), 1);
  435. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  436. msgpack_zone z;
  437. msgpack_zone_init(&z, 2048);
  438. msgpack_object obj;
  439. msgpack_unpack_return ret =
  440. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  441. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  442. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  443. EXPECT_EQ(16u, obj.via.ext.size);
  444. EXPECT_EQ(1, obj.via.ext.type);
  445. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  446. msgpack_zone_destroy(&z);
  447. msgpack_sbuffer_destroy(&sbuf);
  448. }
  449. TEST(MSGPACKC, simple_buffer_fixext_1byte_0)
  450. {
  451. const size_t size = 0;
  452. msgpack_sbuffer sbuf;
  453. msgpack_sbuffer_init(&sbuf);
  454. msgpack_packer pk;
  455. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  456. msgpack_pack_ext(&pk, size, 77);
  457. // fprintf(stderr, "size: %u, data: \"", sbuf.size);
  458. // for (size_t i = 0; i < sbuf.size; i++)
  459. // fprintf(stderr, "%02x ", (uint8_t)sbuf.data[i]);
  460. // fprintf(stderr, "\"\n");
  461. msgpack_zone z;
  462. msgpack_zone_init(&z, 2048);
  463. msgpack_object obj;
  464. msgpack_unpack_return ret =
  465. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  466. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  467. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  468. EXPECT_EQ(size, obj.via.ext.size);
  469. EXPECT_EQ(77, obj.via.ext.type);
  470. msgpack_zone_destroy(&z);
  471. msgpack_sbuffer_destroy(&sbuf);
  472. }
  473. TEST(MSGPACKC, simple_buffer_fixext_1byte_255)
  474. {
  475. const size_t size = 255;
  476. char buf[size];
  477. for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
  478. msgpack_sbuffer sbuf;
  479. msgpack_sbuffer_init(&sbuf);
  480. msgpack_packer pk;
  481. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  482. msgpack_pack_ext(&pk, size, 78);
  483. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  484. msgpack_zone z;
  485. msgpack_zone_init(&z, 2048);
  486. msgpack_object obj;
  487. msgpack_unpack_return ret =
  488. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  489. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  490. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  491. EXPECT_EQ(size, obj.via.ext.size);
  492. EXPECT_EQ(78, obj.via.ext.type);
  493. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  494. msgpack_zone_destroy(&z);
  495. msgpack_sbuffer_destroy(&sbuf);
  496. }
  497. TEST(MSGPACKC, simple_buffer_fixext_2byte_256)
  498. {
  499. const size_t size = 256;
  500. char buf[size];
  501. for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
  502. msgpack_sbuffer sbuf;
  503. msgpack_sbuffer_init(&sbuf);
  504. msgpack_packer pk;
  505. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  506. msgpack_pack_ext(&pk, size, 79);
  507. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  508. msgpack_zone z;
  509. msgpack_zone_init(&z, 2048);
  510. msgpack_object obj;
  511. msgpack_unpack_return ret =
  512. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  513. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  514. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  515. EXPECT_EQ(size, obj.via.ext.size);
  516. EXPECT_EQ(79, obj.via.ext.type);
  517. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  518. msgpack_zone_destroy(&z);
  519. msgpack_sbuffer_destroy(&sbuf);
  520. }
  521. TEST(MSGPACKC, simple_buffer_fixext_2byte_65535)
  522. {
  523. const size_t size = 65535;
  524. char buf[size];
  525. for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
  526. msgpack_sbuffer sbuf;
  527. msgpack_sbuffer_init(&sbuf);
  528. msgpack_packer pk;
  529. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  530. msgpack_pack_ext(&pk, size, 80);
  531. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  532. msgpack_zone z;
  533. msgpack_zone_init(&z, 2048);
  534. msgpack_object obj;
  535. msgpack_unpack_return ret =
  536. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  537. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  538. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  539. EXPECT_EQ(size, obj.via.ext.size);
  540. EXPECT_EQ(80, obj.via.ext.type);
  541. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  542. msgpack_zone_destroy(&z);
  543. msgpack_sbuffer_destroy(&sbuf);
  544. }
  545. TEST(MSGPACKC, simple_buffer_fixext_4byte_65536)
  546. {
  547. const size_t size = 65536;
  548. char buf[size];
  549. for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
  550. msgpack_sbuffer sbuf;
  551. msgpack_sbuffer_init(&sbuf);
  552. msgpack_packer pk;
  553. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  554. msgpack_pack_ext(&pk, size, 81);
  555. msgpack_pack_ext_body(&pk, buf, sizeof(buf));
  556. msgpack_zone z;
  557. msgpack_zone_init(&z, 2048);
  558. msgpack_object obj;
  559. msgpack_unpack_return ret =
  560. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  561. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  562. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  563. EXPECT_EQ(size, obj.via.ext.size);
  564. EXPECT_EQ(81, obj.via.ext.type);
  565. EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
  566. msgpack_zone_destroy(&z);
  567. msgpack_sbuffer_destroy(&sbuf);
  568. }
  569. TEST(MSGPACKC, simple_buffer_timestamp_32)
  570. {
  571. msgpack_timestamp ts = {
  572. 0xffffffff,
  573. 0
  574. };
  575. msgpack_sbuffer sbuf;
  576. msgpack_sbuffer_init(&sbuf);
  577. msgpack_packer pk;
  578. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  579. msgpack_pack_timestamp(&pk, &ts);
  580. msgpack_zone z;
  581. msgpack_zone_init(&z, 2048);
  582. msgpack_object obj;
  583. msgpack_unpack_return ret =
  584. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  585. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  586. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  587. EXPECT_EQ(4u, obj.via.ext.size);
  588. EXPECT_EQ(-1, obj.via.ext.type);
  589. msgpack_timestamp ts2;
  590. bool r = msgpack_object_to_timestamp(&obj, &ts2);
  591. EXPECT_TRUE(r);
  592. EXPECT_EQ(ts.tv_sec, ts2.tv_sec);
  593. EXPECT_EQ(ts.tv_nsec, ts2.tv_nsec);
  594. msgpack_zone_destroy(&z);
  595. msgpack_sbuffer_destroy(&sbuf);
  596. }
  597. TEST(MSGPACKC, simple_buffer_timestamp_64)
  598. {
  599. msgpack_timestamp ts = {
  600. 0x3ffffffffL,
  601. 999999999
  602. };
  603. msgpack_sbuffer sbuf;
  604. msgpack_sbuffer_init(&sbuf);
  605. msgpack_packer pk;
  606. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  607. msgpack_pack_timestamp(&pk, &ts);
  608. msgpack_zone z;
  609. msgpack_zone_init(&z, 2048);
  610. msgpack_object obj;
  611. msgpack_unpack_return ret =
  612. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  613. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  614. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  615. EXPECT_EQ(8u, obj.via.ext.size);
  616. EXPECT_EQ(-1, obj.via.ext.type);
  617. msgpack_timestamp ts2;
  618. bool r = msgpack_object_to_timestamp(&obj, &ts2);
  619. EXPECT_TRUE(r);
  620. EXPECT_EQ(ts.tv_sec, ts2.tv_sec);
  621. EXPECT_EQ(ts.tv_nsec, ts2.tv_nsec);
  622. msgpack_zone_destroy(&z);
  623. msgpack_sbuffer_destroy(&sbuf);
  624. }
  625. TEST(MSGPACKC, simple_buffer_timestamp_96)
  626. {
  627. msgpack_timestamp ts = {
  628. 0x7fffffffffffffffLL,
  629. 999999999
  630. };
  631. msgpack_sbuffer sbuf;
  632. msgpack_sbuffer_init(&sbuf);
  633. msgpack_packer pk;
  634. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  635. msgpack_pack_timestamp(&pk, &ts);
  636. msgpack_zone z;
  637. msgpack_zone_init(&z, 2048);
  638. msgpack_object obj;
  639. msgpack_unpack_return ret =
  640. msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  641. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  642. EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
  643. EXPECT_EQ(12u, obj.via.ext.size);
  644. EXPECT_EQ(-1, obj.via.ext.type);
  645. msgpack_timestamp ts2;
  646. bool r = msgpack_object_to_timestamp(&obj, &ts2);
  647. EXPECT_TRUE(r);
  648. EXPECT_EQ(ts.tv_sec, ts2.tv_sec);
  649. EXPECT_EQ(ts.tv_nsec, ts2.tv_nsec);
  650. msgpack_zone_destroy(&z);
  651. msgpack_sbuffer_destroy(&sbuf);
  652. }
  653. TEST(MSGPACKC, simple_buffer_array)
  654. {
  655. unsigned int array_size = 5;
  656. msgpack_sbuffer sbuf;
  657. msgpack_sbuffer_init(&sbuf);
  658. msgpack_packer pk;
  659. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  660. msgpack_pack_array(&pk, array_size);
  661. msgpack_pack_nil(&pk);
  662. msgpack_pack_true(&pk);
  663. msgpack_pack_false(&pk);
  664. msgpack_pack_int(&pk, 10);
  665. msgpack_pack_int(&pk, -10);
  666. msgpack_zone z;
  667. msgpack_zone_init(&z, 2048);
  668. msgpack_object obj;
  669. msgpack_unpack_return ret;
  670. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  671. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  672. EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
  673. EXPECT_EQ(array_size, obj.via.array.size);
  674. for (unsigned int i = 0; i < obj.via.array.size; i++) {
  675. msgpack_object o = obj.via.array.ptr[i];
  676. switch (i) {
  677. case 0:
  678. EXPECT_EQ(MSGPACK_OBJECT_NIL, o.type);
  679. break;
  680. case 1:
  681. EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type);
  682. EXPECT_EQ(true, o.via.boolean);
  683. break;
  684. case 2:
  685. EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type);
  686. EXPECT_FALSE(o.via.boolean);
  687. break;
  688. case 3:
  689. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, o.type);
  690. EXPECT_EQ(10u, o.via.u64);
  691. break;
  692. case 4:
  693. EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, o.type);
  694. EXPECT_EQ(-10, o.via.i64);
  695. break;
  696. }
  697. }
  698. msgpack_zone_destroy(&z);
  699. msgpack_sbuffer_destroy(&sbuf);
  700. }
  701. TEST(MSGPACKC, simple_buffer_map)
  702. {
  703. unsigned int map_size = 2;
  704. msgpack_sbuffer sbuf;
  705. msgpack_sbuffer_init(&sbuf);
  706. msgpack_packer pk;
  707. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  708. msgpack_pack_map(&pk, map_size);
  709. msgpack_pack_true(&pk);
  710. msgpack_pack_false(&pk);
  711. msgpack_pack_int(&pk, 10);
  712. msgpack_pack_int(&pk, -10);
  713. msgpack_zone z;
  714. msgpack_zone_init(&z, 2048);
  715. msgpack_object obj;
  716. msgpack_unpack_return ret;
  717. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  718. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  719. EXPECT_EQ(MSGPACK_OBJECT_MAP, obj.type);
  720. EXPECT_EQ(map_size, obj.via.map.size);
  721. for (unsigned int i = 0; i < map_size; i++) {
  722. msgpack_object key = obj.via.map.ptr[i].key;
  723. msgpack_object val = obj.via.map.ptr[i].val;
  724. switch (i) {
  725. case 0:
  726. EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, key.type);
  727. EXPECT_EQ(true, key.via.boolean);
  728. EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, val.type);
  729. EXPECT_FALSE(val.via.boolean);
  730. break;
  731. case 1:
  732. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, key.type);
  733. EXPECT_EQ(10u, key.via.u64);
  734. EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, val.type);
  735. EXPECT_EQ(-10, val.via.i64);
  736. break;
  737. }
  738. }
  739. msgpack_zone_destroy(&z);
  740. msgpack_sbuffer_destroy(&sbuf);
  741. }
  742. TEST(MSGPACKC, simple_buffer_str)
  743. {
  744. unsigned int str_size = 7;
  745. msgpack_sbuffer sbuf;
  746. msgpack_sbuffer_init(&sbuf);
  747. msgpack_packer pk;
  748. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  749. msgpack_pack_str(&pk, str_size);
  750. msgpack_pack_str_body(&pk, "fr", 2);
  751. msgpack_pack_str_body(&pk, "syuki", 5);
  752. // invalid data
  753. msgpack_pack_str_body(&pk, "", 0);
  754. msgpack_pack_str_body(&pk, "kzk", 0);
  755. msgpack_zone z;
  756. msgpack_zone_init(&z, 2048);
  757. msgpack_object obj;
  758. msgpack_unpack_return ret;
  759. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  760. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  761. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  762. EXPECT_EQ(str_size, obj.via.str.size);
  763. EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
  764. msgpack_zone_destroy(&z);
  765. msgpack_sbuffer_destroy(&sbuf);
  766. }
  767. TEST(MSGPACKC, simple_buffer_str_fix_l)
  768. {
  769. char const* str = NULL;
  770. unsigned int str_size = 0;
  771. msgpack_sbuffer sbuf;
  772. msgpack_sbuffer_init(&sbuf);
  773. msgpack_packer pk;
  774. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  775. msgpack_pack_str(&pk, str_size);
  776. msgpack_pack_str_body(&pk, str, str_size);
  777. EXPECT_EQ(sbuf.size, 0x01u);
  778. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xa0u));
  779. msgpack_zone z;
  780. msgpack_zone_init(&z, 2048);
  781. msgpack_object obj;
  782. msgpack_unpack_return ret;
  783. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  784. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  785. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  786. EXPECT_EQ(str_size, obj.via.str.size);
  787. msgpack_zone_destroy(&z);
  788. msgpack_sbuffer_destroy(&sbuf);
  789. }
  790. TEST(MSGPACKC, simple_buffer_str_fix_h)
  791. {
  792. char str[0x1f] = {'0'};
  793. unsigned int str_size = sizeof(str);
  794. msgpack_sbuffer sbuf;
  795. msgpack_sbuffer_init(&sbuf);
  796. msgpack_packer pk;
  797. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  798. msgpack_pack_str(&pk, str_size);
  799. msgpack_pack_str_body(&pk, str, str_size);
  800. EXPECT_EQ(sbuf.size, 0x1f+1u);
  801. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xbfu));
  802. msgpack_zone z;
  803. msgpack_zone_init(&z, 2048);
  804. msgpack_object obj;
  805. msgpack_unpack_return ret;
  806. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  807. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  808. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  809. EXPECT_EQ(str_size, obj.via.str.size);
  810. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  811. msgpack_zone_destroy(&z);
  812. msgpack_sbuffer_destroy(&sbuf);
  813. }
  814. TEST(MSGPACKC, simple_buffer_str_8_l)
  815. {
  816. char str[0x1f+1] = {'0'};
  817. unsigned int str_size = sizeof(str);
  818. msgpack_sbuffer sbuf;
  819. msgpack_sbuffer_init(&sbuf);
  820. msgpack_packer pk;
  821. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  822. msgpack_pack_str(&pk, str_size);
  823. msgpack_pack_str_body(&pk, str, str_size);
  824. EXPECT_EQ(sbuf.size, 0x1f+1+2u);
  825. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xd9u));
  826. EXPECT_EQ(sbuf.data[1], static_cast<char>(0x20u));
  827. msgpack_zone z;
  828. msgpack_zone_init(&z, 2048);
  829. msgpack_object obj;
  830. msgpack_unpack_return ret;
  831. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  832. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  833. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  834. EXPECT_EQ(str_size, obj.via.str.size);
  835. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  836. msgpack_zone_destroy(&z);
  837. msgpack_sbuffer_destroy(&sbuf);
  838. }
  839. TEST(MSGPACKC, simple_buffer_str_8_h)
  840. {
  841. char str[0xff] = {'0'};
  842. unsigned int str_size = sizeof(str);
  843. msgpack_sbuffer sbuf;
  844. msgpack_sbuffer_init(&sbuf);
  845. msgpack_packer pk;
  846. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  847. msgpack_pack_str(&pk, str_size);
  848. msgpack_pack_str_body(&pk, str, str_size);
  849. EXPECT_EQ(sbuf.size, 0xff+2u);
  850. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xd9u));
  851. EXPECT_EQ(sbuf.data[1], static_cast<char>(0xffu));
  852. msgpack_zone z;
  853. msgpack_zone_init(&z, 2048);
  854. msgpack_object obj;
  855. msgpack_unpack_return ret;
  856. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  857. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  858. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  859. EXPECT_EQ(str_size, obj.via.str.size);
  860. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  861. msgpack_zone_destroy(&z);
  862. msgpack_sbuffer_destroy(&sbuf);
  863. }
  864. TEST(MSGPACKC, simple_buffer_str_16_l)
  865. {
  866. char str[0xff+1] = {'0'};
  867. unsigned int str_size = sizeof(str);
  868. msgpack_sbuffer sbuf;
  869. msgpack_sbuffer_init(&sbuf);
  870. msgpack_packer pk;
  871. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  872. msgpack_pack_str(&pk, str_size);
  873. msgpack_pack_str_body(&pk, str, str_size);
  874. EXPECT_EQ(sbuf.size, 0xff+1+3u);
  875. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
  876. EXPECT_EQ(sbuf.data[1], static_cast<char>(0x01u));
  877. EXPECT_EQ(sbuf.data[2], static_cast<char>(0x00u));
  878. msgpack_zone z;
  879. msgpack_zone_init(&z, 2048);
  880. msgpack_object obj;
  881. msgpack_unpack_return ret;
  882. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  883. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  884. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  885. EXPECT_EQ(str_size, obj.via.str.size);
  886. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  887. msgpack_zone_destroy(&z);
  888. msgpack_sbuffer_destroy(&sbuf);
  889. }
  890. TEST(MSGPACKC, simple_buffer_str_16_h)
  891. {
  892. char str[0xffff] = {'0'};
  893. unsigned int str_size = sizeof(str);
  894. msgpack_sbuffer sbuf;
  895. msgpack_sbuffer_init(&sbuf);
  896. msgpack_packer pk;
  897. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  898. msgpack_pack_str(&pk, str_size);
  899. msgpack_pack_str_body(&pk, str, str_size);
  900. EXPECT_EQ(sbuf.size, 0xffff+3u);
  901. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
  902. EXPECT_EQ(sbuf.data[1], static_cast<char>(0xffu));
  903. EXPECT_EQ(sbuf.data[2], static_cast<char>(0xffu));
  904. msgpack_zone z;
  905. msgpack_zone_init(&z, 2048);
  906. msgpack_object obj;
  907. msgpack_unpack_return ret;
  908. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  909. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  910. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  911. EXPECT_EQ(str_size, obj.via.str.size);
  912. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  913. msgpack_zone_destroy(&z);
  914. msgpack_sbuffer_destroy(&sbuf);
  915. }
  916. TEST(MSGPACKC, simple_buffer_str_32_l)
  917. {
  918. char str[0xffff+1] = {'0'};
  919. unsigned int str_size = sizeof(str);
  920. msgpack_sbuffer sbuf;
  921. msgpack_sbuffer_init(&sbuf);
  922. msgpack_packer pk;
  923. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  924. msgpack_pack_str(&pk, str_size);
  925. msgpack_pack_str_body(&pk, str, str_size);
  926. EXPECT_EQ(sbuf.size, 0xffff+1+5u);
  927. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdbu));
  928. EXPECT_EQ(sbuf.data[1], static_cast<char>(0x00u));
  929. EXPECT_EQ(sbuf.data[2], static_cast<char>(0x01u));
  930. EXPECT_EQ(sbuf.data[3], static_cast<char>(0x00u));
  931. EXPECT_EQ(sbuf.data[4], static_cast<char>(0x00u));
  932. msgpack_zone z;
  933. msgpack_zone_init(&z, 2048);
  934. msgpack_object obj;
  935. msgpack_unpack_return ret;
  936. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  937. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  938. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  939. EXPECT_EQ(str_size, obj.via.str.size);
  940. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  941. msgpack_zone_destroy(&z);
  942. msgpack_sbuffer_destroy(&sbuf);
  943. }
  944. TEST(MSGPACKC, simple_buffer_v4raw_fix_l)
  945. {
  946. char const* str = NULL;
  947. unsigned int str_size = 0;
  948. msgpack_sbuffer sbuf;
  949. msgpack_sbuffer_init(&sbuf);
  950. msgpack_packer pk;
  951. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  952. msgpack_pack_v4raw(&pk, str_size);
  953. msgpack_pack_v4raw_body(&pk, str, str_size);
  954. EXPECT_EQ(sbuf.size, 0x01u);
  955. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xa0u));
  956. msgpack_zone z;
  957. msgpack_zone_init(&z, 2048);
  958. msgpack_object obj;
  959. msgpack_unpack_return ret;
  960. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  961. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  962. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  963. EXPECT_EQ(str_size, obj.via.str.size);
  964. msgpack_zone_destroy(&z);
  965. msgpack_sbuffer_destroy(&sbuf);
  966. }
  967. TEST(MSGPACKC, simple_buffer_v4raw_fix_h)
  968. {
  969. char str[0x1f] = {'0'};
  970. unsigned int str_size = sizeof(str);
  971. msgpack_sbuffer sbuf;
  972. msgpack_sbuffer_init(&sbuf);
  973. msgpack_packer pk;
  974. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  975. msgpack_pack_v4raw(&pk, str_size);
  976. msgpack_pack_v4raw_body(&pk, str, str_size);
  977. EXPECT_EQ(sbuf.size, 0x1f+1u);
  978. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xbfu));
  979. msgpack_zone z;
  980. msgpack_zone_init(&z, 2048);
  981. msgpack_object obj;
  982. msgpack_unpack_return ret;
  983. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  984. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  985. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  986. EXPECT_EQ(str_size, obj.via.str.size);
  987. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  988. msgpack_zone_destroy(&z);
  989. msgpack_sbuffer_destroy(&sbuf);
  990. }
  991. TEST(MSGPACKC, simple_buffer_v4raw_16_l)
  992. {
  993. char str[0x1f+1] = {'0'};
  994. unsigned int str_size = sizeof(str);
  995. msgpack_sbuffer sbuf;
  996. msgpack_sbuffer_init(&sbuf);
  997. msgpack_packer pk;
  998. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  999. msgpack_pack_v4raw(&pk, str_size);
  1000. msgpack_pack_v4raw_body(&pk, str, str_size);
  1001. EXPECT_EQ(sbuf.size, 0x1f+1+3u);
  1002. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
  1003. EXPECT_EQ(sbuf.data[1], static_cast<char>(0x00u));
  1004. EXPECT_EQ(sbuf.data[2], static_cast<char>(0x20u));
  1005. msgpack_zone z;
  1006. msgpack_zone_init(&z, 2048);
  1007. msgpack_object obj;
  1008. msgpack_unpack_return ret;
  1009. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  1010. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1011. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1012. EXPECT_EQ(str_size, obj.via.str.size);
  1013. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  1014. msgpack_zone_destroy(&z);
  1015. msgpack_sbuffer_destroy(&sbuf);
  1016. }
  1017. TEST(MSGPACKC, simple_buffer_v4raw_16_h)
  1018. {
  1019. char str[0xffff] = {'0'};
  1020. unsigned int str_size = sizeof(str);
  1021. msgpack_sbuffer sbuf;
  1022. msgpack_sbuffer_init(&sbuf);
  1023. msgpack_packer pk;
  1024. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  1025. msgpack_pack_v4raw(&pk, str_size);
  1026. msgpack_pack_v4raw_body(&pk, str, str_size);
  1027. EXPECT_EQ(sbuf.size, 0xffff+3u);
  1028. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
  1029. EXPECT_EQ(sbuf.data[1], static_cast<char>(0xffu));
  1030. EXPECT_EQ(sbuf.data[2], static_cast<char>(0xffu));
  1031. msgpack_zone z;
  1032. msgpack_zone_init(&z, 2048);
  1033. msgpack_object obj;
  1034. msgpack_unpack_return ret;
  1035. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  1036. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1037. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1038. EXPECT_EQ(str_size, obj.via.str.size);
  1039. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  1040. msgpack_zone_destroy(&z);
  1041. msgpack_sbuffer_destroy(&sbuf);
  1042. }
  1043. TEST(MSGPACKC, simple_buffer_v4raw_32_l)
  1044. {
  1045. char str[0xffff+1] = {'0'};
  1046. unsigned int str_size = sizeof(str);
  1047. msgpack_sbuffer sbuf;
  1048. msgpack_sbuffer_init(&sbuf);
  1049. msgpack_packer pk;
  1050. msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
  1051. msgpack_pack_v4raw(&pk, str_size);
  1052. msgpack_pack_v4raw_body(&pk, str, str_size);
  1053. EXPECT_EQ(sbuf.size, 0xffff+1+5u);
  1054. EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdbu));
  1055. EXPECT_EQ(sbuf.data[1], static_cast<char>(0x00u));
  1056. EXPECT_EQ(sbuf.data[2], static_cast<char>(0x01u));
  1057. EXPECT_EQ(sbuf.data[3], static_cast<char>(0x00u));
  1058. EXPECT_EQ(sbuf.data[4], static_cast<char>(0x00u));
  1059. msgpack_zone z;
  1060. msgpack_zone_init(&z, 2048);
  1061. msgpack_object obj;
  1062. msgpack_unpack_return ret;
  1063. ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
  1064. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1065. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1066. EXPECT_EQ(str_size, obj.via.str.size);
  1067. EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
  1068. msgpack_zone_destroy(&z);
  1069. msgpack_sbuffer_destroy(&sbuf);
  1070. }
  1071. TEST(MSGPACKC, unpack_fixstr)
  1072. {
  1073. size_t str_size = 7;
  1074. const char buf[] = {
  1075. (char)0xa7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1076. };
  1077. msgpack_zone z;
  1078. msgpack_zone_init(&z, 2048);
  1079. msgpack_object obj;
  1080. msgpack_unpack_return ret;
  1081. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1082. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1083. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1084. EXPECT_EQ(str_size, obj.via.str.size);
  1085. EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
  1086. msgpack_zone_destroy(&z);
  1087. }
  1088. TEST(MSGPACKC, unpack_str8)
  1089. {
  1090. size_t str_size = 7;
  1091. const char buf[] = {
  1092. (char)0xd9, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1093. };
  1094. msgpack_zone z;
  1095. msgpack_zone_init(&z, 2048);
  1096. msgpack_object obj;
  1097. msgpack_unpack_return ret;
  1098. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1099. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1100. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1101. EXPECT_EQ(str_size, obj.via.str.size);
  1102. EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
  1103. msgpack_zone_destroy(&z);
  1104. }
  1105. TEST(MSGPACKC, unpack_str16)
  1106. {
  1107. size_t str_size = 7;
  1108. const char buf[] = {
  1109. (char)0xda, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1110. };
  1111. msgpack_zone z;
  1112. msgpack_zone_init(&z, 2048);
  1113. msgpack_object obj;
  1114. msgpack_unpack_return ret;
  1115. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1116. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1117. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1118. EXPECT_EQ(str_size, obj.via.str.size);
  1119. EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
  1120. msgpack_zone_destroy(&z);
  1121. }
  1122. TEST(MSGPACKC, unpack_str32)
  1123. {
  1124. size_t str_size = 7;
  1125. const char buf[] = {
  1126. (char)0xdb, 0, 0, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1127. };
  1128. msgpack_zone z;
  1129. msgpack_zone_init(&z, 2048);
  1130. msgpack_object obj;
  1131. msgpack_unpack_return ret;
  1132. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1133. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1134. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  1135. EXPECT_EQ(str_size, obj.via.str.size);
  1136. EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
  1137. msgpack_zone_destroy(&z);
  1138. }
  1139. TEST(MSGPACKC, unpack_bin8)
  1140. {
  1141. size_t bin_size = 7;
  1142. const char buf[] = {
  1143. (char)0xc4, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1144. };
  1145. msgpack_zone z;
  1146. msgpack_zone_init(&z, 2048);
  1147. msgpack_object obj;
  1148. msgpack_unpack_return ret;
  1149. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1150. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1151. EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
  1152. EXPECT_EQ(bin_size, obj.via.bin.size);
  1153. EXPECT_EQ(0, memcmp("frsyuki", obj.via.bin.ptr, bin_size));
  1154. msgpack_zone_destroy(&z);
  1155. }
  1156. TEST(MSGPACKC, unpack_bin16)
  1157. {
  1158. size_t bin_size = 7;
  1159. const char buf[] = {
  1160. (char)0xc5, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1161. };
  1162. msgpack_zone z;
  1163. msgpack_zone_init(&z, 2048);
  1164. msgpack_object obj;
  1165. msgpack_unpack_return ret;
  1166. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1167. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1168. EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
  1169. EXPECT_EQ(bin_size, obj.via.bin.size);
  1170. EXPECT_EQ(0, memcmp("frsyuki", obj.via.bin.ptr, bin_size));
  1171. msgpack_zone_destroy(&z);
  1172. }
  1173. TEST(MSGPACKC, unpack_bin32)
  1174. {
  1175. size_t bin_size = 7;
  1176. const char buf[] = {
  1177. (char)0xc6, 0, 0, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
  1178. };
  1179. msgpack_zone z;
  1180. msgpack_zone_init(&z, 2048);
  1181. msgpack_object obj;
  1182. msgpack_unpack_return ret;
  1183. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1184. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1185. EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
  1186. EXPECT_EQ(bin_size, obj.via.bin.size);
  1187. EXPECT_EQ(0, memcmp("frsyuki", obj.via.bin.ptr, bin_size));
  1188. msgpack_zone_destroy(&z);
  1189. }
  1190. TEST(MSGPACKC, unpack_array_uint64)
  1191. {
  1192. const char buf[] = {
  1193. (char)0x91, (char)0xcf, (char)0xff, (char)0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
  1194. };
  1195. msgpack_zone z;
  1196. msgpack_zone_init(&z, 2048);
  1197. msgpack_object obj;
  1198. msgpack_unpack_return ret;
  1199. ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
  1200. EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
  1201. EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
  1202. EXPECT_EQ(1u, obj.via.array.size);
  1203. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.via.array.ptr[0].type);
  1204. EXPECT_EQ(0xFFF0000000000001LL, obj.via.array.ptr[0].via.u64);
  1205. msgpack_zone_destroy(&z);
  1206. }
  1207. TEST(MSGPACKC, vref_buffer_overflow)
  1208. {
  1209. msgpack_vrefbuffer vbuf;
  1210. msgpack_vrefbuffer to;
  1211. size_t ref_size = 0;
  1212. size_t chunk_size = std::numeric_limits<size_t>::max();
  1213. EXPECT_FALSE(msgpack_vrefbuffer_init(&vbuf, ref_size, chunk_size));
  1214. EXPECT_EQ(-1, msgpack_vrefbuffer_migrate(&vbuf, &to));
  1215. }