Bitcoin Core  27.1.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 #if defined(HAVE_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 
24 {
26 }
27 
29 {
30  // reset args
33 }
34 
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  OptionsModel options{m_node};
55  QVERIFY(options.Init(error));
56  QVERIFY(!settings.contains("nDatabaseCache"));
57  QVERIFY(!settings.contains("nThreadsScriptVerif"));
58  QVERIFY(!settings.contains("fUseUPnP"));
59  QVERIFY(!settings.contains("fListen"));
60  QVERIFY(!settings.contains("bPrune"));
61  QVERIFY(!settings.contains("nPruneSize"));
62  QVERIFY(!settings.contains("fUseProxy"));
63  QVERIFY(!settings.contains("addrProxy"));
64  QVERIFY(!settings.contains("fUseSeparateProxyTor"));
65  QVERIFY(!settings.contains("addrSeparateProxyTor"));
66 
67  std::ifstream file(gArgs.GetDataDirNet() / "settings.json");
68  std::string default_warning = strprintf("This file is automatically generated and updated by %s. Please do not edit this file while the node "
69  "is running, as any changes might be ignored or overwritten.",
70  PACKAGE_NAME);
71  QCOMPARE(std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()).c_str(), "{\n"
72  " \"_warning_\": \""+ default_warning+"\",\n"
73  " \"dbcache\": \"600\",\n"
74  " \"listen\": false,\n"
75  " \"onion\": \"onion:234\",\n"
76  " \"par\": \"12\",\n"
77  " \"proxy\": \"proxy:123\",\n"
78  " \"prune\": \"2861\"\n"
79  "}\n");
80 }
81 
83 {
84  // Test regression https://github.com/bitcoin/bitcoin/issues/24457. Ensure
85  // that setting integer prune value doesn't cause an exception to be thrown
86  // in the OptionsModel constructor
87  gArgs.LockSettings([&](common::Settings& settings) {
88  settings.forced_settings.erase("prune");
89  settings.rw_settings["prune"] = 3814;
90  });
93  QVERIFY(OptionsModel{m_node}.Init(error));
94  gArgs.LockSettings([&](common::Settings& settings) {
95  settings.rw_settings.erase("prune");
96  });
98 }
99 
101 {
102  // Test that the bug https://github.com/bitcoin-core/gui/issues/567 does not resurface.
103  // It was fixed via https://github.com/bitcoin-core/gui/pull/568.
104  // With fListen=false in ~/.config/Bitcoin/Bitcoin-Qt.conf and all else left as default,
105  // bitcoin-qt should set both -listen and -listenonion to false and start successfully.
107  s.forced_settings.erase("listen");
108  s.forced_settings.erase("listenonion");
109  });
110  QVERIFY(!gArgs.IsArgSet("-listen"));
111  QVERIFY(!gArgs.IsArgSet("-listenonion"));
112 
113  QSettings settings;
114  settings.setValue("fListen", false);
115 
117  QVERIFY(OptionsModel{m_node}.Init(error));
118 
119  const bool expected{false};
120 
121  QVERIFY(gArgs.IsArgSet("-listen"));
122  QCOMPARE(gArgs.GetBoolArg("-listen", !expected), expected);
123 
124  QVERIFY(gArgs.IsArgSet("-listenonion"));
125  QCOMPARE(gArgs.GetBoolArg("-listenonion", !expected), expected);
126 
128 
129  // cleanup
130  settings.remove("fListen");
131  QVERIFY(!settings.contains("fListen"));
133 }
134 
136 {
137  QString filter = QString("Partially Signed Transaction (Binary) (*.psbt)");
138  QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "psbt");
139 
140  filter = QString("Image (*.png *.jpg)");
141  QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
142 }
void migrateSettings()
Definition: optiontests.cpp:35
OptionTests(interfaces::Node &node)
Definition: optiontests.cpp:23
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: args.cpp:369
std::map< std::string, SettingsValue > forced_settings
Map of setting name to forced setting value.
Definition: settings.h:34
Stored settings.
Definition: settings.h:32
Bilingual messages:
Definition: translation.h:18
node::NodeContext m_node
Definition: bitcoin-gui.cpp:37
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1162
#define PACKAGE_NAME
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition: args.cpp:505
void extractFilter()
common::Settings m_previous_settings
Definition: optiontests.h:29
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:232
Definition: init.h:25
ArgsManager gArgs
Definition: args.cpp:41
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const
Write settings file or backup settings file.
Definition: args.cpp:423
bool AppInitParameterInteraction(const ArgsManager &args)
Initialization: parameter interaction.
Definition: init.cpp:881
Interface from Qt to configuration data structure for Bitcoin client.
Definition: optionsmodel.h:42
bool error(const char *fmt, const Args &... args)
Definition: logging.h:267
void integerGetArgBug()
Definition: optiontests.cpp:82
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
Definition: settings.h:38
interfaces::Node & m_node
Definition: optiontests.h:28
void LockSettings(Fn &&fn)
Access settings with lock held.
Definition: args.h:404
void parametersInteraction()
void ClearPathCache()
Clear cached directory paths.
Definition: args.cpp:331
Top-level interface for a bitcoin node (bitcoind process).
Definition: node.h:69
QString ExtractFirstSuffixFromFilter(const QString &filter)
Extract first suffix from filter pattern "Description (*.foo)" or "Description (*.foo *.bar ...).
Definition: guiutil.cpp:301