Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Source/CTest/cmCTestCoverageHandler.h
4998 views
1
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2
file LICENSE.rst or https://cmake.org/licensing for details. */
3
#pragma once
4
5
#include "cmConfigure.h" // IWYU pragma: keep
6
7
#include <iosfwd>
8
#include <map>
9
#include <set>
10
#include <string>
11
#include <vector>
12
13
#include "cmsys/RegularExpression.hxx"
14
15
#include "cmCTestGenericHandler.h"
16
17
class cmGeneratedFileStream;
18
class cmXMLWriter;
19
class cmCTest;
20
21
class cmCTestCoverageHandlerContainer
22
{
23
public:
24
int Error;
25
std::string SourceDir;
26
std::string BinaryDir;
27
using SingleFileCoverageVector = std::vector<int>;
28
using TotalCoverageMap = std::map<std::string, SingleFileCoverageVector>;
29
TotalCoverageMap TotalCoverage;
30
std::ostream* OFS;
31
bool Quiet;
32
};
33
/** \class cmCTestCoverageHandler
34
* \brief A class that handles coverage computation for ctest
35
*
36
*/
37
class cmCTestCoverageHandler : public cmCTestGenericHandler
38
{
39
public:
40
using Superclass = cmCTestGenericHandler;
41
42
/*
43
* The main entry point for this class
44
*/
45
int ProcessHandler() override;
46
47
cmCTestCoverageHandler(cmCTest* ctest);
48
49
/**
50
* This method is called when reading CTest custom file
51
*/
52
void PopulateCustomVectors(cmMakefile* mf) override;
53
54
/** Report coverage only for sources with these labels. */
55
void SetLabelFilter(std::set<std::string> const& labels);
56
57
private:
58
bool ShouldIDoCoverage(std::string const& file, std::string const& srcDir,
59
std::string const& binDir);
60
void CleanCoverageLogFiles(std::ostream& log);
61
bool StartCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
62
void EndCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
63
64
void StartCoverageLogXML(cmXMLWriter& xml);
65
void EndCoverageLogXML(cmXMLWriter& xml);
66
67
//! Handle coverage using GCC's GCov
68
int HandleGCovCoverage(cmCTestCoverageHandlerContainer* cont);
69
void FindGCovFiles(std::vector<std::string>& files);
70
71
//! Handle coverage using Intel's LCov
72
int HandleLCovCoverage(cmCTestCoverageHandlerContainer* cont);
73
bool FindLCovFiles(std::vector<std::string>& files);
74
75
//! Handle coverage using xdebug php coverage
76
int HandlePHPCoverage(cmCTestCoverageHandlerContainer* cont);
77
78
//! Handle coverage for Python with coverage.py
79
int HandleCoberturaCoverage(cmCTestCoverageHandlerContainer* cont);
80
81
//! Handle coverage for mumps
82
int HandleMumpsCoverage(cmCTestCoverageHandlerContainer* cont);
83
84
//! Handle coverage for Jacoco
85
int HandleJacocoCoverage(cmCTestCoverageHandlerContainer* cont);
86
87
//! Handle coverage for Delphi (Pascal)
88
int HandleDelphiCoverage(cmCTestCoverageHandlerContainer* cont);
89
90
//! Handle coverage for Jacoco
91
int HandleBlanketJSCoverage(cmCTestCoverageHandlerContainer* cont);
92
93
//! Handle coverage using Bullseye
94
int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont);
95
int RunBullseyeSourceSummary(cmCTestCoverageHandlerContainer* cont);
96
int RunBullseyeCoverageBranch(cmCTestCoverageHandlerContainer* cont,
97
std::set<std::string>& coveredFileNames,
98
std::vector<std::string>& files,
99
std::vector<std::string>& filesFullPath);
100
101
int RunBullseyeCommand(cmCTestCoverageHandlerContainer* cont,
102
char const* cmd, char const* arg,
103
std::string& outputFile);
104
bool ParseBullsEyeCovsrcLine(std::string const& inputLine,
105
std::string& sourceFile, int& functionsCalled,
106
int& totalFunctions, int& percentFunction,
107
int& branchCovered, int& totalBranches,
108
int& percentBranch);
109
bool GetNextInt(std::string const& inputLine, std::string::size_type& pos,
110
int& value);
111
//! Handle Python coverage using Python's Trace.py
112
int HandleTracePyCoverage(cmCTestCoverageHandlerContainer* cont);
113
114
// Find the source file based on the source and build tree. This is used for
115
// Trace.py mode, since that one does not tell us where the source file is.
116
std::string FindFile(cmCTestCoverageHandlerContainer* cont,
117
std::string const& fileName);
118
119
std::set<std::string> FindUncoveredFiles(
120
cmCTestCoverageHandlerContainer* cont);
121
std::vector<std::string> CustomCoverageExclude;
122
std::vector<cmsys::RegularExpression> CustomCoverageExcludeRegex;
123
std::vector<std::string> ExtraCoverageGlobs;
124
125
// Map from source file to label ids.
126
class LabelSet : public std::set<int>
127
{
128
};
129
using LabelMapType = std::map<std::string, LabelSet>;
130
LabelMapType SourceLabels;
131
LabelMapType TargetDirs;
132
133
// Map from label name to label id.
134
using LabelIdMapType = std::map<std::string, int>;
135
LabelIdMapType LabelIdMap;
136
std::vector<std::string> Labels;
137
int GetLabelId(std::string const& label);
138
139
// Label reading and writing methods.
140
void LoadLabels();
141
void LoadLabels(char const* dir);
142
void WriteXMLLabels(cmXMLWriter& xml, std::string const& source);
143
144
// Label-based filtering.
145
std::set<int> LabelFilter;
146
bool IntersectsFilter(LabelSet const& labels);
147
bool IsFilteredOut(std::string const& source);
148
};
149
150