Tests: allow ArmoredAllocator to be called multiple times

This commit is contained in:
Benoit Blanchon
2023-04-07 18:27:29 +02:00
parent e9850152a7
commit 22e4f216c3

View File

@ -16,37 +16,25 @@ using ArduinoJson::detail::sizeofString;
class ArmoredAllocator : public Allocator { class ArmoredAllocator : public Allocator {
public: public:
ArmoredAllocator() : _ptr(0), _size(0) {}
virtual ~ArmoredAllocator() {} virtual ~ArmoredAllocator() {}
void* allocate(size_t size) override { void* allocate(size_t size) override {
_ptr = malloc(size); return malloc(size);
_size = size;
return _ptr;
} }
void deallocate(void* ptr) override { void deallocate(void* ptr) override {
REQUIRE(ptr == _ptr);
free(ptr); free(ptr);
_ptr = 0;
_size = 0;
} }
void* reallocate(void* ptr, size_t new_size) override { void* reallocate(void* ptr, size_t new_size) override {
REQUIRE(ptr == _ptr);
// don't call realloc, instead alloc a new buffer and erase the old one // don't call realloc, instead alloc a new buffer and erase the old one
// this way we make sure we support relocation // this way we make sure we support relocation
void* new_ptr = malloc(new_size); void* new_ptr = malloc(new_size);
memcpy(new_ptr, _ptr, std::min(new_size, _size)); memset(new_ptr, '#', new_size); // erase
memset(_ptr, '#', _size); // erase memcpy(new_ptr, ptr, std::min(new_size, new_size));
free(_ptr); free(ptr);
_ptr = new_ptr;
return new_ptr; return new_ptr;
} }
private:
void* _ptr;
size_t _size;
}; };
TEST_CASE("JsonDocument::shrinkToFit()") { TEST_CASE("JsonDocument::shrinkToFit()") {