forked from qt-creator/qt-creator
ClangTools: Sanitize ClangToolsUnitTests
This fixes the currently failing tests ClangToolsUnitTests::testProject(simple.qbs) ClangToolsUnitTests::testProject(simple.pro) which produce more diagnostics now due to the upgrade to clang 8. Sanitize the test by specifying exactly the tidy/clazy checks we are interested in. This should avoid maintenance on clang upgraded (pulling in new checks that will fail the test). While at it, fix writing the settings for the tests, which worked by accident so far. Change-Id: If8bf5076ad7141faa93eced611334ac609f0cf92 Reviewed-by: Cristian Adam <cristian.adam@qt.io> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -25,8 +25,9 @@
|
|||||||
|
|
||||||
#include "clangtoolsunittests.h"
|
#include "clangtoolsunittests.h"
|
||||||
|
|
||||||
#include "clangtoolsdiagnostic.h"
|
|
||||||
#include "clangtidyclazytool.h"
|
#include "clangtidyclazytool.h"
|
||||||
|
#include "clangtoolsdiagnostic.h"
|
||||||
|
#include "clangtoolssettings.h"
|
||||||
#include "clangtoolsutils.h"
|
#include "clangtoolsutils.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
@@ -50,6 +51,8 @@
|
|||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(CppTools::ClangDiagnosticConfig)
|
||||||
|
|
||||||
namespace ClangTools {
|
namespace ClangTools {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -75,16 +78,17 @@ void ClangToolsUnitTests::cleanupTestCase()
|
|||||||
delete m_tmpDir;
|
delete m_tmpDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CppTools::ClangDiagnosticConfig createTidyClazyConfig()
|
static CppTools::ClangDiagnosticConfig configFor(const QString &tidyChecks,
|
||||||
|
const QString &clazyChecks)
|
||||||
{
|
{
|
||||||
CppTools::ClangDiagnosticConfig config;
|
CppTools::ClangDiagnosticConfig config;
|
||||||
config.setId("Test.ClangTidy");
|
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(CppTools::ClangDiagnosticConfig::TidyMode::ChecksPrefixList);
|
||||||
config.setClangTidyChecks("modernize-*, misc-*");
|
config.setClangTidyChecks(tidyChecks);
|
||||||
config.setClazyChecks("level2");
|
config.setClazyChecks(clazyChecks);
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,6 +96,7 @@ void ClangToolsUnitTests::testProject()
|
|||||||
{
|
{
|
||||||
QFETCH(QString, projectFilePath);
|
QFETCH(QString, projectFilePath);
|
||||||
QFETCH(int, expectedDiagCount);
|
QFETCH(int, expectedDiagCount);
|
||||||
|
QFETCH(CppTools::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(),
|
||||||
@@ -106,23 +111,25 @@ void ClangToolsUnitTests::testProject()
|
|||||||
ClangTool *tool = ClangTidyClazyTool::instance();
|
ClangTool *tool = ClangTidyClazyTool::instance();
|
||||||
|
|
||||||
// Change configs
|
// Change configs
|
||||||
QSharedPointer<CppTools::CppCodeModelSettings> settings = CppTools::codeModelSettings();
|
QSharedPointer<CppTools::CppCodeModelSettings> cppToolsSettings = CppTools::codeModelSettings();
|
||||||
const CppTools::ClangDiagnosticConfigs originalConfigs = settings->clangCustomDiagnosticConfigs();
|
ClangToolsSettings *clangToolsSettings = ClangToolsSettings::instance();
|
||||||
const Core::Id originalId = settings->clangDiagnosticConfigId();
|
const CppTools::ClangDiagnosticConfigs originalConfigs = cppToolsSettings
|
||||||
|
->clangCustomDiagnosticConfigs();
|
||||||
|
const Core::Id originalId = clangToolsSettings->diagnosticConfigId();
|
||||||
|
|
||||||
CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs;
|
CppTools::ClangDiagnosticConfigs modifiedConfigs = originalConfigs;
|
||||||
|
modifiedConfigs.push_back(diagnosticConfig);
|
||||||
const CppTools::ClangDiagnosticConfig clangTidyConfig = createTidyClazyConfig();
|
|
||||||
modifiedConfigs.push_back(clangTidyConfig);
|
|
||||||
|
|
||||||
ExecuteOnDestruction executeOnDestruction([=]() {
|
ExecuteOnDestruction executeOnDestruction([=]() {
|
||||||
// Restore configs
|
// Restore configs
|
||||||
settings->setClangCustomDiagnosticConfigs(originalConfigs);
|
cppToolsSettings->setClangCustomDiagnosticConfigs(originalConfigs);
|
||||||
settings->setClangDiagnosticConfigId(originalId);
|
clangToolsSettings->setDiagnosticConfigId(originalId);
|
||||||
|
clangToolsSettings->writeSettings();
|
||||||
});
|
});
|
||||||
|
|
||||||
settings->setClangCustomDiagnosticConfigs(modifiedConfigs);
|
cppToolsSettings->setClangCustomDiagnosticConfigs(modifiedConfigs);
|
||||||
settings->setClangDiagnosticConfigId(clangTidyConfig.id());
|
clangToolsSettings->setDiagnosticConfigId(diagnosticConfig.id());
|
||||||
|
clangToolsSettings->writeSettings();
|
||||||
|
|
||||||
tool->startTool(false);
|
tool->startTool(false);
|
||||||
QSignalSpy waiter(tool, SIGNAL(finished(bool)));
|
QSignalSpy waiter(tool, SIGNAL(finished(bool)));
|
||||||
@@ -137,43 +144,50 @@ 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");
|
||||||
|
|
||||||
// For the simple project, we expect the following warning:
|
// Test simple C++ project.
|
||||||
// warning: use nullptr [modernize-use-nullptr]
|
CppTools::ClangDiagnosticConfig config = configFor("modernize-use-nullptr", QString());
|
||||||
addTestRow("simple/simple.qbs", 1);
|
addTestRow("simple/simple.qbs", 1, config);
|
||||||
addTestRow("simple/simple.pro", 1);
|
addTestRow("simple/simple.pro", 1, config);
|
||||||
|
|
||||||
addTestRow("simple-library/simple-library.qbs", 0);
|
// Test simple Qt project.
|
||||||
addTestRow("simple-library/simple-library.pro", 0);
|
config = configFor("readability-static-accessed-through-instance", QString());
|
||||||
|
addTestRow("qt-widgets-app/qt-widgets-app.qbs", 1, config);
|
||||||
|
addTestRow("qt-widgets-app/qt-widgets-app.pro", 1, config);
|
||||||
|
|
||||||
addTestRow("stdc++11-includes/stdc++11-includes.qbs", 0);
|
// Test that libraries can be analyzed.
|
||||||
addTestRow("stdc++11-includes/stdc++11-includes.pro", 0);
|
config = configFor(QString(), QString());
|
||||||
|
addTestRow("simple-library/simple-library.qbs", 0, config);
|
||||||
|
addTestRow("simple-library/simple-library.pro", 0, config);
|
||||||
|
|
||||||
// For qt-widgets-app, we expect the following warning for "a.exec()",
|
// Test that standard headers can be parsed.
|
||||||
// "a" being the QApplication object:
|
addTestRow("stdc++11-includes/stdc++11-includes.qbs", 0, config);
|
||||||
// warning: static member accessed through instance
|
addTestRow("stdc++11-includes/stdc++11-includes.pro", 0, config);
|
||||||
// [readability-static-accessed-through-instance]
|
|
||||||
addTestRow("qt-widgets-app/qt-widgets-app.qbs", 1);
|
|
||||||
addTestRow("qt-widgets-app/qt-widgets-app.pro", 1);
|
|
||||||
|
|
||||||
addTestRow("qt-essential-includes/qt-essential-includes.qbs", 0);
|
// Test that qt essential headers can be parsed.
|
||||||
addTestRow("qt-essential-includes/qt-essential-includes.pro", 0);
|
addTestRow("qt-essential-includes/qt-essential-includes.qbs", 0, config);
|
||||||
|
addTestRow("qt-essential-includes/qt-essential-includes.pro", 0, config);
|
||||||
|
|
||||||
addTestRow("mingw-includes/mingw-includes.qbs", 0);
|
// Test that mingw includes can be parsed.
|
||||||
addTestRow("mingw-includes/mingw-includes.pro", 0);
|
addTestRow("mingw-includes/mingw-includes.qbs", 0, config);
|
||||||
|
addTestRow("mingw-includes/mingw-includes.pro", 0, config);
|
||||||
|
|
||||||
|
// Test that tidy and clazy diagnostics are emitted for the same project.
|
||||||
addTestRow("clangtidy_clazy/clangtidy_clazy.pro",
|
addTestRow("clangtidy_clazy/clangtidy_clazy.pro",
|
||||||
4 /* ClangTidy: modernize-*,misc-* */
|
1 /*tidy*/ + 1 /*clazy*/,
|
||||||
+ 2 /* Clazy: level1 */);
|
configFor("misc-unconventional-assign-operator", "base-class-event"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath,
|
void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath,
|
||||||
int expectedDiagCount)
|
int expectedDiagCount,
|
||||||
|
const CppTools::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();
|
||||||
|
|
||||||
QTest::newRow(fileName.toUtf8().constData()) << absoluteFilePath << expectedDiagCount;
|
QTest::newRow(fileName.toUtf8().constData())
|
||||||
|
<< absoluteFilePath << expectedDiagCount << diagnosticConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -27,7 +27,10 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
namespace CppTools { namespace Tests { class TemporaryCopiedDir; } }
|
namespace CppTools {
|
||||||
|
class ClangDiagnosticConfig;
|
||||||
|
namespace Tests { class TemporaryCopiedDir; }
|
||||||
|
} // namespace CppTools
|
||||||
|
|
||||||
namespace ClangTools {
|
namespace ClangTools {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
@@ -46,7 +49,9 @@ private slots:
|
|||||||
void testProject_data();
|
void testProject_data();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void addTestRow(const QByteArray &relativeFilePath, int expectedDiagCount);
|
void addTestRow(const QByteArray &relativeFilePath,
|
||||||
|
int expectedDiagCount,
|
||||||
|
const CppTools::ClangDiagnosticConfig &diagnosticConfig);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CppTools::Tests::TemporaryCopiedDir *m_tmpDir = nullptr;
|
CppTools::Tests::TemporaryCopiedDir *m_tmpDir = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user