| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-14 10:59:10 +01:00
										 |  |  | ** Copyright (C) 2016 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: https://www.qt.io/licensing/
 | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-14 10:59:10 +01:00
										 |  |  | ** This file is part of Qt Creator. | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-14 10:59:10 +01:00
										 |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							| 
									
										
										
										
											2016-01-14 10:59:10 +01:00
										 |  |  | ** a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | ** and conditions see https://www.qt.io/terms-conditions. For further
 | 
					
						
							|  |  |  | ** information use the contact form at https://www.qt.io/contact-us.
 | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2016-01-14 10:59:10 +01:00
										 |  |  | ** GNU General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | ** General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | ** included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | ** information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "clangstaticanalyzerunittests.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "clangstaticanalyzerdiagnostic.h"
 | 
					
						
							|  |  |  | #include "clangstaticanalyzertool.h"
 | 
					
						
							|  |  |  | #include "clangstaticanalyzerutils.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-24 14:42:52 +01:00
										 |  |  | #include <debugger/analyzer/analyzermanager.h>
 | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | #include <cpptools/cppmodelmanager.h>
 | 
					
						
							|  |  |  | #include <cpptools/cpptoolstestcase.h>
 | 
					
						
							|  |  |  | #include <projectexplorer/kitinformation.h>
 | 
					
						
							|  |  |  | #include <projectexplorer/kitmanager.h>
 | 
					
						
							|  |  |  | #include <projectexplorer/projectexplorer.h>
 | 
					
						
							|  |  |  | #include <projectexplorer/toolchain.h>
 | 
					
						
							|  |  |  | #include <utils/fileutils.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QEventLoop>
 | 
					
						
							|  |  |  | #include <QSignalSpy>
 | 
					
						
							|  |  |  | #include <QTemporaryDir>
 | 
					
						
							|  |  |  | #include <QTimer>
 | 
					
						
							|  |  |  | #include <QtTest>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 13:57:37 +01:00
										 |  |  | using namespace Debugger; | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | using namespace ProjectExplorer; | 
					
						
							|  |  |  | using namespace Utils; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace ClangStaticAnalyzer { | 
					
						
							|  |  |  | namespace Internal { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ClangStaticAnalyzerUnitTests::ClangStaticAnalyzerUnitTests(ClangStaticAnalyzerTool *analyzerTool, | 
					
						
							|  |  |  |                                                            QObject *parent) | 
					
						
							|  |  |  |     : QObject(parent) | 
					
						
							|  |  |  |     , m_analyzerTool(analyzerTool) | 
					
						
							|  |  |  |     , m_tmpDir(0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ClangStaticAnalyzerUnitTests::initTestCase() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QList<Kit *> allKits = KitManager::kits(); | 
					
						
							|  |  |  |     if (allKits.count() != 1) | 
					
						
							|  |  |  |         QSKIP("This test requires exactly one kit to be present"); | 
					
						
							|  |  |  |     const ToolChain * const toolchain = ToolChainKitInformation::toolChain(allKits.first()); | 
					
						
							|  |  |  |     if (!toolchain) | 
					
						
							|  |  |  |         QSKIP("This test requires that there is a kit with a toolchain."); | 
					
						
							|  |  |  |     bool hasClangExecutable; | 
					
						
							| 
									
										
										
										
											2015-07-07 15:24:47 +02:00
										 |  |  |     clangExecutableFromSettings(toolchain->typeId(), &hasClangExecutable); | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  |     if (!hasClangExecutable) | 
					
						
							|  |  |  |         QSKIP("No clang suitable for analyzing found"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_tmpDir = new CppTools::Tests::TemporaryCopiedDir(QLatin1String(":/unit-tests")); | 
					
						
							| 
									
										
										
										
											2015-05-18 11:32:43 +02:00
										 |  |  |     QVERIFY(m_tmpDir->isValid()); | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ClangStaticAnalyzerUnitTests::cleanupTestCase() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     delete m_tmpDir; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ClangStaticAnalyzerUnitTests::testProject() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFETCH(QString, projectFilePath); | 
					
						
							|  |  |  |     QFETCH(int, expectedDiagCount); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CppTools::Tests::ProjectOpenerAndCloser projectManager; | 
					
						
							|  |  |  |     const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true); | 
					
						
							|  |  |  |     QVERIFY(projectInfo.isValid()); | 
					
						
							| 
									
										
										
										
											2016-03-02 13:57:37 +01:00
										 |  |  |     Debugger::runAction(ClangStaticAnalyzerActionId); | 
					
						
							| 
									
										
										
										
											2015-05-04 14:57:03 +02:00
										 |  |  |     QSignalSpy waiter(m_analyzerTool, SIGNAL(finished(bool))); | 
					
						
							|  |  |  |     QVERIFY(waiter.wait(30000)); | 
					
						
							|  |  |  |     const QList<QVariant> arguments = waiter.takeFirst(); | 
					
						
							|  |  |  |     QVERIFY(arguments.first().toBool()); | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  |     QCOMPARE(m_analyzerTool->diagnostics().count(), expectedDiagCount); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void ClangStaticAnalyzerUnitTests::testProject_data() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QTest::addColumn<QString>("projectFilePath"); | 
					
						
							|  |  |  |     QTest::addColumn<int>("expectedDiagCount"); | 
					
						
							| 
									
										
										
										
											2015-04-15 18:24:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("simple qbs project") | 
					
						
							| 
									
										
										
										
											2015-05-18 11:32:43 +02:00
										 |  |  |             << QString(m_tmpDir->absolutePath("simple/simple.qbs")) << 1; | 
					
						
							| 
									
										
										
										
											2015-04-15 18:24:58 +02:00
										 |  |  |     QTest::newRow("simple qmake project") | 
					
						
							| 
									
										
										
										
											2015-05-18 11:32:43 +02:00
										 |  |  |             << QString(m_tmpDir->absolutePath("simple/simple.pro")) << 1; | 
					
						
							| 
									
										
										
										
											2015-04-15 18:24:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-21 11:56:14 +02:00
										 |  |  |     QTest::newRow("simple qbs library project") | 
					
						
							|  |  |  |             << QString(m_tmpDir->absolutePath("simple-library/simple-library.qbs")) << 0; | 
					
						
							|  |  |  |     QTest::newRow("simple qmake library project") | 
					
						
							|  |  |  |             << QString(m_tmpDir->absolutePath("simple-library/simple-library.pro")) << 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-15 18:24:58 +02:00
										 |  |  |     QTest::newRow("qt-widgets-app qbs project") | 
					
						
							| 
									
										
										
										
											2015-05-18 11:32:43 +02:00
										 |  |  |             << QString(m_tmpDir->absolutePath("qt-widgets-app/qt-widgets-app.qbs")) << 0; | 
					
						
							| 
									
										
										
										
											2015-04-15 18:24:58 +02:00
										 |  |  |     QTest::newRow("qt-widgets-app qmake project") | 
					
						
							| 
									
										
										
										
											2015-05-18 11:32:43 +02:00
										 |  |  |             << QString(m_tmpDir->absolutePath("qt-widgets-app/qt-widgets-app.pro")) << 0; | 
					
						
							| 
									
										
										
										
											2016-04-13 13:03:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     QTest::newRow("qt-essential-includes qbs project") | 
					
						
							|  |  |  |             << QString(m_tmpDir->absolutePath("qt-essential-includes/qt-essential-includes.qbs")) | 
					
						
							|  |  |  |             << 0; | 
					
						
							|  |  |  |     QTest::newRow("qt-essential-includes qmake project") | 
					
						
							|  |  |  |             << QString(m_tmpDir->absolutePath("qt-essential-includes/qt-essential-includes.pro")) | 
					
						
							|  |  |  |             << 0; | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Internal
 | 
					
						
							|  |  |  | } // namespace ClangStaticAnalyzerPlugin
 |