optiontests.cpp raw

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