reference_cpp11.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #include <msgpack.hpp>
  2. #include <gtest/gtest.h>
  3. #if !defined(MSGPACK_USE_CPP03)
  4. TEST(reference, unpack_int)
  5. {
  6. msgpack::sbuffer sbuf;
  7. msgpack::pack(sbuf, 1);
  8. bool referenced;
  9. msgpack::object_handle oh = 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;
  17. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  18. EXPECT_FALSE(referenced);
  19. }
  20. TEST(reference, unpack_bin)
  21. {
  22. msgpack::sbuffer sbuf;
  23. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  24. char c[] = { 1, 2, 3, 4, 5, 6 };
  25. packer.pack_bin(sizeof(c));
  26. packer.pack_bin_body(c, sizeof(c));
  27. bool referenced;
  28. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  29. EXPECT_FALSE(referenced);
  30. }
  31. TEST(reference, unpack_ext)
  32. {
  33. msgpack::sbuffer sbuf;
  34. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  35. char const buf [] = { 2 };
  36. packer.pack_ext(sizeof(buf), 1);
  37. packer.pack_ext_body(buf, sizeof(buf));
  38. bool referenced;
  39. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced);
  40. EXPECT_FALSE(referenced);
  41. }
  42. bool never_called(msgpack::type::object_type, std::size_t, void*)
  43. {
  44. EXPECT_TRUE(false);
  45. return false;
  46. }
  47. bool always_reference(msgpack::type::object_type, std::size_t, void*)
  48. {
  49. return true;
  50. }
  51. TEST(reference, unpack_int_ref)
  52. {
  53. msgpack::sbuffer sbuf;
  54. msgpack::pack(sbuf, 1);
  55. bool referenced;
  56. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, never_called);
  57. EXPECT_FALSE(referenced);
  58. }
  59. TEST(reference, unpack_string_ref)
  60. {
  61. msgpack::sbuffer sbuf;
  62. msgpack::pack(sbuf, std::string("abcdefg"));
  63. bool referenced;
  64. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, always_reference);
  65. EXPECT_TRUE(referenced);
  66. }
  67. TEST(reference, unpack_bin_ref)
  68. {
  69. msgpack::sbuffer sbuf;
  70. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  71. char c[] = { 1, 2, 3, 4, 5, 6 };
  72. packer.pack_bin(sizeof(c));
  73. packer.pack_bin_body(c, sizeof(c));
  74. bool referenced;
  75. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, always_reference);
  76. EXPECT_TRUE(referenced);
  77. }
  78. TEST(reference, unpack_ext_ref)
  79. {
  80. msgpack::sbuffer sbuf;
  81. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  82. char const buf [] = { 2 };
  83. packer.pack_ext(sizeof(buf), 1);
  84. packer.pack_ext_body(buf, sizeof(buf));
  85. bool referenced;
  86. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, always_reference);
  87. EXPECT_TRUE(referenced);
  88. }
  89. static void* s_p;
  90. bool sized_reference(msgpack::type::object_type t, std::size_t s, void* p)
  91. {
  92. s_p = p;
  93. switch (t) {
  94. case msgpack::type::STR:
  95. if (s >= 5) return true;
  96. break;
  97. case msgpack::type::BIN:
  98. if (s >= 6) return true;
  99. break;
  100. case msgpack::type::EXT:
  101. if (s >= 7) return true;
  102. break;
  103. default:
  104. EXPECT_TRUE(false);
  105. }
  106. return false;
  107. }
  108. TEST(reference, unpack_int_sized_ref)
  109. {
  110. msgpack::sbuffer sbuf;
  111. msgpack::pack(sbuf, 1);
  112. bool referenced;
  113. s_p = MSGPACK_NULLPTR;
  114. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, never_called, &sbuf);
  115. EXPECT_FALSE(referenced);
  116. EXPECT_EQ(MSGPACK_NULLPTR, s_p);
  117. }
  118. TEST(reference, unpack_string_sized_ref_4)
  119. {
  120. msgpack::sbuffer sbuf;
  121. msgpack::pack(sbuf, std::string("1234"));
  122. bool referenced;
  123. s_p = MSGPACK_NULLPTR;
  124. // the last argument sbuf is any pointer as a user data.
  125. // That is stored to s_p in sized_reference
  126. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  127. EXPECT_FALSE(referenced);
  128. // compare the passed argument with stored s_p.
  129. EXPECT_EQ(&sbuf, s_p);
  130. }
  131. TEST(reference, unpack_string_sized_ref_5)
  132. {
  133. msgpack::sbuffer sbuf;
  134. msgpack::pack(sbuf, std::string("12345"));
  135. bool referenced;
  136. s_p = MSGPACK_NULLPTR;
  137. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  138. EXPECT_TRUE(referenced);
  139. EXPECT_EQ(&sbuf, s_p);
  140. }
  141. TEST(reference, unpack_bin_sized_ref_5)
  142. {
  143. msgpack::sbuffer sbuf;
  144. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  145. char c[] = { 1, 2, 3, 4, 5 };
  146. packer.pack_bin(sizeof(c));
  147. packer.pack_bin_body(c, sizeof(c));
  148. bool referenced;
  149. s_p = MSGPACK_NULLPTR;
  150. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  151. EXPECT_FALSE(referenced);
  152. EXPECT_EQ(&sbuf, s_p);
  153. }
  154. TEST(reference, unpack_bin_sized_ref_6)
  155. {
  156. msgpack::sbuffer sbuf;
  157. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  158. char c[] = { 1, 2, 3, 4, 5, 6 };
  159. packer.pack_bin(sizeof(c));
  160. packer.pack_bin_body(c, sizeof(c));
  161. bool referenced;
  162. s_p = MSGPACK_NULLPTR;
  163. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  164. EXPECT_TRUE(referenced);
  165. EXPECT_EQ(&sbuf, s_p);
  166. }
  167. TEST(reference, unpack_ext_sized_ref_6)
  168. {
  169. msgpack::sbuffer sbuf;
  170. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  171. char const buf [] = { 1, 2, 3, 4, 5 };
  172. packer.pack_ext(sizeof(buf), 1); // 5 + 1(type) = 6
  173. packer.pack_ext_body(buf, sizeof(buf));
  174. bool referenced;
  175. s_p = MSGPACK_NULLPTR;
  176. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  177. EXPECT_FALSE(referenced);
  178. EXPECT_EQ(&sbuf, s_p);
  179. }
  180. TEST(reference, unpack_ext_sized_ref_7)
  181. {
  182. msgpack::sbuffer sbuf;
  183. msgpack::packer<msgpack::sbuffer> packer(sbuf);
  184. char const buf [] = { 1, 2, 3, 4, 5, 6 };
  185. packer.pack_ext(sizeof(buf), 1); // 6 + 1(type) = 7
  186. packer.pack_ext_body(buf, sizeof(buf));
  187. bool referenced;
  188. s_p = MSGPACK_NULLPTR;
  189. msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size(), referenced, sized_reference, &sbuf);
  190. EXPECT_TRUE(referenced);
  191. EXPECT_EQ(&sbuf, s_p);
  192. }
  193. #endif // !defined(MSGPACK_USE_CPP03)