Line data Source code
1 : // Copyright (c) 2017-2020 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 <boost/test/unit_test.hpp> 6 : 7 : #include <stdlib.h> 8 : 9 : #include <chain.h> 10 : #include <rpc/blockchain.h> 11 : #include <test/util/setup_common.h> 12 : #include <util/string.h> 13 : 14 : /* Equality between doubles is imprecise. Comparison should be done 15 : * with a small threshold of tolerance, rather than exact equality. 16 : */ 17 5 : static bool DoubleEquals(double a, double b, double epsilon) 18 : { 19 5 : return std::abs(a - b) < epsilon; 20 : } 21 : 22 5 : static CBlockIndex* CreateBlockIndexWithNbits(uint32_t nbits) 23 : { 24 5 : CBlockIndex* block_index = new CBlockIndex(); 25 5 : block_index->nHeight = 46367; 26 5 : block_index->nTime = 1269211443; 27 5 : block_index->nBits = nbits; 28 5 : return block_index; 29 0 : } 30 : 31 5 : static void RejectDifficultyMismatch(double difficulty, double expected_difficulty) { 32 5 : BOOST_CHECK_MESSAGE( 33 : DoubleEquals(difficulty, expected_difficulty, 0.00001), 34 : "Difficulty was " + ToString(difficulty) 35 : + " but was expected to be " + ToString(expected_difficulty)); 36 5 : } 37 : 38 : /* Given a BlockIndex with the provided nbits, 39 : * verify that the expected difficulty results. 40 : */ 41 5 : static void TestDifficulty(uint32_t nbits, double expected_difficulty) 42 : { 43 5 : CBlockIndex* block_index = CreateBlockIndexWithNbits(nbits); 44 5 : double difficulty = GetDifficulty(block_index); 45 5 : delete block_index; 46 : 47 5 : RejectDifficultyMismatch(difficulty, expected_difficulty); 48 5 : } 49 : 50 89 : BOOST_FIXTURE_TEST_SUITE(blockchain_tests, BasicTestingSetup) 51 : 52 95 : BOOST_AUTO_TEST_CASE(get_difficulty_for_very_low_target) 53 : { 54 1 : TestDifficulty(0x1f111111, 0.000001); 55 1 : } 56 : 57 95 : BOOST_AUTO_TEST_CASE(get_difficulty_for_low_target) 58 : { 59 1 : TestDifficulty(0x1ef88f6f, 0.000016); 60 1 : } 61 : 62 95 : BOOST_AUTO_TEST_CASE(get_difficulty_for_mid_target) 63 : { 64 1 : TestDifficulty(0x1df88f6f, 0.004023); 65 1 : } 66 : 67 95 : BOOST_AUTO_TEST_CASE(get_difficulty_for_high_target) 68 : { 69 1 : TestDifficulty(0x1cf88f6f, 1.029916); 70 1 : } 71 : 72 95 : BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target) 73 : { 74 1 : TestDifficulty(0x12345678, 5913134931067755359633408.0); 75 1 : } 76 : 77 89 : BOOST_AUTO_TEST_SUITE_END()