Changeset View
Changeset View
Standalone View
Standalone View
src/test/finalization_tests.cpp
Show All 10 Lines | |||||
BOOST_FIXTURE_TEST_SUITE(finalization_tests, TestChain100Setup) | BOOST_FIXTURE_TEST_SUITE(finalization_tests, TestChain100Setup) | ||||
BOOST_AUTO_TEST_CASE(finalizationDelay) { | BOOST_AUTO_TEST_CASE(finalizationDelay) { | ||||
CScript p2pk_scriptPubKey = | CScript p2pk_scriptPubKey = | ||||
CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG; | CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG; | ||||
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 | // the test setup are too close to "now"; | ||||
// 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); | |||||
// 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); | |||||
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); | |||||
// 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); | |||||
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() |