walletdb_tests.cpp
1 // Copyright (c) 2012-2021 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 <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