Branch data Line data Source code
1 : : // Copyright (c) 2022 The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <test/fuzz/FuzzedDataProvider.h>
6 : : #include <test/fuzz/fuzz.h>
7 : : #include <test/fuzz/util.h>
8 : : #include <test/util/setup_common.h>
9 : : #include <wallet/coincontrol.h>
10 : : #include <wallet/test/util.h>
11 : :
12 : : namespace wallet {
13 : : namespace {
14 : :
15 : : const TestingSetup* g_setup;
16 : :
17 : 1 : void initialize_coincontrol()
18 : : {
19 [ + - + - ]: 2 : static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
20 : 1 : g_setup = testing_setup.get();
21 [ + - ]: 2 : }
22 : :
23 [ + - ]: 793 : FUZZ_TARGET(coincontrol, .init = initialize_coincontrol)
24 : : {
25 : 361 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
26 : 361 : const auto& node = g_setup->m_node;
27 : 361 : ArgsManager& args = *node.args;
28 : :
29 : : // for GetBoolArg to return true sometimes
30 [ + + + - : 848 : args.ForceSetArg("-avoidpartialspends", fuzzed_data_provider.ConsumeBool()?"1":"0");
+ - ]
31 : :
32 : 361 : CCoinControl coin_control;
33 : 361 : COutPoint out_point;
34 : :
35 [ + + + + ]: 261812 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000)
36 : : {
37 [ + - ]: 261451 : CallOneOf(
38 : : fuzzed_data_provider,
39 : 27779 : [&] {
40 : 27779 : std::optional<COutPoint> optional_out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider);
41 [ + + ]: 27779 : if (!optional_out_point) {
42 : : return;
43 : : }
44 : 16215 : out_point = *optional_out_point;
45 : : },
46 : 17497 : [&] {
47 : 17497 : (void)coin_control.HasSelected();
48 : 17497 : },
49 : 15985 : [&] {
50 : 15985 : (void)coin_control.IsSelected(out_point);
51 : 15985 : },
52 : 52527 : [&] {
53 : 52527 : (void)coin_control.IsExternalSelected(out_point);
54 : 52527 : },
55 : 23698 : [&] {
56 : 23698 : (void)coin_control.GetExternalOutput(out_point);
57 : 23698 : },
58 : 14638 : [&] {
59 : 14638 : (void)coin_control.Select(out_point);
60 : 14638 : },
61 : 34632 : [&] {
62 [ + - ]: 34632 : const CTxOut tx_out{ConsumeMoney(fuzzed_data_provider), ConsumeScript(fuzzed_data_provider)};
63 [ + - + - ]: 34632 : (void)coin_control.Select(out_point).SetTxOut(tx_out);
64 : 34632 : },
65 : 37767 : [&] {
66 : 37767 : (void)coin_control.UnSelect(out_point);
67 : 37767 : },
68 : 1523 : [&] {
69 : 1523 : (void)coin_control.UnSelectAll();
70 : 1523 : },
71 : 18545 : [&] {
72 : 18545 : (void)coin_control.ListSelected();
73 : 18545 : },
74 : 5972 : [&] {
75 : 5972 : int64_t weight{fuzzed_data_provider.ConsumeIntegral<int64_t>()};
76 : 5972 : (void)coin_control.SetInputWeight(out_point, weight);
77 : 5972 : },
78 : 10888 : [&] {
79 : 10888 : (void)coin_control.GetInputWeight(out_point);
80 : 10888 : });
81 : : }
82 : 361 : }
83 : : } // namespace
84 : : } // namespace wallet
|