123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #include "cmParseBlanketJSCoverage.h"
- #include "cmCTest.h"
- #include "cmCTestCoverageHandler.h"
- #include "cmSystemTools.h"
- #include "cmsys/FStream.hxx"
- #include <stdio.h>
- #include <stdlib.h>
- class cmParseBlanketJSCoverage::JSONParser
- {
- public:
- typedef cmCTestCoverageHandlerContainer::SingleFileCoverageVector
- FileLinesType;
- JSONParser(cmCTestCoverageHandlerContainer& cont)
- : Coverage(cont)
- {
- }
- virtual ~JSONParser() {}
- std::string getValue(std::string const& line, int type)
- {
- size_t begIndex;
- size_t endIndex;
- endIndex = line.rfind(',');
- begIndex = line.find_first_of(':');
- if (type == 0) {
- // A unique substring to remove the extra characters
- // around the files name in the JSON (extra " and ,)
- std::string foundFileName =
- line.substr(begIndex + 3, endIndex - (begIndex + 4));
- return foundFileName;
- }
- return line.substr(begIndex);
- }
- bool ParseFile(std::string const& file)
- {
- FileLinesType localCoverageVector;
- std::string filename;
- bool foundFile = false;
- bool inSource = false;
- std::string covResult;
- std::string line;
- cmsys::ifstream in(file.c_str());
- if (!in) {
- return false;
- }
- while (cmSystemTools::GetLineFromStream(in, line)) {
- if (line.find("filename") != std::string::npos) {
- if (foundFile) {
- /*
- * Upon finding a second file name, generate a
- * vector within the total coverage to capture the
- * information in the local vector
- */
- FileLinesType& CoverageVector =
- this->Coverage.TotalCoverage[filename];
- CoverageVector = localCoverageVector;
- localCoverageVector.clear();
- }
- foundFile = true;
- inSource = false;
- filename = getValue(line, 0);
- } else if ((line.find("coverage") != std::string::npos) && foundFile &&
- inSource) {
- /*
- * two types of "coverage" in the JSON structure
- *
- * The coverage result over the file or set of files
- * and the coverage for each individual line
- *
- * FoundFile and foundSource ensure that
- * only the value of the line coverage is captured
- */
- std::string result = getValue(line, 1);
- result = result.substr(2);
- if (result == "\"\"") {
- // Empty quotation marks indicate that the
- // line is not executable
- localCoverageVector.push_back(-1);
- } else {
- // Else, it contains the number of time executed
- localCoverageVector.push_back(atoi(result.c_str()));
- }
- } else if (line.find("source") != std::string::npos) {
- inSource = true;
- }
- }
- // On exit, capture end of last file covered.
- FileLinesType& CoverageVector = this->Coverage.TotalCoverage[filename];
- CoverageVector = localCoverageVector;
- localCoverageVector.clear();
- return true;
- }
- private:
- cmCTestCoverageHandlerContainer& Coverage;
- };
- cmParseBlanketJSCoverage::cmParseBlanketJSCoverage(
- cmCTestCoverageHandlerContainer& cont, cmCTest* ctest)
- : Coverage(cont)
- , CTest(ctest)
- {
- }
- bool cmParseBlanketJSCoverage::LoadCoverageData(std::vector<std::string> files)
- {
- cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
- "Found " << files.size() << " Files" << std::endl,
- this->Coverage.Quiet);
- for (std::string const& file : files) {
- cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
- "Reading JSON File " << file << std::endl,
- this->Coverage.Quiet);
- if (!this->ReadJSONFile(file)) {
- return false;
- }
- }
- return true;
- }
- bool cmParseBlanketJSCoverage::ReadJSONFile(std::string const& file)
- {
- cmParseBlanketJSCoverage::JSONParser parser(this->Coverage);
- cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
- "Parsing " << file << std::endl, this->Coverage.Quiet);
- parser.ParseFile(file);
- return true;
- }
|