aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-04-16 10:27:59 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-04-16 11:20:28 +0200
commitf103f283c2c2d488877e7159b4b8b8f8d3ae1976 (patch)
tree69f417be2546ea2f0bf0c6ef575ee260773a2b1f /tests
parent097aabb9ad63e716f1bd3f02964bfab6d4bb05b2 (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.qbs5
-rw-r--r--tests/auto/api/tst_api.cpp18
-rw-r--r--tests/auto/api/tst_api.h5
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();