/ src / test / txindex_tests.cpp
txindex_tests.cpp
 1  // Copyright (c) 2017-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 <addresstype.h>
 6  #include <chainparams.h>
 7  #include <index/txindex.h>
 8  #include <interfaces/chain.h>
 9  #include <test/util/setup_common.h>
10  #include <validation.h>
11  
12  #include <boost/test/unit_test.hpp>
13  
14  BOOST_AUTO_TEST_SUITE(txindex_tests)
15  
16  BOOST_FIXTURE_TEST_CASE(txindex_initial_sync, TestChain100Setup)
17  {
18      TxIndex txindex(interfaces::MakeChain(m_node), 1 << 20, true);
19      BOOST_REQUIRE(txindex.Init());
20  
21      CTransactionRef tx_disk;
22      uint256 block_hash;
23  
24      // Transaction should not be found in the index before it is started.
25      for (const auto& txn : m_coinbase_txns) {
26          BOOST_CHECK(!txindex.FindTx(txn->GetHash(), block_hash, tx_disk));
27      }
28  
29      // BlockUntilSyncedToCurrentChain should return false before txindex is started.
30      BOOST_CHECK(!txindex.BlockUntilSyncedToCurrentChain());
31  
32      txindex.Sync();
33  
34      // Check that txindex excludes genesis block transactions.
35      const CBlock& genesis_block = Params().GenesisBlock();
36      for (const auto& txn : genesis_block.vtx) {
37          BOOST_CHECK(!txindex.FindTx(txn->GetHash(), block_hash, tx_disk));
38      }
39  
40      // Check that txindex has all txs that were in the chain before it started.
41      for (const auto& txn : m_coinbase_txns) {
42          if (!txindex.FindTx(txn->GetHash(), block_hash, tx_disk)) {
43              BOOST_ERROR("FindTx failed");
44          } else if (tx_disk->GetHash() != txn->GetHash()) {
45              BOOST_ERROR("Read incorrect tx");
46          }
47      }
48  
49      // Check that new transactions in new blocks make it into the index.
50      for (int i = 0; i < 10; i++) {
51          CScript coinbase_script_pub_key = GetScriptForDestination(PKHash(coinbaseKey.GetPubKey()));
52          std::vector<CMutableTransaction> no_txns;
53          const CBlock& block = CreateAndProcessBlock(no_txns, coinbase_script_pub_key);
54          const CTransaction& txn = *block.vtx[0];
55  
56          BOOST_CHECK(txindex.BlockUntilSyncedToCurrentChain());
57          if (!txindex.FindTx(txn.GetHash(), block_hash, tx_disk)) {
58              BOOST_ERROR("FindTx failed");
59          } else if (tx_disk->GetHash() != txn.GetHash()) {
60              BOOST_ERROR("Read incorrect tx");
61          }
62      }
63  
64      // shutdown sequence (c.f. Shutdown() in init.cpp)
65      txindex.Stop();
66  }
67  
68  BOOST_AUTO_TEST_SUITE_END()