Try to make TestShellClient::testUnresponsiveWindow more robust

Summary:
When looking at the test results on build.kde.org we see this is the
test which fails most often and it's always at the same line of code.

So I just had a look with the thought: "what's special about this code,
why could it fail?"

Looking at it we start an external process which is supposed to connect
to KWin. We wait for the process to start and then wait for the shell
client added. This assumes that at the time we handle the wait for
started the connection of the window has not happened yet.

Waiting for the process in a blocking way, might make the process fail
to connect to the Wayland session, so this is changed to not block and
instead use a signal.

Reviewers: #kwin

Subscribers: kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D17748
This commit is contained in:
Martin Flöser 2018-12-23 07:58:29 +01:00
parent d49642ca15
commit feb1d443f1

View file

@ -982,11 +982,15 @@ void TestShellClient::testUnresponsiveWindow()
process->setProcessEnvironment(env); process->setProcessEnvironment(env);
process->setProcessChannelMode(QProcess::ForwardedChannels); process->setProcessChannelMode(QProcess::ForwardedChannels);
process->setProgram(kill); process->setProgram(kill);
QSignalSpy processStartedSpy{process.data(), &QProcess::started};
QVERIFY(processStartedSpy.isValid());
process->start(); process->start();
QVERIFY(process->waitForStarted()); QVERIFY(processStartedSpy.wait());
AbstractClient *killClient = nullptr; AbstractClient *killClient = nullptr;
QVERIFY(shellClientAddedSpy.wait()); if (shellClientAddedSpy.isEmpty()) {
QVERIFY(shellClientAddedSpy.wait());
}
killClient = shellClientAddedSpy.first().first().value<AbstractClient*>(); killClient = shellClientAddedSpy.first().first().value<AbstractClient*>();
QSignalSpy unresponsiveSpy(killClient, &AbstractClient::unresponsiveChanged); QSignalSpy unresponsiveSpy(killClient, &AbstractClient::unresponsiveChanged);
QSignalSpy killedSpy(process.data(), static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished)); QSignalSpy killedSpy(process.data(), static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished));