Skip to content
Bitcoin Roots

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. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

src/qt/test/optiontests.cpp CHANGED
@@ -7,12 +7,20 @@
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
 
@@ -146,3 +154,66 @@ void OptionTests::extractFilter()
146
  filter = QString("Image (*.png *.jpg)");
147
  QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
148
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  #include <common/args.h>
8
  #include <init.h>
9
  #include <qt/bitcoin.h>
10
+ #include <qt/bitcoinunits.h>
11
  #include <qt/guiutil.h>
12
+ #include <qt/optionsmodel.h>
13
  #include <qt/test/optiontests.h>
14
  #include <test/util/setup_common.h>
15
 
16
+ #include <QByteArray>
17
+ #include <QCoreApplication>
18
+ #include <QDebug>
19
+ #include <QProcess>
20
  #include <QSettings>
21
+ #include <QTemporaryDir>
22
  #include <QTest>
23
+ #include <QVariant>
24
 
25
  #include <univalue.h>
26
 
 
154
  filter = QString("Image (*.png *.jpg)");
155
  QCOMPARE(GUIUtil::ExtractFirstSuffixFromFilter(filter), "png");
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
+ }