Changeset View
Changeset View
Standalone View
Standalone View
src/test/validation_tests.cpp
// Copyright (c) 2011-2016 The Bitcoin Core developers | // Copyright (c) 2011-2019 The Bitcoin Core developers | ||||
// Copyright (c) 2017 The Bitcoin developers | // Copyright (c) 2017-2019 The Bitcoin developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <validation.h> | #include <validation.h> | ||||
#include <chainparams.h> | #include <chainparams.h> | ||||
#include <clientversion.h> | #include <clientversion.h> | ||||
#include <config.h> | #include <config.h> | ||||
#include <consensus/consensus.h> | #include <consensus/consensus.h> | ||||
#include <net.h> | |||||
#include <primitives/transaction.h> | #include <primitives/transaction.h> | ||||
#include <streams.h> | #include <streams.h> | ||||
#include <util/system.h> | #include <util/system.h> | ||||
#include <validation.h> | |||||
#include <test/test_bitcoin.h> | #include <test/test_bitcoin.h> | ||||
#include <boost/signals2/signal.hpp> | |||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
#include <cstdint> | #include <cstdint> | ||||
#include <cstdio> | #include <cstdio> | ||||
#include <vector> | #include <vector> | ||||
BOOST_FIXTURE_TEST_SUITE(validation_tests, TestingSetup) | |||||
static void TestBlockSubsidyHalvings(const Consensus::Params &consensusParams) { | |||||
int maxHalvings = 64; | |||||
Amount nInitialSubsidy = 50 * COIN; | |||||
// for height == 0 | |||||
Amount nPreviousSubsidy = 2 * nInitialSubsidy; | |||||
BOOST_CHECK_EQUAL(nPreviousSubsidy, 2 * nInitialSubsidy); | |||||
for (int nHalvings = 0; nHalvings < maxHalvings; nHalvings++) { | |||||
int nHeight = nHalvings * consensusParams.nSubsidyHalvingInterval; | |||||
Amount nSubsidy = GetBlockSubsidy(nHeight, consensusParams); | |||||
BOOST_CHECK(nSubsidy <= nInitialSubsidy); | |||||
BOOST_CHECK_EQUAL(nSubsidy, nPreviousSubsidy / 2); | |||||
nPreviousSubsidy = nSubsidy; | |||||
} | |||||
BOOST_CHECK_EQUAL( | |||||
GetBlockSubsidy(maxHalvings * consensusParams.nSubsidyHalvingInterval, | |||||
consensusParams), | |||||
Amount::zero()); | |||||
} | |||||
static void TestBlockSubsidyHalvings(int nSubsidyHalvingInterval) { | |||||
Consensus::Params consensusParams; | |||||
consensusParams.nSubsidyHalvingInterval = nSubsidyHalvingInterval; | |||||
TestBlockSubsidyHalvings(consensusParams); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(block_subsidy_test) { | |||||
const auto chainParams = CreateChainParams(CBaseChainParams::MAIN); | |||||
// As in main | |||||
TestBlockSubsidyHalvings(chainParams->GetConsensus()); | |||||
// As in regtest | |||||
TestBlockSubsidyHalvings(150); | |||||
// Just another interval | |||||
TestBlockSubsidyHalvings(1000); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(subsidy_limit_test) { | |||||
const auto chainParams = CreateChainParams(CBaseChainParams::MAIN); | |||||
Amount nSum = Amount::zero(); | |||||
for (int nHeight = 0; nHeight < 14000000; nHeight += 1000) { | |||||
Amount nSubsidy = GetBlockSubsidy(nHeight, chainParams->GetConsensus()); | |||||
BOOST_CHECK(nSubsidy <= 50 * COIN); | |||||
nSum += 1000 * nSubsidy; | |||||
BOOST_CHECK(MoneyRange(nSum)); | |||||
} | |||||
BOOST_CHECK_EQUAL(nSum, int64_t(2099999997690000LL) * SATOSHI); | |||||
} | |||||
static CBlock makeLargeDummyBlock(const size_t num_tx) { | static CBlock makeLargeDummyBlock(const size_t num_tx) { | ||||
CBlock block; | CBlock block; | ||||
block.vtx.reserve(num_tx); | block.vtx.reserve(num_tx); | ||||
CTransaction tx; | CTransaction tx; | ||||
for (size_t i = 0; i < num_tx; i++) { | for (size_t i = 0; i < num_tx; i++) { | ||||
block.vtx.push_back(MakeTransactionRef(tx)); | block.vtx.push_back(MakeTransactionRef(tx)); | ||||
} | } | ||||
return block; | return block; | ||||
} | } | ||||
BOOST_FIXTURE_TEST_SUITE(validation_tests, TestingSetup) | /** | ||||
* Test that LoadExternalBlockFile works with the buffer size set below the | |||||
/** Test that LoadExternalBlockFile works with the buffer size set | * size of a large block. Currently, LoadExternalBlockFile has the buffer size | ||||
below the size of a large block. Currently, LoadExternalBlockFile has the | * for CBufferedFile set to 2 * MAX_TX_SIZE. Test with a value of | ||||
buffer size for CBufferedFile set to 2 * MAX_TX_SIZE. Test with a value | * 10 * MAX_TX_SIZE. | ||||
of 10 * MAX_TX_SIZE. */ | */ | ||||
BOOST_AUTO_TEST_CASE(validation_load_external_block_file) { | BOOST_AUTO_TEST_CASE(validation_load_external_block_file) { | ||||
fs::path tmpfile_name = | fs::path tmpfile_name = | ||||
SetDataDir("validation_load_external_block_file") / "block.dat"; | SetDataDir("validation_load_external_block_file") / "block.dat"; | ||||
FILE *fp = fopen(tmpfile_name.string().c_str(), "wb+"); | FILE *fp = fopen(tmpfile_name.string().c_str(), "wb+"); | ||||
BOOST_CHECK(fp != nullptr); | BOOST_CHECK(fp != nullptr); | ||||
Show All 33 Lines |