testnet4_miner_tests.cpp raw
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 <chain.h>
6 #include <interfaces/mining.h>
7 #include <node/mining_types.h>
8 #include <primitives/block.h>
9 #include <sync.h>
10 #include <test/util/common.h>
11 #include <test/util/setup_common.h>
12 #include <test/util/time.h>
13 #include <util/time.h>
14 #include <validation.h>
15
16 #include <boost/test/unit_test.hpp>
17
18 #include <memory>
19
20 using interfaces::BlockTemplate;
21 using interfaces::Mining;
22 using node::BlockWaitOptions;
23
24 namespace testnet4_miner_tests {
25
26 struct Testnet4MinerTestingSetup : public Testnet4Setup {
27 std::unique_ptr<Mining> MakeMining()
28 {
29 return interfaces::MakeMining(m_node, /*wait_loaded=*/false);
30 }
31 };
32 } // namespace testnet4_miner_tests
33
34 BOOST_FIXTURE_TEST_SUITE(testnet4_miner_tests, Testnet4MinerTestingSetup)
35
36 BOOST_AUTO_TEST_CASE(MiningInterface)
37 {
38 auto mining{MakeMining()};
39 BOOST_REQUIRE(mining);
40
41 std::unique_ptr<BlockTemplate> block_template;
42
43 // Set node time a few minutes past the testnet4 genesis block
44 const auto template_time{3min + WITH_LOCK(cs_main, return m_node.chainman->ActiveChain().Tip()->Time())};
45 FakeNodeClock clock{template_time};
46
47 block_template = mining->createNewBlock({}, /*cooldown=*/false);
48 BOOST_REQUIRE(block_template);
49
50 // The template should use the mocked system time
51 BOOST_REQUIRE_EQUAL(block_template->getBlockHeader().Time(), template_time);
52
53 const BlockWaitOptions wait_options{.timeout = MillisecondsDouble{0}, .fee_threshold = 1};
54
55 // waitNext() should return nullptr because there is no better template
56 auto should_be_nullptr = block_template->waitNext(wait_options);
57 BOOST_REQUIRE(should_be_nullptr == nullptr);
58
59 // This remains the case when exactly 20 minutes have gone by
60 clock += 17min;
61 should_be_nullptr = block_template->waitNext(wait_options);
62 BOOST_REQUIRE(should_be_nullptr == nullptr);
63
64 // One second later the difficulty drops and it returns a new template
65 // Note that we can't test the actual difficulty change, because the
66 // difficulty is already at 1.
67 clock += 1s;
68 block_template = block_template->waitNext(wait_options);
69 BOOST_REQUIRE(block_template);
70 }
71
72 BOOST_AUTO_TEST_SUITE_END()
73