@@ -427,19 +427,63 @@ BOOST_AUTO_TEST_CASE(ComputeTimeSmart)
427427 BOOST_CHECK_EQUAL (AddTx (*m_node.chainman , m_wallet, 5 , 50 , 600 ), 300 );
428428}
429429
430- BOOST_AUTO_TEST_CASE (LoadReceiveRequests)
430+ static const DatabaseFormat DATABASE_FORMATS[] = {
431+ #ifdef USE_SQLITE
432+ DatabaseFormat::SQLITE,
433+ #endif
434+ #ifdef USE_BDB
435+ DatabaseFormat::BERKELEY,
436+ #endif
437+ };
438+
439+ void TestLoadWallet (const std::string& name, DatabaseFormat format, std::function<void (std::shared_ptr<CWallet>)> f)
431440{
432- CTxDestination dest = PKHash ();
433- LOCK (m_wallet.cs_wallet );
434- WalletBatch batch{m_wallet.GetDatabase ()};
435- m_wallet.SetAddressUsed (batch, dest, true );
436- m_wallet.SetAddressReceiveRequest (batch, dest, " 0" , " val_rr0" );
437- m_wallet.SetAddressReceiveRequest (batch, dest, " 1" , " val_rr1" );
438-
439- auto values = m_wallet.GetAddressReceiveRequests ();
440- BOOST_CHECK_EQUAL (values.size (), 2U );
441- BOOST_CHECK_EQUAL (values[0 ], " val_rr0" );
442- BOOST_CHECK_EQUAL (values[1 ], " val_rr1" );
441+ node::NodeContext node;
442+ auto chain = interfaces::MakeChain (node);
443+ DatabaseOptions options;
444+ options.require_format = format;
445+ DatabaseStatus status;
446+ bilingual_str error;
447+ std::vector<bilingual_str> warnings;
448+ auto database = MakeWalletDatabase (name, options, status, error);
449+ auto wallet = std::make_shared<CWallet>(chain.get (), " " , std::move (database));
450+ wallet->LoadWallet ();
451+ WITH_LOCK (wallet->cs_wallet , f (wallet));
452+ }
453+
454+ BOOST_FIXTURE_TEST_CASE (LoadReceiveRequests, TestingSetup)
455+ {
456+ for (DatabaseFormat format : DATABASE_FORMATS) {
457+ const std::string name = strprintf (" receive-requests-%i" , format);
458+ TestLoadWallet (name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED (wallet->cs_wallet ) {
459+ BOOST_CHECK (!wallet->m_address_book [PKHash ()].IsUsed ());
460+ WalletBatch batch{wallet->GetDatabase ()};
461+ BOOST_CHECK (batch.WriteUsed (PKHash (), true ));
462+ BOOST_CHECK (batch.WriteUsed (ScriptHash (), true ));
463+ BOOST_CHECK (wallet->SetAddressReceiveRequest (batch, PKHash (), " 0" , " val_rr00" ));
464+ BOOST_CHECK (wallet->SetAddressReceiveRequest (batch, PKHash (), " 0" , " " ));
465+ BOOST_CHECK (wallet->SetAddressReceiveRequest (batch, PKHash (), " 1" , " val_rr10" ));
466+ BOOST_CHECK (wallet->SetAddressReceiveRequest (batch, PKHash (), " 1" , " val_rr11" ));
467+ BOOST_CHECK (wallet->SetAddressReceiveRequest (batch, ScriptHash (), " 2" , " val_rr20" ));
468+ });
469+ TestLoadWallet (name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED (wallet->cs_wallet ) {
470+ BOOST_CHECK (wallet->m_address_book [PKHash ()].IsUsed ());
471+ BOOST_CHECK (wallet->m_address_book [ScriptHash ()].IsUsed ());
472+ auto requests = wallet->GetAddressReceiveRequests ();
473+ auto erequests = {" val_rr11" , " val_rr20" };
474+ BOOST_CHECK_EQUAL_COLLECTIONS (requests.begin (), requests.end (), std::begin (erequests), std::end (erequests));
475+ WalletBatch batch{wallet->GetDatabase ()};
476+ BOOST_CHECK (batch.WriteUsed (PKHash (), false ));
477+ BOOST_CHECK (batch.EraseDestData (ScriptHash ()));
478+ });
479+ TestLoadWallet (name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED (wallet->cs_wallet ) {
480+ BOOST_CHECK (!wallet->m_address_book [PKHash ()].IsUsed ());
481+ BOOST_CHECK (!wallet->m_address_book [ScriptHash ()].IsUsed ());
482+ auto requests = wallet->GetAddressReceiveRequests ();
483+ auto erequests = {" val_rr11" };
484+ BOOST_CHECK_EQUAL_COLLECTIONS (requests.begin (), requests.end (), std::begin (erequests), std::end (erequests));
485+ });
486+ }
443487}
444488
445489// Test some watch-only LegacyScriptPubKeyMan methods by the procedure of loading (LoadWatchOnly),
@@ -922,6 +966,7 @@ class FailBatch : public DatabaseBatch
922966 bool WriteKey (DataStream&& key, DataStream&& value, bool overwrite = true ) override { return m_pass; }
923967 bool EraseKey (DataStream&& key) override { return m_pass; }
924968 bool HasKey (DataStream&& key) override { return m_pass; }
969+ bool ErasePrefix (Span<std::byte> prefix) override { return m_pass; }
925970
926971public:
927972 explicit FailBatch (bool pass) : m_pass(pass) {}
0 commit comments