From 408ae164779f0eb3399eb2163e09adeaee32cbff Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Fri, 11 Sep 2020 07:49:13 -0700 Subject: [PATCH] Test parse allocation discrepancy --- test/parse.cpp | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ test/string.cpp | 2 ++ test/test.hpp | 5 ++- 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/test/parse.cpp b/test/parse.cpp index d0c0227f..755a8c32 100644 --- a/test/parse.cpp +++ b/test/parse.cpp @@ -12,6 +12,9 @@ #include +#include + +#include "test.hpp" #include "test_suite.hpp" BOOST_JSON_NS_BEGIN @@ -46,10 +49,100 @@ public: bad ("[1,2,3] #"); } + void + testMemoryUsage() + { + // string + { + std::string s(10000, '*'); + s.insert(s.begin(), '\"'); + s.append(1, '\"'); + + fail_resource mr1; + value jv1 = parse(s, &mr1); + + fail_resource mr2; + value jv2(jv1, &mr2); + BOOST_TEST(mr1.bytes == mr2.bytes); + + fail_resource mr3; + value jv3(&mr3); + jv3 = jv1; + BOOST_TEST(mr1.bytes == mr3.bytes); + } + + // array + { + { + fail_resource mr1; + value jv1 = parse("[1]", &mr1); + + fail_resource mr2; + value jv2(jv1, &mr2); + BOOST_TEST(mr1.bytes == mr2.bytes); + + fail_resource mr3; + value jv3(&mr3); + jv3 = jv1; + BOOST_TEST(mr1.bytes == mr3.bytes); + } + { + std::string s; + s = "1,2,3,4"; + s = s + "," + s; + s = s + "," + s; + s = s + "," + s; + s = s + "," + s; + s = s + "," + s; + s = s + "," + s; + s = s + "," + s; + s = s + "," + s; + s = "[[" + s + "]]"; + + fail_resource mr1; + value jv1 = parse(s, &mr1); + + fail_resource mr2; + value jv2(jv1, &mr2); + BOOST_TEST(mr1.bytes == mr2.bytes); + + fail_resource mr3; + value jv3(&mr3); + jv3 = jv1; + BOOST_TEST(mr1.bytes == mr3.bytes); + } + } + + // object + { + std::string s; + s = "{\"0\":null"; + for(int i = 1; i < 1000; ++i) + s += + ",\"" + + std::to_string(i) + + "\":null"; + s.append("}"); + + fail_resource mr1; + value jv1 = parse(s, &mr1); + + fail_resource mr2; + value jv2(jv1, &mr2); + BOOST_TEST(mr1.bytes == mr2.bytes); + + fail_resource mr3; + value jv3(&mr3); + jv3 = jv1; + BOOST_TEST(mr1.bytes == mr3.bytes); + } + } + void run() { testParse(); + testMemoryUsage(); } }; diff --git a/test/string.cpp b/test/string.cpp index 4cb51f1d..30c9c349 100644 --- a/test/string.cpp +++ b/test/string.cpp @@ -10,6 +10,8 @@ // Test that header file is self-contained. #include +#include + #include #include #include diff --git a/test/test.hpp b/test/test.hpp index 7a87d306..981ca5fd 100644 --- a/test/test.hpp +++ b/test/test.hpp @@ -43,6 +43,7 @@ struct fail_resource std::size_t fail_max = 0; std::size_t fail = 0; std::size_t nalloc = 0; + std::size_t bytes = 0; ~fail_resource() { @@ -62,17 +63,19 @@ struct fail_resource } auto p = ::operator new(n); ++nalloc; + bytes += n; return p; } void do_deallocate( void* p, - std::size_t, + std::size_t n, std::size_t) noexcept override { if(BOOST_TEST(nalloc > 0)) --nalloc; + bytes -= n; ::operator delete(p); }