1 // Copyright (c) 2012-2018 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 <merkleblock.h>
6 #include <uint256.h>
7 #include <test/test_bitcoin.h>
8
9 #include <boost/test/unit_test.hpp>
10
11
BOOST_FIXTURE_TEST_SUITE(merkleblock_tests,BasicTestingSetup)12 BOOST_FIXTURE_TEST_SUITE(merkleblock_tests, BasicTestingSetup)
13
14 /**
15 * Create a CMerkleBlock using a list of txids which will be found in the
16 * given block.
17 */
18 BOOST_AUTO_TEST_CASE(merkleblock_construct_from_txids_found)
19 {
20 CBlock block = getBlock13b8a();
21
22 std::set<uint256> txids;
23
24 // Last txn in block.
25 uint256 txhash1 = uint256S("0x74d681e0e03bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20");
26
27 // Second txn in block.
28 uint256 txhash2 = uint256S("0xf9fc751cb7dc372406a9f8d738d5e6f8f63bab71986a39cf36ee70ee17036d07");
29
30 txids.insert(txhash1);
31 txids.insert(txhash2);
32
33 CMerkleBlock merkleBlock(block, txids);
34
35 BOOST_CHECK_EQUAL(merkleBlock.header.GetHash().GetHex(), block.GetHash().GetHex());
36
37 // vMatchedTxn is only used when bloom filter is specified.
38 BOOST_CHECK_EQUAL(merkleBlock.vMatchedTxn.size(), 0U);
39
40 std::vector<uint256> vMatched;
41 std::vector<unsigned int> vIndex;
42
43 BOOST_CHECK_EQUAL(merkleBlock.txn.ExtractMatches(vMatched, vIndex).GetHex(), block.hashMerkleRoot.GetHex());
44 BOOST_CHECK_EQUAL(vMatched.size(), 2U);
45
46 // Ordered by occurrence in depth-first tree traversal.
47 BOOST_CHECK_EQUAL(vMatched[0].ToString(), txhash2.ToString());
48 BOOST_CHECK_EQUAL(vIndex[0], 1U);
49
50 BOOST_CHECK_EQUAL(vMatched[1].ToString(), txhash1.ToString());
51 BOOST_CHECK_EQUAL(vIndex[1], 8U);
52 }
53
54
55 /**
56 * Create a CMerkleBlock using a list of txids which will not be found in the
57 * given block.
58 */
BOOST_AUTO_TEST_CASE(merkleblock_construct_from_txids_not_found)59 BOOST_AUTO_TEST_CASE(merkleblock_construct_from_txids_not_found)
60 {
61 CBlock block = getBlock13b8a();
62
63 std::set<uint256> txids2;
64 txids2.insert(uint256S("0xc0ffee00003bafa802c8aa084379aa98d9fcd632ddc2ed9782b586ec87451f20"));
65 CMerkleBlock merkleBlock(block, txids2);
66
67 BOOST_CHECK_EQUAL(merkleBlock.header.GetHash().GetHex(), block.GetHash().GetHex());
68 BOOST_CHECK_EQUAL(merkleBlock.vMatchedTxn.size(), 0U);
69
70 std::vector<uint256> vMatched;
71 std::vector<unsigned int> vIndex;
72
73 BOOST_CHECK_EQUAL(merkleBlock.txn.ExtractMatches(vMatched, vIndex).GetHex(), block.hashMerkleRoot.GetHex());
74 BOOST_CHECK_EQUAL(vMatched.size(), 0U);
75 BOOST_CHECK_EQUAL(vIndex.size(), 0U);
76 }
77
78 BOOST_AUTO_TEST_SUITE_END()
79