Autotest: Use QPromise for async calls

Change-Id: I57d2feed36eeb1871b2b00cf7720c48f6a0e81b5
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2023-02-12 01:31:47 +01:00
parent 10a97e1f0e
commit 8285c85725
12 changed files with 30 additions and 33 deletions

View File

@@ -96,7 +96,7 @@ static BoostTestParseResult *createParseResult(const QString &name, const FilePa
} }
bool BoostTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool BoostTestParser::processDocument(QPromise<TestParseResultPtr> &promise,
const FilePath &fileName) const FilePath &fileName)
{ {
CPlusPlus::Document::Ptr doc = document(fileName); CPlusPlus::Document::Ptr doc = document(fileName);
@@ -148,7 +148,7 @@ bool BoostTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futu
locationAndType.m_type, locationAndType.m_type,
tmpInfo); tmpInfo);
currentSuite->children.append(funcResult); currentSuite->children.append(funcResult);
futureInterface.reportResult(TestParseResultPtr(topLevelSuite)); promise.addResult(TestParseResultPtr(topLevelSuite));
} }
} }
return true; return true;

View File

@@ -22,7 +22,7 @@ class BoostTestParser : public CppParser
{ {
public: public:
explicit BoostTestParser(ITestFramework *framework) : CppParser(framework) {} explicit BoostTestParser(ITestFramework *framework) : CppParser(framework) {}
bool processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool processDocument(QPromise<TestParseResultPtr> &promise,
const Utils::FilePath &fileName) override; const Utils::FilePath &fileName) override;
}; };

View File

@@ -91,7 +91,7 @@ static bool hasCatchNames(const CPlusPlus::Document::Ptr &document)
return false; return false;
} }
bool CatchTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool CatchTestParser::processDocument(QPromise<TestParseResultPtr> &promise,
const FilePath &fileName) const FilePath &fileName)
{ {
CPlusPlus::Document::Ptr doc = document(fileName); CPlusPlus::Document::Ptr doc = document(fileName);
@@ -144,7 +144,7 @@ bool CatchTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futu
parseResult->children.append(testCase); parseResult->children.append(testCase);
} }
futureInterface.reportResult(TestParseResultPtr(parseResult)); promise.addResult(TestParseResultPtr(parseResult));
return !foundTests.isEmpty(); return !foundTests.isEmpty();
} }

View File

@@ -23,7 +23,7 @@ class CatchTestParser : public CppParser
public: public:
CatchTestParser(ITestFramework *framework) CatchTestParser(ITestFramework *framework)
: CppParser(framework) {} : CppParser(framework) {}
bool processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool processDocument(QPromise<TestParseResultPtr> &promise,
const Utils::FilePath &fileName) override; const Utils::FilePath &fileName) override;
}; };

View File

@@ -70,7 +70,7 @@ static bool hasGTestNames(const CPlusPlus::Document::Ptr &document)
return false; return false;
} }
bool GTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool GTestParser::processDocument(QPromise<TestParseResultPtr> &promise,
const FilePath &fileName) const FilePath &fileName)
{ {
CPlusPlus::Document::Ptr doc = document(fileName); CPlusPlus::Document::Ptr doc = document(fileName);
@@ -124,7 +124,7 @@ bool GTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureIn
parseResult->children.append(testSet); parseResult->children.append(testSet);
} }
futureInterface.reportResult(TestParseResultPtr(parseResult)); promise.addResult(TestParseResultPtr(parseResult));
} }
return !result.isEmpty(); return !result.isEmpty();
} }

View File

@@ -22,7 +22,7 @@ class GTestParser : public CppParser
{ {
public: public:
explicit GTestParser(ITestFramework *framework) : CppParser(framework) {} explicit GTestParser(ITestFramework *framework) : CppParser(framework) {}
bool processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool processDocument(QPromise<TestParseResultPtr> &futureInterface,
const Utils::FilePath &fileName) override; const Utils::FilePath &fileName) override;
}; };

View File

@@ -9,9 +9,9 @@
#include <cppeditor/cppworkingcopy.h> #include <cppeditor/cppworkingcopy.h>
#include <qmljs/qmljsdocument.h> #include <qmljs/qmljsdocument.h>
#include <QFutureInterface>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
template <class T>
class QPromise;
class QRegularExpression; class QRegularExpression;
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -46,7 +46,7 @@ public:
explicit ITestParser(ITestFramework *framework) : m_framework(framework) {} explicit ITestParser(ITestFramework *framework) : m_framework(framework) {}
virtual ~ITestParser() { } virtual ~ITestParser() { }
virtual void init(const Utils::FilePaths &filesToParse, bool fullParse) = 0; virtual void init(const Utils::FilePaths &filesToParse, bool fullParse) = 0;
virtual bool processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, virtual bool processDocument(QPromise<TestParseResultPtr> &futureInterface,
const Utils::FilePath &fileName) = 0; const Utils::FilePath &fileName) = 0;
virtual QStringList supportedExtensions() const { return {}; } virtual QStringList supportedExtensions() const { return {}; }

View File

@@ -292,7 +292,7 @@ static bool isQObject(const CPlusPlus::Document::Ptr &declaringDoc)
|| file.endsWith("QtCore/qobject.h") || file.endsWith("kernel/qobject.h"); || file.endsWith("QtCore/qobject.h") || file.endsWith("kernel/qobject.h");
} }
bool QtTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool QtTestParser::processDocument(QPromise<TestParseResultPtr> &promise,
const FilePath &fileName) const FilePath &fileName)
{ {
CPlusPlus::Document::Ptr doc = document(fileName); CPlusPlus::Document::Ptr doc = document(fileName);
@@ -325,7 +325,7 @@ bool QtTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureI
data.multipleTestCases = testCase.multipleTestCases; data.multipleTestCases = testCase.multipleTestCases;
QtTestParseResult *parseResult QtTestParseResult *parseResult
= createParseResult(testCase.name, data, projectParts.first()->projectFile); = createParseResult(testCase.name, data, projectParts.first()->projectFile);
futureInterface.reportResult(TestParseResultPtr(parseResult)); promise.addResult(TestParseResultPtr(parseResult));
reported = true; reported = true;
} }
} }

View File

@@ -36,7 +36,7 @@ public:
void init(const Utils::FilePaths &filesToParse, bool fullParse) override; void init(const Utils::FilePaths &filesToParse, bool fullParse) override;
void release() override; void release() override;
bool processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool processDocument(QPromise<TestParseResultPtr> &promise,
const Utils::FilePath &fileName) override; const Utils::FilePath &fileName) override;
private: private:

View File

@@ -196,7 +196,7 @@ QList<Document::Ptr> QuickTestParser::scanDirectoryForQuickTestQmlFiles(const Fi
return foundDocs; return foundDocs;
} }
static bool checkQmlDocumentForQuickTestCode(QFutureInterface<TestParseResultPtr> &futureInterface, static bool checkQmlDocumentForQuickTestCode(QPromise<TestParseResultPtr> &promise,
const Document::Ptr &qmlJSDoc, const Document::Ptr &qmlJSDoc,
ITestFramework *framework, ITestFramework *framework,
const FilePath &proFile = {}, const FilePath &proFile = {},
@@ -240,12 +240,12 @@ static bool checkQmlDocumentForQuickTestCode(QFutureInterface<TestParseResultPtr
parseResult->children.append(funcResult); parseResult->children.append(funcResult);
} }
futureInterface.reportResult(TestParseResultPtr(parseResult)); promise.addResult(TestParseResultPtr(parseResult));
} }
return true; return true;
} }
bool QuickTestParser::handleQtQuickTest(QFutureInterface<TestParseResultPtr> &futureInterface, bool QuickTestParser::handleQtQuickTest(QPromise<TestParseResultPtr> &promise,
CPlusPlus::Document::Ptr document, CPlusPlus::Document::Ptr document,
ITestFramework *framework) ITestFramework *framework)
{ {
@@ -263,17 +263,14 @@ bool QuickTestParser::handleQtQuickTest(QFutureInterface<TestParseResultPtr> &fu
if (srcDir.isEmpty()) if (srcDir.isEmpty())
return false; return false;
if (futureInterface.isCanceled()) if (promise.isCanceled())
return false; return false;
const QList<Document::Ptr> qmlDocs = scanDirectoryForQuickTestQmlFiles(srcDir); const QList<Document::Ptr> qmlDocs = scanDirectoryForQuickTestQmlFiles(srcDir);
bool result = false; bool result = false;
for (const Document::Ptr &qmlJSDoc : qmlDocs) { for (const Document::Ptr &qmlJSDoc : qmlDocs) {
if (futureInterface.isCanceled()) if (promise.isCanceled())
break; break;
result |= checkQmlDocumentForQuickTestCode(futureInterface, result |= checkQmlDocumentForQuickTestCode(promise, qmlJSDoc, framework, proFile,
qmlJSDoc,
framework,
proFile,
m_checkForDerivedTests); m_checkForDerivedTests);
} }
return result; return result;
@@ -370,7 +367,7 @@ void QuickTestParser::release()
CppParser::release(); CppParser::release();
} }
bool QuickTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool QuickTestParser::processDocument(QPromise<TestParseResultPtr> &promise,
const FilePath &fileName) const FilePath &fileName)
{ {
if (fileName.endsWith(".qml")) { if (fileName.endsWith(".qml")) {
@@ -378,7 +375,7 @@ bool QuickTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futu
if (proFile.isEmpty()) if (proFile.isEmpty())
return false; return false;
Document::Ptr qmlJSDoc = m_qmlSnapshot.document(fileName); Document::Ptr qmlJSDoc = m_qmlSnapshot.document(fileName);
return checkQmlDocumentForQuickTestCode(futureInterface, return checkQmlDocumentForQuickTestCode(promise,
qmlJSDoc, qmlJSDoc,
framework(), framework(),
proFile, proFile,
@@ -389,7 +386,7 @@ bool QuickTestParser::processDocument(QFutureInterface<TestParseResultPtr> &futu
if (cppdoc.isNull() || !includesQtQuickTest(cppdoc, m_cppSnapshot)) if (cppdoc.isNull() || !includesQtQuickTest(cppdoc, m_cppSnapshot))
return false; return false;
return handleQtQuickTest(futureInterface, cppdoc, framework()); return handleQtQuickTest(promise, cppdoc, framework());
} }
FilePath QuickTestParser::projectFileForMainCppFile(const FilePath &fileName) const FilePath QuickTestParser::projectFileForMainCppFile(const FilePath &fileName) const

View File

@@ -26,13 +26,13 @@ public:
explicit QuickTestParser(ITestFramework *framework); explicit QuickTestParser(ITestFramework *framework);
void init(const Utils::FilePaths &filesToParse, bool fullParse) override; void init(const Utils::FilePaths &filesToParse, bool fullParse) override;
void release() override; void release() override;
bool processDocument(QFutureInterface<TestParseResultPtr> &futureInterface, bool processDocument(QPromise<TestParseResultPtr> &promise,
const Utils::FilePath &fileName) override; const Utils::FilePath &fileName) override;
Utils::FilePath projectFileForMainCppFile(const Utils::FilePath &fileName) const; Utils::FilePath projectFileForMainCppFile(const Utils::FilePath &fileName) const;
QStringList supportedExtensions() const override { return {"qml"}; }; QStringList supportedExtensions() const override { return {"qml"}; };
private: private:
bool handleQtQuickTest(QFutureInterface<TestParseResultPtr> &futureInterface, bool handleQtQuickTest(QPromise<TestParseResultPtr> &promise,
CPlusPlus::Document::Ptr document, CPlusPlus::Document::Ptr document,
ITestFramework *framework); ITestFramework *framework);
void handleDirectoryChanged(const QString &directory); void handleDirectoryChanged(const QString &directory);

View File

@@ -254,13 +254,13 @@ bool TestCodeParser::postponed(const FilePaths &fileList)
QTC_ASSERT(false, return false); // should not happen at all QTC_ASSERT(false, return false); // should not happen at all
} }
static void parseFileForTests(QFutureInterface<TestParseResultPtr> &futureInterface, static void parseFileForTests(QPromise<TestParseResultPtr> &promise,
const QList<ITestParser *> &parsers, const FilePath &fileName) const QList<ITestParser *> &parsers, const FilePath &fileName)
{ {
for (ITestParser *parser : parsers) { for (ITestParser *parser : parsers) {
if (futureInterface.isCanceled()) if (promise.isCanceled())
return; return;
if (parser->processDocument(futureInterface, fileName)) if (parser->processDocument(promise, fileName))
break; break;
} }
} }
@@ -359,7 +359,7 @@ void TestCodeParser::scanForTests(const FilePaths &fileList, const QList<ITestPa
QList<TaskItem> tasks{parallel}; // TODO: use ParallelLimit(N) and add to settings? QList<TaskItem> tasks{parallel}; // TODO: use ParallelLimit(N) and add to settings?
for (const FilePath &file : filteredList) { for (const FilePath &file : filteredList) {
const auto setup = [this, codeParsers, file](AsyncTask<TestParseResultPtr> &async) { const auto setup = [this, codeParsers, file](AsyncTask<TestParseResultPtr> &async) {
async.setAsyncCallData(parseFileForTests, codeParsers, file); async.setConcurrentCallData(parseFileForTests, codeParsers, file);
async.setThreadPool(m_threadPool); async.setThreadPool(m_threadPool);
async.setPriority(QThread::LowestPriority); async.setPriority(QThread::LowestPriority);
async.setFutureSynchronizer(&m_futureSynchronizer); async.setFutureSynchronizer(&m_futureSynchronizer);