|
|
@@ -5,6 +5,8 @@
|
|
|
#include <ArduinoJson.h>
|
|
|
#include <catch.hpp>
|
|
|
|
|
|
+#include "Allocators.hpp"
|
|
|
+
|
|
|
using ArduinoJson::detail::sizeofArray;
|
|
|
using ArduinoJson::detail::sizeofObject;
|
|
|
using ArduinoJson::detail::sizeofString;
|
|
|
@@ -20,9 +22,10 @@ static void checkValue(const char* input, T expected) {
|
|
|
REQUIRE(doc.as<T>() == expected);
|
|
|
}
|
|
|
|
|
|
-static void checkError(size_t capacity, const char* input,
|
|
|
- DeserializationError expected) {
|
|
|
- JsonDocument doc(capacity);
|
|
|
+static void checkError(size_t capacity, size_t timebombCountDown,
|
|
|
+ const char* input, DeserializationError expected) {
|
|
|
+ TimebombAllocator timebombAllocator(timebombCountDown);
|
|
|
+ JsonDocument doc(capacity, &timebombAllocator);
|
|
|
|
|
|
DeserializationError error = deserializeMsgPack(doc, input);
|
|
|
|
|
|
@@ -144,133 +147,120 @@ TEST_CASE("deserialize MsgPack value") {
|
|
|
|
|
|
TEST_CASE("deserializeMsgPack() under memory constaints") {
|
|
|
SECTION("single values always fit") {
|
|
|
- checkError(0, "\xc0", DeserializationError::Ok); // nil
|
|
|
- checkError(0, "\xc2", DeserializationError::Ok); // false
|
|
|
- checkError(0, "\xc3", DeserializationError::Ok); // true
|
|
|
- checkError(0, "\xcc\x00", DeserializationError::Ok); // uint 8
|
|
|
- checkError(0, "\xcd\x30\x39", DeserializationError::Ok); // uint 16
|
|
|
- checkError(0, "\xCE\x12\x34\x56\x78", DeserializationError::Ok); // uint 32
|
|
|
+ checkError(0, 0, "\xc0", DeserializationError::Ok); // nil
|
|
|
+ checkError(0, 0, "\xc2", DeserializationError::Ok); // false
|
|
|
+ checkError(0, 0, "\xc3", DeserializationError::Ok); // true
|
|
|
+ checkError(0, 0, "\xcc\x00", DeserializationError::Ok); // uint 8
|
|
|
+ checkError(0, 0, "\xcd\x30\x39", DeserializationError::Ok); // uint 16
|
|
|
+ checkError(0, 0, "\xCE\x12\x34\x56\x78",
|
|
|
+ DeserializationError::Ok); // uint 32
|
|
|
}
|
|
|
|
|
|
SECTION("fixstr") {
|
|
|
- checkError(8, "\xA0", DeserializationError::Ok);
|
|
|
- checkError(8, "\xA7ZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(8, "\xA8ZZZZZZZZ", DeserializationError::NoMemory);
|
|
|
- checkError(16, "\xAFZZZZZZZZZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(16, "\xB0ZZZZZZZZZZZZZZZZ", DeserializationError::NoMemory);
|
|
|
+ checkError(0, 2, "\xA7ZZZZZZZ", DeserializationError::Ok);
|
|
|
+ checkError(0, 0, "\xA7ZZZZZZZ", DeserializationError::NoMemory);
|
|
|
}
|
|
|
|
|
|
SECTION("str 8") {
|
|
|
- checkError(8, "\xD9\x00", DeserializationError::Ok);
|
|
|
- checkError(8, "\xD9\x07ZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(8, "\xD9\x08ZZZZZZZZ", DeserializationError::NoMemory);
|
|
|
- checkError(16, "\xD9\x0FZZZZZZZZZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(16, "\xD9\x10ZZZZZZZZZZZZZZZZ", DeserializationError::NoMemory);
|
|
|
+ checkError(0, 2, "\xD9\x07ZZZZZZZ", DeserializationError::Ok);
|
|
|
+ checkError(0, 0, "\xD9\x07ZZZZZZZ", DeserializationError::NoMemory);
|
|
|
}
|
|
|
|
|
|
SECTION("str 16") {
|
|
|
- checkError(8, "\xDA\x00\x00", DeserializationError::Ok);
|
|
|
- checkError(8, "\xDA\x00\x07ZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(8, "\xDA\x00\x08ZZZZZZZZ", DeserializationError::NoMemory);
|
|
|
- checkError(16, "\xDA\x00\x0FZZZZZZZZZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(16, "\xDA\x00\x10ZZZZZZZZZZZZZZZZ",
|
|
|
- DeserializationError::NoMemory);
|
|
|
+ checkError(0, 2, "\xDA\x00\x07ZZZZZZZ", DeserializationError::Ok);
|
|
|
+ checkError(0, 0, "\xDA\x00\x07ZZZZZZZ", DeserializationError::NoMemory);
|
|
|
}
|
|
|
|
|
|
SECTION("str 32") {
|
|
|
- checkError(8, "\xDB\x00\x00\x00\x00", DeserializationError::Ok);
|
|
|
- checkError(8, "\xDB\x00\x00\x00\x07ZZZZZZZ", DeserializationError::Ok);
|
|
|
- checkError(8, "\xDB\x00\x00\x00\x08ZZZZZZZZ",
|
|
|
- DeserializationError::NoMemory);
|
|
|
- checkError(16, "\xDB\x00\x00\x00\x0FZZZZZZZZZZZZZZZ",
|
|
|
- DeserializationError::Ok);
|
|
|
- checkError(16, "\xDB\x00\x00\x00\x10ZZZZZZZZZZZZZZZZ",
|
|
|
+ checkError(0, 2, "\xDB\x00\x00\x00\x07ZZZZZZZ", DeserializationError::Ok);
|
|
|
+ checkError(0, 0, "\xDB\x00\x00\x00\x07ZZZZZZZ",
|
|
|
DeserializationError::NoMemory);
|
|
|
}
|
|
|
|
|
|
SECTION("fixarray") {
|
|
|
- checkError(sizeofArray(0), "\x90", DeserializationError::Ok); // []
|
|
|
- checkError(sizeofArray(0), "\x91\x01",
|
|
|
+ checkError(sizeofArray(0), 1, "\x90", DeserializationError::Ok); // []
|
|
|
+ checkError(sizeofArray(0), 1, "\x91\x01",
|
|
|
DeserializationError::NoMemory); // [1]
|
|
|
- checkError(sizeofArray(1), "\x91\x01",
|
|
|
+ checkError(sizeofArray(1), 1, "\x91\x01",
|
|
|
DeserializationError::Ok); // [1]
|
|
|
- checkError(sizeofArray(1), "\x92\x01\x02",
|
|
|
+ checkError(sizeofArray(1), 1, "\x92\x01\x02",
|
|
|
DeserializationError::NoMemory); // [1,2]
|
|
|
}
|
|
|
|
|
|
SECTION("array 16") {
|
|
|
- checkError(sizeofArray(0), "\xDC\x00\x00", DeserializationError::Ok);
|
|
|
- checkError(sizeofArray(0), "\xDC\x00\x01\x01",
|
|
|
+ checkError(sizeofArray(0), 1, "\xDC\x00\x00", DeserializationError::Ok);
|
|
|
+ checkError(sizeofArray(0), 1, "\xDC\x00\x01\x01",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofArray(1), "\xDC\x00\x01\x01", DeserializationError::Ok);
|
|
|
- checkError(sizeofArray(1), "\xDC\x00\x02\x01\x02",
|
|
|
+ checkError(sizeofArray(1), 1, "\xDC\x00\x01\x01", DeserializationError::Ok);
|
|
|
+ checkError(sizeofArray(1), 1, "\xDC\x00\x02\x01\x02",
|
|
|
DeserializationError::NoMemory);
|
|
|
}
|
|
|
|
|
|
SECTION("array 32") {
|
|
|
- checkError(sizeofArray(0), "\xDD\x00\x00\x00\x00",
|
|
|
+ checkError(sizeofArray(0), 1, "\xDD\x00\x00\x00\x00",
|
|
|
DeserializationError::Ok);
|
|
|
- checkError(sizeofArray(0), "\xDD\x00\x00\x00\x01\x01",
|
|
|
+ checkError(sizeofArray(0), 1, "\xDD\x00\x00\x00\x01\x01",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofArray(1), "\xDD\x00\x00\x00\x01\x01",
|
|
|
+ checkError(sizeofArray(1), 1, "\xDD\x00\x00\x00\x01\x01",
|
|
|
DeserializationError::Ok);
|
|
|
- checkError(sizeofArray(1), "\xDD\x00\x00\x00\x02\x01\x02",
|
|
|
+ checkError(sizeofArray(1), 1, "\xDD\x00\x00\x00\x02\x01\x02",
|
|
|
DeserializationError::NoMemory);
|
|
|
}
|
|
|
|
|
|
SECTION("fixmap") {
|
|
|
SECTION("{}") {
|
|
|
- checkError(sizeofObject(0), "\x80", DeserializationError::Ok);
|
|
|
+ checkError(sizeofObject(0), 0, "\x80", DeserializationError::Ok);
|
|
|
}
|
|
|
SECTION("{H:1}") {
|
|
|
- checkError(sizeofObject(0), "\x81\xA1H\x01",
|
|
|
+ checkError(sizeofObject(0), 0, "\x81\xA1H\x01",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofObject(1) + sizeofString(2), "\x81\xA1H\x01",
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 3, "\x81\xA1H\x01",
|
|
|
DeserializationError::Ok);
|
|
|
}
|
|
|
SECTION("{H:1,W:2}") {
|
|
|
- checkError(sizeofObject(1) + sizeofString(2), "\x82\xA1H\x01\xA1W\x02",
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 3, "\x82\xA1H\x01\xA1W\x02",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofObject(2) + 2 * sizeofString(2),
|
|
|
+ checkError(sizeofObject(2) + 2 * sizeofString(2), 5,
|
|
|
"\x82\xA1H\x01\xA1W\x02", DeserializationError::Ok);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
SECTION("map 16") {
|
|
|
SECTION("{}") {
|
|
|
- checkError(sizeofObject(0), "\xDE\x00\x00", DeserializationError::Ok);
|
|
|
+ checkError(sizeofObject(0), 0, "\xDE\x00\x00", DeserializationError::Ok);
|
|
|
}
|
|
|
SECTION("{H:1}") {
|
|
|
- checkError(sizeofObject(0), "\xDE\x00\x01\xA1H\x01",
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 1, "\xDE\x00\x01\xA1H\x01",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofObject(1) + sizeofString(2), "\xDE\x00\x01\xA1H\x01",
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 3, "\xDE\x00\x01\xA1H\x01",
|
|
|
DeserializationError::Ok);
|
|
|
}
|
|
|
SECTION("{H:1,W:2}") {
|
|
|
- checkError(sizeofObject(1) + sizeofString(2),
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 3,
|
|
|
"\xDE\x00\x02\xA1H\x01\xA1W\x02",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofObject(2) + 2 * sizeofObject(1),
|
|
|
+ checkError(sizeofObject(2) + 2 * sizeofObject(1), 5,
|
|
|
"\xDE\x00\x02\xA1H\x01\xA1W\x02", DeserializationError::Ok);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
SECTION("map 32") {
|
|
|
SECTION("{}") {
|
|
|
- checkError(sizeofObject(0), "\xDF\x00\x00\x00\x00",
|
|
|
+ checkError(sizeofObject(0), 0, "\xDF\x00\x00\x00\x00",
|
|
|
DeserializationError::Ok);
|
|
|
}
|
|
|
SECTION("{H:1}") {
|
|
|
- checkError(sizeofObject(0), "\xDF\x00\x00\x00\x01\xA1H\x01",
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 1,
|
|
|
+ "\xDF\x00\x00\x00\x01\xA1H\x01",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofObject(1) + sizeofString(2),
|
|
|
+ checkError(sizeofObject(1) + sizeofString(2), 3,
|
|
|
"\xDF\x00\x00\x00\x01\xA1H\x01", DeserializationError::Ok);
|
|
|
}
|
|
|
SECTION("{H:1,W:2}") {
|
|
|
- checkError(sizeofObject(1) + sizeofString(2),
|
|
|
+ checkError(sizeofObject(1) + 2 * sizeofString(2), 3,
|
|
|
"\xDF\x00\x00\x00\x02\xA1H\x01\xA1W\x02",
|
|
|
DeserializationError::NoMemory);
|
|
|
- checkError(sizeofObject(2) + 2 * sizeofObject(1),
|
|
|
+ checkError(sizeofObject(2) + 2 * sizeofObject(1), 5,
|
|
|
"\xDF\x00\x00\x00\x02\xA1H\x01\xA1W\x02",
|
|
|
DeserializationError::Ok);
|
|
|
}
|