diff --git a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp index 4ea6d5f26f2..cb2473326e0 100644 --- a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp +++ b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp @@ -206,3 +206,21 @@ int ProcessTestApp::CrashAfterOneSecond::main() doCrash(); return 1; } + +int ProcessTestApp::RecursiveCrashingProcess::main() +{ + const int currentDepth = qEnvironmentVariableIntValue(envVar()); + if (currentDepth == 0) { + QThread::sleep(1); + doCrash(); + return 1; + } + SubProcessConfig subConfig(envVar(), QString::number(currentDepth - 1)); + QtcProcess process; + subConfig.setupSubProcess(&process); + process.start(); + process.waitForFinished(); + if (process.exitStatus() == QProcess::NormalExit) + return process.exitCode(); + return s_crashCode; +} diff --git a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h index 6523f8c8bca..1e338f7a3b2 100644 --- a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h +++ b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h @@ -70,6 +70,7 @@ public: SUB_PROCESS(KillBlockingProcess); SUB_PROCESS(EmitOneErrorOnCrash); SUB_PROCESS(CrashAfterOneSecond); + SUB_PROCESS(RecursiveCrashingProcess); // In order to get a value associated with the certain subprocess use SubProcessClass::envVar(). // The classes above define different custom executables. Inside invokeSubProcess(), called @@ -100,7 +101,7 @@ static const char s_simpleTestData[] = "Test process successfully executed."; static const char s_runBlockingStdOutSubProcessMagicWord[] = "42"; // Expect ending lines detected at '|': -const char s_lineCallbackData[] = +static const char s_lineCallbackData[] = "This is the first line\r\n|" "Here comes the second one\r\n|" "And a line without LF\n|" @@ -117,4 +118,6 @@ enum class BlockType { EventLoop }; +static const int s_crashCode = 123; + Q_DECLARE_METATYPE(BlockType) diff --git a/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp b/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp index 2197c9b7950..449b2e16b8f 100644 --- a/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp +++ b/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp @@ -162,6 +162,7 @@ private slots: void flushFinishedWhileWaitingForReadyRead(); void emitOneErrorOnCrash(); void crashAfterOneSecond(); + void recursiveCrashingProcess(); void cleanupTestCase(); @@ -1206,6 +1207,20 @@ void tst_QtcProcess::crashAfterOneSecond() QCOMPARE(process.error(), QProcess::Crashed); } +void tst_QtcProcess::recursiveCrashingProcess() +{ + const int recursionDepth = 5; // must be at least 1 + SubProcessConfig subConfig(ProcessTestApp::RecursiveCrashingProcess::envVar(), + QString::number(recursionDepth)); + TestProcess process; + subConfig.setupSubProcess(&process); + process.start(); + QVERIFY(process.waitForStarted(1000)); + QVERIFY(process.waitForFinished(3000)); + QCOMPARE(process.state(), QProcess::NotRunning); + QCOMPARE(process.exitStatus(), QProcess::NormalExit); + QCOMPARE(process.exitCode(), s_crashCode); +} QTEST_MAIN(tst_QtcProcess) #include "tst_qtcprocess.moc"