optiontests.cpp raw

   1  // Copyright (c) 2018-present 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 <bitcoin-build-config.h> // IWYU pragma: keep
   6  
   7  #include <common/args.h>
   8  #include <init.h>
   9  #include <qt/bitcoin.h>
  10  #include <qt/guiutil.h>
  11  #include <qt/test/optiontests.h>
  12  #include <test/util/setup_common.h>
  13  
  14  #include <QSettings>
  15  #include <QTest>
  16  
  17  #include <univalue.h>
  18  
  19  #include <fstream>
  20  
  21  OptionTests::OptionTests(interfaces::Node& node) : m_node(node)
  22  {
  23      gArgs.LockSettings([&](common::Settings& s) { m_previous_settings = s; });
  24  }
  25  
  26  void OptionTests::init()
  27  {
  28      // reset args
  29      gArgs.LockSettings([&](common::Settings& s) { s = m_previous_settings; });
  30      gArgs.ClearPathCache();
  31  }
  32  
  33  void OptionTests::migrateSettings()
  34  {
  35      // Set legacy QSettings and verify that they get cleared and migrated to
  36      // settings.json
  37      QSettings settings;
  38      settings.setValue("nDatabaseCache", 600);
  39      settings.setValue("nThreadsScriptVerif", 12);
  40      settings.setValue("fListen", false);
  41      settings.setValue("bPrune", true);
  42      settings.setValue("nPruneSize", 3);
  43      settings.setValue("fUseProxy", true);
  44      settings.setValue("addrProxy", "proxy:123");
  45      settings.setValue("fUseSeparateProxyTor", true);
  46      settings.setValue("addrSeparateProxyTor", "onion:234");
  47  
  48      settings.sync();
  49  
  50      QVERIFY(settings.contains("nDatabaseCache"));
  51      QVERIFY(settings.contains("nThreadsScriptVerif"));
  52      QVERIFY(settings.contains("fListen"));
  53      QVERIFY(settings.contains("bPrune"));
  54      QVERIFY(settings.contains("nPruneSize"));
  55      QVERIFY(settings.contains("fUseProxy"));
  56      QVERIFY(settings.contains("addrProxy"));
  57      QVERIFY(settings.contains("fUseSeparateProxyTor"));
  58      QVERIFY(settings.contains("addrSeparateProxyTor"));
  59  
  60      OptionsModel options{m_node};
  61      bilingual_str error;
  62      QVERIFY(options.Init(error));
  63      QVERIFY(!settings.contains("nDatabaseCache"));
  64      QVERIFY(!settings.contains("nThreadsScriptVerif"));
  65      QVERIFY(!settings.contains("fListen"));
  66      QVERIFY(!settings.contains("bPrune"));
  67      QVERIFY(!settings.contains("nPruneSize"));
  68      QVERIFY(!settings.contains("fUseProxy"));
  69      QVERIFY(!settings.contains("addrProxy"));
  70      QVERIFY(!settings.contains("fUseSeparateProxyTor"));
  71      QVERIFY(!settings.contains("addrSeparateProxyTor"));
  72  
  73      std::ifstream file((gArgs.GetDataDirNet() / "settings.json").std_path());
  74      std::string default_warning = strprintf("This file is automatically generated and updated by %s. Please do not edit this file while the node "
  75                                              "is running, as any changes might be ignored or overwritten.",
  76                                              CLIENT_NAME);
  77      QCOMPARE(std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()).c_str(), "{\n"
  78          "    \"_warning_\": \""+ default_warning+"\",\n"
  79          "    \"dbcache\": \"600\",\n"
  80          "    \"listen\": false,\n"
  81          "    \"onion\": \"onion:234\",\n"
  82          "    \"par\": \"12\",\n"
  83          "    \"proxy\": \"proxy:123\",\n"
  84          "    \"prune\": \"2861\"\n"
  85          "}\n");
  86  }
  87  
  88  void OptionTests::integerGetArgBug()
  89  {
  90      // Test regression https://github.com/bitcoin/bitcoin/issues/24457. Ensure
  91      // that setting integer prune value doesn't cause an exception to be thrown
  92      // in the OptionsModel constructor
  93      gArgs.LockSettings([&](common::Settings& settings) {
  94          settings.forced_settings.erase("prune");
  95          settings.rw_settings["prune"] = 3814;
  96      });
  97      gArgs.WriteSettingsFile();
  98      bilingual_str error;
  99      QVERIFY(OptionsModel{m_node}.Init(error));
 100      gArgs.LockSettings([&](common::Settings& settings) {
 101          settings.rw_settings.erase("prune");
 102      });
 103      gArgs.WriteSettingsFile();
 104  }
 105  
 106  void OptionTests::parametersInteraction()
 107  {
 108      // Test that the bug https://github.com/bitcoin-core/gui/issues/567 does not resurface.
 109      // It was fixed via https://github.com/bitcoin-core/gui/pull/568.
 110      // With fListen=false in ~/.config/Bitcoin/Bitcoin-Qt.conf and all else left as default,
 111      // bitcoin-qt should set both -listen and -listenonion to false and start successfully.
 112      gArgs.LockSettings([&](common::Settings& s) {
 113          s.forced_settings.erase("listen");
 114          s.forced_settings.erase("listenonion");
 115      });
 116      QVERIFY(!gArgs.IsArgSet("-listen"));
 117      QVERIFY(!gArgs.IsArgSet("-listenonion"));
 118  
 119      QSettings settings;
 120      settings.setValue("fListen", false);
 121  
 122      bilingual_str error;
 123      QVERIFY(OptionsModel{m_node}.Init(error));
 124  
 125      const bool expected{false};
 126  
 127      QVERIFY(gArgs.IsArgSet("-listen"));
 128      QCOMPARE(gArgs.GetBoolArg("-listen", !expected), expected);
 129  
 130      QVERIFY(gArgs.IsArgSet("-listenonion"));
 131      QCOMPARE(gArgs.GetBoolArg("-listenonion", !expected), expected);
 132  
 133      QVERIFY(AppInitParameterInteraction(gArgs));
 134  
 135      // cleanup
 136      settings.remove("fListen");
 137      QVERIFY(!settings.contains("fListen"));
 138      gArgs.ClearPathCache();
 139  }
 140  
 141  void OptionTests::extractFilter()
 142  {
 143      QString filter = QString("Partially Signed Transaction (Binary) (*.psbt)");
 144      QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "psbt");
 145  
 146      filter = QString("Image (*.png *.jpg)");
 147      QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
 148  }
 149