reference.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. #include <msgpack.hpp>
  2. #include <gtest/gtest.h>
  3. TEST(reference, unpack_int)
  4. {
  5. msgpack::sbuffer sbuf;
  6. msgpack::pack(sbuf, 1);
  7. bool referenced = false;
  8. msgpack::object_handle oh =
  9. msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  10. EXPECT_FALSE(referenced);
  11. }
  12. TEST(reference, unpack_string)
  13. {
  14. msgpack::sbuffer sbuf;
  15. msgpack::pack(sbuf, std::string("abcdefg"));
  16. bool referenced = false;
  17. msgpack::object_handle oh =
  18. msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  19. EXPECT_FALSE(referenced);
  20. }
  21. TEST(reference, unpack_bin)
  22. {
  23. msgpack::sbuffer sbuf;
  24. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  25. char c[] = { 1, 2, 3, 4, 5, 6 };
  26. packer.pack_bin(sizeof(c));
  27. packer.pack_bin_body(c, sizeof(c));
  28. bool referenced = false;
  29. msgpack::object_handle oh =
  30. msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  31. EXPECT_FALSE(referenced);
  32. }
  33. TEST(reference, unpack_ext)
  34. {
  35. msgpack::sbuffer sbuf;
  36. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  37. char const buf [] = { 2 };
  38. packer.pack_ext(sizeof(buf), 1);
  39. packer.pack_ext_body(buf, sizeof(buf));
  40. bool referenced = false;
  41. msgpack::object_handle oh =
  42. msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  43. EXPECT_FALSE(referenced);
  44. }
  45. bool never_called(msgpack::type::object_type, std::size_t, void*)
  46. {
  47. EXPECT_TRUE(false);
  48. return false;
  49. }
  50. bool always_reference(msgpack::type::object_type, std::size_t, void*)
  51. {
  52. return true;
  53. }
  54. TEST(reference, unpack_int_ref)
  55. {
  56. msgpack::sbuffer sbuf;
  57. msgpack::pack(sbuf, 1);
  58. bool referenced = false;
  59. msgpack::object_handle oh =
  60. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, never_called);
  61. EXPECT_FALSE(referenced);
  62. }
  63. TEST(reference, unpack_string_ref)
  64. {
  65. msgpack::sbuffer sbuf;
  66. msgpack::pack(sbuf, std::string("abcdefg"));
  67. bool referenced = false;
  68. msgpack::object_handle oh =
  69. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, always_reference);
  70. EXPECT_TRUE(referenced);
  71. }
  72. TEST(reference, unpack_bin_ref)
  73. {
  74. msgpack::sbuffer sbuf;
  75. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  76. char c[] = { 1, 2, 3, 4, 5, 6 };
  77. packer.pack_bin(sizeof(c));
  78. packer.pack_bin_body(c, sizeof(c));
  79. bool referenced = false;
  80. msgpack::object_handle oh =
  81. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, always_reference);
  82. EXPECT_TRUE(referenced);
  83. }
  84. TEST(reference, unpack_ext_ref)
  85. {
  86. msgpack::sbuffer sbuf;
  87. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  88. char const buf [] = { 2 };
  89. packer.pack_ext(sizeof(buf), 1);
  90. packer.pack_ext_body(buf, sizeof(buf));
  91. bool referenced = false;
  92. msgpack::object_handle oh =
  93. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, always_reference);
  94. EXPECT_TRUE(referenced);
  95. }
  96. static void* s_p;
  97. bool sized_reference(msgpack::type::object_type t, std::size_t s, void* p)
  98. {
  99. s_p = p;
  100. switch (t) {
  101. case msgpack::type::STR:
  102. if (s >= 5) return true;
  103. break;
  104. case msgpack::type::BIN:
  105. if (s >= 6) return true;
  106. break;
  107. case msgpack::type::EXT:
  108. if (s >= 7) return true;
  109. break;
  110. default:
  111. EXPECT_TRUE(false);
  112. }
  113. return false;
  114. }
  115. TEST(reference, unpack_int_sized_ref)
  116. {
  117. msgpack::sbuffer sbuf;
  118. msgpack::pack(sbuf, 1);
  119. bool referenced = false;
  120. s_p = MSGPACK_NULLPTR;
  121. msgpack::object_handle oh =
  122. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, never_called, &sbuf);
  123. EXPECT_FALSE(referenced);
  124. EXPECT_EQ(MSGPACK_NULLPTR, s_p);
  125. }
  126. TEST(reference, unpack_string_sized_ref_4)
  127. {
  128. msgpack::sbuffer sbuf;
  129. msgpack::pack(sbuf, std::string("1234"));
  130. bool referenced = false;
  131. s_p = MSGPACK_NULLPTR;
  132. // the last argument sbuf is any pointer as a user data.
  133. // That is stored to s_p in sized_reference
  134. msgpack::object_handle oh =
  135. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  136. EXPECT_FALSE(referenced);
  137. // compare the passed argument with stored s_p.
  138. EXPECT_EQ(&sbuf, s_p);
  139. }
  140. TEST(reference, unpack_string_sized_ref_5)
  141. {
  142. msgpack::sbuffer sbuf;
  143. msgpack::pack(sbuf, std::string("12345"));
  144. bool referenced = false;
  145. s_p = MSGPACK_NULLPTR;
  146. msgpack::object_handle oh =
  147. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  148. EXPECT_TRUE(referenced);
  149. EXPECT_EQ(&sbuf, s_p);
  150. }
  151. TEST(reference, unpack_bin_sized_ref_5)
  152. {
  153. msgpack::sbuffer sbuf;
  154. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  155. char c[] = { 1, 2, 3, 4, 5 };
  156. packer.pack_bin(sizeof(c));
  157. packer.pack_bin_body(c, sizeof(c));
  158. bool referenced = false;
  159. s_p = MSGPACK_NULLPTR;
  160. msgpack::object_handle oh =
  161. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  162. EXPECT_FALSE(referenced);
  163. EXPECT_EQ(&sbuf, s_p);
  164. }
  165. TEST(reference, unpack_bin_sized_ref_6)
  166. {
  167. msgpack::sbuffer sbuf;
  168. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  169. char c[] = { 1, 2, 3, 4, 5, 6 };
  170. packer.pack_bin(sizeof(c));
  171. packer.pack_bin_body(c, sizeof(c));
  172. bool referenced = false;
  173. s_p = MSGPACK_NULLPTR;
  174. msgpack::object_handle oh =
  175. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  176. EXPECT_TRUE(referenced);
  177. EXPECT_EQ(&sbuf, s_p);
  178. }
  179. TEST(reference, unpack_ext_sized_ref_6)
  180. {
  181. msgpack::sbuffer sbuf;
  182. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  183. char const buf [] = { 1, 2, 3, 4, 5 };
  184. packer.pack_ext(sizeof(buf), 1); // 5 + 1(type) = 6
  185. packer.pack_ext_body(buf, sizeof(buf));
  186. bool referenced = false;
  187. s_p = MSGPACK_NULLPTR;
  188. msgpack::object_handle oh =
  189. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  190. EXPECT_FALSE(referenced);
  191. EXPECT_EQ(&sbuf, s_p);
  192. }
  193. TEST(reference, unpack_ext_sized_ref_7)
  194. {
  195. msgpack::sbuffer sbuf;
  196. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  197. char const buf [] = { 1, 2, 3, 4, 5, 6 };
  198. packer.pack_ext(sizeof(buf), 1); // 6 + 1(type) = 7
  199. packer.pack_ext_body(buf, sizeof(buf));
  200. bool referenced = false;
  201. s_p = MSGPACK_NULLPTR;
  202. msgpack::object_handle oh =
  203. msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  204. EXPECT_TRUE(referenced);
  205. EXPECT_EQ(&sbuf, s_p);
  206. }
  207. // default reference function
  208. // STR, BIN, and EXT are always referenced, otherwise copied (converted).
  209. TEST(reference, unpacker_int)
  210. {
  211. msgpack::sbuffer sbuf;
  212. msgpack::pack(sbuf, 1);
  213. msgpack::unpacker unp;
  214. msgpack::object_handle oh;
  215. bool referenced = false;
  216. unp.reserve_buffer(sbuf.size());
  217. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  218. unp.buffer_consumed(sbuf.size());
  219. bool b = unp.next(oh, referenced);
  220. EXPECT_TRUE(b);
  221. EXPECT_FALSE(referenced);
  222. }
  223. TEST(reference, unpacker_string)
  224. {
  225. msgpack::sbuffer sbuf;
  226. msgpack::pack(sbuf, std::string("a"));
  227. msgpack::unpacker unp;
  228. msgpack::object_handle oh;
  229. bool referenced = false;
  230. unp.reserve_buffer(sbuf.size());
  231. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  232. unp.buffer_consumed(sbuf.size());
  233. bool b = unp.next(oh, referenced);
  234. EXPECT_TRUE(b);
  235. EXPECT_TRUE(referenced);
  236. }
  237. TEST(reference, unpacker_bin)
  238. {
  239. msgpack::sbuffer sbuf;
  240. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  241. char c[] = { 1 };
  242. packer.pack_bin(sizeof(c));
  243. packer.pack_bin_body(c, sizeof(c));
  244. msgpack::unpacker unp;
  245. msgpack::object_handle oh;
  246. bool referenced = false;
  247. unp.reserve_buffer(sbuf.size());
  248. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  249. unp.buffer_consumed(sbuf.size());
  250. bool b = unp.next(oh, referenced);
  251. EXPECT_TRUE(b);
  252. EXPECT_TRUE(referenced);
  253. }
  254. TEST(reference, unpacker_ext)
  255. {
  256. msgpack::sbuffer sbuf;
  257. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  258. char const buf [] = { 2 };
  259. packer.pack_ext(sizeof(buf), 1);
  260. packer.pack_ext_body(buf, sizeof(buf));
  261. msgpack::unpacker unp;
  262. msgpack::object_handle oh;
  263. bool referenced = false;
  264. unp.reserve_buffer(sbuf.size());
  265. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  266. unp.buffer_consumed(sbuf.size());
  267. bool b = unp.next(oh, referenced);
  268. EXPECT_TRUE(b);
  269. EXPECT_TRUE(referenced);
  270. }
  271. // pass user custom reference function
  272. TEST(reference, unpacker_int_sized_ref)
  273. {
  274. msgpack::sbuffer sbuf;
  275. msgpack::pack(sbuf, 1);
  276. msgpack::unpacker unp(never_called, &sbuf);
  277. msgpack::object_handle oh;
  278. bool referenced = false;
  279. unp.reserve_buffer(sbuf.size());
  280. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  281. unp.buffer_consumed(sbuf.size());
  282. s_p = MSGPACK_NULLPTR;
  283. bool b = unp.next(oh, referenced);
  284. EXPECT_TRUE(b);
  285. EXPECT_FALSE(referenced);
  286. EXPECT_EQ(MSGPACK_NULLPTR, s_p);
  287. }
  288. TEST(reference, unpacker_string_sized_ref_4)
  289. {
  290. msgpack::sbuffer sbuf;
  291. msgpack::pack(sbuf, std::string("1234"));
  292. msgpack::unpacker unp(sized_reference, &sbuf);
  293. msgpack::object_handle oh;
  294. bool referenced = false;
  295. unp.reserve_buffer(sbuf.size());
  296. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  297. unp.buffer_consumed(sbuf.size());
  298. s_p = MSGPACK_NULLPTR;
  299. bool b = unp.next(oh, referenced);
  300. EXPECT_TRUE(b);
  301. EXPECT_FALSE(referenced);
  302. EXPECT_EQ(&sbuf, s_p);
  303. }
  304. TEST(reference, unpacker_string_sized_ref_5)
  305. {
  306. msgpack::sbuffer sbuf;
  307. msgpack::pack(sbuf, std::string("12345"));
  308. msgpack::unpacker unp(sized_reference, &sbuf);
  309. msgpack::object_handle oh;
  310. bool referenced = false;
  311. unp.reserve_buffer(sbuf.size());
  312. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  313. unp.buffer_consumed(sbuf.size());
  314. s_p = MSGPACK_NULLPTR;
  315. bool b = unp.next(oh, referenced);
  316. EXPECT_TRUE(b);
  317. EXPECT_TRUE(referenced);
  318. EXPECT_EQ(&sbuf, s_p);
  319. }
  320. TEST(reference, unpacker_bin_sized_ref_5)
  321. {
  322. msgpack::sbuffer sbuf;
  323. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  324. char c[] = { 1, 2, 3, 4, 5 };
  325. packer.pack_bin(sizeof(c));
  326. packer.pack_bin_body(c, sizeof(c));
  327. msgpack::unpacker unp(sized_reference, &sbuf);
  328. msgpack::object_handle oh;
  329. bool referenced = false;
  330. unp.reserve_buffer(sbuf.size());
  331. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  332. unp.buffer_consumed(sbuf.size());
  333. s_p = MSGPACK_NULLPTR;
  334. bool b = unp.next(oh, referenced);
  335. EXPECT_TRUE(b);
  336. EXPECT_FALSE(referenced);
  337. EXPECT_EQ(&sbuf, s_p);
  338. }
  339. TEST(reference, unpacker_bin_sized_ref_6)
  340. {
  341. msgpack::sbuffer sbuf;
  342. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  343. char c[] = { 1, 2, 3, 4, 5, 6 };
  344. packer.pack_bin(sizeof(c));
  345. packer.pack_bin_body(c, sizeof(c));
  346. msgpack::unpacker unp(sized_reference, &sbuf);
  347. msgpack::object_handle oh;
  348. bool referenced = false;
  349. unp.reserve_buffer(sbuf.size());
  350. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  351. unp.buffer_consumed(sbuf.size());
  352. s_p = MSGPACK_NULLPTR;
  353. bool b = unp.next(oh, referenced);
  354. EXPECT_TRUE(b);
  355. EXPECT_TRUE(referenced);
  356. EXPECT_EQ(&sbuf, s_p);
  357. }
  358. TEST(reference, unpacker_ext_sized_ref_6)
  359. {
  360. msgpack::sbuffer sbuf;
  361. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  362. char const buf [] = { 1, 2, 3, 4, 5 };
  363. packer.pack_ext(sizeof(buf), 1); // 5 + 1(type) = 6
  364. packer.pack_ext_body(buf, sizeof(buf));
  365. msgpack::unpacker unp(sized_reference, &sbuf);
  366. msgpack::object_handle oh;
  367. bool referenced = false;
  368. unp.reserve_buffer(sbuf.size());
  369. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  370. unp.buffer_consumed(sbuf.size());
  371. s_p = MSGPACK_NULLPTR;
  372. bool b = unp.next(oh, referenced);
  373. EXPECT_TRUE(b);
  374. EXPECT_FALSE(referenced);
  375. EXPECT_EQ(&sbuf, s_p);
  376. }
  377. TEST(reference, unpacker_ext_sized_ref_7)
  378. {
  379. msgpack::sbuffer sbuf;
  380. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  381. char const buf [] = { 1, 2, 3, 4, 5, 6 };
  382. packer.pack_ext(sizeof(buf), 1); // 6 + 1(type) = 7
  383. packer.pack_ext_body(buf, sizeof(buf));
  384. msgpack::unpacker unp(sized_reference, &sbuf);
  385. msgpack::object_handle oh;
  386. bool referenced = false;
  387. unp.reserve_buffer(sbuf.size());
  388. std::memcpy(unp.buffer(), sbuf.data(), sbuf.size());
  389. unp.buffer_consumed(sbuf.size());
  390. s_p = MSGPACK_NULLPTR;
  391. bool b = unp.next(oh, referenced);
  392. EXPECT_TRUE(b);
  393. EXPECT_TRUE(referenced);
  394. EXPECT_EQ(&sbuf, s_p);
  395. }