aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/Main.java
diff options
context:
space:
mode:
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.java61
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;