Bitcoin Core  27.99.0
P2P Digital Currency
optiontests.cpp
Go to the documentation of this file.
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 #include <config/bitcoin-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 
22 {
24 }
25 
27 {
28  // reset args
31 }
32 
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  PACKAGE_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 
92 {
93  // Test regression https://github.com/bitcoin/bitcoin/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  });
101  bilingual_str error;
102  QVERIFY(OptionsModel{m_node}.Init(error));
103  gArgs.LockSettings([&](common::Settings& settings) {
104  settings.rw_settings.erase("prune");
105  });
107 }
108 
110 {
111  // Test that the bug https://github.com/bitcoin-core/gui/issues/567 does not resurface.
112  // It was fixed via https://github.com/bitcoin-core/gui/pull/568.
113  // With fListen=false in ~/.config/Bitcoin/Bitcoin-Qt.conf and all else left as default,
114  // bitcoin-qt should set both -listen and -listenonion to false and start successfully.
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 
137 
138  // cleanup
139  settings.remove("fListen");
140  QVERIFY(!settings.contains("fListen"));
142 }
143 
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 }
ArgsManager gArgs
Definition: args.cpp:41
#define PACKAGE_NAME
node::NodeContext m_node
Definition: bitcoin-gui.cpp:37
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:232
void LockSettings(Fn &&fn)
Access settings with lock held.
Definition: args.h:404
void ClearPathCache()
Clear cached directory paths.
Definition: args.cpp:331
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: args.cpp:369
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const
Write settings file or backup settings file.
Definition: args.cpp:423
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition: args.cpp:505
common::Settings m_previous_settings
Definition: optiontests.h:29
void extractFilter()
OptionTests(interfaces::Node &node)
Definition: optiontests.cpp:21
void integerGetArgBug()
Definition: optiontests.cpp:91
interfaces::Node & m_node
Definition: optiontests.h:28
void parametersInteraction()
void migrateSettings()
Definition: optiontests.cpp:33
Interface from Qt to configuration data structure for Bitcoin client.
Definition: optionsmodel.h:43
Top-level interface for a bitcoin node (bitcoind process).
Definition: node.h:70
bool AppInitParameterInteraction(const ArgsManager &args)
Initialization: parameter interaction.
Definition: init.cpp:878
QString ExtractFirstSuffixFromFilter(const QString &filter)
Extract first suffix from filter pattern "Description (*.foo)" or "Description (*....
Definition: guiutil.cpp:303
Definition: init.h:25
Bilingual messages:
Definition: translation.h:18
Stored settings.
Definition: settings.h:32
std::map< std::string, SettingsValue > forced_settings
Map of setting name to forced setting value.
Definition: settings.h:34
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
Definition: settings.h:38
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1162