Merge #11625: Add BitcoinApplication & RPCConsole tests
7e4bd19785Add BitcoinApplication & RPCConsole tests (Russell Yanofsky)ca20b65cc0Move BitcoinApplication to header so it can be tested (Russell Yanofsky) Pull request description: Add test coverage for Qt initialization code & basic RPC console functionality Motivation for this change was a bug in #11603 which existing tests failed to catch. Tree-SHA512: f66546ffc84b8e07679c66a73b265023fbf6a0cb8f24f1606a5fcae2dd3b4dc7b2c6d26c69dedcec53398a26ef17c4d5fb28c055698fa6e45e89aa2995cefe2f
This commit is contained in:
+18
-109
@@ -6,6 +6,7 @@
|
||||
#include <config/bitcoin-config.h>
|
||||
#endif
|
||||
|
||||
#include <qt/bitcoin.h>
|
||||
#include <qt/bitcoingui.h>
|
||||
|
||||
#include <chainparams.h>
|
||||
@@ -71,11 +72,6 @@ Q_DECLARE_METATYPE(bool*)
|
||||
Q_DECLARE_METATYPE(CAmount)
|
||||
Q_DECLARE_METATYPE(uint256)
|
||||
|
||||
/** Translate string to current locale using Qt. */
|
||||
const std::function<std::string(const char*)> G_TRANSLATION_FUN = [](const char* psz) {
|
||||
return QCoreApplication::translate("bitcoin-core", psz).toStdString();
|
||||
};
|
||||
|
||||
static QString GetLangTerritory()
|
||||
{
|
||||
QSettings settings;
|
||||
@@ -140,101 +136,6 @@ void DebugMessageHandler(QtMsgType type, const QMessageLogContext& context, cons
|
||||
}
|
||||
}
|
||||
|
||||
/** Class encapsulating Bitcoin Core startup and shutdown.
|
||||
* Allows running startup and shutdown in a different thread from the UI thread.
|
||||
*/
|
||||
class BitcoinCore: public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BitcoinCore(interfaces::Node& node);
|
||||
|
||||
public Q_SLOTS:
|
||||
void initialize();
|
||||
void shutdown();
|
||||
|
||||
Q_SIGNALS:
|
||||
void initializeResult(bool success);
|
||||
void shutdownResult();
|
||||
void runawayException(const QString &message);
|
||||
|
||||
private:
|
||||
/// Pass fatal exception message to UI thread
|
||||
void handleRunawayException(const std::exception *e);
|
||||
|
||||
interfaces::Node& m_node;
|
||||
};
|
||||
|
||||
/** Main Bitcoin application object */
|
||||
class BitcoinApplication: public QApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BitcoinApplication(interfaces::Node& node, int &argc, char **argv);
|
||||
~BitcoinApplication();
|
||||
|
||||
#ifdef ENABLE_WALLET
|
||||
/// Create payment server
|
||||
void createPaymentServer();
|
||||
#endif
|
||||
/// parameter interaction/setup based on rules
|
||||
void parameterSetup();
|
||||
/// Create options model
|
||||
void createOptionsModel(bool resetSettings);
|
||||
/// Create main window
|
||||
void createWindow(const NetworkStyle *networkStyle);
|
||||
/// Create splash screen
|
||||
void createSplashScreen(const NetworkStyle *networkStyle);
|
||||
|
||||
/// Request core initialization
|
||||
void requestInitialize();
|
||||
/// Request core shutdown
|
||||
void requestShutdown();
|
||||
|
||||
/// Get process return value
|
||||
int getReturnValue() const { return returnValue; }
|
||||
|
||||
/// Get window identifier of QMainWindow (BitcoinGUI)
|
||||
WId getMainWinId() const;
|
||||
|
||||
/// Setup platform style
|
||||
void setupPlatformStyle();
|
||||
|
||||
public Q_SLOTS:
|
||||
void initializeResult(bool success);
|
||||
void shutdownResult();
|
||||
/// Handle runaway exceptions. Shows a message box with the problem and quits the program.
|
||||
void handleRunawayException(const QString &message);
|
||||
void addWallet(WalletModel* walletModel);
|
||||
void removeWallet();
|
||||
|
||||
Q_SIGNALS:
|
||||
void requestedInitialize();
|
||||
void requestedShutdown();
|
||||
void stopThread();
|
||||
void splashFinished();
|
||||
|
||||
private:
|
||||
QThread *coreThread;
|
||||
interfaces::Node& m_node;
|
||||
OptionsModel *optionsModel;
|
||||
ClientModel *clientModel;
|
||||
BitcoinGUI *window;
|
||||
QTimer *pollShutdownTimer;
|
||||
#ifdef ENABLE_WALLET
|
||||
PaymentServer* paymentServer;
|
||||
std::vector<WalletModel*> m_wallet_models;
|
||||
std::unique_ptr<interfaces::Handler> m_handler_load_wallet;
|
||||
#endif
|
||||
int returnValue;
|
||||
const PlatformStyle *platformStyle;
|
||||
std::unique_ptr<QWidget> shutdownWindow;
|
||||
|
||||
void startThread();
|
||||
};
|
||||
|
||||
#include <qt/bitcoin.moc>
|
||||
|
||||
BitcoinCore::BitcoinCore(interfaces::Node& node) :
|
||||
QObject(), m_node(node)
|
||||
{
|
||||
@@ -358,6 +259,11 @@ void BitcoinApplication::createSplashScreen(const NetworkStyle *networkStyle)
|
||||
connect(this, &BitcoinApplication::requestedShutdown, splash, &QWidget::close);
|
||||
}
|
||||
|
||||
bool BitcoinApplication::baseInitialize()
|
||||
{
|
||||
return m_node.baseInitialize();
|
||||
}
|
||||
|
||||
void BitcoinApplication::startThread()
|
||||
{
|
||||
if(coreThread)
|
||||
@@ -467,7 +373,7 @@ void BitcoinApplication::initializeResult(bool success)
|
||||
#ifdef ENABLE_BIP70
|
||||
PaymentServer::LoadRootCAs();
|
||||
#endif
|
||||
paymentServer->setOptionsModel(optionsModel);
|
||||
if (paymentServer) paymentServer->setOptionsModel(optionsModel);
|
||||
#endif
|
||||
|
||||
clientModel = new ClientModel(m_node, optionsModel);
|
||||
@@ -496,16 +402,19 @@ void BitcoinApplication::initializeResult(bool success)
|
||||
window->show();
|
||||
}
|
||||
Q_EMIT splashFinished();
|
||||
Q_EMIT windowShown(window);
|
||||
|
||||
#ifdef ENABLE_WALLET
|
||||
// Now that initialization/startup is done, process any command-line
|
||||
// bitcoin: URIs or payment requests:
|
||||
connect(paymentServer, &PaymentServer::receivedPaymentRequest, window, &BitcoinGUI::handlePaymentRequest);
|
||||
connect(window, &BitcoinGUI::receivedURI, paymentServer, &PaymentServer::handleURIOrFile);
|
||||
connect(paymentServer, &PaymentServer::message, [this](const QString& title, const QString& message, unsigned int style) {
|
||||
window->message(title, message, style);
|
||||
});
|
||||
QTimer::singleShot(100, paymentServer, &PaymentServer::uiReady);
|
||||
if (paymentServer) {
|
||||
connect(paymentServer, &PaymentServer::receivedPaymentRequest, window, &BitcoinGUI::handlePaymentRequest);
|
||||
connect(window, &BitcoinGUI::receivedURI, paymentServer, &PaymentServer::handleURIOrFile);
|
||||
connect(paymentServer, &PaymentServer::message, [this](const QString& title, const QString& message, unsigned int style) {
|
||||
window->message(title, message, style);
|
||||
});
|
||||
QTimer::singleShot(100, paymentServer, &PaymentServer::uiReady);
|
||||
}
|
||||
#endif
|
||||
pollShutdownTimer->start(200);
|
||||
} else {
|
||||
@@ -548,7 +457,7 @@ static void SetupUIArgs()
|
||||
}
|
||||
|
||||
#ifndef BITCOIN_QT_TEST
|
||||
int main(int argc, char *argv[])
|
||||
int GuiMain(int argc, char* argv[])
|
||||
{
|
||||
#ifdef WIN32
|
||||
util::WinCmdLineArgs winArgs;
|
||||
@@ -706,7 +615,7 @@ int main(int argc, char *argv[])
|
||||
// Perform base initialization before spinning up initialization/shutdown thread
|
||||
// This is acceptable because this function only contains steps that are quick to execute,
|
||||
// so the GUI thread won't be held up.
|
||||
if (node->baseInitialize()) {
|
||||
if (app.baseInitialize()) {
|
||||
app.requestInitialize();
|
||||
#if defined(Q_OS_WIN)
|
||||
WinShutdownMonitor::registerShutdownBlockReason(QObject::tr("%1 didn't yet exit safely...").arg(QObject::tr(PACKAGE_NAME)), (HWND)app.getMainWinId());
|
||||
|
||||
Reference in New Issue
Block a user