diff options
Diffstat (limited to 'tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java')
-rw-r--r-- | tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java b/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java index 5bac98e80d..2984d7b274 100644 --- a/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java +++ b/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java @@ -15,12 +15,15 @@ package com.google.devtools.lcovmerger; import static com.google.devtools.lcovmerger.LcovConstants.TRACEFILE_EXTENSION; +import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.annotations.VisibleForTesting; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -48,14 +51,23 @@ public class Main { System.exit(1); } - List<File> lcovTracefiles = getLcovTracefiles(flags.get("coverage_dir")); + List<File> lcovTracefiles = new ArrayList<>(); + if (flags.containsKey("coverage_dir")) { + logger.log(Level.SEVERE, "Retrieving tracefiles from coverage_dir."); + lcovTracefiles = getLcovTracefilesFromDir(flags.get("coverage_dir")); + } else if (flags.containsKey("reports_file")) { + logger.log(Level.SEVERE, "Retrieving tracefiles from reports_file."); + lcovTracefiles = getLcovTracefilesFromFile(flags.get("reports_file")); + } if (lcovTracefiles.isEmpty()) { logger.log(Level.SEVERE, "No lcov file found."); System.exit(1); } + logger.log(Level.SEVERE, "Found " + lcovTracefiles.size() + " tracefiles."); Coverage coverage = new Coverage(); for (File tracefile : lcovTracefiles) { try { + logger.log(Level.SEVERE, "Parsing tracefile " + tracefile.toString()); List<SourceFileCoverage> sourceFilesCoverage = LcovParser.parse(new FileInputStream(tracefile)); for (SourceFileCoverage sourceFileCoverage : sourceFilesCoverage) { @@ -72,7 +84,8 @@ public class Main { File coverageFile = new File(outputFile); LcovPrinter.print(new FileOutputStream(coverageFile), coverage); } catch (IOException e) { - logger.log(Level.SEVERE, "Could not write to output file " + outputFile); + logger.log(Level.SEVERE, + "Could not write to output file " + outputFile + " due to " + e.getMessage()); exitStatus = 1; } System.exit(exitStatus); @@ -83,19 +96,37 @@ public class Main { * directory. */ @VisibleForTesting - static List<File> getLcovTracefiles(String coverageDir) { + static List<File> getLcovTracefilesFromDir(String coverageDir) { List<File> datFiles = new ArrayList<>(); try (Stream<Path> stream = Files.walk(Paths.get(coverageDir))) { datFiles = stream.filter(p -> p.toString().endsWith(TRACEFILE_EXTENSION)) .map(path -> path.toFile()) .collect(Collectors.toList()); } catch (IOException ex) { - logger.log(Level.SEVERE, "error reading folder " + coverageDir + ": " + ex.getMessage()); + logger.log(Level.SEVERE, "Error reading folder " + coverageDir + ": " + ex.getMessage()); } return datFiles; } + static List<File> getLcovTracefilesFromFile(String reportsFile) { + List<File> datFiles = new ArrayList<>(); + try (FileInputStream inputStream = new FileInputStream(reportsFile)) { + InputStreamReader inputStreamReader = new InputStreamReader(inputStream, UTF_8); + BufferedReader reader = new BufferedReader(inputStreamReader); + for (String tracefile = reader.readLine(); tracefile != null; tracefile = reader.readLine()) { + // TODO(elenairina): baseline coverage contains some file names that need to be modified + if (!tracefile.endsWith("baseline_coverage.dat")) { + datFiles.add(new File(tracefile)); + } + } + + } catch (IOException e) { + logger.log(Level.SEVERE, "Error reading file " + reportsFile + ": " + e.getMessage()); + } + return datFiles; + } + /** * Parse flags in the form of "--coverage_dir=... -output_file=..." */ @@ -114,12 +145,28 @@ public class Main { } // Validate flags - if (!flags.containsKey("coverage_dir")) { - throw new IllegalArgumentException("coverage_dir was not specified"); + for (String flag : flags.keySet()) { + switch (flag) { + case "coverage_dir": + case "reports_file": + case "output_file": + continue; + default: + throw new IllegalArgumentException("Unknown flag --" + flag); + } + } + + if (!flags.containsKey("coverage_dir") && !flags.containsKey("reports_file")) { + throw new IllegalArgumentException( + "At least one of --coverage_dir or --reports_file should be specified."); + } + if (flags.containsKey("coverage_dir") && flags.containsKey("reports_file")) { + throw new IllegalArgumentException( + "Only one of --coverage_dir or --reports_file must be specified."); } if (!flags.containsKey("output_file")) { // Different from blaze, this should be mandatory - throw new IllegalArgumentException("output_file was not specified"); + throw new IllegalArgumentException("--output_file was not specified"); } return flags; |