Branch data Line data Source code
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 [ + - + - : 7 : 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 : 1 : DataStream ssValue{};
28 : 1 : uint256 dummy;
29 [ + - - + : 2 : BOOST_CHECK_THROW(ssValue >> dummy, std::ios_base::failure);
- - - - -
+ + - +
- ]
30 : 1 : }
31 : :
32 [ + - + - : 7 : BOOST_AUTO_TEST_CASE(walletdb_read_write_deadlock)
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- ]
33 : : {
34 : : // Exercises a db read write operation that shouldn't deadlock.
35 [ + + ]: 2 : for (const DatabaseFormat& db_format : DATABASE_FORMATS) {
36 : : // Context setup
37 [ + - ]: 1 : DatabaseOptions options;
38 [ + - ]: 1 : options.require_format = db_format;
39 : 1 : DatabaseStatus status;
40 [ + - ]: 1 : bilingual_str error_string;
41 [ + - + - : 4 : std::unique_ptr<WalletDatabase> db = MakeDatabase(m_path_root / strprintf("wallet_%d_.dat", db_format).c_str(), options, status, error_string);
+ - + - ]
42 [ + - + - ]: 1 : BOOST_CHECK_EQUAL(status, DatabaseStatus::SUCCESS);
43 : :
44 [ + - + - : 2 : std::shared_ptr<CWallet> wallet(new CWallet(m_node.chain.get(), "", std::move(db)));
+ - + - -
- ]
45 [ + - ]: 1 : wallet->m_keypool_size = 4;
46 : :
47 : : // Create legacy spkm
48 [ + - ]: 1 : LOCK(wallet->cs_wallet);
49 [ + - ]: 1 : auto legacy_spkm = wallet->GetOrCreateLegacyScriptPubKeyMan();
50 [ + - + - : 2 : BOOST_CHECK(legacy_spkm->SetupGeneration(true));
+ - + - ]
51 [ + - ]: 1 : wallet->Flush();
52 : :
53 : : // Now delete all records, which performs a read write operation.
54 [ + - + - : 2 : BOOST_CHECK(wallet->GetLegacyScriptPubKeyMan()->DeleteRecords());
+ - + - +
- ]
55 [ + - ]: 3 : }
56 : 1 : }
57 : :
58 : : BOOST_AUTO_TEST_SUITE_END()
59 : : } // namespace wallet
|