From e7d67c9fd9a4a94d448ad122abe98a63d2e64077 Mon Sep 17 00:00:00 2001 From: Ava Chow Date: Mon, 7 Jul 2025 14:12:58 -0700 Subject: [PATCH] test: Make duplicating MockableDatabases use cursor and batch Instead of directly copying the stored records map when duplicating a MockableDatabase, use a Cursor to read the records, and a Batch to write them into the new database. This prepares for using SQLite as the database backend for MockableDatabase. --- src/wallet/test/util.cpp | 22 +++++++++++++++++++--- src/wallet/test/util.h | 16 ++++++++-------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/wallet/test/util.cpp b/src/wallet/test/util.cpp index 9ee63f6e228..9c101d7ec02 100644 --- a/src/wallet/test/util.cpp +++ b/src/wallet/test/util.cpp @@ -105,7 +105,23 @@ void TestUnloadWallet(std::shared_ptr&& wallet) std::unique_ptr DuplicateMockDatabase(WalletDatabase& database) { - return std::make_unique(dynamic_cast(database).m_records); + std::unique_ptr batch_orig = database.MakeBatch(); + std::unique_ptr cursor_orig = batch_orig->GetNewCursor(); + + std::unique_ptr new_db = std::make_unique(); + std::unique_ptr new_db_batch = new_db->MakeBatch(); + MockableBatch* batch_new = dynamic_cast(new_db_batch.get()); + Assert(batch_new); + + while (true) { + DataStream key, value; + DatabaseCursor::Status status = cursor_orig->Next(key, value); + Assert(status != DatabaseCursor::Status::FAIL); + if (status != DatabaseCursor::Status::MORE) break; + batch_new->WriteKey(std::move(key), std::move(value)); + } + + return new_db; } std::string getnewaddress(CWallet& w) @@ -208,9 +224,9 @@ bool MockableBatch::ErasePrefix(std::span prefix) return true; } -std::unique_ptr CreateMockableWalletDatabase(MockableData records) +std::unique_ptr CreateMockableWalletDatabase() { - return std::make_unique(records); + return std::make_unique(); } MockableDatabase& GetMockableDatabase(CWallet& wallet) diff --git a/src/wallet/test/util.h b/src/wallet/test/util.h index d5deba295d2..f812b0ccfaf 100644 --- a/src/wallet/test/util.h +++ b/src/wallet/test/util.h @@ -68,18 +68,18 @@ private: MockableData& m_records; bool m_pass; - bool ReadKey(DataStream&& key, DataStream& value) override; - bool WriteKey(DataStream&& key, DataStream&& value, bool overwrite=true) override; - bool EraseKey(DataStream&& key) override; - bool HasKey(DataStream&& key) override; - bool ErasePrefix(std::span prefix) override; - public: explicit MockableBatch(MockableData& records, bool pass) : m_records(records), m_pass(pass) {} ~MockableBatch() = default; void Close() override {} + bool ReadKey(DataStream&& key, DataStream& value) override; + bool WriteKey(DataStream&& key, DataStream&& value, bool overwrite=true) override; + bool EraseKey(DataStream&& key) override; + bool HasKey(DataStream&& key) override; + bool ErasePrefix(std::span prefix) override; + std::unique_ptr GetNewCursor() override { return std::make_unique(m_records, m_pass); @@ -101,7 +101,7 @@ public: MockableData m_records; bool m_pass{true}; - MockableDatabase(MockableData records = {}) : WalletDatabase(), m_records(records) {} + MockableDatabase() : WalletDatabase() {} ~MockableDatabase() = default; void Open() override {} @@ -116,7 +116,7 @@ public: std::unique_ptr MakeBatch() override { return std::make_unique(m_records, m_pass); } }; -std::unique_ptr CreateMockableWalletDatabase(MockableData records = {}); +std::unique_ptr CreateMockableWalletDatabase(); MockableDatabase& GetMockableDatabase(CWallet& wallet); DescriptorScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string& desc_str, bool success);