mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-10-10 11:33:46 +02:00
252f363f2f
qt: Replace `QCoreApplication::quit()` with `QCoreApplication::exit(0)` (Hennadii Stepanov) Pull request description: ### Qt 5: - no behavior change. See https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/kernel/qcoreapplication.cpp?h=5.15#n2012: ```cpp void QCoreApplication::quit() { exit(0); } ``` ### Qt 6: - this change avoids sending a duplicated `QEvent::Quit` We use `QEvent::Quit` to [handle](https://github.com/bitcoin-core/gui/pull/547) macOS dock menu events. Qt 6 uses `QEvent::Quit` more [widely](89f7a2759c
). We do not want a duplicated `QEvent::Quit` which fires `Assert(node.args);` in the [`Shutdown()`](d1b3dfb275/src/init.cpp (L200)
) function. ACKs for top commit: promag: Code review ACK252f363f2f
. Tree-SHA512: 6a04cbcf523c0375158a59b29afadf18da99738c8db8b8728f99319a8cdc10806d2f06dc5a7d3b8b0e1a5f1711be778a75d4ecdefef7cf66e26ae2848f7f57db
125 lines
4.1 KiB
C++
125 lines
4.1 KiB
C++
// Copyright (c) 2018-2021 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <qt/test/apptests.h>
|
|
|
|
#include <chainparams.h>
|
|
#include <key.h>
|
|
#include <qt/bitcoin.h>
|
|
#include <qt/bitcoingui.h>
|
|
#include <qt/networkstyle.h>
|
|
#include <qt/rpcconsole.h>
|
|
#include <shutdown.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <validation.h>
|
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
#include <config/bitcoin-config.h>
|
|
#endif
|
|
|
|
#include <QAction>
|
|
#include <QLineEdit>
|
|
#include <QRegularExpression>
|
|
#include <QScopedPointer>
|
|
#include <QSignalSpy>
|
|
#include <QString>
|
|
#include <QTest>
|
|
#include <QTextEdit>
|
|
#include <QtGlobal>
|
|
#include <QtTest/QtTestWidgets>
|
|
#include <QtTest/QtTestGui>
|
|
|
|
namespace {
|
|
//! Regex find a string group inside of the console output
|
|
QString FindInConsole(const QString& output, const QString& pattern)
|
|
{
|
|
const QRegularExpression re(pattern);
|
|
return re.match(output).captured(1);
|
|
}
|
|
|
|
//! Call getblockchaininfo RPC and check first field of JSON output.
|
|
void TestRpcCommand(RPCConsole* console)
|
|
{
|
|
QTextEdit* messagesWidget = console->findChild<QTextEdit*>("messagesWidget");
|
|
QLineEdit* lineEdit = console->findChild<QLineEdit*>("lineEdit");
|
|
QSignalSpy mw_spy(messagesWidget, &QTextEdit::textChanged);
|
|
QVERIFY(mw_spy.isValid());
|
|
QTest::keyClicks(lineEdit, "getblockchaininfo");
|
|
QTest::keyClick(lineEdit, Qt::Key_Return);
|
|
QVERIFY(mw_spy.wait(1000));
|
|
QCOMPARE(mw_spy.count(), 4);
|
|
const QString output = messagesWidget->toPlainText();
|
|
const QString pattern = QStringLiteral("\"chain\": \"(\\w+)\"");
|
|
QCOMPARE(FindInConsole(output, pattern), QString("regtest"));
|
|
}
|
|
} // namespace
|
|
|
|
//! Entry point for BitcoinApplication tests.
|
|
void AppTests::appTests()
|
|
{
|
|
#ifdef Q_OS_MACOS
|
|
if (QApplication::platformName() == "minimal") {
|
|
// Disable for mac on "minimal" platform to avoid crashes inside the Qt
|
|
// framework when it tries to look up unimplemented cocoa functions,
|
|
// and fails to handle returned nulls
|
|
// (https://bugreports.qt.io/browse/QTBUG-49686).
|
|
QWARN("Skipping AppTests on mac build with 'minimal' platform set due to Qt bugs. To run AppTests, invoke "
|
|
"with 'QT_QPA_PLATFORM=cocoa test_bitcoin-qt' on mac, or else use a linux or windows build.");
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
fs::create_directories([] {
|
|
BasicTestingSetup test{CBaseChainParams::REGTEST}; // Create a temp data directory to backup the gui settings to
|
|
return gArgs.GetDataDirNet() / "blocks";
|
|
}());
|
|
|
|
qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");
|
|
m_app.parameterSetup();
|
|
m_app.createOptionsModel(true /* reset settings */);
|
|
QScopedPointer<const NetworkStyle> style(NetworkStyle::instantiate(Params().NetworkIDString()));
|
|
m_app.setupPlatformStyle();
|
|
m_app.createWindow(style.data());
|
|
connect(&m_app, &BitcoinApplication::windowShown, this, &AppTests::guiTests);
|
|
expectCallback("guiTests");
|
|
m_app.baseInitialize();
|
|
m_app.requestInitialize();
|
|
m_app.exec();
|
|
m_app.requestShutdown();
|
|
m_app.exec();
|
|
|
|
// Reset global state to avoid interfering with later tests.
|
|
LogInstance().DisconnectTestLogger();
|
|
AbortShutdown();
|
|
}
|
|
|
|
//! Entry point for BitcoinGUI tests.
|
|
void AppTests::guiTests(BitcoinGUI* window)
|
|
{
|
|
HandleCallback callback{"guiTests", *this};
|
|
connect(window, &BitcoinGUI::consoleShown, this, &AppTests::consoleTests);
|
|
expectCallback("consoleTests");
|
|
QAction* action = window->findChild<QAction*>("openRPCConsoleAction");
|
|
action->activate(QAction::Trigger);
|
|
}
|
|
|
|
//! Entry point for RPCConsole tests.
|
|
void AppTests::consoleTests(RPCConsole* console)
|
|
{
|
|
HandleCallback callback{"consoleTests", *this};
|
|
TestRpcCommand(console);
|
|
}
|
|
|
|
//! Destructor to shut down after the last expected callback completes.
|
|
AppTests::HandleCallback::~HandleCallback()
|
|
{
|
|
auto& callbacks = m_app_tests.m_callbacks;
|
|
auto it = callbacks.find(m_callback);
|
|
assert(it != callbacks.end());
|
|
callbacks.erase(it);
|
|
if (callbacks.empty()) {
|
|
m_app_tests.m_app.exit(0);
|
|
}
|
|
}
|