walletdb_tests.cpp raw

   1  // Copyright (c) 2012-2021 The Limenka 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 <test/util/setup_common.h>
   6  #include <clientversion.h>
   7  #include <streams.h>
   8  #include <uint256.h>
   9  #include <wallet/test/util.h>
  10  #include <wallet/wallet.h>
  11  
  12  #include <boost/test/unit_test.hpp>
  13  
  14  namespace wallet {
  15  BOOST_FIXTURE_TEST_SUITE(walletdb_tests, BasicTestingSetup)
  16  
  17  BOOST_AUTO_TEST_CASE(walletdb_readkeyvalue)
  18  {
  19      /**
  20       * When ReadKeyValue() reads from either a "key" or "wkey" it first reads the DataStream into a
  21       * CPrivKey or CWalletKey respectively and then reads a hash of the pubkey and privkey into a uint256.
  22       * Wallets from 0.8 or before do not store the pubkey/privkey hash, trying to read the hash from old
  23       * wallets throws an exception, for backwards compatibility this read is wrapped in a try block to
  24       * silently fail. The test here makes sure the type of exception thrown from DataStream::read()
  25       * matches the type we expect, otherwise we need to update the "key"/"wkey" exception type caught.
  26       */
  27      DataStream ssValue{};
  28      uint256 dummy;
  29      BOOST_CHECK_THROW(ssValue >> dummy, std::ios_base::failure);
  30  }
  31  
  32  BOOST_AUTO_TEST_CASE(walletdb_read_write_deadlock)
  33  {
  34      // Exercises a db read write operation that shouldn't deadlock.
  35      for (const DatabaseFormat& db_format : DATABASE_FORMATS) {
  36          // Context setup
  37          DatabaseOptions options;
  38          options.require_format = db_format;
  39          DatabaseStatus status;
  40          bilingual_str error_string;
  41          std::unique_ptr<WalletDatabase> db = MakeDatabase(m_path_root / strprintf("wallet_%d_.dat", db_format).c_str(), options, status, error_string);
  42          BOOST_CHECK_EQUAL(status, DatabaseStatus::SUCCESS);
  43  
  44          std::shared_ptr<CWallet> wallet(new CWallet(m_node.chain.get(), "", std::move(db)));
  45          wallet->m_keypool_size = 4;
  46  
  47          // Create legacy spkm
  48          LOCK(wallet->cs_wallet);
  49          auto legacy_spkm = wallet->GetOrCreateLegacyScriptPubKeyMan();
  50          BOOST_CHECK(legacy_spkm->SetupGeneration(true));
  51          wallet->Flush();
  52  
  53          // Now delete all records, which performs a read write operation.
  54          BOOST_CHECK(wallet->GetLegacyScriptPubKeyMan()->DeleteRecords());
  55      }
  56  }
  57  
  58  BOOST_AUTO_TEST_SUITE_END()
  59  } // namespace wallet
  60