mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-05-11 20:30:27 +02:00
-BEGIN VERIFY SCRIPT- regex_string='^(?!//).*(AC_APPLE_UNIVERSAL_BUILD|BOOST_PROCESS_USE_STD_FS|CHAR_EQUALS_INT8|CLIENT_VERSION_BUILD|CLIENT_VERSION_IS_RELEASE|CLIENT_VERSION_MAJOR|CLIENT_VERSION_MINOR|COPYRIGHT_HOLDERS|COPYRIGHT_HOLDERS_FINAL|COPYRIGHT_HOLDERS_SUBSTITUTION|COPYRIGHT_YEAR|ENABLE_ARM_SHANI|ENABLE_AVX2|ENABLE_EXTERNAL_SIGNER|ENABLE_SSE41|ENABLE_TRACING|ENABLE_WALLET|ENABLE_X86_SHANI|ENABLE_ZMQ|HAVE_BOOST|HAVE_BUILTIN_CLZL|HAVE_BUILTIN_CLZLL|HAVE_BYTESWAP_H|HAVE_CLMUL|HAVE_CONSENSUS_LIB|HAVE_CXX20|HAVE_DECL_BE16TOH|HAVE_DECL_BE32TOH|HAVE_DECL_BE64TOH|HAVE_DECL_BSWAP_16|HAVE_DECL_BSWAP_32|HAVE_DECL_BSWAP_64|HAVE_DECL_FORK|HAVE_DECL_FREEIFADDRS|HAVE_DECL_GETIFADDRS|HAVE_DECL_HTOBE16|HAVE_DECL_HTOBE32|HAVE_DECL_HTOBE64|HAVE_DECL_HTOLE16|HAVE_DECL_HTOLE32|HAVE_DECL_HTOLE64|HAVE_DECL_LE16TOH|HAVE_DECL_LE32TOH|HAVE_DECL_LE64TOH|HAVE_DECL_PIPE2|HAVE_DECL_SETSID|HAVE_DECL_STRERROR_R|HAVE_DEFAULT_VISIBILITY_ATTRIBUTE|HAVE_DLFCN_H|HAVE_DLLEXPORT_ATTRIBUTE|HAVE_ENDIAN_H|HAVE_EVHTTP_CONNECTION_GET_PEER_CONST_CHAR|HAVE_FDATASYNC|HAVE_GETENTROPY_RAND|HAVE_GETRANDOM|HAVE_GMTIME_R|HAVE_INTTYPES_H|HAVE_LIBADVAPI32|HAVE_LIBCOMCTL32|HAVE_LIBCOMDLG32|HAVE_LIBGDI32|HAVE_LIBIPHLPAPI|HAVE_LIBKERNEL32|HAVE_LIBOLE32|HAVE_LIBOLEAUT32|HAVE_LIBSHELL32|HAVE_LIBSHLWAPI|HAVE_LIBUSER32|HAVE_LIBUUID|HAVE_LIBWINMM|HAVE_LIBWS2_32|HAVE_MALLOC_INFO|HAVE_MALLOPT_ARENA_MAX|HAVE_MINIUPNPC_MINIUPNPC_H|HAVE_MINIUPNPC_UPNPCOMMANDS_H|HAVE_MINIUPNPC_UPNPERRORS_H|HAVE_NATPMP_H|HAVE_O_CLOEXEC|HAVE_POSIX_FALLOCATE|HAVE_PTHREAD|HAVE_PTHREAD_PRIO_INHERIT|HAVE_STDINT_H|HAVE_STDIO_H|HAVE_STDLIB_H|HAVE_STRERROR_R|HAVE_STRINGS_H|HAVE_STRING_H|HAVE_STRONG_GETAUXVAL|HAVE_SYSCTL|HAVE_SYSCTL_ARND|HAVE_SYSTEM|HAVE_SYS_ENDIAN_H|HAVE_SYS_PRCTL_H|HAVE_SYS_RESOURCES_H|HAVE_SYS_SELECT_H|HAVE_SYS_STAT_H|HAVE_SYS_SYSCTL_H|HAVE_SYS_TYPES_H|HAVE_SYS_VMMETER_H|HAVE_THREAD_LOCAL|HAVE_TIMINGSAFE_BCMP|HAVE_UNISTD_H|HAVE_VM_VM_PARAM_H|LT_OBJDIR|PACKAGE_BUGREPORT|PACKAGE_NAME|PACKAGE_STRING|PACKAGE_TARNAME|PACKAGE_URL|PACKAGE_VERSION|PTHREAD_CREATE_JOINABLE|QT_QPA_PLATFORM_ANDROID|QT_QPA_PLATFORM_COCOA|QT_QPA_PLATFORM_MINIMAL|QT_QPA_PLATFORM_WINDOWS|QT_QPA_PLATFORM_XCB|QT_STATICPLUGIN|STDC_HEADERS|STRERROR_R_CHAR_P|USE_ASM|USE_BDB|USE_DBUS|USE_NATPMP|USE_QRCODE|USE_SQLITE|USE_UPNP|_FILE_OFFSET_BITS|_LARGE_FILES)' exclusion_files=":(exclude)src/minisketch :(exclude)src/crc32c :(exclude)src/secp256k1 :(exclude)src/crypto/sha256_arm_shani.cpp :(exclude)src/crypto/sha256_avx2.cpp :(exclude)src/crypto/sha256_sse41.cpp :(exclude)src/crypto/sha256_x86_shani.cpp" git grep --perl-regexp --files-with-matches "$regex_string" -- '*.cpp' $exclusion_files | xargs git grep -L "bitcoin-config.h" | while read -r file; do line_number=$(awk -v my_file="$file" '/\/\/ file COPYING or https?:\/\/www.opensource.org\/licenses\/mit-license.php\./ {line = NR} /^\/\// && NR == line + 1 {while(getline && /^\/\//) line = NR} END {print line+1}' "$file"); sed -i "${line_number}i\\\\n\#if defined(HAVE_CONFIG_H)\\n#include <config/bitcoin-config.h>\\n\#endif" "$file"; done; git grep --perl-regexp --files-with-matches "$regex_string" -- '*.h' $exclusion_files | xargs git grep -L "bitcoin-config.h" | while read -r file; do sed -i "/#define.*_H/a \\\\n\#if defined(HAVE_CONFIG_H)\\n#include <config/bitcoin-config.h>\\n\#endif" "$file"; done; for file in $(git grep --files-with-matches 'bitcoin-config.h' -- '*.cpp' '*.h' $exclusion_files); do if ! grep -q --perl-regexp "$regex_string" $file; then sed -i '/HAVE_CONFIG_H/{N;N;N;d;}' $file; fi; done; -END VERIFY SCRIPT- The first command creates a regular expression for matching all bitcoin-config.h symbols in the following form: ^(?!//).*(AC_APPLE_UNIVERSAL_BUILD|BOOST_PROCESS_USE_STD_FS|...|_LARGE_FILES). It was generated with: ./autogen.sh && printf '^(?!//).*(%s)' $(awk '/^#undef/ {print $2}' src/config/bitcoin-config.h.in | paste -sd "|" -) The second command holds a list of files and directories that should not be processed. These include subtree directories as well as some crypto files that already get their symbols through the makefile. The third command checks for missing bitcoin-config headers in .cpp files and adds the header if it is missing. The fourth command checks for missing bitcoin-config headers in .h files and adds the header if it is missing. The fifth command checks for unneeded bitcoin-config headers in sources files and removes the header if it is unneeded.
136 lines
4.4 KiB
C++
136 lines
4.4 KiB
C++
// Copyright (c) 2021-2022 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_WALLET_TEST_UTIL_H
|
|
#define BITCOIN_WALLET_TEST_UTIL_H
|
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
#include <config/bitcoin-config.h>
|
|
#endif
|
|
|
|
#include <addresstype.h>
|
|
#include <wallet/db.h>
|
|
|
|
#include <memory>
|
|
|
|
class ArgsManager;
|
|
class CChain;
|
|
class CKey;
|
|
enum class OutputType;
|
|
namespace interfaces {
|
|
class Chain;
|
|
} // namespace interfaces
|
|
|
|
namespace wallet {
|
|
class CWallet;
|
|
class WalletDatabase;
|
|
struct WalletContext;
|
|
|
|
static const DatabaseFormat DATABASE_FORMATS[] = {
|
|
#ifdef USE_SQLITE
|
|
DatabaseFormat::SQLITE,
|
|
#endif
|
|
#ifdef USE_BDB
|
|
DatabaseFormat::BERKELEY,
|
|
#endif
|
|
};
|
|
|
|
const std::string ADDRESS_BCRT1_UNSPENDABLE = "bcrt1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3xueyj";
|
|
|
|
std::unique_ptr<CWallet> CreateSyncedWallet(interfaces::Chain& chain, CChain& cchain, const CKey& key);
|
|
|
|
std::shared_ptr<CWallet> TestLoadWallet(WalletContext& context);
|
|
std::shared_ptr<CWallet> TestLoadWallet(std::unique_ptr<WalletDatabase> database, WalletContext& context, uint64_t create_flags);
|
|
void TestUnloadWallet(std::shared_ptr<CWallet>&& wallet);
|
|
|
|
// Creates a copy of the provided database
|
|
std::unique_ptr<WalletDatabase> DuplicateMockDatabase(WalletDatabase& database);
|
|
|
|
/** Returns a new encoded destination from the wallet (hardcoded to BECH32) */
|
|
std::string getnewaddress(CWallet& w);
|
|
/** Returns a new destination, of an specific type, from the wallet */
|
|
CTxDestination getNewDestination(CWallet& w, OutputType output_type);
|
|
|
|
using MockableData = std::map<SerializeData, SerializeData, std::less<>>;
|
|
|
|
class MockableCursor: public DatabaseCursor
|
|
{
|
|
public:
|
|
MockableData::const_iterator m_cursor;
|
|
MockableData::const_iterator m_cursor_end;
|
|
bool m_pass;
|
|
|
|
explicit MockableCursor(const MockableData& records, bool pass) : m_cursor(records.begin()), m_cursor_end(records.end()), m_pass(pass) {}
|
|
MockableCursor(const MockableData& records, bool pass, Span<const std::byte> prefix);
|
|
~MockableCursor() {}
|
|
|
|
Status Next(DataStream& key, DataStream& value) override;
|
|
};
|
|
|
|
class MockableBatch : public DatabaseBatch
|
|
{
|
|
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(Span<const std::byte> prefix) override;
|
|
|
|
public:
|
|
explicit MockableBatch(MockableData& records, bool pass) : m_records(records), m_pass(pass) {}
|
|
~MockableBatch() {}
|
|
|
|
void Flush() override {}
|
|
void Close() override {}
|
|
|
|
std::unique_ptr<DatabaseCursor> GetNewCursor() override
|
|
{
|
|
return std::make_unique<MockableCursor>(m_records, m_pass);
|
|
}
|
|
std::unique_ptr<DatabaseCursor> GetNewPrefixCursor(Span<const std::byte> prefix) override {
|
|
return std::make_unique<MockableCursor>(m_records, m_pass, prefix);
|
|
}
|
|
bool TxnBegin() override { return m_pass; }
|
|
bool TxnCommit() override { return m_pass; }
|
|
bool TxnAbort() override { return m_pass; }
|
|
};
|
|
|
|
/** A WalletDatabase whose contents and return values can be modified as needed for testing
|
|
**/
|
|
class MockableDatabase : public WalletDatabase
|
|
{
|
|
public:
|
|
MockableData m_records;
|
|
bool m_pass{true};
|
|
|
|
MockableDatabase(MockableData records = {}) : WalletDatabase(), m_records(records) {}
|
|
~MockableDatabase() {};
|
|
|
|
void Open() override {}
|
|
void AddRef() override {}
|
|
void RemoveRef() override {}
|
|
|
|
bool Rewrite(const char* pszSkip=nullptr) override { return m_pass; }
|
|
bool Backup(const std::string& strDest) const override { return m_pass; }
|
|
void Flush() override {}
|
|
void Close() override {}
|
|
bool PeriodicFlush() override { return m_pass; }
|
|
void IncrementUpdateCounter() override {}
|
|
void ReloadDbEnv() override {}
|
|
|
|
std::string Filename() override { return "mockable"; }
|
|
std::string Format() override { return "mock"; }
|
|
std::unique_ptr<DatabaseBatch> MakeBatch(bool flush_on_close = true) override { return std::make_unique<MockableBatch>(m_records, m_pass); }
|
|
};
|
|
|
|
std::unique_ptr<WalletDatabase> CreateMockableWalletDatabase(MockableData records = {});
|
|
|
|
MockableDatabase& GetMockableDatabase(CWallet& wallet);
|
|
} // namespace wallet
|
|
|
|
#endif // BITCOIN_WALLET_TEST_UTIL_H
|