mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-10 14:48:46 +02:00
refactor, blockstorage: Generalize GetFirstStoredBlock
GetFirstStoredBlock is generalized to check for any data status with a status mask that needs to be passed as a parameter. To reflect this the function is also renamed to GetFirstBlock. Co-authored-by: stickies-v <stickies-v@protonmail.com>
This commit is contained in:
@@ -5,7 +5,9 @@
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include <chain.h>
|
||||
#include <node/blockstorage.h>
|
||||
#include <rpc/blockchain.h>
|
||||
#include <sync.h>
|
||||
#include <test/util/setup_common.h>
|
||||
#include <util/string.h>
|
||||
|
||||
@@ -74,4 +76,36 @@ BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target)
|
||||
TestDifficulty(0x12345678, 5913134931067755359633408.0);
|
||||
}
|
||||
|
||||
//! Prune chain from height down to genesis block and check that
|
||||
//! GetPruneHeight returns the correct value
|
||||
static void CheckGetPruneHeight(node::BlockManager& blockman, CChain& chain, int height) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
|
||||
{
|
||||
AssertLockHeld(::cs_main);
|
||||
|
||||
// Emulate pruning all blocks from `height` down to the genesis block
|
||||
// by unsetting the `BLOCK_HAVE_DATA` flag from `nStatus`
|
||||
for (CBlockIndex* it{chain[height]}; it != nullptr && it->nHeight > 0; it = it->pprev) {
|
||||
it->nStatus &= ~BLOCK_HAVE_DATA;
|
||||
}
|
||||
|
||||
const auto prune_height{GetPruneHeight(blockman, chain)};
|
||||
BOOST_REQUIRE(prune_height.has_value());
|
||||
BOOST_CHECK_EQUAL(*prune_height, height);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(get_prune_height, TestChain100Setup)
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
auto& chain = m_node.chainman->ActiveChain();
|
||||
auto& blockman = m_node.chainman->m_blockman;
|
||||
|
||||
// Fresh chain of 100 blocks without any pruned blocks, so std::nullopt should be returned
|
||||
BOOST_CHECK(!GetPruneHeight(blockman, chain).has_value());
|
||||
|
||||
// Start pruning
|
||||
CheckGetPruneHeight(blockman, chain, 1);
|
||||
CheckGetPruneHeight(blockman, chain, 99);
|
||||
CheckGetPruneHeight(blockman, chain, 100);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#include <chain.h>
|
||||
#include <chainparams.h>
|
||||
#include <clientversion.h>
|
||||
#include <node/blockstorage.h>
|
||||
@@ -113,7 +114,7 @@ BOOST_FIXTURE_TEST_CASE(blockmanager_block_data_availability, TestChain100Setup)
|
||||
};
|
||||
|
||||
// 1) Return genesis block when all blocks are available
|
||||
BOOST_CHECK_EQUAL(blockman.GetFirstStoredBlock(tip), chainman->ActiveChain()[0]);
|
||||
BOOST_CHECK_EQUAL(blockman.GetFirstBlock(tip, BLOCK_HAVE_DATA), chainman->ActiveChain()[0]);
|
||||
BOOST_CHECK(blockman.CheckBlockDataAvailability(tip, *chainman->ActiveChain()[0]));
|
||||
|
||||
// 2) Check lower_block when all blocks are available
|
||||
@@ -127,7 +128,7 @@ BOOST_FIXTURE_TEST_CASE(blockmanager_block_data_availability, TestChain100Setup)
|
||||
func_prune_blocks(last_pruned_block);
|
||||
|
||||
// 3) The last block not pruned is in-between upper-block and the genesis block
|
||||
BOOST_CHECK_EQUAL(blockman.GetFirstStoredBlock(tip), first_available_block);
|
||||
BOOST_CHECK_EQUAL(blockman.GetFirstBlock(tip, BLOCK_HAVE_DATA), first_available_block);
|
||||
BOOST_CHECK(blockman.CheckBlockDataAvailability(tip, *first_available_block));
|
||||
BOOST_CHECK(!blockman.CheckBlockDataAvailability(tip, *last_pruned_block));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user