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