From 10a1a70532e4ef01ea8134ff24a8bceb0318ae47 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 27 May 2015 09:37:02 +0200 Subject: CodeModelBackEnd: Restart backend on QProcess::finished Change-Id: Ib017f87cb4c470678ecb9e25b2b253c7a366b658 Reviewed-by: Marco Bubke --- src/libs/codemodelbackendipc/connectionclient.cpp | 33 ++++++++++++++++++++-- src/libs/codemodelbackendipc/connectionclient.h | 5 ++++ .../unittest/clientserveroutsideprocess.cpp | 17 +++++++++-- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/libs/codemodelbackendipc/connectionclient.cpp b/src/libs/codemodelbackendipc/connectionclient.cpp index be1dce22bb..b8ff35e490 100644 --- a/src/libs/codemodelbackendipc/connectionclient.cpp +++ b/src/libs/codemodelbackendipc/connectionclient.cpp @@ -67,7 +67,8 @@ ConnectionClient::~ConnectionClient() } bool ConnectionClient::connectToServer() -{localSocket.connectToServer(connectionName()); +{ + localSocket.connectToServer(connectionName()); isInConnectedMode = true; bool isConnected = localSocket.waitForConnected(); if (!isConnected) { @@ -178,6 +179,7 @@ void ConnectionClient::finishProcess() { processAliveTimer.stop(); + disconnectProcessFinished(); endProcess(); disconnectFromServer(); terminateProcess(); @@ -198,6 +200,11 @@ IpcServerProxy &ConnectionClient::serverProxy() return serverProxy_; } +QProcess *ConnectionClient::processForTestOnly() const +{ + return process_.get(); +} + bool ConnectionClient::isProcessIsRunning() const { return process_ && process_->state() == QProcess::Running; @@ -205,12 +212,34 @@ bool ConnectionClient::isProcessIsRunning() const QProcess *ConnectionClient::process() const { - if (!process_) + if (!process_) { process_.reset(new QProcess); + connectProcessFinished(); + } return process_.get(); } +void ConnectionClient::connectProcessFinished() const +{ + if (process_) { + connect(process_.get(), + static_cast(&QProcess::finished), + this, + &ConnectionClient::restartProcess); + } +} + +void ConnectionClient::disconnectProcessFinished() const +{ + if (process_) { + disconnect(process_.get(), + static_cast(&QProcess::finished), + this, + &ConnectionClient::restartProcess); + } +} + const QString &ConnectionClient::processPath() const { return processPath_; diff --git a/src/libs/codemodelbackendipc/connectionclient.h b/src/libs/codemodelbackendipc/connectionclient.h index e1128fc69a..3e336230e4 100644 --- a/src/libs/codemodelbackendipc/connectionclient.h +++ b/src/libs/codemodelbackendipc/connectionclient.h @@ -77,6 +77,8 @@ public: IpcServerProxy &serverProxy(); + QProcess *processForTestOnly() const; + signals: void processRestarted(); @@ -85,7 +87,10 @@ private: void endProcess(); void terminateProcess(); void killProcess(); + QProcess *process() const; + void connectProcessFinished() const; + void disconnectProcessFinished() const; private: mutable std::unique_ptr process_; diff --git a/tests/unit/codemodelbackend/unittest/clientserveroutsideprocess.cpp b/tests/unit/codemodelbackend/unittest/clientserveroutsideprocess.cpp index 5b8b071306..25e2fbf2b7 100644 --- a/tests/unit/codemodelbackend/unittest/clientserveroutsideprocess.cpp +++ b/tests/unit/codemodelbackend/unittest/clientserveroutsideprocess.cpp @@ -33,12 +33,14 @@ #include "gmock/gmock-matchers.h" #include "gmock/gmock.h" -#include #include +#include #include -#include +#include #include +#include + #include "gtest-qt-printing.h" #include @@ -93,7 +95,7 @@ TEST_F(ClientServerOutsideProcess, RestartProcess) ASSERT_TRUE(client.isConnected()); } -TEST_F(ClientServerOutsideProcess, ResetAliveTimer) +TEST_F(ClientServerOutsideProcess, RestartProcessAfterAliveTimeout) { QSignalSpy clientSpy(&client, SIGNAL(processRestarted())); @@ -102,6 +104,15 @@ TEST_F(ClientServerOutsideProcess, ResetAliveTimer) ASSERT_TRUE(clientSpy.wait(100000)); } +TEST_F(ClientServerOutsideProcess, RestartProcessAfterTermination) +{ + QSignalSpy clientSpy(&client, SIGNAL(processRestarted())); + + client.processForTestOnly()->kill(); + + ASSERT_TRUE(clientSpy.wait(100000)); +} + TEST_F(ClientServerOutsideProcess, SendRegisterTranslationUnitForCodeCompletionCommand) { CodeModelBackEnd::FileContainer fileContainer(Utf8StringLiteral("foo"), Utf8StringLiteral("pathToProjectPart.pro")); -- cgit v1.2.1