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