AutoTest: Fix source file construction on Windows

Task-number: QTCREATORBUG-15667
Change-Id: I4d0e81a39a5031403d77fb3e2179ed17451346b4
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Christian Stenger
2016-01-26 17:24:11 +01:00
parent f2012bca8f
commit 09bc4baf3c
5 changed files with 37 additions and 23 deletions

View File

@@ -28,6 +28,7 @@
#include <cpptools/cppmodelmanager.h> #include <cpptools/cppmodelmanager.h>
#include <cpptools/projectinfo.h> #include <cpptools/projectinfo.h>
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/buildtargetinfo.h> #include <projectexplorer/buildtargetinfo.h>
#include <projectexplorer/environmentaspect.h> #include <projectexplorer/environmentaspect.h>
#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitinformation.h>
@@ -115,6 +116,7 @@ void TestConfiguration::completeTestInformation()
QString workDir; QString workDir;
QString proFile = m_proFile; QString proFile = m_proFile;
QString displayName; QString displayName;
QString buildDir;
Project *targetProject = 0; Project *targetProject = 0;
Utils::Environment env; Utils::Environment env;
bool hasDesktopTarget = false; bool hasDesktopTarget = false;
@@ -140,6 +142,15 @@ void TestConfiguration::completeTestInformation()
} }
} }
if (targetProject) {
if (auto buildConfig = target->activeBuildConfiguration()) {
const QString buildBase = buildConfig->buildDirectory().toString();
const QString projBase = targetProject->projectDirectory().toString();
if (proFile.startsWith(projBase))
buildDir = QFileInfo(buildBase + proFile.mid(projBase.length())).absolutePath();
}
}
QList<RunConfiguration *> rcs = target->runConfigurations(); QList<RunConfiguration *> rcs = target->runConfigurations();
foreach (RunConfiguration *rc, rcs) { foreach (RunConfiguration *rc, rcs) {
Runnable runnable = rc->runnable(); Runnable runnable = rc->runnable();
@@ -176,6 +187,7 @@ void TestConfiguration::completeTestInformation()
setTargetFile(targetFile); setTargetFile(targetFile);
setTargetName(targetName); setTargetName(targetName);
setWorkingDirectory(workDir); setWorkingDirectory(workDir);
setBuildDirectory(buildDir);
setEnvironment(env); setEnvironment(env);
setProject(project); setProject(project);
setGuessedConfiguration(guessedRunConfiguration); setGuessedConfiguration(guessedRunConfiguration);
@@ -228,6 +240,11 @@ void TestConfiguration::setWorkingDirectory(const QString &workingDirectory)
m_workingDir = workingDirectory; m_workingDir = workingDirectory;
} }
void TestConfiguration::setBuildDirectory(const QString &buildDirectory)
{
m_buildDir = buildDirectory;
}
void TestConfiguration::setDisplayName(const QString &displayName) void TestConfiguration::setDisplayName(const QString &displayName)
{ {
m_displayName = displayName; m_displayName = displayName;

View File

@@ -56,6 +56,7 @@ public:
void setTargetName(const QString &targetName); void setTargetName(const QString &targetName);
void setProFile(const QString &proFile); void setProFile(const QString &proFile);
void setWorkingDirectory(const QString &workingDirectory); void setWorkingDirectory(const QString &workingDirectory);
void setBuildDirectory(const QString &buildDirectory);
void setDisplayName(const QString &displayName); void setDisplayName(const QString &displayName);
void setEnvironment(const Utils::Environment &env); void setEnvironment(const Utils::Environment &env);
void setProject(ProjectExplorer::Project *project); void setProject(ProjectExplorer::Project *project);
@@ -70,6 +71,7 @@ public:
QString targetFile() const { return m_targetFile; } QString targetFile() const { return m_targetFile; }
QString targetName() const { return m_targetName; } QString targetName() const { return m_targetName; }
QString workingDirectory() const { return m_workingDir; } QString workingDirectory() const { return m_workingDir; }
QString buildDirectory() const { return m_buildDir; }
QString displayName() const { return m_displayName; } QString displayName() const { return m_displayName; }
Utils::Environment environment() const { return m_environment; } Utils::Environment environment() const { return m_environment; }
ProjectExplorer::Project *project() const { return m_project.data(); } ProjectExplorer::Project *project() const { return m_project.data(); }
@@ -87,6 +89,7 @@ private:
QString m_targetFile; QString m_targetFile;
QString m_targetName; QString m_targetName;
QString m_workingDir; QString m_workingDir;
QString m_buildDir;
QString m_displayName; QString m_displayName;
Utils::Environment m_environment; Utils::Environment m_environment;
QPointer<ProjectExplorer::Project> m_project; QPointer<ProjectExplorer::Project> m_project;

View File

@@ -57,14 +57,8 @@ static QString decode(const QString& original)
return result; return result;
} }
static QString constructSourceFilePath(const QString &path, const QString &filePath, static QString constructSourceFilePath(const QString &path, const QString &filePath)
const QString &app)
{ {
if (Utils::HostOsInfo::isMacHost() && !app.isEmpty()) {
const QString fileName(QFileInfo(app).fileName());
return QFileInfo(path.left(path.lastIndexOf(fileName + QLatin1String(".app"))), filePath)
.canonicalFilePath();
}
return QFileInfo(path, filePath).canonicalFilePath(); return QFileInfo(path, filePath).canonicalFilePath();
} }
@@ -137,16 +131,17 @@ static QString constructBenchmarkInformation(const QString &metric, double value
} }
TestOutputReader::TestOutputReader(QFutureInterface<TestResult *> futureInterface, TestOutputReader::TestOutputReader(QFutureInterface<TestResult *> futureInterface,
QProcess *testApplication) QProcess *testApplication, const QString &buildDirectory)
: m_futureInterface(futureInterface) : m_futureInterface(futureInterface)
, m_testApplication(testApplication) , m_testApplication(testApplication)
, m_buildDir(buildDirectory)
{ {
connect(m_testApplication, &QProcess::readyRead, this, &TestOutputReader::processOutput); connect(m_testApplication, &QProcess::readyRead, this, &TestOutputReader::processOutput);
} }
QtTestOutputReader::QtTestOutputReader(QFutureInterface<TestResult *> futureInterface, QtTestOutputReader::QtTestOutputReader(QFutureInterface<TestResult *> futureInterface,
QProcess *testApplication) QProcess *testApplication, const QString &buildDirectory)
: TestOutputReader(futureInterface, testApplication) : TestOutputReader(futureInterface, testApplication, buildDirectory)
{ {
} }
@@ -207,9 +202,7 @@ void QtTestOutputReader::processOutput()
attributes.value(QStringLiteral("type")).toString()); attributes.value(QStringLiteral("type")).toString());
m_file = decode(attributes.value(QStringLiteral("file")).toString()); m_file = decode(attributes.value(QStringLiteral("file")).toString());
if (!m_file.isEmpty()) { if (!m_file.isEmpty()) {
const QString base = QFileInfo(m_testApplication->program()).absolutePath(); m_file = constructSourceFilePath(m_buildDir, m_file);
m_file = constructSourceFilePath(base, m_file,
m_testApplication->program());
} }
m_lineNumber = attributes.value(QStringLiteral("line")).toInt(); m_lineNumber = attributes.value(QStringLiteral("line")).toInt();
} else if (currentTag == QStringLiteral("BenchmarkResult")) { } else if (currentTag == QStringLiteral("BenchmarkResult")) {
@@ -306,8 +299,8 @@ void QtTestOutputReader::processOutput()
} }
GTestOutputReader::GTestOutputReader(QFutureInterface<TestResult *> futureInterface, GTestOutputReader::GTestOutputReader(QFutureInterface<TestResult *> futureInterface,
QProcess *testApplication) QProcess *testApplication, const QString &buildDirectory)
: TestOutputReader(futureInterface, testApplication) : TestOutputReader(futureInterface, testApplication, buildDirectory)
{ {
} }
@@ -403,11 +396,9 @@ void GTestOutputReader::processOutput()
m_description.chop(1); m_description.chop(1);
testResult->setDescription(m_description); testResult->setDescription(m_description);
const QString base = QFileInfo(m_testApplication->program()).absolutePath();
foreach (const QString &output, m_description.split(QLatin1Char('\n'))) { foreach (const QString &output, m_description.split(QLatin1Char('\n'))) {
if (failureLocation.exactMatch(output)) { if (failureLocation.exactMatch(output)) {
QString file = constructSourceFilePath(base, failureLocation.cap(1), QString file = constructSourceFilePath(m_buildDir, failureLocation.cap(1));
m_testApplication->program());
if (file.isEmpty()) if (file.isEmpty())
continue; continue;
testResult->setFileName(file); testResult->setFileName(file);

View File

@@ -45,19 +45,20 @@ class TestOutputReader : public QObject
Q_OBJECT Q_OBJECT
public: public:
TestOutputReader(QFutureInterface<TestResult *> futureInterface, TestOutputReader(QFutureInterface<TestResult *> futureInterface,
QProcess *testApplication); QProcess *testApplication, const QString &buildDirectory);
protected: protected:
virtual void processOutput() = 0; virtual void processOutput() = 0;
QFutureInterface<TestResult *> m_futureInterface; QFutureInterface<TestResult *> m_futureInterface;
QProcess *m_testApplication; // not owned QProcess *m_testApplication; // not owned
QString m_buildDir;
}; };
class QtTestOutputReader : public TestOutputReader class QtTestOutputReader : public TestOutputReader
{ {
public: public:
QtTestOutputReader(QFutureInterface<TestResult *> futureInterface, QtTestOutputReader(QFutureInterface<TestResult *> futureInterface,
QProcess *testApplication); QProcess *testApplication, const QString &buildDirectory);
protected: protected:
void processOutput() override; void processOutput() override;
@@ -89,7 +90,7 @@ class GTestOutputReader : public TestOutputReader
{ {
public: public:
GTestOutputReader(QFutureInterface<TestResult *> futureInterface, GTestOutputReader(QFutureInterface<TestResult *> futureInterface,
QProcess *testApplication); QProcess *testApplication, const QString &buildDirectory);
protected: protected:
void processOutput() override; void processOutput() override;

View File

@@ -145,10 +145,12 @@ static void performTestRun(QFutureInterface<TestResult *> &futureInterface,
QScopedPointer<TestOutputReader> outputReader; QScopedPointer<TestOutputReader> outputReader;
switch (testConfiguration->testType()) { switch (testConfiguration->testType()) {
case TestTypeQt: case TestTypeQt:
outputReader.reset(new QtTestOutputReader(futureInterface, &testProcess)); outputReader.reset(new QtTestOutputReader(futureInterface, &testProcess,
testConfiguration->buildDirectory()));
break; break;
case TestTypeGTest: case TestTypeGTest:
outputReader.reset(new GTestOutputReader(futureInterface, &testProcess)); outputReader.reset(new GTestOutputReader(futureInterface, &testProcess,
testConfiguration->buildDirectory()));
break; break;
} }
if (futureInterface.isCanceled()) if (futureInterface.isCanceled())