coincontrol.cpp raw

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