Removed redundant range check in MemoryPoolPrint

This commit is contained in:
Benoit Blanchon
2021-04-18 16:47:28 +02:00
parent 2a777a659a
commit 64e52e97ee
2 changed files with 47 additions and 19 deletions

View File

@ -47,34 +47,39 @@ struct PrintableString : public Printable {
}; };
TEST_CASE("Printable") { TEST_CASE("Printable") {
SECTION("Enough space for the whole string") { SECTION("Doesn't overflow") {
StaticJsonDocument<64> doc; StaticJsonDocument<8> doc;
doc.set(666); const char* value = "example"; // == 7 chars
doc.set(666); // to make sure we override the value
SECTION("Via Print::write(char)") { SECTION("Via Print::write(char)") {
PrintableString<PrintOneCharacterAtATime> printable = "Hello World!"; PrintableString<PrintOneCharacterAtATime> printable(value);
CHECK(doc.set(printable) == true); CHECK(doc.set(printable) == true);
CHECK(doc.as<std::string>() == "Hello World!"); CHECK(doc.as<std::string>() == value);
CHECK(printable.totalBytesWritten() == 12); CHECK(printable.totalBytesWritten() == 7);
CHECK(doc.overflowed() == false); CHECK(doc.overflowed() == false);
CHECK(doc.memoryUsage() == 13); CHECK(doc.memoryUsage() == 8);
} }
SECTION("Via Print::write(const char* size_t)") { SECTION("Via Print::write(const char* size_t)") {
PrintableString<PrintAllAtOnce> printable = "Hello World!"; PrintableString<PrintAllAtOnce> printable(value);
CHECK(doc.set(printable) == true); CHECK(doc.set(printable) == true);
CHECK(doc.as<std::string>() == "Hello World!"); CHECK(doc.as<std::string>() == value);
CHECK(printable.totalBytesWritten() == 12); CHECK(printable.totalBytesWritten() == 7);
CHECK(doc.overflowed() == false); CHECK(doc.overflowed() == false);
CHECK(doc.memoryUsage() == 13); CHECK(doc.memoryUsage() == 8);
} }
} }
SECTION("Too small memory pool") { SECTION("Overflows early") {
StaticJsonDocument<8> doc; StaticJsonDocument<8> doc;
const char* value = "hello world"; // > 8 chars
doc.set(666); // to make sure we override the value
SECTION("Via Print::write(char)") { SECTION("Via Print::write(char)") {
PrintableString<PrintOneCharacterAtATime> printable = "Hello World!"; PrintableString<PrintOneCharacterAtATime> printable(value);
CHECK(doc.set(printable) == false); CHECK(doc.set(printable) == false);
CHECK(doc.isNull()); CHECK(doc.isNull());
CHECK(printable.totalBytesWritten() == 8); CHECK(printable.totalBytesWritten() == 8);
@ -82,8 +87,33 @@ TEST_CASE("Printable") {
CHECK(doc.memoryUsage() == 0); CHECK(doc.memoryUsage() == 0);
} }
SECTION("Via Print::write(const char* size_t)") { SECTION("Via Print::write(const char*, size_t)") {
PrintableString<PrintAllAtOnce> printable = "Hello World!"; PrintableString<PrintAllAtOnce> printable(value);
CHECK(doc.set(printable) == false);
CHECK(doc.isNull());
CHECK(printable.totalBytesWritten() == 0);
CHECK(doc.overflowed() == true);
CHECK(doc.memoryUsage() == 0);
}
}
SECTION("Overflows adding terminator") {
StaticJsonDocument<8> doc;
const char* value = "overflow"; // == 8 chars
doc.set(666); // to make sure we override the value
SECTION("Via Print::write(char)") {
PrintableString<PrintOneCharacterAtATime> printable(value);
CHECK(doc.set(printable) == false);
CHECK(doc.isNull());
CHECK(printable.totalBytesWritten() == 8);
CHECK(doc.overflowed() == true);
CHECK(doc.memoryUsage() == 0);
}
SECTION("Via Print::write(const char*, size_t)") {
PrintableString<PrintAllAtOnce> printable(value);
CHECK(doc.set(printable) == false); CHECK(doc.set(printable) == false);
CHECK(doc.isNull()); CHECK(doc.isNull());
CHECK(printable.totalBytesWritten() == 0); CHECK(printable.totalBytesWritten() == 0);

View File

@ -215,10 +215,8 @@ class MemoryPoolPrint : public Print {
} }
const char* c_str() { const char* c_str() {
if (_size >= _capacity) _string[_size++] = 0;
return 0; ARDUINOJSON_ASSERT(_size <= _capacity);
_string[_size++] = 0; // TODO: test overflow
return _pool->saveStringFromFreeZone(_size); return _pool->saveStringFromFreeZone(_size);
} }