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