Changeset View
Changeset View
Standalone View
Standalone View
src/test/activation_tests.cpp
Show First 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(iswellingtonenabled) { | ||||
BOOST_CHECK(IsWellingtonEnabled(params, &blocks.back())); | BOOST_CHECK(IsWellingtonEnabled(params, &blocks.back())); | ||||
BOOST_CHECK(IsWellingtonEnabled(params, activation)); | BOOST_CHECK(IsWellingtonEnabled(params, activation)); | ||||
SetMTP(blocks, activation + 1); | SetMTP(blocks, activation + 1); | ||||
BOOST_CHECK(IsWellingtonEnabled(params, &blocks.back())); | BOOST_CHECK(IsWellingtonEnabled(params, &blocks.back())); | ||||
BOOST_CHECK(IsWellingtonEnabled(params, activation + 1)); | BOOST_CHECK(IsWellingtonEnabled(params, activation + 1)); | ||||
} | } | ||||
BOOST_FIXTURE_TEST_CASE(wellington_latch, RegTestingSetup) { | |||||
const Consensus::Params ¶ms = Params().GetConsensus(); | |||||
const auto activation = gArgs.GetIntArg("-wellingtonactivationtime", | |||||
params.wellingtonActivationTime); | |||||
SetMockTime(activation - 1000000); | |||||
const Config &config = GetConfig(); | |||||
auto &mempool = *Assert(m_node.mempool); | |||||
auto &chainman = *Assert(m_node.chainman); | |||||
auto &activeChainstate = chainman.ActiveChainstate(); | |||||
std::array<CBlockIndex, 12> blocks; | |||||
for (size_t i = 1; i < blocks.size() - 1; ++i) { | |||||
blocks[i].pprev = &blocks[i - 1]; | |||||
} | |||||
// Hack: we need to call MineBlock to avoid null pointer dereference in | |||||
// ATMP. Let's make sure it's our tip so SetMTP works as expected. | |||||
MineBlock(config, m_node, CScript() << OP_TRUE); | |||||
blocks[11] = *activeChainstate.m_chain.Tip(); | |||||
blocks[11].pprev = &blocks[10]; | |||||
activeChainstate.m_chain.SetTip(&blocks[11]); | |||||
auto submitTxToMemPool = [&config, &activeChainstate]() { | |||||
LOCK(cs_main); | |||||
return AcceptToMemoryPool(config, activeChainstate, | |||||
MakeTransactionRef(), | |||||
/*accept_time=*/0, | |||||
/*bypass_limits=*/false); | |||||
}; | |||||
BOOST_CHECK(!IsWellingtonEnabled(params, &blocks.back())); | |||||
submitTxToMemPool(); | |||||
BOOST_CHECK(!mempool.wellingtonLatched); | |||||
// Activate Wellington | |||||
SetMTP(blocks, activation); | |||||
BOOST_CHECK(IsWellingtonEnabled(params, &blocks.back())); | |||||
// Upon first tx submission, the flag is latched | |||||
BOOST_CHECK(!mempool.wellingtonLatched); | |||||
submitTxToMemPool(); | |||||
BOOST_CHECK(mempool.wellingtonLatched); | |||||
// Simulate a reorg and check the flag did latch | |||||
SetMTP(blocks, activation - 1); | |||||
BOOST_CHECK(mempool.wellingtonLatched); | |||||
submitTxToMemPool(); | |||||
BOOST_CHECK(mempool.wellingtonLatched); | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |