diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 7efe87ad677..a4c615f37c4 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -1166,7 +1166,9 @@ qint64 QtcProcess::processId() const bool QtcProcess::waitForStarted(int msecs) { QTC_ASSERT(d->m_process, return false); - if (d->m_state != QProcess::Starting) + if (d->m_state == QProcess::Running) + return true; + if (d->m_state == QProcess::NotRunning) return false; return s_waitForStarted.measureAndRun(&ProcessInterface::waitForStarted, d->m_process, msecs); } diff --git a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp index 39fe59ed209..16953222186 100644 --- a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp +++ b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.cpp @@ -106,6 +106,14 @@ void SubProcessConfig::setupSubProcess(QtcProcess *subProcess) subProcess->setCommand(CommandLine(filePath, {})); } +void SubProcessConfig::setupSubProcess(QProcess *subProcess) +{ + subProcess->setProcessEnvironment(m_environment.toProcessEnvironment()); + subProcess->setProgram(FilePath::fromString(s_pathToProcessTestApp + + QLatin1String("/processtestapp")).withExecutableSuffix().toString()); +} + + static void doCrash() { qFatal("The application has crashed purposefully!"); diff --git a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h index 0ad08d45164..b301d65ab5c 100644 --- a/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h +++ b/tests/auto/utils/qtcprocess/processtestapp/processtestapp.h @@ -29,6 +29,10 @@ #include #include +QT_BEGIN_NAMESPACE +class QProcess; +QT_END_NAMESPACE + namespace Utils { class QtcProcess; } #define SUB_PROCESS(SubProcessClass)\ @@ -91,6 +95,7 @@ class SubProcessConfig public: SubProcessConfig(const char *envVar, const QString &envVal); void setupSubProcess(Utils::QtcProcess *subProcess); + void setupSubProcess(QProcess *subProcess); static void setPathToProcessTestApp(const QString &path); diff --git a/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp b/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp index 3a3d01e20e1..778c1f5a848 100644 --- a/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp +++ b/tests/auto/utils/qtcprocess/tst_qtcprocess.cpp @@ -151,6 +151,8 @@ private slots: void runBlockingStdOut_data(); void runBlockingStdOut(); void lineCallback(); + void waitForStartedAfterStarted(); + void waitForStartedAfterStarted2(); void waitForStartedAndFinished(); void notRunningAfterStartingNonExistingProgram(); void channelForwarding_data(); @@ -965,6 +967,47 @@ void tst_QtcProcess::lineCallback() QCOMPARE(lineNumber, lines.size()); } +void tst_QtcProcess::waitForStartedAfterStarted() +{ + SubProcessConfig subConfig(ProcessTestApp::SimpleTest::envVar(), {}); + TestProcess process; + subConfig.setupSubProcess(&process); + + bool started = false; + bool waitForStartedResult = false; + connect(&process, &QtcProcess::started, this, [&] { + started = true; + waitForStartedResult = process.waitForStarted(); + }); + + process.start(); + QVERIFY(process.waitForFinished()); + QVERIFY(started); + QVERIFY(waitForStartedResult); + QVERIFY(!process.waitForStarted()); +} + +// This version is using QProcess +void tst_QtcProcess::waitForStartedAfterStarted2() +{ + SubProcessConfig subConfig(ProcessTestApp::SimpleTest::envVar(), {}); + QProcess process; + subConfig.setupSubProcess(&process); + + bool started = false; + bool waitForStartedResult = false; + connect(&process, &QProcess::started, this, [&] { + started = true; + waitForStartedResult = process.waitForStarted(); + }); + + process.start(); + QVERIFY(process.waitForFinished()); + QVERIFY(started); + QVERIFY(waitForStartedResult); + QVERIFY(!process.waitForStarted()); +} + void tst_QtcProcess::waitForStartedAndFinished() { SubProcessConfig subConfig(ProcessTestApp::SimpleTest::envVar(), {});