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 }