diff options
Diffstat (limited to 'src/wallet/test/fuzz/coincontrol.cpp')
-rw-r--r-- | src/wallet/test/fuzz/coincontrol.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
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 <test/fuzz/FuzzedDataProvider.h> +#include <test/fuzz/fuzz.h> +#include <test/fuzz/util.h> +#include <test/util/setup_common.h> +#include <wallet/coincontrol.h> +#include <wallet/test/util.h> + +namespace wallet { +namespace { + +const TestingSetup* g_setup; + +void initialize_coincontrol() +{ + static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(); + 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<COutPoint> optional_out_point = ConsumeDeserializable<COutPoint>(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<int64_t>()}; + (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 |