Changeset View
Changeset View
Standalone View
Standalone View
src/test/mempool_tests.cpp
Show First 20 Lines • Show All 477 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest) { | ||||
sortedOrder.insert(sortedOrder.begin(), tx7.GetId().ToString()); | sortedOrder.insert(sortedOrder.begin(), tx7.GetId().ToString()); | ||||
CheckSort<ancestor_score>(pool, sortedOrder); | CheckSort<ancestor_score>(pool, sortedOrder); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) { | BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) { | ||||
CTxMemPool pool; | CTxMemPool pool; | ||||
TestMemPoolEntryHelper entry; | TestMemPoolEntryHelper entry; | ||||
entry.dPriority = 10.0; | entry.dPriority = 10.0; | ||||
Amount feeIncrement = Amount(1); | |||||
CMutableTransaction tx1 = CMutableTransaction(); | CMutableTransaction tx1 = CMutableTransaction(); | ||||
tx1.vin.resize(1); | tx1.vin.resize(1); | ||||
tx1.vin[0].scriptSig = CScript() << OP_1; | tx1.vin[0].scriptSig = CScript() << OP_1; | ||||
tx1.vout.resize(1); | tx1.vout.resize(1); | ||||
tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; | tx1.vout[0].scriptPubKey = CScript() << OP_1 << OP_EQUAL; | ||||
tx1.vout[0].nValue = 10 * COIN; | tx1.vout[0].nValue = 10 * COIN; | ||||
pool.addUnchecked(tx1.GetId(), | pool.addUnchecked(tx1.GetId(), | ||||
Show All 40 Lines | BOOST_AUTO_TEST_CASE(MempoolSizeLimitTest) { | ||||
BOOST_CHECK(!pool.exists(tx1.GetId())); | BOOST_CHECK(!pool.exists(tx1.GetId())); | ||||
BOOST_CHECK(!pool.exists(tx2.GetId())); | BOOST_CHECK(!pool.exists(tx2.GetId())); | ||||
BOOST_CHECK(!pool.exists(tx3.GetId())); | BOOST_CHECK(!pool.exists(tx3.GetId())); | ||||
CFeeRate maxFeeRateRemoved(Amount(25000), | CFeeRate maxFeeRateRemoved(Amount(25000), | ||||
CTransaction(tx3).GetTotalSize() + | CTransaction(tx3).GetTotalSize() + | ||||
CTransaction(tx2).GetTotalSize()); | CTransaction(tx2).GetTotalSize()); | ||||
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), | BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), | ||||
maxFeeRateRemoved.GetFeePerK() + Amount(1000)); | maxFeeRateRemoved.GetFeePerK() + feeIncrement); | ||||
CMutableTransaction tx4 = CMutableTransaction(); | CMutableTransaction tx4 = CMutableTransaction(); | ||||
tx4.vin.resize(2); | tx4.vin.resize(2); | ||||
tx4.vin[0].prevout.SetNull(); | tx4.vin[0].prevout.SetNull(); | ||||
tx4.vin[0].scriptSig = CScript() << OP_4; | tx4.vin[0].scriptSig = CScript() << OP_4; | ||||
tx4.vin[1].prevout.SetNull(); | tx4.vin[1].prevout.SetNull(); | ||||
tx4.vin[1].scriptSig = CScript() << OP_4; | tx4.vin[1].scriptSig = CScript() << OP_4; | ||||
tx4.vout.resize(2); | tx4.vout.resize(2); | ||||
▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | pool.addUnchecked(tx5.GetId(), | ||||
entry.Fee(Amount(1000LL)).FromTx(tx5, &pool)); | entry.Fee(Amount(1000LL)).FromTx(tx5, &pool)); | ||||
pool.addUnchecked(tx7.GetId(), | pool.addUnchecked(tx7.GetId(), | ||||
entry.Fee(Amount(9000LL)).FromTx(tx7, &pool)); | entry.Fee(Amount(9000LL)).FromTx(tx7, &pool)); | ||||
std::vector<CTransactionRef> vtx; | std::vector<CTransactionRef> vtx; | ||||
SetMockTime(42); | SetMockTime(42); | ||||
SetMockTime(42 + CTxMemPool::ROLLING_FEE_HALFLIFE); | SetMockTime(42 + CTxMemPool::ROLLING_FEE_HALFLIFE); | ||||
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), | BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), | ||||
maxFeeRateRemoved.GetFeePerK() + Amount(1000)); | maxFeeRateRemoved.GetFeePerK() + feeIncrement); | ||||
// ... we should keep the same min fee until we get a block | // ... we should keep the same min fee until we get a block | ||||
pool.removeForBlock(vtx, 1); | pool.removeForBlock(vtx, 1); | ||||
SetMockTime(42 + 2 * CTxMemPool::ROLLING_FEE_HALFLIFE); | SetMockTime(42 + 2 * CTxMemPool::ROLLING_FEE_HALFLIFE); | ||||
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), | BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), | ||||
(maxFeeRateRemoved.GetFeePerK() + Amount(1000)) / 2); | (maxFeeRateRemoved.GetFeePerK() + feeIncrement) / 2); | ||||
// ... then feerate should drop 1/2 each halflife | // ... then feerate should drop 1/2 each halflife | ||||
SetMockTime(42 + 2 * CTxMemPool::ROLLING_FEE_HALFLIFE + | SetMockTime(42 + 2 * CTxMemPool::ROLLING_FEE_HALFLIFE + | ||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 2); | CTxMemPool::ROLLING_FEE_HALFLIFE / 2); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.GetMinFee(pool.DynamicMemoryUsage() * 5 / 2).GetFeePerK(), | pool.GetMinFee(pool.DynamicMemoryUsage() * 5 / 2).GetFeePerK(), | ||||
(maxFeeRateRemoved.GetFeePerK() + Amount(1000)) / 4); | (maxFeeRateRemoved.GetFeePerK() + feeIncrement) / 4); | ||||
// ... with a 1/2 halflife when mempool is < 1/2 its target size | // ... with a 1/2 halflife when mempool is < 1/2 its target size | ||||
SetMockTime(42 + 2 * CTxMemPool::ROLLING_FEE_HALFLIFE + | SetMockTime(42 + 2 * CTxMemPool::ROLLING_FEE_HALFLIFE + | ||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 2 + | CTxMemPool::ROLLING_FEE_HALFLIFE / 2 + | ||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 4); | CTxMemPool::ROLLING_FEE_HALFLIFE / 4); | ||||
BOOST_CHECK_EQUAL( | BOOST_CHECK_EQUAL( | ||||
pool.GetMinFee(pool.DynamicMemoryUsage() * 9 / 2).GetFeePerK(), | pool.GetMinFee(pool.DynamicMemoryUsage() * 9 / 2).GetFeePerK(), | ||||
(maxFeeRateRemoved.GetFeePerK() + Amount(1000)) / 8); | (maxFeeRateRemoved.GetFeePerK() + feeIncrement) / 8); | ||||
// ... with a 1/4 halflife when mempool is < 1/4 its target size | // ... with a 1/4 halflife when mempool is < 1/4 its target size | ||||
SetMockTime(42 + 7 * CTxMemPool::ROLLING_FEE_HALFLIFE + | |||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 2 + | |||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 4); | |||||
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), Amount(1000)); | |||||
// ... but feerate should never drop below 1000 | |||||
SetMockTime(42 + 8 * CTxMemPool::ROLLING_FEE_HALFLIFE + | |||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 2 + | |||||
CTxMemPool::ROLLING_FEE_HALFLIFE / 4); | |||||
BOOST_CHECK_EQUAL(pool.GetMinFee(1).GetFeePerK(), Amount(0)); | |||||
// ... unless it has gone all the way to 0 (after getting past 1000/2) | |||||
SetMockTime(0); | SetMockTime(0); | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |