v31.1-roots.1 · Commit 9: [PATCH 09/17] fix(roots): restore audited portability and runtime behavior
src/qt/test/optiontests.cpp
Before: src/qt/test/optiontests.cpp · After: src/qt/test/optiontests.cpp
File metadata
index 3edf37ded46371c8eb2ae536f433b72ceeb14c77..fe22819c32a006bc7e204ae2cc556019b366cfc3 100644
Download original patch · Release notes
Diff rows 1–86 of 86. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. The two line-number columns refer to before and after.
src/qt/test/optiontests.cpp
CHANGED
|
@@ -7,12 +7,20 @@
|
|
|
7
7
|
#include <common/args.h>
|
|
8
8
|
#include <init.h>
|
|
9
9
|
#include <qt/bitcoin.h>
|
|
10
|
+
#include <qt/bitcoinunits.h>
|
|
10
11
|
#include <qt/guiutil.h>
|
|
12
|
+
#include <qt/optionsmodel.h>
|
|
11
13
|
#include <qt/test/optiontests.h>
|
|
12
14
|
#include <test/util/setup_common.h>
|
|
13
15
|
|
|
16
|
+
#include <QByteArray>
|
|
17
|
+
#include <QCoreApplication>
|
|
18
|
+
#include <QDebug>
|
|
19
|
+
#include <QProcess>
|
|
14
20
|
#include <QSettings>
|
|
21
|
+
#include <QTemporaryDir>
|
|
15
22
|
#include <QTest>
|
|
23
|
+
#include <QVariant>
|
|
16
24
|
|
|
17
25
|
#include <univalue.h>
|
|
18
26
|
|
|
@@ -146,3 +154,66 @@ void OptionTests::extractFilter()
|
|
|
146
154
|
filter = QString("Image (*.png *.jpg)");
|
|
147
155
|
QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
|
|
148
156
|
}
|
|
157
|
+
|
|
158
|
+
int RunDisplayUnitSettingsTest(interfaces::Node& node, const QString& settings_dir, const QString& action, BitcoinUnit unit)
|
|
159
|
+
{
|
|
160
|
+
// Each invocation starts with a fresh Qt metatype registry and settings
|
|
161
|
+
// cache. Redirect both scopes before the production model accesses settings.
|
|
162
|
+
QSettings::setDefaultFormat(QSettings::IniFormat);
|
|
163
|
+
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, settings_dir);
|
|
164
|
+
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, settings_dir + "/system");
|
|
165
|
+
QCoreApplication::setApplicationName("display-unit-persistence-test");
|
|
166
|
+
|
|
167
|
+
if (action == "read") {
|
|
168
|
+
// Production initializes translations before constructing OptionsModel.
|
|
169
|
+
// Reading language parses and caches the same settings section that
|
|
170
|
+
// contains DisplayBitcoinUnit, so registration must already be ready.
|
|
171
|
+
QSettings early_settings;
|
|
172
|
+
if (early_settings.value("language").toString() != "en") return 1;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
OptionsModel options{node};
|
|
176
|
+
QSettings settings;
|
|
177
|
+
const QVariant saved_unit{settings.value("DisplayBitcoinUnit")};
|
|
178
|
+
bilingual_str error;
|
|
179
|
+
if (!options.Init(error)) {
|
|
180
|
+
qWarning() << QString::fromStdString(error.original);
|
|
181
|
+
return 1;
|
|
182
|
+
}
|
|
183
|
+
if (action == "write") {
|
|
184
|
+
options.setDisplayUnit(QVariant::fromValue(unit));
|
|
185
|
+
settings.setValue("language", "en");
|
|
186
|
+
settings.sync();
|
|
187
|
+
return settings.status() == QSettings::NoError ? 0 : 1;
|
|
188
|
+
}
|
|
189
|
+
if (action == "read") {
|
|
190
|
+
// Check the stored type too: falling back to BTC must not pass the BTC
|
|
191
|
+
// case when an unregistered enum could not be restored from disk.
|
|
192
|
+
const bool restored{settings.status() == QSettings::NoError && saved_unit.canConvert<BitcoinUnit>() &&
|
|
193
|
+
saved_unit.value<BitcoinUnit>() == unit && options.getDisplayUnit() == unit};
|
|
194
|
+
return restored ? 0 : 1;
|
|
195
|
+
}
|
|
196
|
+
return 2;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
void OptionTests::displayUnitPersistence()
|
|
200
|
+
{
|
|
201
|
+
QTemporaryDir settings_dir;
|
|
202
|
+
QVERIFY(settings_dir.isValid());
|
|
203
|
+
for (const BitcoinUnit unit : BitcoinUnits::availableUnits()) {
|
|
204
|
+
for (const QString& action : {QString{"write"}, QString{"read"}}) {
|
|
205
|
+
QProcess process;
|
|
206
|
+
process.start(QCoreApplication::applicationFilePath(),
|
|
207
|
+
{"--test-display-unit-settings", settings_dir.path(), action, QString::number(static_cast<int>(unit))});
|
|
208
|
+
QVERIFY(process.waitForStarted());
|
|
209
|
+
if (!process.waitForFinished(10000)) {
|
|
210
|
+
process.kill();
|
|
211
|
+
process.waitForFinished();
|
|
212
|
+
QFAIL("Display-unit settings child timed out");
|
|
213
|
+
}
|
|
214
|
+
QCOMPARE(process.exitStatus(), QProcess::NormalExit);
|
|
215
|
+
const QByteArray diagnostic{process.readAllStandardOutput() + process.readAllStandardError()};
|
|
216
|
+
QVERIFY2(process.exitCode() == 0, diagnostic.constData());
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|