Branch data Line data Source code
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 : :
15 : : using interfaces::BlockTemplate;
16 : : using interfaces::Mining;
17 : : using node::BlockAssembler;
18 : : using node::BlockWaitOptions;
19 : :
20 : : namespace testnet4_miner_tests {
21 : :
22 : 3 : struct Testnet4MinerTestingSetup : public Testnet4Setup {
23 : 1 : std::unique_ptr<Mining> MakeMining()
24 : : {
25 : 1 : return interfaces::MakeMining(m_node);
26 : : }
27 : : };
28 : : } // namespace testnet4_miner_tests
29 : :
30 : : BOOST_FIXTURE_TEST_SUITE(testnet4_miner_tests, Testnet4MinerTestingSetup)
31 : :
32 [ + - + - : 7 : BOOST_AUTO_TEST_CASE(MiningInterface)
+ - + - -
+ + - + -
+ - + - +
- + - - +
+ - + - +
- + - + -
+ - - + +
- + - + -
+ - + - +
- + - - +
+ - + - +
- + - + -
+ - - + +
- ]
33 : : {
34 : 1 : auto mining{MakeMining()};
35 [ + - + - : 2 : BOOST_REQUIRE(mining);
+ - ]
36 : :
37 [ + - ]: 1 : BlockAssembler::Options options;
38 : 1 : options.include_dummy_extranonce = true;
39 : 1 : std::unique_ptr<BlockTemplate> block_template;
40 : :
41 : : // Set node time a few minutes past the testnet4 genesis block
42 [ + - - + : 4 : const int64_t genesis_time{WITH_LOCK(cs_main, return m_node.chainman->ActiveChain().Tip()->GetBlockTime())};
+ - ]
43 [ + - ]: 1 : SetMockTime(genesis_time + 3 * 60);
44 : :
45 [ + - ]: 2 : block_template = mining->createNewBlock(options);
46 [ + - + - : 2 : BOOST_REQUIRE(block_template);
+ - ]
47 : :
48 : : // The template should use the mocked system time
49 [ + - + - : 1 : BOOST_REQUIRE_EQUAL(block_template->getBlockHeader().nTime, genesis_time + 3 * 60);
+ - ]
50 : :
51 : 1 : const BlockWaitOptions wait_options{.timeout = MillisecondsDouble{0}, .fee_threshold = 1};
52 : :
53 : : // waitNext() should return nullptr because there is no better template
54 [ + - ]: 1 : auto should_be_nullptr = block_template->waitNext(wait_options);
55 [ + - + - : 2 : BOOST_REQUIRE(should_be_nullptr == nullptr);
+ - ]
56 : :
57 : : // This remains the case when exactly 20 minutes have gone by
58 : 1 : {
59 [ + - ]: 1 : LOCK(cs_main);
60 [ + - - + : 2 : SetMockTime(m_node.chainman->ActiveChain().Tip()->GetBlockTime() + 20 * 60);
+ - ]
61 : 0 : }
62 [ + - ]: 2 : should_be_nullptr = block_template->waitNext(wait_options);
63 [ + - + - : 2 : 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 : 1 : {
69 [ + - ]: 1 : LOCK(cs_main);
70 [ + - - + : 2 : SetMockTime(m_node.chainman->ActiveChain().Tip()->GetBlockTime() + 20 * 60 + 1);
+ - ]
71 : 0 : }
72 [ + - ]: 2 : block_template = block_template->waitNext(wait_options);
73 [ + - + - ]: 2 : BOOST_REQUIRE(block_template);
74 : 1 : }
75 : :
76 : : BOOST_AUTO_TEST_SUITE_END()
|