cmCTestCoverageHandler.h 5.2 KB

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