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 @@ -14,6 +14,48 @@ BOOST_FIXTURE_TEST_SUITE(mempool_tests, TestingSetup) +BOOST_AUTO_TEST_CASE(TestPackageAccounting) { + CTxMemPool testPool; + TestMemPoolEntryHelper entry; + CMutableTransaction tx; + + tx.vin.resize(1); + tx.vin[0].scriptSig = CScript(); + tx.vout.resize(1); + tx.vout[0].scriptPubKey = CScript() << OP_TRUE; + tx.vout[0].nValue = 10 * SATOSHI; + testPool.addUnchecked(tx.GetId(), entry.FromTx(tx)); + + TxId parentOfAll = tx.GetId(); + + Amount totalFee = Amount::zero(); + size_t totalSize = CTransaction(tx).GetTotalSize(); + std::vector txIds; + for (int64_t i = 0; i < 100; i++) { + // Recycle the transaction + TxId parentId = tx.GetId(); + txIds.push_back(parentId); + tx.vin[0].prevout = COutPoint(tx.GetId(), 0); + testPool.addUnchecked(tx.GetId(), entry.Fee(i * SATOSHI).FromTx(tx)); + + totalFee += i * SATOSHI; + totalSize += CTransaction(tx).GetTotalSize(); + CTxMemPoolEntry parentEntry = *testPool.mapTx.find(parentOfAll); + CTxMemPoolEntry latestEntry = *testPool.mapTx.find(tx.GetId()); + + BOOST_CHECK_EQUAL(latestEntry.GetCountWithAncestors(), i + 2); + BOOST_CHECK_EQUAL(latestEntry.GetSizeWithAncestors(), totalSize); + BOOST_CHECK_EQUAL(latestEntry.GetModFeesWithAncestors(), totalFee); + + BOOST_CHECK_EQUAL(parentEntry.GetCountWithDescendants(), + latestEntry.GetCountWithAncestors()); + BOOST_CHECK_EQUAL(parentEntry.GetSizeWithDescendants(), + latestEntry.GetSizeWithAncestors()); + BOOST_CHECK_EQUAL(parentEntry.GetModFeesWithDescendants(), + latestEntry.GetModFeesWithAncestors()); + } +} + BOOST_AUTO_TEST_CASE(MempoolRemoveTest) { // Test CTxMemPool::remove functionality