nestingLimit.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include <sstream>
  7. #define SHOULD_WORK(expression) REQUIRE(DeserializationError::Ok == expression);
  8. #define SHOULD_FAIL(expression) \
  9. REQUIRE(DeserializationError::TooDeep == expression);
  10. TEST_CASE("JsonDeserializer nesting") {
  11. DynamicJsonDocument doc(4096);
  12. SECTION("Input = const char*") {
  13. SECTION("limit = 0") {
  14. DeserializationOption::NestingLimit nesting(0);
  15. SHOULD_WORK(deserializeMsgPack(doc, "\xA1H", nesting)); // "H"
  16. SHOULD_FAIL(deserializeMsgPack(doc, "\x90", nesting)); // []
  17. SHOULD_FAIL(deserializeMsgPack(doc, "\x80", nesting)); // {}
  18. }
  19. SECTION("limit = 1") {
  20. DeserializationOption::NestingLimit nesting(1);
  21. SHOULD_WORK(deserializeMsgPack(doc, "\x90", nesting)); // {}
  22. SHOULD_WORK(deserializeMsgPack(doc, "\x80", nesting)); // []
  23. SHOULD_FAIL(deserializeMsgPack(doc, "\x81\xA1H\x80", nesting)); // {H:{}}
  24. SHOULD_FAIL(deserializeMsgPack(doc, "\x91\x90", nesting)); // [[]]
  25. }
  26. }
  27. SECTION("char* and size_t") {
  28. SECTION("limit = 0") {
  29. DeserializationOption::NestingLimit nesting(0);
  30. SHOULD_WORK(deserializeMsgPack(doc, "\xA1H", 2, nesting));
  31. SHOULD_FAIL(deserializeMsgPack(doc, "\x90", 1, nesting));
  32. SHOULD_FAIL(deserializeMsgPack(doc, "\x80", 1, nesting));
  33. }
  34. SECTION("limit = 1") {
  35. DeserializationOption::NestingLimit nesting(1);
  36. SHOULD_WORK(deserializeMsgPack(doc, "\x90", 1, nesting));
  37. SHOULD_WORK(deserializeMsgPack(doc, "\x80", 1, nesting));
  38. SHOULD_FAIL(deserializeMsgPack(doc, "\x81\xA1H\x80", 4, nesting));
  39. SHOULD_FAIL(deserializeMsgPack(doc, "\x91\x90", 2, nesting));
  40. }
  41. }
  42. SECTION("Input = std::string") {
  43. using std::string;
  44. SECTION("limit = 0") {
  45. DeserializationOption::NestingLimit nesting(0);
  46. SHOULD_WORK(deserializeMsgPack(doc, string("\xA1H"), nesting));
  47. SHOULD_FAIL(deserializeMsgPack(doc, string("\x90"), nesting));
  48. SHOULD_FAIL(deserializeMsgPack(doc, string("\x80"), nesting));
  49. }
  50. SECTION("limit = 1") {
  51. DeserializationOption::NestingLimit nesting(1);
  52. SHOULD_WORK(deserializeMsgPack(doc, string("\x90"), nesting));
  53. SHOULD_WORK(deserializeMsgPack(doc, string("\x80"), nesting));
  54. SHOULD_FAIL(deserializeMsgPack(doc, string("\x81\xA1H\x80"), nesting));
  55. SHOULD_FAIL(deserializeMsgPack(doc, string("\x91\x90"), nesting));
  56. }
  57. }
  58. SECTION("Input = std::istream") {
  59. SECTION("limit = 0") {
  60. DeserializationOption::NestingLimit nesting(0);
  61. std::istringstream good("\xA1H"); // "H"
  62. std::istringstream bad("\x90"); // []
  63. SHOULD_WORK(deserializeMsgPack(doc, good, nesting));
  64. SHOULD_FAIL(deserializeMsgPack(doc, bad, nesting));
  65. }
  66. SECTION("limit = 1") {
  67. DeserializationOption::NestingLimit nesting(1);
  68. std::istringstream good("\x90"); // []
  69. std::istringstream bad("\x91\x90"); // [[]]
  70. SHOULD_WORK(deserializeMsgPack(doc, good, nesting));
  71. SHOULD_FAIL(deserializeMsgPack(doc, bad, nesting));
  72. }
  73. }
  74. }