| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (C) 2014 Digia Plc | 
					
						
							|  |  |  | ** All rights reserved. | 
					
						
							|  |  |  | ** For any questions to Digia, please use contact form at http://qt.digia.com <http://qt.digia.com/>
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of the Qt Enterprise Qt Quick Profiler Add-on. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Licensees holding valid Qt Enterprise licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the Qt Enterprise License Agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and Digia. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** If you have questions regarding the use of this file, please use | 
					
						
							|  |  |  | ** contact form at http://qt.digia.com <http://qt.digia.com/>
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "clangstaticanalyzerunittests.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "clangstaticanalyzerdiagnostic.h"
 | 
					
						
							|  |  |  | #include "clangstaticanalyzertool.h"
 | 
					
						
							|  |  |  | #include "clangstaticanalyzerutils.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <analyzerbase/analyzermanager.h>
 | 
					
						
							|  |  |  | #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>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace Analyzer; | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  |     clangExecutableFromSettings(toolchain->type(), &hasClangExecutable); | 
					
						
							|  |  |  |     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()); | 
					
						
							| 
									
										
										
										
											2015-02-19 14:48:39 +01:00
										 |  |  |     AnalyzerManager::selectTool(ClangStaticAnalyzerToolId); | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  |     AnalyzerManager::startTool(); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  |     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; | 
					
						
							| 
									
										
										
										
											2015-02-04 15:19:30 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace Internal
 | 
					
						
							|  |  |  | } // namespace ClangStaticAnalyzerPlugin
 |