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