Branch data 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 : : static bool DoubleEquals(double a, double b, double epsilon) # 18 : 10 : { # 19 : 10 : return std::abs(a - b) < epsilon; # 20 : 10 : } # 21 : : # 22 : : static CBlockIndex* CreateBlockIndexWithNbits(uint32_t nbits) # 23 : 10 : { # 24 : 10 : CBlockIndex* block_index = new CBlockIndex(); # 25 : 10 : block_index->nHeight = 46367; # 26 : 10 : block_index->nTime = 1269211443; # 27 : 10 : block_index->nBits = nbits; # 28 : 10 : return block_index; # 29 : 10 : } # 30 : : # 31 : 10 : static void RejectDifficultyMismatch(double difficulty, double expected_difficulty) { # 32 : 10 : BOOST_CHECK_MESSAGE( # 33 : 10 : DoubleEquals(difficulty, expected_difficulty, 0.00001), # 34 : 10 : "Difficulty was " + ToString(difficulty) # 35 : 10 : + " but was expected to be " + ToString(expected_difficulty)); # 36 : 10 : } # 37 : : # 38 : : /* Given a BlockIndex with the provided nbits, # 39 : : * verify that the expected difficulty results. # 40 : : */ # 41 : : static void TestDifficulty(uint32_t nbits, double expected_difficulty) # 42 : 10 : { # 43 : 10 : CBlockIndex* block_index = CreateBlockIndexWithNbits(nbits); # 44 : 10 : double difficulty = GetDifficulty(block_index); # 45 : 10 : delete block_index; # 46 : : # 47 : 10 : RejectDifficultyMismatch(difficulty, expected_difficulty); # 48 : 10 : } # 49 : : # 50 : : BOOST_FIXTURE_TEST_SUITE(blockchain_tests, BasicTestingSetup) # 51 : : # 52 : : BOOST_AUTO_TEST_CASE(get_difficulty_for_very_low_target) # 53 : 2 : { # 54 : 2 : TestDifficulty(0x1f111111, 0.000001); # 55 : 2 : } # 56 : : # 57 : : BOOST_AUTO_TEST_CASE(get_difficulty_for_low_target) # 58 : 2 : { # 59 : 2 : TestDifficulty(0x1ef88f6f, 0.000016); # 60 : 2 : } # 61 : : # 62 : : BOOST_AUTO_TEST_CASE(get_difficulty_for_mid_target) # 63 : 2 : { # 64 : 2 : TestDifficulty(0x1df88f6f, 0.004023); # 65 : 2 : } # 66 : : # 67 : : BOOST_AUTO_TEST_CASE(get_difficulty_for_high_target) # 68 : 2 : { # 69 : 2 : TestDifficulty(0x1cf88f6f, 1.029916); # 70 : 2 : } # 71 : : # 72 : : BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target) # 73 : 2 : { # 74 : 2 : TestDifficulty(0x12345678, 5913134931067755359633408.0); # 75 : 2 : } # 76 : : # 77 : : BOOST_AUTO_TEST_SUITE_END()