diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index ec3c1e2f490..059f6ac1e06 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include #include @@ -64,6 +65,7 @@ #include #include #include +#include #include #include #include @@ -317,6 +319,7 @@ void TestRunner::resetInternalPointers() void TestRunner::prepareToRunTests(TestRunMode mode) { QTC_ASSERT(!m_executingTests, return); + m_skipTargetsCheck = false; m_runMode = mode; ProjectExplorer::Internal::ProjectExplorerSettings projectExplorerSettings = ProjectExplorerPlugin::projectExplorerSettings(); @@ -448,6 +451,15 @@ int TestRunner::precheckTestConfigurations() return testCaseCount; } +void TestRunner::onBuildSystemUpdated() +{ + Target *target = SessionManager::startupTarget(); + if (QTC_GUARD(target)) + disconnect(target, &Target::buildSystemUpdated, this, &TestRunner::onBuildSystemUpdated); + m_skipTargetsCheck = true; + runOrDebugTests(); +} + void TestRunner::runTests() { QList toBeRemoved; @@ -619,8 +631,34 @@ void TestRunner::debugTests() AutotestPlugin::popupResultsPane(); } +static bool executablesEmpty() +{ + Target *target = SessionManager::startupTarget(); + const QList configs = target->runConfigurations(); + QTC_ASSERT(!configs.isEmpty(), return false); + if (auto execAspect = configs.first()->aspect()) + return execAspect->executable().isEmpty(); + return false; +} + void TestRunner::runOrDebugTests() { + if (!m_skipTargetsCheck) { + if (executablesEmpty()) { + m_skipTargetsCheck = true; + Target * target = SessionManager::startupTarget(); + QTimer::singleShot(5000, this, [this, target = QPointer(target)]() { + if (target) { + disconnect(target, &Target::buildSystemUpdated, + this, &TestRunner::onBuildSystemUpdated); + } + runOrDebugTests(); + }); + connect(target, &Target::buildSystemUpdated, this, &TestRunner::onBuildSystemUpdated); + return; + } + } + switch (m_runMode) { case TestRunMode::Run: case TestRunMode::RunWithoutDeploy: diff --git a/src/plugins/autotest/testrunner.h b/src/plugins/autotest/testrunner.h index 4dfb744a256..a33f6248e1a 100644 --- a/src/plugins/autotest/testrunner.h +++ b/src/plugins/autotest/testrunner.h @@ -93,6 +93,8 @@ private: void runOrDebugTests(); void reportResult(ResultType type, const QString &description); explicit TestRunner(QObject *parent = nullptr); + bool postponeTestRunWithEmptyExecutable(ProjectExplorer::Project *project); + void onBuildSystemUpdated(); QFutureWatcher m_futureWatcher; QFutureInterface *m_fakeFutureInterface = nullptr; @@ -111,6 +113,7 @@ private: QMetaObject::Connection m_finishDebugConnect; // temporarily used for handling of switching the current target QMetaObject::Connection m_targetConnect; + bool m_skipTargetsCheck = false; }; class RunConfigurationSelectionDialog : public QDialog