cmCTestCoverageHandler.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*=========================================================================
  2. Program: CMake - Cross-Platform Makefile Generator
  3. Module: $RCSfile$
  4. Language: C++
  5. Date: $Date$
  6. Version: $Revision$
  7. Copyright (c) 2002 Kitware, Inc. All rights reserved.
  8. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
  9. This software is distributed WITHOUT ANY WARRANTY; without even
  10. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. PURPOSE. See the above copyright notices for more information.
  12. =========================================================================*/
  13. #ifndef cmCTestCoverageHandler_h
  14. #define cmCTestCoverageHandler_h
  15. #include "cmCTestGenericHandler.h"
  16. #include "cmListFileCache.h"
  17. #include <cmsys/RegularExpression.hxx>
  18. class cmGeneratedFileStream;
  19. class cmCTestCoverageHandlerContainer;
  20. /** \class cmCTestCoverageHandler
  21. * \brief A class that handles coverage computaiton for ctest
  22. *
  23. */
  24. class cmCTestCoverageHandler : public cmCTestGenericHandler
  25. {
  26. public:
  27. cmTypeMacro(cmCTestCoverageHandler, cmCTestGenericHandler);
  28. /*
  29. * The main entry point for this class
  30. */
  31. int ProcessHandler();
  32. cmCTestCoverageHandler();
  33. virtual void Initialize();
  34. /**
  35. * This method is called when reading CTest custom file
  36. */
  37. void PopulateCustomVectors(cmMakefile *mf);
  38. /** Report coverage only for sources with these labels. */
  39. void SetLabelFilter(std::set<cmStdString> const& labels);
  40. private:
  41. bool ShouldIDoCoverage(const char* file, const char* srcDir,
  42. const char* binDir);
  43. bool StartCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
  44. void EndCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
  45. //! Handle coverage using GCC's GCov
  46. int HandleGCovCoverage(cmCTestCoverageHandlerContainer* cont);
  47. void FindGCovFiles(std::vector<std::string>& files);
  48. //! Handle coverage using Bullseye
  49. int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont);
  50. int RunBullseyeSourceSummary(cmCTestCoverageHandlerContainer* cont);
  51. int RunBullseyeCoverageBranch(cmCTestCoverageHandlerContainer* cont,
  52. std::set<cmStdString>& coveredFileNames,
  53. std::vector<std::string>& files,
  54. std::vector<std::string>& filesFullPath);
  55. int RunBullseyeCommand(
  56. cmCTestCoverageHandlerContainer* cont,
  57. const char* cmd,
  58. const char* arg,
  59. std::string& outputFile);
  60. bool ParseBullsEyeCovsrcLine(
  61. std::string const& inputLine,
  62. std::string& sourceFile,
  63. int& functionsCalled,
  64. int& totalFunctions,
  65. int& percentFunction,
  66. int& branchCovered,
  67. int& totalBranches,
  68. int& percentBranch);
  69. bool GetNextInt(std::string const& inputLine,
  70. std::string::size_type& pos,
  71. int& value);
  72. //! Handle Python coverage using Python's Trace.py
  73. int HandleTracePyCoverage(cmCTestCoverageHandlerContainer* cont);
  74. // Find the source file based on the source and build tree. This is used for
  75. // Trace.py mode, since that one does not tell us where the source file is.
  76. std::string FindFile(cmCTestCoverageHandlerContainer* cont,
  77. std::string fileName);
  78. struct cmCTestCoverage
  79. {
  80. cmCTestCoverage()
  81. {
  82. this->AbsolutePath = "";
  83. this->FullPath = "";
  84. this->Covered = false;
  85. this->Tested = 0;
  86. this->UnTested = 0;
  87. this->Lines.clear();
  88. this->Show = false;
  89. }
  90. cmCTestCoverage(const cmCTestCoverage& rhs) :
  91. AbsolutePath(rhs.AbsolutePath),
  92. FullPath(rhs.FullPath),
  93. Covered(rhs.Covered),
  94. Tested(rhs.Tested),
  95. UnTested(rhs.UnTested),
  96. Lines(rhs.Lines),
  97. Show(rhs.Show)
  98. {
  99. }
  100. cmCTestCoverage& operator=(const cmCTestCoverage& rhs)
  101. {
  102. this->AbsolutePath = rhs.AbsolutePath;
  103. this->FullPath = rhs.FullPath;
  104. this->Covered = rhs.Covered;
  105. this->Tested = rhs.Tested;
  106. this->UnTested = rhs.UnTested;
  107. this->Lines = rhs.Lines;
  108. this->Show = rhs.Show;
  109. return *this;
  110. }
  111. std::string AbsolutePath;
  112. std::string FullPath;
  113. bool Covered;
  114. int Tested;
  115. int UnTested;
  116. std::vector<int> Lines;
  117. bool Show;
  118. };
  119. std::vector<cmStdString> CustomCoverageExclude;
  120. std::vector<cmsys::RegularExpression> CustomCoverageExcludeRegex;
  121. typedef std::map<std::string, cmCTestCoverage> CoverageMap;
  122. // Map from source file to label ids.
  123. class LabelSet: public std::set<int> {};
  124. typedef std::map<cmStdString, LabelSet> LabelMapType;
  125. LabelMapType SourceLabels;
  126. LabelMapType TargetDirs;
  127. // Map from label name to label id.
  128. typedef std::map<cmStdString, int> LabelIdMapType;
  129. LabelIdMapType LabelIdMap;
  130. std::vector<std::string> Labels;
  131. int GetLabelId(std::string const& label);
  132. // Label reading and writing methods.
  133. void LoadLabels();
  134. void LoadLabels(const char* dir);
  135. void WriteXMLLabels(std::ofstream& os, std::string const& source);
  136. // Label-based filtering.
  137. std::set<int> LabelFilter;
  138. bool IntersectsFilter(LabelSet const& labels);
  139. bool IsFilteredOut(std::string const& source);
  140. };
  141. #endif