ClangTools: Clean up plugin tests

We can provide the run settings explicitly instead of writing to the
settings.

Change-Id: Ibb9ef0280c14315ff7ba72be75dfd04c50d84484
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
Nikolai Kosjar
2019-09-25 15:39:32 +02:00
parent 44ddc028b5
commit d2648db914
4 changed files with 38 additions and 39 deletions

View File

@@ -239,8 +239,9 @@ static FileInfos sortedFileInfos(const QVector<CppTools::ProjectPart::Ptr> &proj
return fileInfos; return fileInfos;
} }
static RunSettings runSettings(Project *project) static RunSettings runSettings()
{ {
Project *project = SessionManager::startupProject();
auto *projectSettings = ClangToolsProjectSettingsManager::getSettings(project); auto *projectSettings = ClangToolsProjectSettingsManager::getSettings(project);
if (projectSettings->useGlobalSettings()) if (projectSettings->useGlobalSettings())
return ClangToolsSettings::instance()->runSettings(); return ClangToolsSettings::instance()->runSettings();
@@ -399,7 +400,7 @@ ClangTool::ClangTool()
menu->addAction(ActionManager::registerAction(action, "ClangTidyClazy.Action"), menu->addAction(ActionManager::registerAction(action, "ClangTidyClazy.Action"),
Debugger::Constants::G_ANALYZER_TOOLS); Debugger::Constants::G_ANALYZER_TOOLS);
QObject::connect(action, &QAction::triggered, this, [this]() { QObject::connect(action, &QAction::triggered, this, [this]() {
startTool(ClangTool::FileSelection::AskUser); startTool(FileSelection::AskUser);
}); });
QObject::connect(m_startAction, &QAction::triggered, action, &QAction::triggered); QObject::connect(m_startAction, &QAction::triggered, action, &QAction::triggered);
QObject::connect(m_startAction, &QAction::changed, action, [action, this] { QObject::connect(m_startAction, &QAction::changed, action, [action, this] {
@@ -407,7 +408,7 @@ ClangTool::ClangTool()
}); });
QObject::connect(m_startOnCurrentFileAction, &QAction::triggered, this, [this] { QObject::connect(m_startOnCurrentFileAction, &QAction::triggered, this, [this] {
startTool(ClangTool::FileSelection::CurrentFile); startTool(FileSelection::CurrentFile);
}); });
m_perspective.addToolBarAction(m_startAction); m_perspective.addToolBarAction(m_startAction);
@@ -438,6 +439,11 @@ void ClangTool::selectPerspective()
} }
void ClangTool::startTool(ClangTool::FileSelection fileSelection) void ClangTool::startTool(ClangTool::FileSelection fileSelection)
{
startTool(runSettings(), fileSelection);
}
void ClangTool::startTool(const RunSettings &runSettings, ClangTool::FileSelection fileSelection)
{ {
Project *project = SessionManager::startupProject(); Project *project = SessionManager::startupProject();
QTC_ASSERT(project, return); QTC_ASSERT(project, return);
@@ -453,10 +459,7 @@ void ClangTool::startTool(ClangTool::FileSelection fileSelection)
return; return;
const bool preventBuild = fileSelection == FileSelection::CurrentFile; const bool preventBuild = fileSelection == FileSelection::CurrentFile;
auto clangTool = new ClangToolRunWorker(runControl, auto clangTool = new ClangToolRunWorker(runControl, runSettings, fileInfos, preventBuild);
runSettings(project),
fileInfos,
preventBuild);
m_stopAction->disconnect(); m_stopAction->disconnect();
connect(m_stopAction, &QAction::triggered, runControl, [runControl] { connect(m_stopAction, &QAction::triggered, runControl, [runControl] {

View File

@@ -52,6 +52,7 @@ namespace Internal {
class ClangToolsDiagnosticModel; class ClangToolsDiagnosticModel;
class Diagnostic; class Diagnostic;
class DiagnosticFilterModel; class DiagnosticFilterModel;
class RunSettings;
const char ClangTidyClazyPerspectiveId[] = "ClangTidyClazy.Perspective"; const char ClangTidyClazyPerspectiveId[] = "ClangTidyClazy.Perspective";
@@ -73,12 +74,13 @@ public:
AskUser, AskUser,
}; };
void startTool(FileSelection fileSelection); void startTool(FileSelection fileSelection);
void startTool(const RunSettings &runSettings, FileSelection fileSelection);
Diagnostics read(OutputFileFormat outputFileFormat, Diagnostics read(OutputFileFormat outputFileFormat,
const QString &logFilePath, const QString &logFilePath,
const QString &mainFilePath, const QString &mainFilePath,
const QSet<Utils::FilePath> &projectFiles, const QSet<Utils::FilePath> &projectFiles,
QString *errorMessage) const; QString *errorMessage) const;
FileInfos collectFileInfos(ProjectExplorer::Project *project, FileInfos collectFileInfos(ProjectExplorer::Project *project,
FileSelection fileSelection) const; FileSelection fileSelection) const;

View File

@@ -27,6 +27,7 @@
#include "clangtool.h" #include "clangtool.h"
#include "clangtoolsdiagnostic.h" #include "clangtoolsdiagnostic.h"
#include "clangtoolssettings.h"
#include "clangtoolsutils.h" #include "clangtoolsutils.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -121,7 +122,8 @@ void PreconfiguredSessionTests::testPreconfiguredSession()
QVERIFY(switchToProjectAndTarget(project, target)); QVERIFY(switchToProjectAndTarget(project, target));
ClangTool::instance()->startTool(ClangTool::FileSelection::AllFiles); ClangTool::instance()->startTool(ClangToolsSettings::instance()->runSettings(),
ClangTool::FileSelection::AllFiles);
QSignalSpy waitUntilAnalyzerFinished(ClangTool::instance(), SIGNAL(finished(bool))); QSignalSpy waitUntilAnalyzerFinished(ClangTool::instance(), SIGNAL(finished(bool)));
QVERIFY(waitUntilAnalyzerFinished.wait(30000)); QVERIFY(waitUntilAnalyzerFinished.wait(30000));
const QList<QVariant> arguments = waitUntilAnalyzerFinished.takeFirst(); const QList<QVariant> arguments = waitUntilAnalyzerFinished.takeFirst();

View File

@@ -48,6 +48,7 @@
#include <QTimer> #include <QTimer>
#include <QtTest> #include <QtTest>
using namespace CppTools;
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Utils; using namespace Utils;
@@ -69,7 +70,7 @@ void ClangToolsUnitTests::initTestCase()
if (Core::ICore::clangExecutable(CLANG_BINDIR).isEmpty()) if (Core::ICore::clangExecutable(CLANG_BINDIR).isEmpty())
QSKIP("No clang suitable for analyzing found"); QSKIP("No clang suitable for analyzing found");
m_tmpDir = new CppTools::Tests::TemporaryCopiedDir(QLatin1String(":/unit-tests")); m_tmpDir = new Tests::TemporaryCopiedDir(QLatin1String(":/unit-tests"));
QVERIFY(m_tmpDir->isValid()); QVERIFY(m_tmpDir->isValid());
} }
@@ -78,15 +79,15 @@ void ClangToolsUnitTests::cleanupTestCase()
delete m_tmpDir; delete m_tmpDir;
} }
static CppTools::ClangDiagnosticConfig configFor(const QString &tidyChecks, static ClangDiagnosticConfig configFor(const QString &tidyChecks,
const QString &clazyChecks) const QString &clazyChecks)
{ {
CppTools::ClangDiagnosticConfig config; ClangDiagnosticConfig config;
config.setId("Test.MyTestConfig"); config.setId("Test.MyTestConfig");
config.setDisplayName("Test"); config.setDisplayName("Test");
config.setIsReadOnly(true); config.setIsReadOnly(true);
config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")}); config.setClangOptions(QStringList{QStringLiteral("-Wno-everything")});
config.setClangTidyMode(CppTools::ClangDiagnosticConfig::TidyMode::ChecksPrefixList); config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::ChecksPrefixList);
const QString theTidyChecks = tidyChecks.isEmpty() ? tidyChecks : "-*," + tidyChecks; const QString theTidyChecks = tidyChecks.isEmpty() ? tidyChecks : "-*," + tidyChecks;
config.setClangTidyChecks(theTidyChecks); config.setClangTidyChecks(theTidyChecks);
config.setClazyChecks(clazyChecks); config.setClazyChecks(clazyChecks);
@@ -97,46 +98,37 @@ void ClangToolsUnitTests::testProject()
{ {
QFETCH(QString, projectFilePath); QFETCH(QString, projectFilePath);
QFETCH(int, expectedDiagCount); QFETCH(int, expectedDiagCount);
QFETCH(CppTools::ClangDiagnosticConfig, diagnosticConfig); QFETCH(ClangDiagnosticConfig, diagnosticConfig);
if (projectFilePath.contains("mingw")) { if (projectFilePath.contains("mingw")) {
const ToolChain * const toolchain const ToolChain *const toolchain
= ToolChainKitAspect::toolChain(KitManager::kits().constFirst(), = ToolChainKitAspect::toolChain(KitManager::kits().constFirst(),
Constants::CXX_LANGUAGE_ID); Constants::CXX_LANGUAGE_ID);
if (toolchain->typeId() != ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID) if (toolchain->typeId() != ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID)
QSKIP("This test is mingw specific, does not run for other toolchains"); QSKIP("This test is mingw specific, does not run for other toolchains");
} }
CppTools::Tests::ProjectOpenerAndCloser projectManager; Tests::ProjectOpenerAndCloser projectManager;
const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true); const ProjectInfo projectInfo = projectManager.open(projectFilePath, true);
QVERIFY(projectInfo.isValid()); QVERIFY(projectInfo.isValid());
ClangTool *tool = ClangTool::instance(); ClangTool *tool = ClangTool::instance();
// Change configs // Change configs
QSharedPointer<CppTools::CppCodeModelSettings> cppToolsSettings = CppTools::codeModelSettings(); QSharedPointer<CppCodeModelSettings> cppToolsSettings = codeModelSettings();
ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance(); ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance();
const CppTools::ClangDiagnosticConfigs originalConfigs = cppToolsSettings const ClangDiagnosticConfigs originalConfigs = cppToolsSettings->clangCustomDiagnosticConfigs();
->clangCustomDiagnosticConfigs();
const Core::Id originalId = clangToolsSettings->runSettings().diagnosticConfigId();
CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs; ClangDiagnosticConfigs modifiedConfigs = originalConfigs;
modifiedConfigs.push_back(diagnosticConfig); modifiedConfigs.push_back(diagnosticConfig);
ExecuteOnDestruction executeOnDestruction([=]() { ExecuteOnDestruction restoreCustomConfigs([=]() {
// Restore configs
cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs); cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs);
RunSettings runSettings = clangToolsSettings->runSettings();
runSettings.setDiagnosticConfigId(originalId);
clangToolsSettings->setRunSettings(runSettings);
clangToolsSettings->writeSettings();
}); });
cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs); cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs);
RunSettings runSettings = clangToolsSettings->runSettings(); RunSettings runSettings = clangToolsSettings->runSettings();
runSettings.setDiagnosticConfigId(diagnosticConfig.id()); runSettings.setDiagnosticConfigId(diagnosticConfig.id());
clangToolsSettings->setRunSettings(runSettings);
clangToolsSettings->writeSettings();
tool->startTool(ClangTool::FileSelection::AllFiles); tool->startTool(runSettings, ClangTool::FileSelection::AllFiles);
QSignalSpy waiter(tool, SIGNAL(finished(bool))); QSignalSpy waiter(tool, SIGNAL(finished(bool)));
QVERIFY(waiter.wait(30000)); QVERIFY(waiter.wait(30000));
@@ -149,10 +141,10 @@ void ClangToolsUnitTests::testProject_data()
{ {
QTest::addColumn<QString>("projectFilePath"); QTest::addColumn<QString>("projectFilePath");
QTest::addColumn<int>("expectedDiagCount"); QTest::addColumn<int>("expectedDiagCount");
QTest::addColumn<CppTools::ClangDiagnosticConfig>("diagnosticConfig"); QTest::addColumn<ClangDiagnosticConfig>("diagnosticConfig");
// Test simple C++ project. // Test simple C++ project.
CppTools::ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString()); ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString());
addTestRow("simple/simple.qbs", 1, config); addTestRow("simple/simple.qbs", 1, config);
addTestRow("simple/simple.pro", 1, config); addTestRow("simple/simple.pro", 1, config);
@@ -186,7 +178,7 @@ void ClangToolsUnitTests::testProject_data()
void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath, void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath,
int expectedDiagCount, int expectedDiagCount,
const CppTools::ClangDiagnosticConfig &diagnosticConfig) const ClangDiagnosticConfig &diagnosticConfig)
{ {
const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath); const QString absoluteFilePath = m_tmpDir->absolutePath(relativeFilePath);
const QString fileName = QFileInfo(absoluteFilePath).fileName(); const QString fileName = QFileInfo(absoluteFilePath).fileName();