forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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 {}; }
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user