summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-05-27 09:37:02 +0200
committerMarco Bubke <marco.bubke@theqtcompany.com>2015-05-27 14:44:50 +0000
commit10a1a70532e4ef01ea8134ff24a8bceb0318ae47 (patch)
tree4009620ee498dcc094384e09e8fb53d4613bd892
parent455d149798eed65e11a0c3688800cb61a5cad91a (diff)
downloadqt-creator-10a1a70532e4ef01ea8134ff24a8bceb0318ae47.tar.gz
CodeModelBackEnd: Restart backend on QProcess::finished
Change-Id: Ib017f87cb4c470678ecb9e25b2b253c7a366b658 Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
-rw-r--r--src/libs/codemodelbackendipc/connectionclient.cpp33
-rw-r--r--src/libs/codemodelbackendipc/connectionclient.h5
-rw-r--r--tests/unit/codemodelbackend/unittest/clientserveroutsideprocess.cpp17
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"));