From 5ffdee71e50e9593794e66139baa0c355e0bd88e Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 11 Jul 2014 17:19:04 +0200 Subject: Put a system-wide lock on the build directory. So that two qbs instances can't overwrite each other's build graphs. In practice, this is probably most relevant for IDEs, as these hold a build graph for potentially long periods of time. Facilitates QLockFile that was introduced in Qt 5.1. For older Qt versions, no locking happens. Task-number: QBS-162 Change-Id: Ib598617fb1742eb57b6a017f40b9631d1d54e627 Reviewed-by: Joerg Bornemann --- .../api/testdata/buildgraph-locking/project.qbs | 4 +++ tests/auto/api/tst_api.cpp | 31 +++++++++++++++++++++- tests/auto/api/tst_api.h | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/auto/api/testdata/buildgraph-locking/project.qbs (limited to 'tests') diff --git a/tests/auto/api/testdata/buildgraph-locking/project.qbs b/tests/auto/api/testdata/buildgraph-locking/project.qbs new file mode 100644 index 000000000..e08b008bc --- /dev/null +++ b/tests/auto/api/testdata/buildgraph-locking/project.qbs @@ -0,0 +1,4 @@ +import qbs + +Project { +} diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 73e9bb1b6..db0fc4d41 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -120,6 +120,25 @@ void printProjectData(const qbs::ProjectData &project) } } + +void TestApi::buildGraphLocking() +{ + qbs::SetupProjectParameters setupParams = defaultSetupParameters(); + const QString projectDirPath = QDir::cleanPath(m_workingDataDir + "/buildgraph-locking"); + setupParams.setProjectFilePath(projectDirPath + "/project.qbs"); + QScopedPointer setupJob(qbs::Project::setupProject(setupParams, + m_logSink, 0)); + waitForFinished(setupJob.data()); + QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); + const qbs::Project project = setupJob->project(); + Q_UNUSED(project); + setupJob.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); + waitForFinished(setupJob.data()); + QVERIFY(setupJob->error().hasError()); + QVERIFY2(setupJob->error().toString().contains("lock"), + qPrintable(setupJob->error().toString())); +} + void TestApi::buildSingleFile() { qbs::SetupProjectParameters setupParams = defaultSetupParameters(); @@ -330,6 +349,8 @@ void TestApi::changeContent() // Now check whether the data updates were done correctly. projectData = project.projectData(); + buildJob.reset(0); + project = qbs::Project(); job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -373,6 +394,9 @@ void TestApi::changeContent() // Add a file to the top level of a product that does not have a "files" binding yet. setupParams.setProjectFilePath(QDir::cleanPath(m_workingDataDir + "/project-editing/project-with-no-files.qbs")); + + buildJob.reset(0); + project = qbs::Project(); job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -390,6 +414,8 @@ void TestApi::changeContent() waitForFinished(buildJob.data()); QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString())); QVERIFY(rcvr.descriptions.contains("compiling main.cpp")); + buildJob.reset(0); + project = qbs::Project(); job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -532,6 +558,7 @@ void TestApi::installableFiles() setupParams.setProjectFilePath(QDir::cleanPath(QLatin1String(SRCDIR "/../blackbox/testdata" "/recursive_wildcards/recursive_wildcards.qbs"))); + project = qbs::Project(); job.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); waitForFinished(job.data()); QVERIFY2(!job->error().hasError(), qPrintable(job->error().toString())); @@ -611,7 +638,7 @@ void TestApi::multiArch() m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); - const qbs::Project &project = setupJob->project(); + qbs::Project project = setupJob->project(); QCOMPARE(project.profile(), QLatin1String("qbs_autotests")); const QList &products = project.projectData().products(); QCOMPARE(products.count(), 3); @@ -653,6 +680,8 @@ void TestApi::multiArch() // Error check: Try to build for the same profile twice. overriddenValues.insert("project.targetProfile", hostProfile.name()); setupParams.setOverriddenValues(overriddenValues); + project = qbs::Project(); + buildJob.reset(0); setupJob.reset(qbs::Project::setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.data()); QVERIFY(setupJob->error().hasError()); diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index 7d1157512..5e75218ba 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -47,6 +47,7 @@ public: private slots: void initTestCase(); + void buildGraphLocking(); void buildSingleFile(); void changeContent(); void disabledInstallGroup(); -- cgit v1.2.3