diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-04-16 10:27:59 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2014-04-16 11:20:28 +0200 |
commit | f103f283c2c2d488877e7159b4b8b8f8d3ae1976 (patch) | |
tree | 69f417be2546ea2f0bf0c6ef575ee260773a2b1f /tests | |
parent | 097aabb9ad63e716f1bd3f02964bfab6d4bb05b2 (diff) |
Prevent user code from hanging qbs during resolving.
Long-running commands are handled already, but badly written project
files could still hang qbs with e.g. infinite JS loops on the right
hand side of a binding. Such code can now also be interrupted.
Change-Id: Ie0d114bd37d540e764d5ec5bb323c91bfd64a67a
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/api/testdata/infinite-loop-resolving/project.qbs | 5 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 18 | ||||
-rw-r--r-- | tests/auto/api/tst_api.h | 5 |
3 files changed, 24 insertions, 4 deletions
diff --git a/tests/auto/api/testdata/infinite-loop-resolving/project.qbs b/tests/auto/api/testdata/infinite-loop-resolving/project.qbs new file mode 100644 index 000000000..b690f5041 --- /dev/null +++ b/tests/auto/api/testdata/infinite-loop-resolving/project.qbs @@ -0,0 +1,5 @@ +import qbs + +Product { + type: { while (true); return "Haha!"; } +} diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 13af57c4a..2e441d220 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -429,7 +429,7 @@ void TestApi::fileTagsFilterOverride() QVERIFY(installableFiles.first().targetDirectory().contains("habicht")); } -void TestApi::infiniteLoop() +void TestApi::infiniteLoopBuilding() { QFETCH(QString, projectDirName); qbs::SetupProjectParameters setupParams = defaultSetupParameters(); @@ -446,13 +446,27 @@ void TestApi::infiniteLoop() QVERIFY(waitForFinished(buildJob.data(), 3000)); } -void TestApi::infiniteLoop_data() +void TestApi::infiniteLoopBuilding_data() { QTest::addColumn<QString>("projectDirName"); QTest::newRow("JS Command") << QString("infinite-loop-js"); QTest::newRow("Process Command") << QString("infinite-loop-process"); } +void TestApi::infiniteLoopResolving() +{ + qbs::SetupProjectParameters setupParams = defaultSetupParameters(); + const QString projectDir = QDir::cleanPath(m_workingDataDir + "/infinite-loop-resolving"); + setupParams.setProjectFilePath(projectDir + "/project.qbs"); + setupParams.setBuildRoot(projectDir); + QScopedPointer<qbs::SetupProjectJob> setupJob(qbs::Project::setupProject(setupParams, + m_logSink, 0)); + QTimer::singleShot(1000, setupJob.data(), SLOT(cancel())); + QVERIFY(waitForFinished(setupJob.data(), 3000)); + QVERIFY2(setupJob->error().toString().toLower().contains("cancel"), + qPrintable(setupJob->error().toString())); +} + void TestApi::installableFiles() { qbs::SetupProjectParameters setupParams = defaultSetupParameters(); diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index 6183346ce..9aab60651 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -51,8 +51,9 @@ private slots: void changeContent(); void disabledInstallGroup(); void fileTagsFilterOverride(); - void infiniteLoop(); - void infiniteLoop_data(); + void infiniteLoopBuilding(); + void infiniteLoopBuilding_data(); + void infiniteLoopResolving(); void installableFiles(); void listBuildSystemFiles(); void nonexistingProjectPropertyFromProduct(); |