Bitcoin Core  31.0.0
P2P Digital Currency
testnet4_miner_tests.cpp
Go to the documentation of this file.
1 // Copyright (c) 2025-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <common/system.h>
6 #include <interfaces/mining.h>
7 #include <node/miner.h>
8 #include <util/time.h>
9 #include <validation.h>
10 
11 #include <test/util/setup_common.h>
12 
13 #include <boost/test/unit_test.hpp>
14 
16 using interfaces::Mining;
19 
21 
23  std::unique_ptr<Mining> MakeMining()
24  {
25  return interfaces::MakeMining(m_node, /*wait_loaded=*/false);
26  }
27 };
28 } // namespace testnet4_miner_tests
29 
30 BOOST_FIXTURE_TEST_SUITE(testnet4_miner_tests, Testnet4MinerTestingSetup)
31 
32 BOOST_AUTO_TEST_CASE(MiningInterface)
33 {
34  auto mining{MakeMining()};
35  BOOST_REQUIRE(mining);
36 
37  BlockAssembler::Options options;
38  options.include_dummy_extranonce = true;
39  std::unique_ptr<BlockTemplate> block_template;
40 
41  // Set node time a few minutes past the testnet4 genesis block
42  const int64_t genesis_time{WITH_LOCK(cs_main, return m_node.chainman->ActiveChain().Tip()->GetBlockTime())};
43  SetMockTime(genesis_time + 3 * 60);
44 
45  block_template = mining->createNewBlock(options, /*cooldown=*/false);
46  BOOST_REQUIRE(block_template);
47 
48  // The template should use the mocked system time
49  BOOST_REQUIRE_EQUAL(block_template->getBlockHeader().nTime, genesis_time + 3 * 60);
50 
51  const BlockWaitOptions wait_options{.timeout = MillisecondsDouble{0}, .fee_threshold = 1};
52 
53  // waitNext() should return nullptr because there is no better template
54  auto should_be_nullptr = block_template->waitNext(wait_options);
55  BOOST_REQUIRE(should_be_nullptr == nullptr);
56 
57  // This remains the case when exactly 20 minutes have gone by
58  {
59  LOCK(cs_main);
60  SetMockTime(m_node.chainman->ActiveChain().Tip()->GetBlockTime() + 20 * 60);
61  }
62  should_be_nullptr = block_template->waitNext(wait_options);
63  BOOST_REQUIRE(should_be_nullptr == nullptr);
64 
65  // One second later the difficulty drops and it returns a new template
66  // Note that we can't test the actual difficulty change, because the
67  // difficulty is already at 1.
68  {
69  LOCK(cs_main);
70  SetMockTime(m_node.chainman->ActiveChain().Tip()->GetBlockTime() + 20 * 60 + 1);
71  }
72  block_template = block_template->waitNext(wait_options);
73  BOOST_REQUIRE(block_template);
74 }
75 
Block template interface.
Definition: mining.h:31
Generate a new block, without valid proof-of-work.
Definition: miner.h:60
node::NodeContext m_node
Definition: bitcoin-gui.cpp:43
BOOST_AUTO_TEST_CASE(MiningInterface)
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
Definition: mining.h:96
std::unique_ptr< Mining > MakeMining(node::NodeContext &node, bool wait_loaded=true)
Return implementation of Mining interface.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
#define LOCK(cs)
Definition: sync.h:258
BOOST_AUTO_TEST_SUITE_END()
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:289
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:44
Identical to TestingSetup, but chain set to testnet4.
Definition: setup_common.h:134
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
Definition: cs_main.cpp:8
node::NodeContext m_node
Definition: setup_common.h:66
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
Definition: time.h:94
std::unique_ptr< ChainstateManager > chainman
Definition: context.h:72
MillisecondsDouble timeout
How long to wait before returning nullptr instead of a new template.
Definition: types.h:86