optiontests.cpp raw
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 }
149