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 }