LCOV - code coverage report
Current view: top level - src/wallet/test - walletload_tests.cpp (source / functions) Coverage Total Hit
Test: total_coverage.info Lines: 68.1 % 47 32
Test Date: 2025-06-01 06:26:32 Functions: 31.6 % 19 6
Branches: 48.7 % 150 73

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2022 The Bitcoin Core developers
       2                 :             : // Distributed under the MIT software license, see the accompanying
       3                 :             : // file COPYING or https://www.opensource.org/licenses/mit-license.php.
       4                 :             : 
       5                 :             : #include <wallet/test/util.h>
       6                 :             : #include <wallet/wallet.h>
       7                 :             : #include <test/util/logging.h>
       8                 :             : #include <test/util/setup_common.h>
       9                 :             : 
      10                 :             : #include <boost/test/unit_test.hpp>
      11                 :             : 
      12                 :             : namespace wallet {
      13                 :             : 
      14                 :             : BOOST_AUTO_TEST_SUITE(walletload_tests)
      15                 :             : 
      16                 :             : class DummyDescriptor final : public Descriptor {
      17                 :             : private:
      18                 :             :     std::string desc;
      19                 :             : public:
      20         [ +  - ]:           2 :     explicit DummyDescriptor(const std::string& descriptor) : desc(descriptor) {};
      21                 :           2 :     ~DummyDescriptor() = default;
      22                 :             : 
      23                 :           4 :     std::string ToString(bool compat_format) const override { return desc; }
      24                 :           0 :     std::optional<OutputType> GetOutputType() const override { return OutputType::UNKNOWN; }
      25                 :             : 
      26                 :           0 :     bool IsRange() const override { return false; }
      27                 :           0 :     bool IsSolvable() const override { return false; }
      28                 :           0 :     bool IsSingleType() const override { return true; }
      29                 :           0 :     bool ToPrivateString(const SigningProvider& provider, std::string& out) const override { return false; }
      30                 :           0 :     bool ToNormalizedString(const SigningProvider& provider, std::string& out, const DescriptorCache* cache = nullptr) const override { return false; }
      31                 :           0 :     bool Expand(int pos, const SigningProvider& provider, std::vector<CScript>& output_scripts, FlatSigningProvider& out, DescriptorCache* write_cache = nullptr) const override { return false; };
      32                 :           0 :     bool ExpandFromCache(int pos, const DescriptorCache& read_cache, std::vector<CScript>& output_scripts, FlatSigningProvider& out) const override { return false; }
      33                 :           0 :     void ExpandPrivate(int pos, const SigningProvider& provider, FlatSigningProvider& out) const override {}
      34                 :           0 :     std::optional<int64_t> ScriptSize() const override { return {}; }
      35                 :           0 :     std::optional<int64_t> MaxSatisfactionWeight(bool) const override { return {}; }
      36                 :           0 :     std::optional<int64_t> MaxSatisfactionElems() const override { return {}; }
      37                 :           0 :     void GetPubKeys(std::set<CPubKey>& pubkeys, std::set<CExtPubKey>& ext_pubs) const override {}
      38                 :             : };
      39                 :             : 
      40   [ +  -  +  -  :          10 : BOOST_FIXTURE_TEST_CASE(wallet_load_descriptors, TestingSetup)
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
             +  -  +  - ]
      41                 :             : {
      42         [ +  - ]:           1 :     std::unique_ptr<WalletDatabase> database = CreateMockableWalletDatabase();
      43                 :           1 :     {
      44                 :             :         // Write unknown active descriptor
      45         [ +  - ]:           1 :         WalletBatch batch(*database);
      46         [ +  - ]:           1 :         std::string unknown_desc = "trx(tpubD6NzVbkrYhZ4Y4S7m6Y5s9GD8FqEMBy56AGphZXuagajudVZEnYyBahZMgHNCTJc2at82YX6s8JiL1Lohu5A3v1Ur76qguNH4QVQ7qYrBQx/86'/1'/0'/0/*)#8pn8tzdt";
      47   [ +  -  +  -  :           2 :         WalletDescriptor wallet_descriptor(std::make_shared<DummyDescriptor>(unknown_desc), 0, 0, 0, 0);
                   -  + ]
      48   [ +  -  +  -  :           2 :         BOOST_CHECK(batch.WriteDescriptor(uint256(), wallet_descriptor));
             +  -  +  - ]
      49   [ +  -  +  -  :           2 :         BOOST_CHECK(batch.WriteActiveScriptPubKeyMan(static_cast<uint8_t>(OutputType::UNKNOWN), uint256(), false));
                   +  - ]
      50                 :           1 :     }
      51                 :             : 
      52                 :           1 :     {
      53                 :             :         // Now try to load the wallet and verify the error.
      54   [ +  -  +  -  :           2 :         const std::shared_ptr<CWallet> wallet(new CWallet(m_node.chain.get(), "", std::move(database)));
          +  -  +  -  -  
                      - ]
      55   [ +  -  +  -  :           1 :         BOOST_CHECK_EQUAL(wallet->LoadWallet(), DBErrors::UNKNOWN_DESCRIPTOR);
             +  -  +  - ]
      56                 :           0 :     }
      57                 :             : 
      58                 :             :     // Test 2
      59                 :             :     // Now write a valid descriptor with an invalid ID.
      60                 :             :     // As the software produces another ID for the descriptor, the loading process must be aborted.
      61         [ +  - ]:           2 :     database = CreateMockableWalletDatabase();
      62                 :             : 
      63                 :             :     // Verify the error
      64                 :           1 :     bool found = false;
      65         [ +  - ]:           3 :     DebugLogHelper logHelper("The descriptor ID calculated by the wallet differs from the one in DB", [&](const std::string* s) {
      66                 :           2 :         found = true;
      67                 :           2 :         return false;
      68   [ +  -  +  - ]:           2 :     });
      69                 :             : 
      70                 :           1 :     {
      71                 :             :         // Write valid descriptor with invalid ID
      72         [ +  - ]:           1 :         WalletBatch batch(*database);
      73         [ +  - ]:           1 :         std::string desc = "wpkh([d34db33f/84h/0h/0h]xpub6DJ2dNUysrn5Vt36jH2KLBT2i1auw1tTSSomg8PhqNiUtx8QX2SvC9nrHu81fT41fvDUnhMjEzQgXnQjKEu3oaqMSzhSrHMxyyoEAmUHQbY/0/*)#cjjspncu";
      74   [ +  -  +  -  :           2 :         WalletDescriptor wallet_descriptor(std::make_shared<DummyDescriptor>(desc), 0, 0, 0, 0);
                   -  + ]
      75   [ +  -  +  -  :           2 :         BOOST_CHECK(batch.WriteDescriptor(uint256::ONE, wallet_descriptor));
                   +  - ]
      76                 :           1 :     }
      77                 :             : 
      78                 :           1 :     {
      79                 :             :         // Now try to load the wallet and verify the error.
      80   [ +  -  +  -  :           2 :         const std::shared_ptr<CWallet> wallet(new CWallet(m_node.chain.get(), "", std::move(database)));
          +  -  +  -  -  
                      - ]
      81   [ +  -  +  -  :           1 :         BOOST_CHECK_EQUAL(wallet->LoadWallet(), DBErrors::CORRUPT);
                   +  - ]
      82   [ +  -  +  -  :           2 :         BOOST_CHECK(found); // The error must be logged
                   +  - ]
      83                 :           0 :     }
      84                 :           1 : }
      85                 :             : 
      86                 :             : BOOST_AUTO_TEST_SUITE_END()
      87                 :             : } // namespace wallet
        

Generated by: LCOV version 2.0-1