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 [ + - ]: 674 : FUZZ_TARGET(coincontrol, .init = initialize_coincontrol)
24 : : {
25 : 262 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
26 : 262 : const auto& node = g_setup->m_node;
27 : 262 : ArgsManager& args = *node.args;
28 : :
29 : : // for GetBoolArg to return true sometimes
30 [ + + + - : 618 : args.ForceSetArg("-avoidpartialspends", fuzzed_data_provider.ConsumeBool()?"1":"0");
+ - ]
31 : :
32 : 262 : CCoinControl coin_control;
33 : 262 : COutPoint out_point;
34 : :
35 [ + + + + ]: 169289 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000)
36 : : {
37 [ + - ]: 169027 : CallOneOf(
38 : : fuzzed_data_provider,
39 : 18444 : [&] {
40 : 18444 : std::optional<COutPoint> optional_out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider);
41 [ + + ]: 18444 : if (!optional_out_point) {
42 : : return;
43 : : }
44 : 10382 : out_point = *optional_out_point;
45 : : },
46 : 12085 : [&] {
47 : 12085 : (void)coin_control.HasSelected();
48 : 12085 : },
49 : 9886 : [&] {
50 : 9886 : (void)coin_control.IsSelected(out_point);
51 : 9886 : },
52 : 29406 : [&] {
53 : 29406 : (void)coin_control.IsExternalSelected(out_point);
54 : 29406 : },
55 : 13785 : [&] {
56 : 13785 : (void)coin_control.GetExternalOutput(out_point);
57 : 13785 : },
58 : 13392 : [&] {
59 : 13392 : (void)coin_control.Select(out_point);
60 : 13392 : },
61 : 21184 : [&] {
62 [ + - ]: 21184 : const CTxOut tx_out{ConsumeMoney(fuzzed_data_provider), ConsumeScript(fuzzed_data_provider)};
63 [ + - + - ]: 21184 : (void)coin_control.Select(out_point).SetTxOut(tx_out);
64 : 21184 : },
65 : 28725 : [&] {
66 : 28725 : (void)coin_control.UnSelect(out_point);
67 : 28725 : },
68 : 1148 : [&] {
69 : 1148 : (void)coin_control.UnSelectAll();
70 : 1148 : },
71 : 11451 : [&] {
72 : 11451 : (void)coin_control.ListSelected();
73 : 11451 : },
74 : 3476 : [&] {
75 : 3476 : int64_t weight{fuzzed_data_provider.ConsumeIntegral<int64_t>()};
76 : 3476 : (void)coin_control.SetInputWeight(out_point, weight);
77 : 3476 : },
78 : 6045 : [&] {
79 : 6045 : (void)coin_control.GetInputWeight(out_point);
80 : 6045 : });
81 : : }
82 : 262 : }
83 : : } // namespace
84 : : } // namespace wallet
|