diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2015-05-27 09:37:02 +0200 |
---|---|---|
committer | Marco Bubke <marco.bubke@theqtcompany.com> | 2015-05-27 14:44:50 +0000 |
commit | 10a1a70532e4ef01ea8134ff24a8bceb0318ae47 (patch) | |
tree | 4009620ee498dcc094384e09e8fb53d4613bd892 | |
parent | 455d149798eed65e11a0c3688800cb61a5cad91a (diff) | |
download | qt-creator-10a1a70532e4ef01ea8134ff24a8bceb0318ae47.tar.gz |
CodeModelBackEnd: Restart backend on QProcess::finished
Change-Id: Ib017f87cb4c470678ecb9e25b2b253c7a366b658
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
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<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), + this, + &ConnectionClient::restartProcess); + } +} + +void ConnectionClient::disconnectProcessFinished() const +{ + if (process_) { + disconnect(process_.get(), + static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&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<QProcess> 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 <QString> #include <QBuffer> +#include <QProcess> #include <QSignalSpy> -#include <vector> +#include <QString> #include <QVariant> +#include <vector> + #include "gtest-qt-printing.h" #include <cmbendcommand.h> @@ -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")); |