diff --git a/src/test/mempool_tests.cpp b/src/test/mempool_tests.cpp --- a/src/test/mempool_tests.cpp +++ b/src/test/mempool_tests.cpp @@ -1136,4 +1136,50 @@ BOOST_CHECK_EQUAL(descendants, 4ULL); } +BOOST_AUTO_TEST_CASE(MempoolDynamicUsageTests) { + CTxMemPool pool; + BOOST_CHECK_EQUAL(pool.DynamicMemoryUsage(), 0); + +#if !(defined(__x86_64__) and defined(__GLIBCXX__)) + /* + * FIXME make the calculated value architecture independent. This will + * ensure there is no behavior difference between the various Bitcoin ABC + * versions. + * For now skip the following tests if the tests is not built for a 64 bits + * target. + */ + return; +#endif + + const size_t nTxs = 10; + std::vector txs(nTxs); + txs[0] = make_tx(MK_OUTPUTS(1 * COIN)); + for (size_t i = 1; i < nTxs; i++) { + txs[i] = make_tx(MK_OUTPUTS(1000 * SATOSHI), MK_INPUTS(txs[i - 1])); + } + + LOCK2(cs_main, pool.cs); + TestMemPoolEntryHelper entry; + + pool.addUnchecked(entry.Fee(1000 * SATOSHI).FromTx(txs[0])); + size_t dynamicMemoryUsage = pool.DynamicMemoryUsage(); + BOOST_CHECK_EQUAL(dynamicMemoryUsage, 736); + + for (size_t i = 1; i < nTxs; i++) { + pool.addUnchecked(entry.Fee(1000 * SATOSHI).FromTx(txs[i])); + BOOST_CHECK_GT(pool.DynamicMemoryUsage(), dynamicMemoryUsage); + dynamicMemoryUsage = pool.DynamicMemoryUsage(); + } + + BOOST_CHECK_EQUAL(dynamicMemoryUsage, 9968); + + for (size_t i = nTxs - 1; i > 1; i--) { + pool.removeRecursive(*txs[i]); + BOOST_CHECK_LT(pool.DynamicMemoryUsage(), dynamicMemoryUsage); + dynamicMemoryUsage = pool.DynamicMemoryUsage(); + } + + BOOST_CHECK_EQUAL(dynamicMemoryUsage, 1776); +} + BOOST_AUTO_TEST_SUITE_END()