errors.cpp 5.3 KB

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