1 /*
2 * SPDX-FileCopyrightText: 2009 Volker Krause <vkrause@kde.org>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7 #include "testrunner.h"
8 #include "akonaditest_debug.h"
9
10 #include <KProcess>
11
TestRunner(const QStringList & args,QObject * parent)12 TestRunner::TestRunner(const QStringList &args, QObject *parent)
13 : QObject(parent)
14 , mArguments(args)
15 , mExitCode(0)
16 , mProcess(nullptr)
17 {
18 }
19
exitCode() const20 int TestRunner::exitCode() const
21 {
22 return mExitCode;
23 }
24
run()25 void TestRunner::run()
26 {
27 qCDebug(AKONADITEST_LOG) << "Starting test" << mArguments;
28 mProcess = new KProcess(this);
29 mProcess->setProgram(mArguments);
30 connect(mProcess, qOverload<int, QProcess::ExitStatus>(&KProcess::finished), this, &TestRunner::processFinished);
31 connect(mProcess, &KProcess::errorOccurred, this, &TestRunner::processError);
32 // environment setup seems to have been done by setuptest globally already
33 mProcess->start();
34 if (!mProcess->waitForStarted()) {
35 qCWarning(AKONADITEST_LOG) << mArguments << "failed to start!";
36 mExitCode = 255;
37 Q_EMIT finished();
38 }
39 }
40
triggerTermination(int exitCode)41 void TestRunner::triggerTermination(int exitCode)
42 {
43 processFinished(exitCode);
44 }
45
processFinished(int exitCode)46 void TestRunner::processFinished(int exitCode)
47 {
48 // Only update the exit code when it is 0. This prevents overwriting a non-zero
49 // value with 0. This can happen when multiple processes finish or triggerTermination
50 // is called after a process has finished.
51 if (mExitCode == 0) {
52 mExitCode = exitCode;
53 qCInfo(AKONADITEST_LOG) << "Test finished with exist code" << exitCode;
54 }
55 Q_EMIT finished();
56 }
57
processError(QProcess::ProcessError error)58 void TestRunner::processError(QProcess::ProcessError error)
59 {
60 qCWarning(AKONADITEST_LOG) << mArguments << "exited with an error:" << error;
61 mExitCode = 255;
62 Q_EMIT finished();
63 }
64
terminate()65 void TestRunner::terminate()
66 {
67 if (mProcess) {
68 mProcess->terminate();
69 }
70 }
71