mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-09-12 13:42:10 +02:00
The previous name did not indicate the type was intended for testing. Renaming to FakeNodeClock makes this explicit and allows call sites to drop the ctx suffix on the variable name. Suggested in #34858 review feedback. -BEGIN VERIFY SCRIPT- s() { git grep -l "$1" -- src | xargs sed -i "s/$1/$2/g"; } s '\<NodeClockContext\>' 'FakeNodeClock' s '\<clock_ctx\>' 'clock' -END VERIFY SCRIPT-
73 lines
2.3 KiB
C++
73 lines
2.3 KiB
C++
// Copyright (c) 2025-present The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <chain.h>
|
|
#include <interfaces/mining.h>
|
|
#include <node/mining_types.h>
|
|
#include <primitives/block.h>
|
|
#include <sync.h>
|
|
#include <test/util/common.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <test/util/time.h>
|
|
#include <util/time.h>
|
|
#include <validation.h>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <memory>
|
|
|
|
using interfaces::BlockTemplate;
|
|
using interfaces::Mining;
|
|
using node::BlockWaitOptions;
|
|
|
|
namespace testnet4_miner_tests {
|
|
|
|
struct Testnet4MinerTestingSetup : public Testnet4Setup {
|
|
std::unique_ptr<Mining> MakeMining()
|
|
{
|
|
return interfaces::MakeMining(m_node, /*wait_loaded=*/false);
|
|
}
|
|
};
|
|
} // namespace testnet4_miner_tests
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(testnet4_miner_tests, Testnet4MinerTestingSetup)
|
|
|
|
BOOST_AUTO_TEST_CASE(MiningInterface)
|
|
{
|
|
auto mining{MakeMining()};
|
|
BOOST_REQUIRE(mining);
|
|
|
|
std::unique_ptr<BlockTemplate> block_template;
|
|
|
|
// Set node time a few minutes past the testnet4 genesis block
|
|
const auto template_time{3min + WITH_LOCK(cs_main, return m_node.chainman->ActiveChain().Tip()->Time())};
|
|
FakeNodeClock clock{template_time};
|
|
|
|
block_template = mining->createNewBlock({}, /*cooldown=*/false);
|
|
BOOST_REQUIRE(block_template);
|
|
|
|
// The template should use the mocked system time
|
|
BOOST_REQUIRE_EQUAL(block_template->getBlockHeader().Time(), template_time);
|
|
|
|
const BlockWaitOptions wait_options{.timeout = MillisecondsDouble{0}, .fee_threshold = 1};
|
|
|
|
// waitNext() should return nullptr because there is no better template
|
|
auto should_be_nullptr = block_template->waitNext(wait_options);
|
|
BOOST_REQUIRE(should_be_nullptr == nullptr);
|
|
|
|
// This remains the case when exactly 20 minutes have gone by
|
|
clock += 17min;
|
|
should_be_nullptr = block_template->waitNext(wait_options);
|
|
BOOST_REQUIRE(should_be_nullptr == nullptr);
|
|
|
|
// One second later the difficulty drops and it returns a new template
|
|
// Note that we can't test the actual difficulty change, because the
|
|
// difficulty is already at 1.
|
|
clock += 1s;
|
|
block_template = block_template->waitNext(wait_options);
|
|
BOOST_REQUIRE(block_template);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|