msgpack_basic.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. #include "msgpack.hpp"
  2. #include <cmath>
  3. #include <string>
  4. #include <vector>
  5. #include <map>
  6. #include <deque>
  7. #include <set>
  8. #include <list>
  9. #include <limits>
  10. #include <gtest/gtest.h>
  11. #if defined(_MSC_VER) || defined(__MINGW32__)
  12. #define msgpack_rand() ((double)rand() / RAND_MAX)
  13. #else // _MSC_VER || __MINGW32__
  14. #define msgpack_rand() drand48()
  15. #endif // _MSC_VER || __MINGW32__
  16. #ifdef HAVE_CONFIG_H
  17. #include "config.h"
  18. #endif
  19. using namespace std;
  20. const unsigned int kLoop = 10000;
  21. const unsigned int kElements = 100;
  22. const double kEPS = 1e-10;
  23. #define GEN_TEST(test_type) \
  24. do { \
  25. vector<test_type> v; \
  26. v.push_back(0); \
  27. v.push_back(1); \
  28. v.push_back(2); \
  29. v.push_back(numeric_limits<test_type>::min()); \
  30. v.push_back(numeric_limits<test_type>::max()); \
  31. for (unsigned int i = 0; i < kLoop; i++) \
  32. v.push_back(rand()); \
  33. for (unsigned int i = 0; i < v.size() ; i++) { \
  34. msgpack::sbuffer sbuf; \
  35. test_type val1 = v[i]; \
  36. msgpack::pack(sbuf, val1); \
  37. msgpack::object_handle oh = \
  38. msgpack::unpack(sbuf.data(), sbuf.size()); \
  39. EXPECT_EQ(val1, oh.get().as<test_type>()); \
  40. } \
  41. } while(0)
  42. TEST(MSGPACK, simple_buffer_char)
  43. {
  44. GEN_TEST(char);
  45. }
  46. TEST(MSGPACK, simple_buffer_signed_char)
  47. {
  48. GEN_TEST(signed char);
  49. }
  50. TEST(MSGPACK, simple_buffer_unsigned_char)
  51. {
  52. GEN_TEST(unsigned char);
  53. }
  54. TEST(MSGPACK, simple_buffer_short)
  55. {
  56. GEN_TEST(short);
  57. }
  58. TEST(MSGPACK, simple_buffer_int)
  59. {
  60. GEN_TEST(int);
  61. }
  62. TEST(MSGPACK, simple_buffer_long)
  63. {
  64. GEN_TEST(long);
  65. }
  66. TEST(MSGPACK, simple_buffer_long_long)
  67. {
  68. GEN_TEST(long long);
  69. }
  70. TEST(MSGPACK, simple_buffer_unsigned_short)
  71. {
  72. GEN_TEST(unsigned short);
  73. }
  74. TEST(MSGPACK, simple_buffer_unsigned_int)
  75. {
  76. GEN_TEST(unsigned int);
  77. }
  78. TEST(MSGPACK, simple_buffer_unsigned_long)
  79. {
  80. GEN_TEST(unsigned long);
  81. }
  82. TEST(MSGPACK, simple_buffer_unsigned_long_long)
  83. {
  84. GEN_TEST(unsigned long long);
  85. }
  86. TEST(MSGPACK, simple_buffer_uint8)
  87. {
  88. GEN_TEST(uint8_t);
  89. }
  90. TEST(MSGPACK, simple_buffer_uint16)
  91. {
  92. GEN_TEST(uint16_t);
  93. }
  94. TEST(MSGPACK, simple_buffer_uint32)
  95. {
  96. GEN_TEST(uint32_t);
  97. }
  98. TEST(MSGPACK, simple_buffer_uint64)
  99. {
  100. GEN_TEST(uint64_t);
  101. }
  102. TEST(MSGPACK, simple_buffer_int8)
  103. {
  104. GEN_TEST(int8_t);
  105. }
  106. TEST(MSGPACK, simple_buffer_int16)
  107. {
  108. GEN_TEST(int16_t);
  109. }
  110. TEST(MSGPACK, simple_buffer_int32)
  111. {
  112. GEN_TEST(int32_t);
  113. }
  114. TEST(MSGPACK, simple_buffer_int64)
  115. {
  116. GEN_TEST(int64_t);
  117. }
  118. #if !defined(_MSC_VER) || _MSC_VER >=1800
  119. TEST(MSGPACK, simple_buffer_float)
  120. {
  121. vector<float> v;
  122. v.push_back(0.0);
  123. v.push_back(-0.0);
  124. v.push_back(1.0);
  125. v.push_back(-1.0);
  126. v.push_back(numeric_limits<float>::min());
  127. v.push_back(numeric_limits<float>::max());
  128. v.push_back(nanf("tag"));
  129. if (numeric_limits<float>::has_infinity) {
  130. v.push_back(numeric_limits<float>::infinity());
  131. v.push_back(-numeric_limits<float>::infinity());
  132. }
  133. if (numeric_limits<float>::has_quiet_NaN) {
  134. v.push_back(numeric_limits<float>::quiet_NaN());
  135. }
  136. if (numeric_limits<float>::has_signaling_NaN) {
  137. v.push_back(numeric_limits<float>::signaling_NaN());
  138. }
  139. for (unsigned int i = 0; i < kLoop; i++) {
  140. v.push_back(static_cast<float>(msgpack_rand()));
  141. v.push_back(static_cast<float>(-msgpack_rand()));
  142. }
  143. for (unsigned int i = 0; i < v.size() ; i++) {
  144. msgpack::sbuffer sbuf;
  145. float val1 = v[i];
  146. msgpack::pack(sbuf, val1);
  147. msgpack::object_handle oh =
  148. msgpack::unpack(sbuf.data(), sbuf.size());
  149. float val2 = oh.get().as<float>();
  150. if (std::isnan(val1))
  151. EXPECT_TRUE(std::isnan(val2));
  152. else if (std::isinf(val1))
  153. EXPECT_TRUE(std::isinf(val2));
  154. else
  155. EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
  156. }
  157. }
  158. #endif // !defined(_MSC_VER) || _MSC_VER >=1800
  159. namespace {
  160. template<typename F, typename I>
  161. struct TypePair {
  162. typedef F float_type;
  163. typedef I integer_type;
  164. };
  165. } // namespace
  166. template <typename T>
  167. class IntegerToFloatingPointTest : public testing::Test {
  168. };
  169. TYPED_TEST_CASE_P(IntegerToFloatingPointTest);
  170. TYPED_TEST_P(IntegerToFloatingPointTest, simple_buffer)
  171. {
  172. typedef typename TypeParam::float_type float_type;
  173. typedef typename TypeParam::integer_type integer_type;
  174. vector<integer_type> v;
  175. v.push_back(0);
  176. v.push_back(1);
  177. if (numeric_limits<integer_type>::is_signed) v.push_back(-1);
  178. else v.push_back(2);
  179. for (unsigned int i = 0; i < kLoop; i++) {
  180. v.push_back(rand() % 0x7FFFFF);
  181. }
  182. for (unsigned int i = 0; i < v.size() ; i++) {
  183. msgpack::sbuffer sbuf;
  184. integer_type val1 = v[i];
  185. msgpack::pack(sbuf, val1);
  186. msgpack::object_handle oh =
  187. msgpack::unpack(sbuf.data(), sbuf.size());
  188. float_type val2 = oh.get().as<float_type>();
  189. EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
  190. }
  191. }
  192. REGISTER_TYPED_TEST_CASE_P(IntegerToFloatingPointTest,
  193. simple_buffer);
  194. typedef testing::Types<TypePair<float, signed long long>,
  195. TypePair<float, unsigned long long>,
  196. TypePair<double, signed long long>,
  197. TypePair<double, unsigned long long> > IntegerToFloatingPointTestTypes;
  198. INSTANTIATE_TYPED_TEST_CASE_P(IntegerToFloatingPointTestInstance,
  199. IntegerToFloatingPointTest,
  200. IntegerToFloatingPointTestTypes);
  201. #if !defined(_MSC_VER) || _MSC_VER >=1800
  202. TEST(MSGPACK, simple_buffer_double)
  203. {
  204. vector<double> v;
  205. v.push_back(0.0);
  206. v.push_back(-0.0);
  207. v.push_back(1.0);
  208. v.push_back(-1.0);
  209. v.push_back(numeric_limits<double>::min());
  210. v.push_back(numeric_limits<double>::max());
  211. v.push_back(nanf("tag"));
  212. if (numeric_limits<double>::has_infinity) {
  213. v.push_back(numeric_limits<double>::infinity());
  214. v.push_back(-numeric_limits<double>::infinity());
  215. }
  216. if (numeric_limits<double>::has_quiet_NaN) {
  217. v.push_back(numeric_limits<double>::quiet_NaN());
  218. }
  219. if (numeric_limits<double>::has_signaling_NaN) {
  220. v.push_back(numeric_limits<double>::signaling_NaN());
  221. }
  222. for (unsigned int i = 0; i < kLoop; i++) {
  223. v.push_back(msgpack_rand());
  224. v.push_back(-msgpack_rand());
  225. }
  226. for (unsigned int i = 0; i < kLoop; i++) {
  227. v.push_back(msgpack_rand());
  228. v.push_back(-msgpack_rand());
  229. }
  230. for (unsigned int i = 0; i < v.size() ; i++) {
  231. msgpack::sbuffer sbuf;
  232. double val1 = v[i];
  233. msgpack::pack(sbuf, val1);
  234. msgpack::object_handle oh =
  235. msgpack::unpack(sbuf.data(), sbuf.size());
  236. double val2 = oh.get().as<double>();
  237. if (std::isnan(val1))
  238. EXPECT_TRUE(std::isnan(val2));
  239. else if (std::isinf(val1))
  240. EXPECT_TRUE(std::isinf(val2));
  241. else
  242. EXPECT_TRUE(fabs(val2 - val1) <= kEPS);
  243. }
  244. }
  245. #endif // !defined(_MSC_VER) || _MSC_VER >=1800
  246. TEST(MSGPACK, simple_buffer_nil)
  247. {
  248. msgpack::sbuffer sbuf;
  249. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  250. packer.pack_nil();
  251. msgpack::object_handle oh =
  252. msgpack::unpack(sbuf.data(), sbuf.size());
  253. EXPECT_EQ(oh.get().type, msgpack::type::NIL);
  254. }
  255. TEST(MSGPACK, simple_buffer_true)
  256. {
  257. msgpack::sbuffer sbuf;
  258. bool val1 = true;
  259. msgpack::pack(sbuf, val1);
  260. msgpack::object_handle oh =
  261. msgpack::unpack(sbuf.data(), sbuf.size());
  262. bool val2 = oh.get().as<bool>();
  263. EXPECT_EQ(val1, val2);
  264. }
  265. TEST(MSGPACK, simple_buffer_false)
  266. {
  267. msgpack::sbuffer sbuf;
  268. bool val1 = false;
  269. msgpack::pack(sbuf, val1);
  270. msgpack::object_handle oh =
  271. msgpack::unpack(sbuf.data(), sbuf.size());
  272. bool val2 = oh.get().as<bool>();
  273. EXPECT_EQ(val1, val2);
  274. }
  275. TEST(MSGPACK, simple_buffer_fixext1)
  276. {
  277. msgpack::sbuffer sbuf;
  278. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  279. char const buf [] = { 2 };
  280. packer.pack_ext(sizeof(buf), 1);
  281. packer.pack_ext_body(buf, sizeof(buf));
  282. msgpack::object_handle oh =
  283. msgpack::unpack(sbuf.data(), sbuf.size());
  284. EXPECT_EQ(1ul, oh.get().via.ext.size);
  285. EXPECT_EQ(1, oh.get().via.ext.type());
  286. EXPECT_EQ(2, oh.get().via.ext.data()[0]);
  287. }
  288. TEST(MSGPACK, simple_buffer_fixext2)
  289. {
  290. msgpack::sbuffer sbuf;
  291. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  292. char const buf [] = { 2, 3 };
  293. packer.pack_ext(sizeof(buf), 0);
  294. packer.pack_ext_body(buf, sizeof(buf));
  295. msgpack::object_handle oh =
  296. msgpack::unpack(sbuf.data(), sbuf.size());
  297. EXPECT_EQ(2ul, oh.get().via.ext.size);
  298. EXPECT_EQ(0, oh.get().via.ext.type());
  299. EXPECT_TRUE(
  300. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  301. }
  302. TEST(MSGPACK, simple_buffer_fixext4)
  303. {
  304. msgpack::sbuffer sbuf;
  305. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  306. char const buf [] = { 2, 3, 4, 5 };
  307. packer.pack_ext(sizeof(buf), 1);
  308. packer.pack_ext_body(buf, sizeof(buf));
  309. msgpack::object_handle oh =
  310. msgpack::unpack(sbuf.data(), sbuf.size());
  311. EXPECT_EQ(4ul, oh.get().via.ext.size);
  312. EXPECT_EQ(1, oh.get().via.ext.type());
  313. EXPECT_TRUE(
  314. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  315. }
  316. TEST(MSGPACK, simple_buffer_fixext8)
  317. {
  318. msgpack::sbuffer sbuf;
  319. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  320. char const buf [] = { 2, 3, 4, 5, 6, 7, 8, 9 };
  321. packer.pack_ext(sizeof(buf), 1);
  322. packer.pack_ext_body(buf, sizeof(buf));
  323. msgpack::object_handle oh =
  324. msgpack::unpack(sbuf.data(), sbuf.size());
  325. EXPECT_EQ(8ul, oh.get().via.ext.size);
  326. EXPECT_EQ(1, oh.get().via.ext.type());
  327. EXPECT_TRUE(
  328. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  329. }
  330. TEST(MSGPACK, simple_buffer_fixext16)
  331. {
  332. msgpack::sbuffer sbuf;
  333. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  334. char const buf [] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
  335. packer.pack_ext(sizeof(buf), 1);
  336. packer.pack_ext_body(buf, sizeof(buf));
  337. msgpack::object_handle oh =
  338. msgpack::unpack(sbuf.data(), sbuf.size());
  339. EXPECT_EQ(16ul, oh.get().via.ext.size);
  340. EXPECT_EQ(1, oh.get().via.ext.type());
  341. EXPECT_TRUE(
  342. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  343. }
  344. TEST(MSGPACK, simple_buffer_fixext_1byte_0)
  345. {
  346. std::size_t const size = 0;
  347. msgpack::sbuffer sbuf;
  348. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  349. packer.pack_ext(size, 77);
  350. msgpack::object_handle oh =
  351. msgpack::unpack(sbuf.data(), sbuf.size());
  352. EXPECT_EQ(size, oh.get().via.ext.size);
  353. EXPECT_EQ(77, oh.get().via.ext.type());
  354. }
  355. TEST(MSGPACK, simple_buffer_fixext_1byte_255)
  356. {
  357. std::size_t const size = 255;
  358. msgpack::sbuffer sbuf;
  359. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  360. char buf[size];
  361. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  362. packer.pack_ext(sizeof(buf), 77);
  363. packer.pack_ext_body(buf, sizeof(buf));
  364. msgpack::object_handle oh =
  365. msgpack::unpack(sbuf.data(), sbuf.size());
  366. EXPECT_EQ(size, oh.get().via.ext.size);
  367. EXPECT_EQ(77, oh.get().via.ext.type());
  368. EXPECT_TRUE(
  369. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  370. }
  371. TEST(MSGPACK, simple_buffer_fixext_2byte_256)
  372. {
  373. std::size_t const size = 256;
  374. msgpack::sbuffer sbuf;
  375. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  376. char buf[size];
  377. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  378. packer.pack_ext(sizeof(buf), 77);
  379. packer.pack_ext_body(buf, sizeof(buf));
  380. msgpack::object_handle oh =
  381. msgpack::unpack(sbuf.data(), sbuf.size());
  382. EXPECT_EQ(size, oh.get().via.ext.size);
  383. EXPECT_EQ(77, oh.get().via.ext.type());
  384. EXPECT_TRUE(
  385. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  386. }
  387. TEST(MSGPACK, simple_buffer_fixext_2byte_65535)
  388. {
  389. std::size_t const size = 65535;
  390. msgpack::sbuffer sbuf;
  391. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  392. char buf[size];
  393. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  394. packer.pack_ext(sizeof(buf), 77);
  395. packer.pack_ext_body(buf, sizeof(buf));
  396. msgpack::object_handle oh =
  397. msgpack::unpack(sbuf.data(), sbuf.size());
  398. EXPECT_EQ(size, oh.get().via.ext.size);
  399. EXPECT_EQ(77, oh.get().via.ext.type());
  400. EXPECT_TRUE(
  401. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  402. }
  403. TEST(MSGPACK, simple_buffer_fixext_4byte_65536)
  404. {
  405. std::size_t const size = 65536;
  406. msgpack::sbuffer sbuf;
  407. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  408. char buf[size];
  409. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  410. packer.pack_ext(sizeof(buf), 77);
  411. packer.pack_ext_body(buf, sizeof(buf));
  412. msgpack::object_handle oh =
  413. msgpack::unpack(sbuf.data(), sbuf.size());
  414. EXPECT_EQ(size, oh.get().via.ext.size);
  415. EXPECT_EQ(77, oh.get().via.ext.type());
  416. EXPECT_TRUE(
  417. std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
  418. }
  419. TEST(MSGPACK, simple_buffer_ext_convert)
  420. {
  421. std::size_t const size = 65536;
  422. msgpack::sbuffer sbuf;
  423. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  424. char buf[size];
  425. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  426. packer.pack_ext(sizeof(buf), 77);
  427. packer.pack_ext_body(buf, sizeof(buf));
  428. msgpack::object_handle oh =
  429. msgpack::unpack(sbuf.data(), sbuf.size());
  430. msgpack::type::ext e;
  431. oh.get().convert(e);
  432. EXPECT_EQ(size, e.size());
  433. EXPECT_EQ(77, e.type());
  434. EXPECT_TRUE(
  435. std::equal(buf, buf + sizeof(buf), e.data()));
  436. }
  437. TEST(MSGPACK, simple_buffer_ext_pack_convert)
  438. {
  439. std::size_t const size = 65536;
  440. msgpack::sbuffer sbuf;
  441. msgpack::type::ext val1(77, size);
  442. char* buf = val1.data();
  443. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  444. msgpack::pack(sbuf, val1);
  445. msgpack::object_handle oh =
  446. msgpack::unpack(sbuf.data(), sbuf.size());
  447. msgpack::type::ext val2;
  448. oh.get().convert(val2);
  449. EXPECT_EQ(size, val2.size());
  450. EXPECT_EQ(77, val2.type());
  451. EXPECT_TRUE(
  452. std::equal(buf, buf + sizeof(buf), val2.data()));
  453. }
  454. TEST(MSGPACK, simple_buffer_ext_ref_convert)
  455. {
  456. std::size_t const size = 65536;
  457. msgpack::sbuffer sbuf;
  458. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  459. char buf[size];
  460. for (std::size_t i = 0; i != size; ++i) buf[i] = static_cast<char>(i);
  461. packer.pack_ext(sizeof(buf), 77);
  462. packer.pack_ext_body(buf, sizeof(buf));
  463. msgpack::object_handle oh =
  464. msgpack::unpack(sbuf.data(), sbuf.size());
  465. msgpack::type::ext_ref er;
  466. oh.get().convert(er);
  467. EXPECT_EQ(size, er.size());
  468. EXPECT_EQ(77, er.type());
  469. EXPECT_TRUE(
  470. std::equal(buf, buf + sizeof(buf), er.data()));
  471. }
  472. TEST(MSGPACK, simple_buffer_ext_ref_pack_convert)
  473. {
  474. std::size_t const buf_size = 65536;
  475. std::size_t const data_size = buf_size - 1;
  476. msgpack::sbuffer sbuf;
  477. char buf[buf_size];
  478. buf[0] = static_cast<char>(77);
  479. for (std::size_t i = 0; i != data_size; ++i) buf[i + 1] = static_cast<char>(i);
  480. msgpack::pack(sbuf, msgpack::type::ext_ref(buf, buf_size));
  481. msgpack::object_handle oh =
  482. msgpack::unpack(sbuf.data(), sbuf.size());
  483. msgpack::type::ext_ref val2;
  484. oh.get().convert(val2);
  485. EXPECT_EQ(data_size, val2.size());
  486. EXPECT_EQ(77, val2.type());
  487. EXPECT_TRUE(
  488. std::equal(&buf[1], &buf[buf_size], val2.data()));
  489. }
  490. TEST(MSGPACK_STL, simple_buffer_string)
  491. {
  492. for (unsigned int k = 0; k < kLoop; k++) {
  493. string val1;
  494. for (unsigned int i = 0; i < kElements; i++)
  495. val1 += 'a' + rand() % 26;
  496. msgpack::sbuffer sbuf;
  497. msgpack::pack(sbuf, val1);
  498. msgpack::object_handle oh =
  499. msgpack::unpack(sbuf.data(), sbuf.size());
  500. EXPECT_EQ(oh.get().type, msgpack::type::STR);
  501. string val2 = oh.get().as<string>();
  502. EXPECT_EQ(val1.size(), val2.size());
  503. EXPECT_EQ(val1, val2);
  504. }
  505. }
  506. TEST(MSGPACK_STL, simple_buffer_cstring)
  507. {
  508. for (unsigned int k = 0; k < kLoop; k++) {
  509. string val1;
  510. for (unsigned int i = 0; i < kElements; i++)
  511. val1 += 'a' + rand() % 26;
  512. msgpack::sbuffer sbuf;
  513. msgpack::pack(sbuf, val1.c_str());
  514. msgpack::object_handle oh =
  515. msgpack::unpack(sbuf.data(), sbuf.size());
  516. EXPECT_EQ(oh.get().type, msgpack::type::STR);
  517. string val2 = oh.get().as<string>();
  518. EXPECT_EQ(val1.size(), val2.size());
  519. EXPECT_EQ(val1, val2);
  520. }
  521. }
  522. TEST(MSGPACK_STL, simple_buffer_non_const_cstring)
  523. {
  524. for (unsigned int k = 0; k < kLoop; k++) {
  525. string val1;
  526. for (unsigned int i = 0; i < kElements; i++)
  527. val1 += 'a' + rand() % 26;
  528. msgpack::sbuffer sbuf;
  529. char* s = new char[val1.size() + 1];
  530. std::memcpy(s, val1.c_str(), val1.size() + 1);
  531. msgpack::pack(sbuf, s);
  532. delete [] s;
  533. msgpack::object_handle oh =
  534. msgpack::unpack(sbuf.data(), sbuf.size());
  535. EXPECT_EQ(oh.get().type, msgpack::type::STR);
  536. string val2 = oh.get().as<string>();
  537. EXPECT_EQ(val1.size(), val2.size());
  538. EXPECT_EQ(val1, val2);
  539. }
  540. }