MsgPackReaderTest.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. //===- MsgPackReaderTest.cpp ------------------------------------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/BinaryFormat/MsgPackReader.h"
  10. #include "llvm/BinaryFormat/MsgPack.h"
  11. #include "gtest/gtest.h"
  12. using namespace llvm;
  13. using namespace llvm::msgpack;
  14. struct MsgPackReader : testing::Test {
  15. std::string Buffer;
  16. Object Obj;
  17. };
  18. TEST_F(MsgPackReader, TestReadMultiple) {
  19. Buffer = "\xc0\xc2";
  20. Reader MPReader(Buffer);
  21. {
  22. auto ContinueOrErr = MPReader.read(Obj);
  23. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  24. EXPECT_TRUE(*ContinueOrErr);
  25. EXPECT_EQ(Obj.Kind, Type::Nil);
  26. }
  27. {
  28. auto ContinueOrErr = MPReader.read(Obj);
  29. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  30. EXPECT_TRUE(*ContinueOrErr);
  31. EXPECT_EQ(Obj.Kind, Type::Boolean);
  32. EXPECT_EQ(Obj.Bool, false);
  33. }
  34. {
  35. auto ContinueOrErr = MPReader.read(Obj);
  36. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  37. EXPECT_FALSE(*ContinueOrErr);
  38. }
  39. }
  40. TEST_F(MsgPackReader, TestReadNil) {
  41. Buffer = "\xc0";
  42. Reader MPReader(Buffer);
  43. auto ContinueOrErr = MPReader.read(Obj);
  44. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  45. EXPECT_TRUE(*ContinueOrErr);
  46. EXPECT_EQ(Obj.Kind, Type::Nil);
  47. }
  48. TEST_F(MsgPackReader, TestReadBoolFalse) {
  49. Buffer = "\xc2";
  50. Reader MPReader(Buffer);
  51. auto ContinueOrErr = MPReader.read(Obj);
  52. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  53. EXPECT_TRUE(*ContinueOrErr);
  54. EXPECT_EQ(Obj.Kind, Type::Boolean);
  55. EXPECT_EQ(Obj.Bool, false);
  56. }
  57. TEST_F(MsgPackReader, TestReadBoolTrue) {
  58. Buffer = "\xc3";
  59. Reader MPReader(Buffer);
  60. auto ContinueOrErr = MPReader.read(Obj);
  61. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  62. EXPECT_TRUE(*ContinueOrErr);
  63. EXPECT_EQ(Obj.Kind, Type::Boolean);
  64. EXPECT_EQ(Obj.Bool, true);
  65. }
  66. TEST_F(MsgPackReader, TestReadFixNegativeInt) {
  67. // Positive values will be written in a UInt form, so max FixNegativeInt is -1
  68. //
  69. // FixNegativeInt form bitpattern starts with 111, so min FixNegativeInt
  70. // is 11100000 = -32
  71. for (int8_t i = -1; i >= -32; --i) {
  72. Buffer.assign(1, static_cast<char>(i));
  73. Reader MPReader(Buffer);
  74. auto ContinueOrErr = MPReader.read(Obj);
  75. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  76. EXPECT_TRUE(*ContinueOrErr);
  77. EXPECT_EQ(Obj.Kind, Type::Int);
  78. EXPECT_EQ(Obj.Int, i);
  79. }
  80. }
  81. TEST_F(MsgPackReader, TestReadInt8Max) {
  82. Buffer = "\xd0\x7f";
  83. Reader MPReader(Buffer);
  84. auto ContinueOrErr = MPReader.read(Obj);
  85. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  86. EXPECT_TRUE(*ContinueOrErr);
  87. EXPECT_EQ(Obj.Kind, Type::Int);
  88. EXPECT_EQ(Obj.Int, INT8_MAX);
  89. }
  90. TEST_F(MsgPackReader, TestReadInt8Zero) {
  91. Buffer.assign("\xd0\x00", 2);
  92. Reader MPReader(Buffer);
  93. auto ContinueOrErr = MPReader.read(Obj);
  94. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  95. EXPECT_TRUE(*ContinueOrErr);
  96. EXPECT_EQ(Obj.Kind, Type::Int);
  97. EXPECT_EQ(Obj.Int, 0);
  98. }
  99. TEST_F(MsgPackReader, TestReadInt8Min) {
  100. Buffer = "\xd0\x80";
  101. Reader MPReader(Buffer);
  102. auto ContinueOrErr = MPReader.read(Obj);
  103. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  104. EXPECT_TRUE(*ContinueOrErr);
  105. EXPECT_EQ(Obj.Kind, Type::Int);
  106. EXPECT_EQ(Obj.Int, INT8_MIN);
  107. }
  108. TEST_F(MsgPackReader, TestReadInt16Max) {
  109. Buffer = "\xd1\x7f\xff";
  110. Reader MPReader(Buffer);
  111. auto ContinueOrErr = MPReader.read(Obj);
  112. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  113. EXPECT_TRUE(*ContinueOrErr);
  114. EXPECT_EQ(Obj.Kind, Type::Int);
  115. EXPECT_EQ(Obj.Int, INT16_MAX);
  116. }
  117. TEST_F(MsgPackReader, TestReadInt16Zero) {
  118. Buffer.assign("\xd1\x00\x00", 3);
  119. Reader MPReader(Buffer);
  120. auto ContinueOrErr = MPReader.read(Obj);
  121. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  122. EXPECT_TRUE(*ContinueOrErr);
  123. EXPECT_EQ(Obj.Kind, Type::Int);
  124. EXPECT_EQ(Obj.Int, 0);
  125. }
  126. TEST_F(MsgPackReader, TestReadInt16Min) {
  127. Buffer.assign("\xd1\x80\x00", 3);
  128. Reader MPReader(Buffer);
  129. auto ContinueOrErr = MPReader.read(Obj);
  130. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  131. EXPECT_TRUE(*ContinueOrErr);
  132. EXPECT_EQ(Obj.Kind, Type::Int);
  133. EXPECT_EQ(Obj.Int, INT16_MIN);
  134. }
  135. TEST_F(MsgPackReader, TestReadInt32Max) {
  136. Buffer = "\xd2\x7f\xff\xff\xff";
  137. Reader MPReader(Buffer);
  138. auto ContinueOrErr = MPReader.read(Obj);
  139. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  140. EXPECT_TRUE(*ContinueOrErr);
  141. EXPECT_EQ(Obj.Kind, Type::Int);
  142. EXPECT_EQ(Obj.Int, INT32_MAX);
  143. }
  144. TEST_F(MsgPackReader, TestReadInt32Zero) {
  145. Buffer.assign("\xd2\x00\x00\x00\x00", 5);
  146. Reader MPReader(Buffer);
  147. auto ContinueOrErr = MPReader.read(Obj);
  148. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  149. EXPECT_TRUE(*ContinueOrErr);
  150. EXPECT_EQ(Obj.Kind, Type::Int);
  151. EXPECT_EQ(Obj.Int, 0);
  152. }
  153. TEST_F(MsgPackReader, TestReadInt32Min) {
  154. Buffer.assign("\xd2\x80\x00\x00\x00", 5);
  155. Reader MPReader(Buffer);
  156. auto ContinueOrErr = MPReader.read(Obj);
  157. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  158. EXPECT_TRUE(*ContinueOrErr);
  159. EXPECT_EQ(Obj.Kind, Type::Int);
  160. EXPECT_EQ(Obj.Int, INT32_MIN);
  161. }
  162. TEST_F(MsgPackReader, TestReadInt64Max) {
  163. Buffer = "\xd3\x7f\xff\xff\xff\xff\xff\xff\xff";
  164. Reader MPReader(Buffer);
  165. auto ContinueOrErr = MPReader.read(Obj);
  166. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  167. EXPECT_TRUE(*ContinueOrErr);
  168. EXPECT_EQ(Obj.Kind, Type::Int);
  169. EXPECT_EQ(Obj.Int, INT64_MAX);
  170. }
  171. TEST_F(MsgPackReader, TestReadInt64Zero) {
  172. Buffer.assign("\xd3\x00\x00\x00\x00\x00\x00\x00\x00", 9);
  173. Reader MPReader(Buffer);
  174. auto ContinueOrErr = MPReader.read(Obj);
  175. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  176. EXPECT_TRUE(*ContinueOrErr);
  177. EXPECT_EQ(Obj.Kind, Type::Int);
  178. EXPECT_EQ(Obj.Int, 0);
  179. }
  180. TEST_F(MsgPackReader, TestReadInt64Min) {
  181. Buffer.assign("\xd3\x80\x00\x00\x00\x00\x00\x00\x00", 9);
  182. Reader MPReader(Buffer);
  183. auto ContinueOrErr = MPReader.read(Obj);
  184. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  185. EXPECT_TRUE(*ContinueOrErr);
  186. EXPECT_EQ(Obj.Kind, Type::Int);
  187. EXPECT_EQ(Obj.Int, INT64_MIN);
  188. }
  189. TEST_F(MsgPackReader, TestReadFixPositiveInt) {
  190. // FixPositiveInt form bitpattern starts with 0, so max FixPositiveInt
  191. // is 01111111 = 127
  192. for (uint64_t u = 0; u <= 127; ++u) {
  193. Buffer.assign(1, static_cast<char>(u));
  194. Reader MPReader(Buffer);
  195. auto ContinueOrErr = MPReader.read(Obj);
  196. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  197. EXPECT_TRUE(*ContinueOrErr);
  198. EXPECT_EQ(Obj.Kind, Type::UInt);
  199. EXPECT_EQ(Obj.UInt, u);
  200. }
  201. }
  202. TEST_F(MsgPackReader, TestReadUInt8Zero) {
  203. Buffer.assign("\xcc\x00", 2);
  204. Reader MPReader(Buffer);
  205. auto ContinueOrErr = MPReader.read(Obj);
  206. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  207. EXPECT_TRUE(*ContinueOrErr);
  208. EXPECT_EQ(Obj.Kind, Type::UInt);
  209. EXPECT_EQ(Obj.UInt, 0u);
  210. }
  211. TEST_F(MsgPackReader, TestReadUInt8One) {
  212. Buffer = "\xcc\x01";
  213. Reader MPReader(Buffer);
  214. auto ContinueOrErr = MPReader.read(Obj);
  215. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  216. EXPECT_TRUE(*ContinueOrErr);
  217. EXPECT_EQ(Obj.Kind, Type::UInt);
  218. EXPECT_EQ(Obj.UInt, 1u);
  219. }
  220. TEST_F(MsgPackReader, TestReadUInt8Max) {
  221. Buffer = "\xcc\xff";
  222. Reader MPReader(Buffer);
  223. auto ContinueOrErr = MPReader.read(Obj);
  224. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  225. EXPECT_TRUE(*ContinueOrErr);
  226. EXPECT_EQ(Obj.Kind, Type::UInt);
  227. EXPECT_EQ(Obj.UInt, static_cast<uint8_t>(UINT8_MAX));
  228. }
  229. TEST_F(MsgPackReader, TestReadUInt16Zero) {
  230. Buffer.assign("\xcd\x00\x00", 3);
  231. Reader MPReader(Buffer);
  232. auto ContinueOrErr = MPReader.read(Obj);
  233. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  234. EXPECT_TRUE(*ContinueOrErr);
  235. EXPECT_EQ(Obj.Kind, Type::UInt);
  236. EXPECT_EQ(Obj.UInt, 0u);
  237. }
  238. TEST_F(MsgPackReader, TestReadUInt16One) {
  239. Buffer.assign("\xcd\x00\x01", 3);
  240. Reader MPReader(Buffer);
  241. auto ContinueOrErr = MPReader.read(Obj);
  242. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  243. EXPECT_TRUE(*ContinueOrErr);
  244. EXPECT_EQ(Obj.Kind, Type::UInt);
  245. EXPECT_EQ(Obj.UInt, 1u);
  246. }
  247. TEST_F(MsgPackReader, TestReadUInt16Max) {
  248. Buffer = "\xcd\xff\xff";
  249. Reader MPReader(Buffer);
  250. auto ContinueOrErr = MPReader.read(Obj);
  251. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  252. EXPECT_TRUE(*ContinueOrErr);
  253. EXPECT_EQ(Obj.Kind, Type::UInt);
  254. EXPECT_EQ(Obj.UInt, static_cast<uint16_t>(UINT16_MAX));
  255. }
  256. TEST_F(MsgPackReader, TestReadUInt32Zero) {
  257. Buffer.assign("\xce\x00\x00\x00\x00", 5);
  258. Reader MPReader(Buffer);
  259. auto ContinueOrErr = MPReader.read(Obj);
  260. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  261. EXPECT_TRUE(*ContinueOrErr);
  262. EXPECT_EQ(Obj.Kind, Type::UInt);
  263. EXPECT_EQ(Obj.UInt, 0u);
  264. }
  265. TEST_F(MsgPackReader, TestReadUInt32One) {
  266. Buffer.assign("\xce\x00\x00\x00\x01", 5);
  267. Reader MPReader(Buffer);
  268. auto ContinueOrErr = MPReader.read(Obj);
  269. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  270. EXPECT_TRUE(*ContinueOrErr);
  271. EXPECT_EQ(Obj.Kind, Type::UInt);
  272. EXPECT_EQ(Obj.UInt, 1u);
  273. }
  274. TEST_F(MsgPackReader, TestReadUInt32Max) {
  275. Buffer = "\xce\xff\xff\xff\xff";
  276. Reader MPReader(Buffer);
  277. auto ContinueOrErr = MPReader.read(Obj);
  278. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  279. EXPECT_TRUE(*ContinueOrErr);
  280. EXPECT_EQ(Obj.Kind, Type::UInt);
  281. EXPECT_EQ(Obj.UInt, static_cast<uint32_t>(UINT32_MAX));
  282. }
  283. TEST_F(MsgPackReader, TestReadUInt64Zero) {
  284. Buffer.assign("\xcf\x00\x00\x00\x00\x00\x00\x00\x00", 9);
  285. Reader MPReader(Buffer);
  286. auto ContinueOrErr = MPReader.read(Obj);
  287. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  288. EXPECT_TRUE(*ContinueOrErr);
  289. EXPECT_EQ(Obj.Kind, Type::UInt);
  290. EXPECT_EQ(Obj.UInt, 0u);
  291. }
  292. TEST_F(MsgPackReader, TestReadUInt64One) {
  293. Buffer.assign("\xcf\x00\x00\x00\x00\x00\x00\x00\x01", 9);
  294. Reader MPReader(Buffer);
  295. auto ContinueOrErr = MPReader.read(Obj);
  296. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  297. EXPECT_TRUE(*ContinueOrErr);
  298. EXPECT_EQ(Obj.Kind, Type::UInt);
  299. EXPECT_EQ(Obj.UInt, 1u);
  300. }
  301. TEST_F(MsgPackReader, TestReadUInt64Max) {
  302. Buffer = "\xcf\xff\xff\xff\xff\xff\xff\xff\xff";
  303. Reader MPReader(Buffer);
  304. auto ContinueOrErr = MPReader.read(Obj);
  305. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  306. EXPECT_TRUE(*ContinueOrErr);
  307. EXPECT_EQ(Obj.Kind, Type::UInt);
  308. EXPECT_EQ(Obj.UInt, static_cast<uint64_t>(UINT64_MAX));
  309. }
  310. TEST_F(MsgPackReader, TestReadFloat32) {
  311. Buffer = "\xca\xee\xee\xee\xef";
  312. Reader MPReader(Buffer);
  313. auto ContinueOrErr = MPReader.read(Obj);
  314. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  315. EXPECT_TRUE(*ContinueOrErr);
  316. EXPECT_EQ(Obj.Kind, Type::Float);
  317. EXPECT_EQ(Obj.Float, -3.6973142664068907e+28f);
  318. }
  319. TEST_F(MsgPackReader, TestReadFloat64) {
  320. Buffer = "\xcb\xee\xee\xee\xee\xee\xee\xee\xef";
  321. Reader MPReader(Buffer);
  322. auto ContinueOrErr = MPReader.read(Obj);
  323. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  324. EXPECT_TRUE(*ContinueOrErr);
  325. EXPECT_EQ(Obj.Kind, Type::Float);
  326. EXPECT_EQ(Obj.Float, -2.2899894549927042e+226);
  327. }
  328. TEST_F(MsgPackReader, TestReadFixStrZero) {
  329. Buffer = "\xa0";
  330. Reader MPReader(Buffer);
  331. auto ContinueOrErr = MPReader.read(Obj);
  332. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  333. EXPECT_TRUE(*ContinueOrErr);
  334. EXPECT_EQ(Obj.Kind, Type::String);
  335. EXPECT_EQ(Obj.Raw, StringRef());
  336. }
  337. TEST_F(MsgPackReader, TestReadFixStrOne) {
  338. std::string Result(1, 'a');
  339. Buffer = std::string("\xa1") + Result;
  340. Reader MPReader(Buffer);
  341. auto ContinueOrErr = MPReader.read(Obj);
  342. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  343. EXPECT_TRUE(*ContinueOrErr);
  344. EXPECT_EQ(Obj.Kind, Type::String);
  345. EXPECT_EQ(Obj.Raw, Result);
  346. }
  347. TEST_F(MsgPackReader, TestReadFixStrMax) {
  348. // FixStr format's size is a 5 bit unsigned integer, so max is 11111 = 31
  349. std::string Result(31, 'a');
  350. Buffer = std::string("\xbf") + Result;
  351. Reader MPReader(Buffer);
  352. auto ContinueOrErr = MPReader.read(Obj);
  353. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  354. EXPECT_TRUE(*ContinueOrErr);
  355. EXPECT_EQ(Obj.Kind, Type::String);
  356. EXPECT_EQ(Obj.Raw, Result);
  357. }
  358. TEST_F(MsgPackReader, TestReadStr8Zero) {
  359. Buffer.assign("\xd9\x00", 2);
  360. Reader MPReader(Buffer);
  361. auto ContinueOrErr = MPReader.read(Obj);
  362. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  363. EXPECT_TRUE(*ContinueOrErr);
  364. EXPECT_EQ(Obj.Kind, Type::String);
  365. EXPECT_EQ(Obj.Raw, StringRef());
  366. }
  367. TEST_F(MsgPackReader, TestReadStr8One) {
  368. std::string Result(1, 'a');
  369. Buffer = std::string("\xd9\x01") + Result;
  370. Reader MPReader(Buffer);
  371. auto ContinueOrErr = MPReader.read(Obj);
  372. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  373. EXPECT_TRUE(*ContinueOrErr);
  374. EXPECT_EQ(Obj.Kind, Type::String);
  375. EXPECT_EQ(Obj.Raw, Result);
  376. }
  377. TEST_F(MsgPackReader, TestReadStr8Max) {
  378. std::string Result(UINT8_MAX, 'a');
  379. Buffer = std::string("\xd9\xff") + Result;
  380. Reader MPReader(Buffer);
  381. auto ContinueOrErr = MPReader.read(Obj);
  382. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  383. EXPECT_TRUE(*ContinueOrErr);
  384. EXPECT_EQ(Obj.Kind, Type::String);
  385. EXPECT_EQ(Obj.Raw, Result);
  386. }
  387. TEST_F(MsgPackReader, TestReadStr16Zero) {
  388. Buffer.assign("\xda\x00\x00", 3);
  389. Reader MPReader(Buffer);
  390. auto ContinueOrErr = MPReader.read(Obj);
  391. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  392. EXPECT_TRUE(*ContinueOrErr);
  393. EXPECT_EQ(Obj.Kind, Type::String);
  394. EXPECT_EQ(Obj.Raw, StringRef());
  395. }
  396. TEST_F(MsgPackReader, TestReadStr16One) {
  397. std::string Result(1, 'a');
  398. Buffer = std::string("\xda\x00\x01", 3) + Result;
  399. Reader MPReader(Buffer);
  400. auto ContinueOrErr = MPReader.read(Obj);
  401. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  402. EXPECT_TRUE(*ContinueOrErr);
  403. EXPECT_EQ(Obj.Kind, Type::String);
  404. EXPECT_EQ(Obj.Raw, Result);
  405. }
  406. TEST_F(MsgPackReader, TestReadStr16Max) {
  407. std::string Result(UINT16_MAX, 'a');
  408. Buffer = std::string("\xda\xff\xff") + Result;
  409. Reader MPReader(Buffer);
  410. auto ContinueOrErr = MPReader.read(Obj);
  411. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  412. EXPECT_TRUE(*ContinueOrErr);
  413. EXPECT_EQ(Obj.Kind, Type::String);
  414. EXPECT_EQ(Obj.Raw, Result);
  415. }
  416. TEST_F(MsgPackReader, TestReadStr32Zero) {
  417. Buffer.assign("\xdb\x00\x00\x00\x00", 5);
  418. Reader MPReader(Buffer);
  419. auto ContinueOrErr = MPReader.read(Obj);
  420. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  421. EXPECT_TRUE(*ContinueOrErr);
  422. EXPECT_EQ(Obj.Kind, Type::String);
  423. EXPECT_EQ(Obj.Raw, StringRef());
  424. }
  425. TEST_F(MsgPackReader, TestReadStr32One) {
  426. std::string Result(1, 'a');
  427. Buffer = std::string("\xdb\x00\x00\x00\x01", 5) + Result;
  428. Reader MPReader(Buffer);
  429. auto ContinueOrErr = MPReader.read(Obj);
  430. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  431. EXPECT_TRUE(*ContinueOrErr);
  432. EXPECT_EQ(Obj.Kind, Type::String);
  433. EXPECT_EQ(Obj.Raw, Result);
  434. }
  435. TEST_F(MsgPackReader, TestReadStr32Max) {
  436. std::string Result(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
  437. Buffer = std::string("\xdb\x00\x01\x00\x00", 5) + Result;
  438. Reader MPReader(Buffer);
  439. auto ContinueOrErr = MPReader.read(Obj);
  440. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  441. EXPECT_TRUE(*ContinueOrErr);
  442. EXPECT_EQ(Obj.Kind, Type::String);
  443. EXPECT_EQ(Obj.Raw, Result);
  444. }
  445. TEST_F(MsgPackReader, TestReadBin8Zero) {
  446. Buffer.assign("\xc4\x00", 2);
  447. Reader MPReader(Buffer);
  448. auto ContinueOrErr = MPReader.read(Obj);
  449. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  450. EXPECT_TRUE(*ContinueOrErr);
  451. EXPECT_EQ(Obj.Kind, Type::Binary);
  452. EXPECT_EQ(Obj.Raw, StringRef());
  453. }
  454. TEST_F(MsgPackReader, TestReadBin8One) {
  455. std::string Result(1, 'a');
  456. Buffer = std::string("\xc4\x01") + Result;
  457. Reader MPReader(Buffer);
  458. auto ContinueOrErr = MPReader.read(Obj);
  459. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  460. EXPECT_TRUE(*ContinueOrErr);
  461. EXPECT_EQ(Obj.Kind, Type::Binary);
  462. EXPECT_EQ(Obj.Raw, Result);
  463. }
  464. TEST_F(MsgPackReader, TestReadBin8Max) {
  465. std::string Result(UINT8_MAX, 'a');
  466. Buffer = std::string("\xc4\xff") + Result;
  467. Reader MPReader(Buffer);
  468. auto ContinueOrErr = MPReader.read(Obj);
  469. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  470. EXPECT_TRUE(*ContinueOrErr);
  471. EXPECT_EQ(Obj.Kind, Type::Binary);
  472. EXPECT_EQ(Obj.Raw, Result);
  473. }
  474. TEST_F(MsgPackReader, TestReadBin16Zero) {
  475. Buffer.assign("\xc5\x00\x00", 3);
  476. Reader MPReader(Buffer);
  477. auto ContinueOrErr = MPReader.read(Obj);
  478. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  479. EXPECT_TRUE(*ContinueOrErr);
  480. EXPECT_EQ(Obj.Kind, Type::Binary);
  481. EXPECT_EQ(Obj.Raw, StringRef());
  482. }
  483. TEST_F(MsgPackReader, TestReadBin16One) {
  484. std::string Result(1, 'a');
  485. Buffer = std::string("\xc5\x00\x01", 3) + Result;
  486. Reader MPReader(Buffer);
  487. auto ContinueOrErr = MPReader.read(Obj);
  488. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  489. EXPECT_TRUE(*ContinueOrErr);
  490. EXPECT_EQ(Obj.Kind, Type::Binary);
  491. EXPECT_EQ(Obj.Raw, Result);
  492. }
  493. TEST_F(MsgPackReader, TestReadBin16Max) {
  494. std::string Result(UINT16_MAX, 'a');
  495. Buffer = std::string("\xc5\xff\xff") + Result;
  496. Reader MPReader(Buffer);
  497. auto ContinueOrErr = MPReader.read(Obj);
  498. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  499. EXPECT_TRUE(*ContinueOrErr);
  500. EXPECT_EQ(Obj.Kind, Type::Binary);
  501. EXPECT_EQ(Obj.Raw, Result);
  502. }
  503. TEST_F(MsgPackReader, TestReadBin32Zero) {
  504. Buffer.assign("\xc6\x00\x00\x00\x00", 5);
  505. Reader MPReader(Buffer);
  506. auto ContinueOrErr = MPReader.read(Obj);
  507. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  508. EXPECT_TRUE(*ContinueOrErr);
  509. EXPECT_EQ(Obj.Kind, Type::Binary);
  510. EXPECT_EQ(Obj.Raw, StringRef());
  511. }
  512. TEST_F(MsgPackReader, TestReadBin32One) {
  513. std::string Result(1, 'a');
  514. Buffer = std::string("\xc6\x00\x00\x00\x01", 5) + Result;
  515. Reader MPReader(Buffer);
  516. auto ContinueOrErr = MPReader.read(Obj);
  517. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  518. EXPECT_TRUE(*ContinueOrErr);
  519. EXPECT_EQ(Obj.Kind, Type::Binary);
  520. EXPECT_EQ(Obj.Raw, Result);
  521. }
  522. TEST_F(MsgPackReader, TestReadBin32Max) {
  523. std::string Result(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
  524. Buffer = std::string("\xc6\x00\x01\x00\x00", 5) + Result;
  525. Reader MPReader(Buffer);
  526. auto ContinueOrErr = MPReader.read(Obj);
  527. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  528. EXPECT_TRUE(*ContinueOrErr);
  529. EXPECT_EQ(Obj.Kind, Type::Binary);
  530. EXPECT_EQ(Obj.Raw, Result);
  531. }
  532. TEST_F(MsgPackReader, TestReadFixArrayZero) {
  533. Buffer = "\x90";
  534. Reader MPReader(Buffer);
  535. auto ContinueOrErr = MPReader.read(Obj);
  536. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  537. EXPECT_TRUE(*ContinueOrErr);
  538. EXPECT_EQ(Obj.Kind, Type::Array);
  539. EXPECT_EQ(Obj.Length, 0u);
  540. }
  541. TEST_F(MsgPackReader, TestReadFixArrayOne) {
  542. Buffer = "\x91";
  543. Reader MPReader(Buffer);
  544. auto ContinueOrErr = MPReader.read(Obj);
  545. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  546. EXPECT_TRUE(*ContinueOrErr);
  547. EXPECT_EQ(Obj.Kind, Type::Array);
  548. EXPECT_EQ(Obj.Length, 1u);
  549. }
  550. TEST_F(MsgPackReader, TestReadFixArrayMax) {
  551. Buffer = "\x9f";
  552. Reader MPReader(Buffer);
  553. auto ContinueOrErr = MPReader.read(Obj);
  554. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  555. EXPECT_TRUE(*ContinueOrErr);
  556. EXPECT_EQ(Obj.Kind, Type::Array);
  557. // FixArray format's size is a 4 bit unsigned integer, so max is 1111 = 15
  558. EXPECT_EQ(Obj.Length, 15u);
  559. }
  560. TEST_F(MsgPackReader, TestReadArray16Zero) {
  561. Buffer.assign("\xdc\x00\x00", 3);
  562. Reader MPReader(Buffer);
  563. auto ContinueOrErr = MPReader.read(Obj);
  564. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  565. EXPECT_TRUE(*ContinueOrErr);
  566. EXPECT_EQ(Obj.Kind, Type::Array);
  567. EXPECT_EQ(Obj.Length, 0u);
  568. }
  569. TEST_F(MsgPackReader, TestReadArray16One) {
  570. Buffer.assign("\xdc\x00\x01", 3);
  571. Reader MPReader(Buffer);
  572. auto ContinueOrErr = MPReader.read(Obj);
  573. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  574. EXPECT_TRUE(*ContinueOrErr);
  575. EXPECT_EQ(Obj.Kind, Type::Array);
  576. EXPECT_EQ(Obj.Length, 1u);
  577. }
  578. TEST_F(MsgPackReader, TestReadArray16Max) {
  579. Buffer = "\xdc\xff\xff";
  580. Reader MPReader(Buffer);
  581. auto ContinueOrErr = MPReader.read(Obj);
  582. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  583. EXPECT_TRUE(*ContinueOrErr);
  584. EXPECT_EQ(Obj.Kind, Type::Array);
  585. EXPECT_EQ(Obj.Length, static_cast<uint16_t>(UINT16_MAX));
  586. }
  587. TEST_F(MsgPackReader, TestReadArray32Zero) {
  588. Buffer.assign("\xdd\x00\x00\x00\x00", 5);
  589. Reader MPReader(Buffer);
  590. auto ContinueOrErr = MPReader.read(Obj);
  591. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  592. EXPECT_TRUE(*ContinueOrErr);
  593. EXPECT_EQ(Obj.Kind, Type::Array);
  594. EXPECT_EQ(Obj.Length, 0u);
  595. }
  596. TEST_F(MsgPackReader, TestReadArray32One) {
  597. Buffer.assign("\xdd\x00\x00\x00\x01", 5);
  598. Reader MPReader(Buffer);
  599. auto ContinueOrErr = MPReader.read(Obj);
  600. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  601. EXPECT_TRUE(*ContinueOrErr);
  602. EXPECT_EQ(Obj.Kind, Type::Array);
  603. EXPECT_EQ(Obj.Length, 1u);
  604. }
  605. TEST_F(MsgPackReader, TestReadArray32Max) {
  606. Buffer = "\xdd\xff\xff\xff\xff";
  607. Reader MPReader(Buffer);
  608. auto ContinueOrErr = MPReader.read(Obj);
  609. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  610. EXPECT_TRUE(*ContinueOrErr);
  611. EXPECT_EQ(Obj.Kind, Type::Array);
  612. EXPECT_EQ(Obj.Length, static_cast<uint32_t>(UINT32_MAX));
  613. }
  614. TEST_F(MsgPackReader, TestReadFixMapZero) {
  615. Buffer = "\x80";
  616. Reader MPReader(Buffer);
  617. auto ContinueOrErr = MPReader.read(Obj);
  618. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  619. EXPECT_TRUE(*ContinueOrErr);
  620. EXPECT_EQ(Obj.Kind, Type::Map);
  621. EXPECT_EQ(Obj.Length, 0u);
  622. }
  623. TEST_F(MsgPackReader, TestReadFixMapOne) {
  624. Buffer = "\x81";
  625. Reader MPReader(Buffer);
  626. auto ContinueOrErr = MPReader.read(Obj);
  627. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  628. EXPECT_TRUE(*ContinueOrErr);
  629. EXPECT_EQ(Obj.Kind, Type::Map);
  630. EXPECT_EQ(Obj.Length, 1u);
  631. }
  632. TEST_F(MsgPackReader, TestReadFixMapMax) {
  633. Buffer = "\x8f";
  634. Reader MPReader(Buffer);
  635. auto ContinueOrErr = MPReader.read(Obj);
  636. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  637. EXPECT_TRUE(*ContinueOrErr);
  638. EXPECT_EQ(Obj.Kind, Type::Map);
  639. // FixMap format's size is a 4 bit unsigned integer, so max is 1111 = 15
  640. EXPECT_EQ(Obj.Length, 15u);
  641. }
  642. TEST_F(MsgPackReader, TestReadMap16Zero) {
  643. Buffer.assign("\xde\x00\x00", 3);
  644. Reader MPReader(Buffer);
  645. auto ContinueOrErr = MPReader.read(Obj);
  646. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  647. EXPECT_TRUE(*ContinueOrErr);
  648. EXPECT_EQ(Obj.Kind, Type::Map);
  649. EXPECT_EQ(Obj.Length, 0u);
  650. }
  651. TEST_F(MsgPackReader, TestReadMap16One) {
  652. Buffer.assign("\xde\x00\x01", 3);
  653. Reader MPReader(Buffer);
  654. auto ContinueOrErr = MPReader.read(Obj);
  655. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  656. EXPECT_TRUE(*ContinueOrErr);
  657. EXPECT_EQ(Obj.Kind, Type::Map);
  658. EXPECT_EQ(Obj.Length, 1u);
  659. }
  660. TEST_F(MsgPackReader, TestReadMap16Max) {
  661. Buffer = "\xde\xff\xff";
  662. Reader MPReader(Buffer);
  663. auto ContinueOrErr = MPReader.read(Obj);
  664. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  665. EXPECT_TRUE(*ContinueOrErr);
  666. EXPECT_EQ(Obj.Kind, Type::Map);
  667. EXPECT_EQ(Obj.Length, static_cast<uint16_t>(UINT16_MAX));
  668. }
  669. TEST_F(MsgPackReader, TestReadMap32Zero) {
  670. Buffer.assign("\xdf\x00\x00\x00\x00", 5);
  671. Reader MPReader(Buffer);
  672. auto ContinueOrErr = MPReader.read(Obj);
  673. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  674. EXPECT_TRUE(*ContinueOrErr);
  675. EXPECT_EQ(Obj.Kind, Type::Map);
  676. EXPECT_EQ(Obj.Length, 0u);
  677. }
  678. TEST_F(MsgPackReader, TestReadMap32One) {
  679. Buffer.assign("\xdf\x00\x00\x00\x01", 5);
  680. Reader MPReader(Buffer);
  681. auto ContinueOrErr = MPReader.read(Obj);
  682. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  683. EXPECT_TRUE(*ContinueOrErr);
  684. EXPECT_EQ(Obj.Kind, Type::Map);
  685. EXPECT_EQ(Obj.Length, 1u);
  686. }
  687. TEST_F(MsgPackReader, TestReadMap32Max) {
  688. Buffer = "\xdf\xff\xff\xff\xff";
  689. Reader MPReader(Buffer);
  690. auto ContinueOrErr = MPReader.read(Obj);
  691. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  692. EXPECT_TRUE(*ContinueOrErr);
  693. EXPECT_EQ(Obj.Kind, Type::Map);
  694. EXPECT_EQ(Obj.Length, static_cast<uint32_t>(UINT32_MAX));
  695. }
  696. // FixExt formats are only available for these specific lengths: 1, 2, 4, 8, 16
  697. TEST_F(MsgPackReader, TestReadFixExt1) {
  698. std::string Result(1, 'a');
  699. Buffer = std::string("\xd4\x01") + Result;
  700. Reader MPReader(Buffer);
  701. auto ContinueOrErr = MPReader.read(Obj);
  702. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  703. EXPECT_TRUE(*ContinueOrErr);
  704. EXPECT_EQ(Obj.Kind, Type::Extension);
  705. EXPECT_EQ(Obj.Extension.Type, 0x01);
  706. EXPECT_EQ(Obj.Extension.Bytes, Result);
  707. }
  708. TEST_F(MsgPackReader, TestReadFixExt2) {
  709. std::string Result(2, 'a');
  710. Buffer = std::string("\xd5\x01") + Result;
  711. Reader MPReader(Buffer);
  712. auto ContinueOrErr = MPReader.read(Obj);
  713. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  714. EXPECT_TRUE(*ContinueOrErr);
  715. EXPECT_EQ(Obj.Kind, Type::Extension);
  716. EXPECT_EQ(Obj.Extension.Type, 0x01);
  717. EXPECT_EQ(Obj.Extension.Bytes, Result);
  718. }
  719. TEST_F(MsgPackReader, TestReadFixExt4) {
  720. std::string Result(4, 'a');
  721. Buffer = std::string("\xd6\x01") + Result;
  722. Reader MPReader(Buffer);
  723. auto ContinueOrErr = MPReader.read(Obj);
  724. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  725. EXPECT_TRUE(*ContinueOrErr);
  726. EXPECT_EQ(Obj.Kind, Type::Extension);
  727. EXPECT_EQ(Obj.Extension.Type, 0x01);
  728. EXPECT_EQ(Obj.Extension.Bytes, Result);
  729. }
  730. TEST_F(MsgPackReader, TestReadFixExt8) {
  731. std::string Result(8, 'a');
  732. Buffer = std::string("\xd7\x01") + Result;
  733. Reader MPReader(Buffer);
  734. auto ContinueOrErr = MPReader.read(Obj);
  735. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  736. EXPECT_TRUE(*ContinueOrErr);
  737. EXPECT_EQ(Obj.Kind, Type::Extension);
  738. EXPECT_EQ(Obj.Extension.Type, 0x01);
  739. EXPECT_EQ(Obj.Extension.Bytes, Result);
  740. }
  741. TEST_F(MsgPackReader, TestReadFixExt16) {
  742. std::string Result(16, 'a');
  743. Buffer = std::string("\xd8\x01") + Result;
  744. Reader MPReader(Buffer);
  745. auto ContinueOrErr = MPReader.read(Obj);
  746. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  747. EXPECT_TRUE(*ContinueOrErr);
  748. EXPECT_EQ(Obj.Kind, Type::Extension);
  749. EXPECT_EQ(Obj.Extension.Type, 0x01);
  750. EXPECT_EQ(Obj.Extension.Bytes, Result);
  751. }
  752. TEST_F(MsgPackReader, TestReadExt8Min) {
  753. // There are fix variants for sizes 1 and 2
  754. Buffer.assign("\xc7\x00\x01", 3);
  755. Reader MPReader(Buffer);
  756. auto ContinueOrErr = MPReader.read(Obj);
  757. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  758. EXPECT_TRUE(*ContinueOrErr);
  759. EXPECT_EQ(Obj.Kind, Type::Extension);
  760. EXPECT_EQ(Obj.Extension.Type, 0x01);
  761. EXPECT_EQ(Obj.Extension.Bytes, StringRef());
  762. }
  763. TEST_F(MsgPackReader, TestReadExt8Max) {
  764. std::string Result(UINT8_MAX, 'a');
  765. Buffer = std::string("\xc7\xff\x01", 3) + Result;
  766. Reader MPReader(Buffer);
  767. auto ContinueOrErr = MPReader.read(Obj);
  768. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  769. EXPECT_TRUE(*ContinueOrErr);
  770. EXPECT_EQ(Obj.Kind, Type::Extension);
  771. EXPECT_EQ(Obj.Extension.Type, 0x01);
  772. EXPECT_EQ(Obj.Extension.Bytes, Result);
  773. }
  774. TEST_F(MsgPackReader, TestReadExt16Min) {
  775. std::string Result(static_cast<uint16_t>(UINT8_MAX) + 1, 'a');
  776. Buffer = std::string("\xc8\x01\x00\x01", 4) + Result;
  777. Reader MPReader(Buffer);
  778. auto ContinueOrErr = MPReader.read(Obj);
  779. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  780. EXPECT_TRUE(*ContinueOrErr);
  781. EXPECT_EQ(Obj.Kind, Type::Extension);
  782. EXPECT_EQ(Obj.Extension.Type, 0x01);
  783. EXPECT_EQ(Obj.Extension.Bytes, Result);
  784. }
  785. TEST_F(MsgPackReader, TestReadExt16Max) {
  786. std::string Result(UINT16_MAX, 'a');
  787. Buffer = std::string("\xc8\xff\xff\x01") + Result;
  788. Reader MPReader(Buffer);
  789. auto ContinueOrErr = MPReader.read(Obj);
  790. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  791. EXPECT_TRUE(*ContinueOrErr);
  792. EXPECT_EQ(Obj.Kind, Type::Extension);
  793. EXPECT_EQ(Obj.Extension.Type, 0x01);
  794. EXPECT_EQ(Obj.Extension.Bytes, Result);
  795. }
  796. TEST_F(MsgPackReader, TestReadExt32Min) {
  797. std::string Result(static_cast<uint32_t>(UINT16_MAX) + 1, 'a');
  798. Buffer = std::string("\xc9\x00\x01\x00\x00\x01", 6) + Result;
  799. Reader MPReader(Buffer);
  800. auto ContinueOrErr = MPReader.read(Obj);
  801. EXPECT_TRUE(static_cast<bool>(ContinueOrErr));
  802. EXPECT_TRUE(*ContinueOrErr);
  803. EXPECT_EQ(Obj.Kind, Type::Extension);
  804. EXPECT_EQ(Obj.Extension.Type, 0x01);
  805. EXPECT_EQ(Obj.Extension.Bytes, Result);
  806. }