Bitcoin Core  26.1.0
P2P Digital Currency
apptests.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 #include <qt/test/apptests.h>
6 
7 #include <chainparams.h>
8 #include <key.h>
9 #include <logging.h>
10 #include <qt/bitcoin.h>
11 #include <qt/bitcoingui.h>
12 #include <qt/networkstyle.h>
13 #include <qt/rpcconsole.h>
14 #include <shutdown.h>
15 #include <test/util/setup_common.h>
16 #include <validation.h>
17 
18 #if defined(HAVE_CONFIG_H)
19 #include <config/bitcoin-config.h>
20 #endif
21 
22 #include <QAction>
23 #include <QLineEdit>
24 #include <QRegularExpression>
25 #include <QScopedPointer>
26 #include <QSignalSpy>
27 #include <QString>
28 #include <QTest>
29 #include <QTextEdit>
30 #include <QtGlobal>
31 #include <QtTest/QtTestWidgets>
32 #include <QtTest/QtTestGui>
33 
34 namespace {
36 QString FindInConsole(const QString& output, const QString& pattern)
37 {
38  const QRegularExpression re(pattern);
39  return re.match(output).captured(1);
40 }
41 
43 void TestRpcCommand(RPCConsole* console)
44 {
45  QTextEdit* messagesWidget = console->findChild<QTextEdit*>("messagesWidget");
46  QLineEdit* lineEdit = console->findChild<QLineEdit*>("lineEdit");
47  QSignalSpy mw_spy(messagesWidget, &QTextEdit::textChanged);
48  QVERIFY(mw_spy.isValid());
49  QTest::keyClicks(lineEdit, "getblockchaininfo");
50  QTest::keyClick(lineEdit, Qt::Key_Return);
51  QVERIFY(mw_spy.wait(1000));
52  QCOMPARE(mw_spy.count(), 4);
53  const QString output = messagesWidget->toPlainText();
54  const QString pattern = QStringLiteral("\"chain\": \"(\\w+)\"");
55  QCOMPARE(FindInConsole(output, pattern), QString("regtest"));
56 }
57 } // namespace
58 
61 {
62 #ifdef Q_OS_MACOS
63  if (QApplication::platformName() == "minimal") {
64  // Disable for mac on "minimal" platform to avoid crashes inside the Qt
65  // framework when it tries to look up unimplemented cocoa functions,
66  // and fails to handle returned nulls
67  // (https://bugreports.qt.io/browse/QTBUG-49686).
68  QWARN("Skipping AppTests on mac build with 'minimal' platform set due to Qt bugs. To run AppTests, invoke "
69  "with 'QT_QPA_PLATFORM=cocoa test_bitcoin-qt' on mac, or else use a linux or windows build.");
70  return;
71  }
72 #endif
73 
74  qRegisterMetaType<interfaces::BlockAndHeaderTipInfo>("interfaces::BlockAndHeaderTipInfo");
76  QVERIFY(m_app.createOptionsModel(/*resetSettings=*/true));
77  QScopedPointer<const NetworkStyle> style(NetworkStyle::instantiate(Params().GetChainType()));
79  m_app.createWindow(style.data());
81  expectCallback("guiTests");
84  m_app.exec();
86  m_app.exec();
87 
88  // Reset global state to avoid interfering with later tests.
90 }
91 
94 {
95  HandleCallback callback{"guiTests", *this};
96  connect(window, &BitcoinGUI::consoleShown, this, &AppTests::consoleTests);
97  expectCallback("consoleTests");
98  QAction* action = window->findChild<QAction*>("openRPCConsoleAction");
99  action->activate(QAction::Trigger);
100 }
101 
104 {
105  HandleCallback callback{"consoleTests", *this};
106  TestRpcCommand(console);
107 }
108 
111 {
112  auto& callbacks = m_app_tests.m_callbacks;
113  auto it = callbacks.find(m_callback);
114  assert(it != callbacks.end());
115  callbacks.erase(it);
116  if (callbacks.empty()) {
117  m_app_tests.m_app.exit(0);
118  }
119 }
Local Bitcoin RPC console.
Definition: rpcconsole.h:43
void setupPlatformStyle()
Setup platform style.
Definition: bitcoin.cpp:232
BCLog::Logger & LogInstance()
Definition: logging.cpp:20
assert(!tx.IsCoinBase())
void consoleShown(RPCConsole *console)
Signal raised when RPC console shown.
void parameterSetup()
parameter interaction/setup based on rules
Definition: bitcoin.cpp:331
void expectCallback(std::string callback)
Add expected callback name to list of pending callbacks.
Definition: apptests.h:30
void requestInitialize()
Request core initialization.
Definition: bitcoin.cpp:346
AppTests & m_app_tests
Definition: apptests.h:36
Bitcoin GUI main class.
Definition: bitcoingui.h:69
~HandleCallback()
Destructor to shut down after the last expected callback completes.
Definition: apptests.cpp:110
static const NetworkStyle * instantiate(const ChainType networkId)
Get style associated with provided network id, or 0 if not known.
void appTests()
Entry point for BitcoinApplication tests.
Definition: apptests.cpp:60
RAII helper to remove no-longer-pending callback.
Definition: apptests.h:33
void guiTests(BitcoinGUI *window)
Entry point for BitcoinGUI tests.
Definition: apptests.cpp:93
std::multiset< std::string > m_callbacks
Set of pending callback names.
Definition: apptests.h:47
std::string m_callback
Definition: apptests.h:35
void windowShown(BitcoinGUI *window)
void DisconnectTestLogger()
Only for testing.
Definition: logging.cpp:87
bool createOptionsModel(bool resetSettings)
Create options model.
Definition: bitcoin.cpp:262
void requestShutdown()
Request core shutdown.
Definition: bitcoin.cpp:353
void createWindow(const NetworkStyle *networkStyle)
Create main window.
Definition: bitcoin.cpp:284
const CChainParams & Params()
Return the currently selected parameters.
void consoleTests(RPCConsole *console)
Entry point for RPCConsole tests.
Definition: apptests.cpp:103
bool baseInitialize()
Basic initialization, before starting initialization/shutdown thread. Return true on success...
Definition: bitcoin.cpp:311
BitcoinApplication & m_app
Bitcoin application.
Definition: apptests.h:41