From 9438d1042df9e70570d245f6bd259acdfbb3455e Mon Sep 17 00:00:00 2001 From: elenairina Date: Fri, 6 Jul 2018 03:06:21 -0700 Subject: Create Bazel coverage report action. Fixes #5246 RELNOTES: None. PiperOrigin-RevId: 203453340 --- tools/test/BUILD | 2 +- .../com/google/devtools/lcovmerger/BUILD.tools | 1 + .../java/com/google/devtools/lcovmerger/Main.java | 61 +++++++++++++++++++--- .../com/google/devtools/lcovmerger/MainTest.java | 4 +- 4 files changed, 58 insertions(+), 10 deletions(-) (limited to 'tools') diff --git a/tools/test/BUILD b/tools/test/BUILD index 3f7d28b72a..4a4e56b284 100644 --- a/tools/test/BUILD +++ b/tools/test/BUILD @@ -24,7 +24,7 @@ filegroup( filegroup( name = "coverage_report_generator", - srcs = ["//tools/coverage:coverage_report_generator"], + srcs = ["@bazel_tools//tools/test/LcovMerger/java/com/google/devtools/lcovmerger:Main"], ) filegroup( diff --git a/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/BUILD.tools b/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/BUILD.tools index 37cf8e4657..29a60f0fef 100644 --- a/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/BUILD.tools +++ b/tools/test/LcovMerger/java/com/google/devtools/lcovmerger/BUILD.tools @@ -7,6 +7,7 @@ java_import( java_binary( name = "Main", + create_executable = 1, main_class = "com.google.devtools.lcovmerger.Main", runtime_deps = [":all_lcov_merger_lib"], ) 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 lcovTracefiles = getLcovTracefiles(flags.get("coverage_dir")); + List 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 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 getLcovTracefiles(String coverageDir) { + static List getLcovTracefilesFromDir(String coverageDir) { List datFiles = new ArrayList<>(); try (Stream 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 getLcovTracefilesFromFile(String reportsFile) { + List 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; diff --git a/tools/test/LcovMerger/javatests/com/google/devtools/lcovmerger/MainTest.java b/tools/test/LcovMerger/javatests/com/google/devtools/lcovmerger/MainTest.java index 07be4215e5..a6b99fb12e 100644 --- a/tools/test/LcovMerger/javatests/com/google/devtools/lcovmerger/MainTest.java +++ b/tools/test/LcovMerger/javatests/com/google/devtools/lcovmerger/MainTest.java @@ -41,7 +41,7 @@ public class MainTest { @Test public void testMainEmptyCoverageDir() { - assertThat(Main.getLcovTracefiles(coverageDir.toAbsolutePath().toString())).isEmpty(); + assertThat(Main.getLcovTracefilesFromDir(coverageDir.toAbsolutePath().toString())).isEmpty(); } @Test @@ -52,7 +52,7 @@ public class MainTest { Files.createTempFile(ccCoverageDir, "tracefile1", ".dat"); Files.createTempFile(javaCoverageDir, "tracefile2", ".dat"); - List tracefiles = Main.getLcovTracefiles(coverageDir.toAbsolutePath().toString()); + List tracefiles = Main.getLcovTracefilesFromDir(coverageDir.toAbsolutePath().toString()); assertThat(tracefiles).hasSize(2); } } -- cgit v1.2.3