From 40b333e21f8741e2f553df6b5dcff7277c00a982 Mon Sep 17 00:00:00 2001 From: Ayush Singh Date: Fri, 16 Jun 2023 20:30:46 +0530 Subject: [PATCH] fuzz: wallet, add target for CoinControl --- src/Makefile.test.include | 1 + src/wallet/test/fuzz/coincontrol.cpp | 87 ++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/wallet/test/fuzz/coincontrol.cpp diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 2ee32a58c9..224f1fe301 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -194,6 +194,7 @@ BITCOIN_TESTS += wallet/test/db_tests.cpp endif FUZZ_WALLET_SRC = \ + wallet/test/fuzz/coincontrol.cpp \ wallet/test/fuzz/coinselection.cpp \ wallet/test/fuzz/fees.cpp \ wallet/test/fuzz/parse_iso8601.cpp diff --git a/src/wallet/test/fuzz/coincontrol.cpp b/src/wallet/test/fuzz/coincontrol.cpp new file mode 100644 index 0000000000..7dabdfb472 --- /dev/null +++ b/src/wallet/test/fuzz/coincontrol.cpp @@ -0,0 +1,87 @@ +// Copyright (c) 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. + +#include +#include +#include +#include +#include +#include + +namespace wallet { +namespace { + +const TestingSetup* g_setup; + +void initialize_coincontrol() +{ + static const auto testing_setup = MakeNoLogFileContext(); + g_setup = testing_setup.get(); +} + +FUZZ_TARGET_INIT(coincontrol, initialize_coincontrol) +{ + FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); + const auto& node = g_setup->m_node; + ArgsManager& args = *node.args; + + // for GetBoolArg to return true sometimes + args.ForceSetArg("-avoidpartialspends", fuzzed_data_provider.ConsumeBool()?"1":"0"); + + CCoinControl coin_control; + COutPoint out_point; + + LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) + { + CallOneOf( + fuzzed_data_provider, + [&] { + std::optional optional_out_point = ConsumeDeserializable(fuzzed_data_provider); + if (!optional_out_point) { + return; + } + out_point = *optional_out_point; + }, + [&] { + (void)coin_control.HasSelected(); + }, + [&] { + (void)coin_control.IsSelected(out_point); + }, + [&] { + (void)coin_control.IsExternalSelected(out_point); + }, + [&] { + (void)coin_control.GetExternalOutput(out_point); + }, + [&] { + (void)coin_control.Select(out_point); + }, + [&] { + const CTxOut tx_out{ConsumeMoney(fuzzed_data_provider), ConsumeScript(fuzzed_data_provider)}; + (void)coin_control.SelectExternal(out_point, tx_out); + }, + [&] { + (void)coin_control.UnSelect(out_point); + }, + [&] { + (void)coin_control.UnSelectAll(); + }, + [&] { + (void)coin_control.ListSelected(); + }, + [&] { + int64_t weight{fuzzed_data_provider.ConsumeIntegral()}; + (void)coin_control.SetInputWeight(out_point, weight); + }, + [&] { + // Condition to avoid the assertion in GetInputWeight + if (coin_control.HasInputWeight(out_point)) { + (void)coin_control.GetInputWeight(out_point); + } + }); + } +} +} // namespace +} // namespace wallet