errors.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2024, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include <sstream>
  7. TEST_CASE("deserializeMsgPack() returns InvalidInput") {
  8. JsonDocument doc;
  9. SECTION("integer as key") {
  10. auto err = deserializeMsgPack(doc, "\x81\x01\xA1H", 3);
  11. REQUIRE(err == DeserializationError::InvalidInput);
  12. }
  13. }
  14. TEST_CASE("deserializeMsgPack() returns EmptyInput") {
  15. JsonDocument doc;
  16. SECTION("from sized buffer") {
  17. auto err = deserializeMsgPack(doc, "", 0);
  18. REQUIRE(err == DeserializationError::EmptyInput);
  19. }
  20. SECTION("from stream") {
  21. std::istringstream input("");
  22. auto err = deserializeMsgPack(doc, input);
  23. REQUIRE(err == DeserializationError::EmptyInput);
  24. }
  25. }
  26. static void testIncompleteInput(const char* input, size_t len) {
  27. JsonDocument doc;
  28. REQUIRE(deserializeMsgPack(doc, input, len) == DeserializationError::Ok);
  29. while (--len) {
  30. REQUIRE(deserializeMsgPack(doc, input, len) ==
  31. DeserializationError::IncompleteInput);
  32. }
  33. }
  34. TEST_CASE("deserializeMsgPack() returns IncompleteInput") {
  35. SECTION("empty input") {
  36. testIncompleteInput("\x00", 1);
  37. }
  38. SECTION("fixarray") {
  39. testIncompleteInput("\x91\x01", 2);
  40. }
  41. SECTION("array 16") {
  42. testIncompleteInput("\xDC\x00\x01\x01", 4);
  43. }
  44. SECTION("array 32") {
  45. testIncompleteInput("\xDD\x00\x00\x00\x01\x01", 6);
  46. }
  47. SECTION("fixmap") {
  48. testIncompleteInput("\x81\xA3one\x01", 6);
  49. }
  50. SECTION("map 16") {
  51. testIncompleteInput("\xDE\x00\x01\xA3one\x01", 8);
  52. }
  53. SECTION("map 32") {
  54. testIncompleteInput("\xDF\x00\x00\x00\x01\xA3one\x01", 10);
  55. testIncompleteInput("\xDF\x00\x00\x00\x01\xd9\x03one\x01", 11);
  56. }
  57. SECTION("uint 8") {
  58. testIncompleteInput("\xcc\x01", 2);
  59. }
  60. SECTION("uint 16") {
  61. testIncompleteInput("\xcd\x00\x01", 3);
  62. }
  63. SECTION("uint 32") {
  64. testIncompleteInput("\xCE\x00\x00\x00\x01", 5);
  65. }
  66. #if ARDUINOJSON_USE_LONG_LONG
  67. SECTION("uint 64") {
  68. testIncompleteInput("\xCF\x00\x00\x00\x00\x00\x00\x00\x00", 9);
  69. }
  70. #endif
  71. SECTION("int 8") {
  72. testIncompleteInput("\xD0\x01", 2);
  73. }
  74. SECTION("int 16") {
  75. testIncompleteInput("\xD1\x00\x01", 3);
  76. }
  77. SECTION("int 32") {
  78. testIncompleteInput("\xD2\x00\x00\x00\x01", 5);
  79. }
  80. #if ARDUINOJSON_USE_LONG_LONG
  81. SECTION("int 64") {
  82. testIncompleteInput("\xD3\x00\x00\x00\x00\x00\x00\x00\x00", 9);
  83. }
  84. #endif
  85. SECTION("float 32") {
  86. testIncompleteInput("\xCA\x40\x48\xF5\xC3", 5);
  87. }
  88. SECTION("float 64") {
  89. testIncompleteInput("\xCB\x40\x09\x21\xCA\xC0\x83\x12\x6F", 9);
  90. }
  91. SECTION("fixstr") {
  92. testIncompleteInput("\xABhello world", 12);
  93. }
  94. SECTION("str 8") {
  95. testIncompleteInput("\xd9\x05hello", 7);
  96. }
  97. SECTION("str 16") {
  98. testIncompleteInput("\xda\x00\x05hello", 8);
  99. }
  100. SECTION("str 32") {
  101. testIncompleteInput("\xdb\x00\x00\x00\x05hello", 10);
  102. }
  103. SECTION("bin 8") {
  104. testIncompleteInput("\xc4\x01X", 3);
  105. }
  106. SECTION("bin 16") {
  107. testIncompleteInput("\xc5\x00\x01X", 4);
  108. }
  109. SECTION("bin 32") {
  110. testIncompleteInput("\xc6\x00\x00\x00\x01X", 6);
  111. }
  112. SECTION("ext 8") {
  113. testIncompleteInput("\xc7\x01\x01\x01", 4);
  114. }
  115. SECTION("ext 16") {
  116. testIncompleteInput("\xc8\x00\x01\x01\x01", 5);
  117. }
  118. SECTION("ext 32") {
  119. testIncompleteInput("\xc9\x00\x00\x00\x01\x01\x01", 7);
  120. }
  121. SECTION("fixext 1") {
  122. testIncompleteInput("\xd4\x01\x01", 3);
  123. }
  124. SECTION("fixext 2") {
  125. testIncompleteInput("\xd5\x01\x01\x02", 4);
  126. }
  127. SECTION("fixext 4") {
  128. testIncompleteInput("\xd6\x01\x01\x02\x03\x04", 6);
  129. }
  130. SECTION("fixext 8") {
  131. testIncompleteInput("\xd7\x01\x01\x02\x03\x04\x05\x06\x07\x08", 10);
  132. }
  133. SECTION("fixext 16") {
  134. testIncompleteInput(
  135. "\xd8\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E"
  136. "\x0F\x10",
  137. 18);
  138. }
  139. }
  140. static std::string msgPackToJson(const char* input, size_t inputSize) {
  141. JsonDocument doc;
  142. auto err = deserializeMsgPack(doc, input, inputSize);
  143. REQUIRE(err == DeserializationError::Ok);
  144. return doc.as<std::string>();
  145. }
  146. TEST_CASE("deserializeMsgPack() replaces unsupported types by null") {
  147. SECTION("bin 8") {
  148. REQUIRE(msgPackToJson("\x92\xc4\x01X\x2A", 5) == "[null,42]");
  149. }
  150. SECTION("bin 16") {
  151. REQUIRE(msgPackToJson("\x92\xc5\x00\x01X\x2A", 6) == "[null,42]");
  152. }
  153. SECTION("bin 32") {
  154. REQUIRE(msgPackToJson("\x92\xc6\x00\x00\x00\x01X\x2A", 8) == "[null,42]");
  155. }
  156. SECTION("ext 8") {
  157. REQUIRE(msgPackToJson("\x92\xc7\x01\x01\x01\x2A", 6) == "[null,42]");
  158. }
  159. SECTION("ext 16") {
  160. REQUIRE(msgPackToJson("\x92\xc8\x00\x01\x01\x01\x2A", 7) == "[null,42]");
  161. }
  162. SECTION("ext 32") {
  163. REQUIRE(msgPackToJson("\x92\xc9\x00\x00\x00\x01\x01\x01\x2A", 9) ==
  164. "[null,42]");
  165. }
  166. SECTION("fixext 1") {
  167. REQUIRE(msgPackToJson("\x92\xd4\x01\x01\x2A", 5) == "[null,42]");
  168. }
  169. SECTION("fixext 2") {
  170. REQUIRE(msgPackToJson("\x92\xd5\x01\x01\x02\x2A", 6) == "[null,42]");
  171. }
  172. SECTION("fixext 4") {
  173. REQUIRE(msgPackToJson("\x92\xd6\x01\x01\x02\x03\x04\x2A", 8) ==
  174. "[null,42]");
  175. }
  176. SECTION("fixext 8") {
  177. REQUIRE(msgPackToJson("\x92\xd7\x01\x01\x02\x03\x04\x05\x06\x07\x08\x2A",
  178. 12) == "[null,42]");
  179. }
  180. SECTION("fixext 16") {
  181. REQUIRE(msgPackToJson("\x92\xd8\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
  182. "\x0B\x0C\x0D\x0E"
  183. "\x0F\x10\x2A",
  184. 20) == "[null,42]");
  185. }
  186. }
  187. TEST_CASE("deserializeMsgPack() returns NoMemory is string length overflows") {
  188. JsonDocument doc;
  189. auto maxLength = ArduinoJson::detail::StringNode::maxLength;
  190. SECTION("max length should succeed") {
  191. auto len = maxLength;
  192. std::string prefix = {'\xdb', char(len >> 24), char(len >> 16),
  193. char(len >> 8), char(len)};
  194. auto err = deserializeMsgPack(doc, prefix + std::string(len, 'a'));
  195. REQUIRE(err == DeserializationError::Ok);
  196. }
  197. SECTION("one above max length should fail") {
  198. auto len = maxLength + 1;
  199. std::string prefix = {'\xdb', char(len >> 24), char(len >> 16),
  200. char(len >> 8), char(len)};
  201. auto err = deserializeMsgPack(doc, prefix + std::string(len, 'a'));
  202. REQUIRE(err == DeserializationError::NoMemory);
  203. }
  204. }