Skip to content

Commit 58ce961

Browse files
committed
qml: interrupt node before GUI shutdown
1 parent 3e5ac27 commit 58ce961

3 files changed

Lines changed: 39 additions & 4 deletions

File tree

qml/models/nodemodel.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ void NodeModel::requestShutdown()
423423
}
424424
m_shutdown_requested = true;
425425
stopShutdownPolling();
426+
m_node.startShutdown();
426427
Q_EMIT requestedShutdown();
427428
}
428429

test/functional/qml_wallet_test_lib.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,19 @@ def start_gui(self, reset_gui_settings=False, extra_args=None, cwd=None):
242242

243243
def stop_gui(self):
244244
if self.gui_process and self.gui_process.poll() is None:
245-
self.gui_process.send_signal(signal.SIGTERM)
246245
try:
247-
self.gui_process.wait(timeout=10)
246+
rpc_call(self.gui_rpc_port, "stop")
247+
except Exception:
248+
pass
249+
try:
250+
self.gui_process.wait(timeout=20)
248251
except subprocess.TimeoutExpired:
249-
self.gui_process.kill()
250-
self.gui_process.wait()
252+
self.gui_process.send_signal(signal.SIGTERM)
253+
try:
254+
self.gui_process.wait(timeout=10)
255+
except subprocess.TimeoutExpired:
256+
self.gui_process.kill()
257+
self.gui_process.wait()
251258
self.gui_process = None
252259
if self.driver:
253260
self.driver.close()

test/test_nodemodel.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ private Q_SLOTS:
166166
void nodeInformationRowsExposeDiagnostics();
167167
void initEmitsRequestedInitialize();
168168
void initGuardBlocksSecondEmission();
169+
void shutdownPollingStartsShutdownBeforeEmittingSignal();
169170
};
170171

171172
void NodeModelTests::refreshMempoolInfoUpdatesProperties()
@@ -1384,6 +1385,32 @@ void NodeModelTests::initGuardBlocksSecondEmission()
13841385
QCOMPARE(spy.count(), 1);
13851386
}
13861387

1388+
void NodeModelTests::shutdownPollingStartsShutdownBeforeEmittingSignal()
1389+
{
1390+
NiceMock<MockNode> node;
1391+
MempoolState mempool;
1392+
InstallDefaultHandlers(node);
1393+
InstallMempoolGetters(node, mempool);
1394+
ON_CALL(node, shutdownRequested()).WillByDefault(Return(true));
1395+
1396+
NodeModel model{node};
1397+
WaitForInitialMempoolRefresh(mempool);
1398+
1399+
QSignalSpy shutdown_spy{&model, &NodeModel::requestedShutdown};
1400+
bool started_before_signal{false};
1401+
EXPECT_CALL(node, startShutdown()).WillOnce(Invoke([&] {
1402+
started_before_signal = shutdown_spy.count() == 0;
1403+
}));
1404+
1405+
model.startShutdownPolling();
1406+
1407+
QTRY_COMPARE_WITH_TIMEOUT(shutdown_spy.count(), 1, ASYNC_TIMEOUT_MS);
1408+
QVERIFY(started_before_signal);
1409+
1410+
model.requestShutdown();
1411+
QCOMPARE(shutdown_spy.count(), 1);
1412+
}
1413+
13871414
#ifdef BITCOINQML_NO_TEST_MAIN
13881415
BITCOINQML_REGISTER_QT_TEST(NodeModelTests)
13891416
#else

0 commit comments

Comments
 (0)