Changeset View
Changeset View
Standalone View
Standalone View
src/test/finalization_tests.cpp
Show All 19 Lines | BOOST_AUTO_TEST_CASE(finalizationDelay) { | ||||
CBlock block; | CBlock block; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// We should have no finalized block because the 100 blocks generated by | // We should have no finalized block because the 100 blocks generated by | ||||
// the test setup are too close to "now"; | // the test setup are too close to "now"; | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == nullptr, | BOOST_CHECK_MESSAGE(GetFinalizedBlock() == nullptr, | ||||
"No block finalized (tip at height " | "No block finalized (tip at height " | ||||
<< chainActive.Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Create maxreorgdepth blocks. Auto-finalization will not occur because | // Create maxreorgdepth blocks. Auto-finalization will not occur because | ||||
// the delay is not expired | // the delay is not expired | ||||
int64_t mockedTime = GetTime(); | int64_t mockedTime = GetTime(); | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// These blocks are too recent. | // These blocks are too recent. | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == nullptr, | BOOST_CHECK_MESSAGE(GetFinalizedBlock() == nullptr, | ||||
"No block finalized (tip at height " | "No block finalized (tip at height " | ||||
<< chainActive.Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Make the finalization time to expire | // Make the finalization time to expire | ||||
mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | ||||
SetMockTime(mockedTime); | SetMockTime(mockedTime); | ||||
// Next maxreorgdepth blocks should cause auto-finalization | // Next maxreorgdepth blocks should cause auto-finalization | ||||
CBlockIndex *blockToFinalize = chainActive.Tip()->GetAncestor( | CBlockIndex *blockToFinalize = ::ChainActive().Tip()->GetAncestor( | ||||
chainActive.Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ::ChainActive().Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
blockToFinalize = chainActive.Next(blockToFinalize); | blockToFinalize = ::ChainActive().Next(blockToFinalize); | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | ||||
"Block finalized at height " | "Block finalized at height " | ||||
<< blockToFinalize->nHeight | << blockToFinalize->nHeight | ||||
<< " (tip at height " | << " (tip at height " | ||||
<< chainActive.Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Next blocks won't cause auto-finalization because the delay is not | // Next blocks won't cause auto-finalization because the delay is not | ||||
// expired | // expired | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
// These blocks are finalized. | // These blocks are finalized. | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | ||||
"Finalized block remains unchanged at height " | "Finalized block remains unchanged at height " | ||||
<< blockToFinalize->nHeight | << blockToFinalize->nHeight | ||||
<< " (tip at height " | << " (tip at height " | ||||
<< chainActive.Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
// Make the finalization time to expire | // Make the finalization time to expire | ||||
mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | mockedTime += DEFAULT_MIN_FINALIZATION_DELAY + 1; | ||||
SetMockTime(mockedTime); | SetMockTime(mockedTime); | ||||
blockToFinalize = chainActive.Tip()->GetAncestor( | blockToFinalize = ::ChainActive().Tip()->GetAncestor( | ||||
chainActive.Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ::ChainActive().Tip()->nHeight - DEFAULT_MAX_REORG_DEPTH); | ||||
// Create some more blocks. | // Create some more blocks. | ||||
// Finalization should start moving again. | // Finalization should start moving again. | ||||
for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | for (uint32_t i = 0; i < DEFAULT_MAX_REORG_DEPTH; i++) { | ||||
blockToFinalize = chainActive.Next(blockToFinalize); | blockToFinalize = ::ChainActive().Next(blockToFinalize); | ||||
block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | block = CreateAndProcessBlock({}, p2pk_scriptPubKey); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | BOOST_CHECK_MESSAGE(GetFinalizedBlock() == blockToFinalize, | ||||
"Block finalized at height " | "Block finalized at height " | ||||
<< blockToFinalize->nHeight | << blockToFinalize->nHeight | ||||
<< " (tip at height " | << " (tip at height " | ||||
<< chainActive.Tip()->nHeight << ")"); | << ::ChainActive().Tip()->nHeight << ")"); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |