/ src / qt / test / optiontests.cpp
optiontests.cpp
  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  }