diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SegmentlessTestProbes.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SegmentlessTestProbes.java index 788d925e42e..a1e096c00bd 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SegmentlessTestProbes.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SegmentlessTestProbes.java @@ -12,7 +12,6 @@ import datadog.trace.civisibility.source.SourcePathResolver; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.List; @@ -134,7 +133,7 @@ public boolean report(Long testSessionId, Long testSuiteId, long spanId) { List fileEntries = new ArrayList<>(coveredPaths.size()); for (String path : coveredPaths) { - TestReportFileEntry fileEntry = new TestReportFileEntry(path, Collections.emptyList()); + TestReportFileEntry fileEntry = new TestReportFileEntry(path, null); fileEntries.add(fileEntry); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SourceAnalyzer.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SourceAnalyzer.java index c27b31e3404..a9f5a03fc94 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SourceAnalyzer.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/SourceAnalyzer.java @@ -1,17 +1,16 @@ package datadog.trace.civisibility.coverage; -import datadog.trace.api.civisibility.coverage.TestReportFileEntry; -import java.util.List; +import java.util.BitSet; import org.jacoco.core.analysis.IClassCoverage; import org.jacoco.core.analysis.ICounter; import org.jacoco.core.analysis.ICoverageVisitor; public class SourceAnalyzer implements ICoverageVisitor { - private final List segments; + private final BitSet coveredLines; - public SourceAnalyzer(List segments) { - this.segments = segments; + public SourceAnalyzer(BitSet coveredLines) { + this.coveredLines = coveredLines; } @Override @@ -26,17 +25,10 @@ public void visitCoverage(IClassCoverage coverage) { } int lastLine = coverage.getLastLine(); - int line = firstLine; - while (line <= lastLine) { + + for (int line = firstLine; line <= lastLine; line++) { if (coverage.getLine(line).getStatus() >= ICounter.FULLY_COVERED) { - int start = line++; - while (line <= lastLine && coverage.getLine(line).getStatus() >= ICounter.FULLY_COVERED) { - line++; - } - segments.add(new TestReportFileEntry.Segment(start, -1, line - 1, -1, -1)); - - } else { - line++; + coveredLines.set(line); } } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/TestProbes.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/TestProbes.java index f1761227f60..f9f6efcbcb2 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/TestProbes.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/TestProbes.java @@ -13,9 +13,8 @@ import datadog.trace.civisibility.source.Utils; import java.io.InputStream; import java.util.ArrayList; +import java.util.BitSet; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; @@ -107,7 +106,7 @@ public boolean report(Long testSessionId, Long testSuiteId, long spanId) { return false; } - Map> segmentsBySourcePath = new HashMap<>(); + Map coveredLinesBySourcePath = new HashMap<>(); for (Map.Entry, ExecutionDataAdapter> e : probeActivations.entrySet()) { ExecutionDataAdapter executionDataAdapter = e.getValue(); String className = executionDataAdapter.getClassName(); @@ -132,15 +131,15 @@ public boolean report(Long testSessionId, Long testSuiteId, long spanId) { } try (InputStream is = Utils.getClassStream(clazz)) { - List segments = - segmentsBySourcePath.computeIfAbsent(sourcePath, key -> new ArrayList<>()); + BitSet coveredLines = + coveredLinesBySourcePath.computeIfAbsent(sourcePath, key -> new BitSet()); ExecutionDataStore store = new ExecutionDataStore(); store.put(executionDataAdapter.toExecutionData(totalProbeCount)); // TODO optimize this part to avoid parsing // the same class multiple times for different test cases - Analyzer analyzer = new Analyzer(store, new SourceAnalyzer(segments)); + Analyzer analyzer = new Analyzer(store, new SourceAnalyzer(coveredLines)); analyzer.analyzeClass(is, null); } catch (Exception exception) { @@ -153,16 +152,11 @@ public boolean report(Long testSessionId, Long testSuiteId, long spanId) { } } - List fileEntries = new ArrayList<>(segmentsBySourcePath.size()); - for (Map.Entry> e : - segmentsBySourcePath.entrySet()) { + List fileEntries = new ArrayList<>(coveredLinesBySourcePath.size()); + for (Map.Entry e : coveredLinesBySourcePath.entrySet()) { String sourcePath = e.getKey(); - - List segments = e.getValue(); - segments.sort(Comparator.naturalOrder()); - - List compressedSegments = getCompressedSegments(segments); - fileEntries.add(new TestReportFileEntry(sourcePath, compressedSegments)); + BitSet coveredLines = e.getValue(); + fileEntries.add(new TestReportFileEntry(sourcePath, coveredLines)); } for (String nonCodeResource : nonCodeResources) { @@ -175,8 +169,7 @@ public boolean report(Long testSessionId, Long testSuiteId, long spanId) { CiVisibilityCountMetric.CODE_COVERAGE_ERRORS, 1, CoverageErrorType.PATH); continue; } - TestReportFileEntry fileEntry = - new TestReportFileEntry(resourcePath, Collections.emptyList()); + TestReportFileEntry fileEntry = new TestReportFileEntry(resourcePath, null); fileEntries.add(fileEntry); } @@ -193,29 +186,6 @@ public boolean report(Long testSessionId, Long testSuiteId, long spanId) { } } - private static List getCompressedSegments( - List segments) { - List compressedSegments = new ArrayList<>(); - - int startLine = -1, endLine = -1; - for (TestReportFileEntry.Segment segment : segments) { - if (segment.getStartLine() <= endLine + 1) { - endLine = Math.max(endLine, segment.getEndLine()); - } else { - if (startLine > 0) { - compressedSegments.add(new TestReportFileEntry.Segment(startLine, -1, endLine, -1, -1)); - } - startLine = segment.getStartLine(); - endLine = segment.getEndLine(); - } - } - - if (startLine > 0) { - compressedSegments.add(new TestReportFileEntry.Segment(startLine, -1, endLine, -1, -1)); - } - return compressedSegments; - } - @Nullable @Override public TestReport getReport() { diff --git a/dd-smoke-tests/gradle/src/test/resources/test-succeed-junit-5/coverages.ftl b/dd-smoke-tests/gradle/src/test/resources/test-succeed-junit-5/coverages.ftl index 8fc0ad78841..b6b94b8bcd4 100644 --- a/dd-smoke-tests/gradle/src/test/resources/test-succeed-junit-5/coverages.ftl +++ b/dd-smoke-tests/gradle/src/test/resources/test-succeed-junit-5/coverages.ftl @@ -4,9 +4,9 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "ABg=" }, { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-forks-new-instrumentation/coverages.ftl b/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-forks-new-instrumentation/coverages.ftl index e18b060709d..a9c1fdf69f2 100644 --- a/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-forks-new-instrumentation/coverages.ftl +++ b/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-forks-new-instrumentation/coverages.ftl @@ -4,10 +4,10 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 10, -1, 11, -1, -1 ] ] + "bitmap" : "gAw=" }, { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" } ] }, { "test_session_id" : ${content_test_session_id}, @@ -15,9 +15,9 @@ "span_id" : ${content_span_id_2}, "files" : [ { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 8, -1, 8, -1, -1 ] ] + "bitmap" : "AAE=" }, { "filename" : "src/test/java/datadog/smoke/TestSucceedJunit5.java", - "segments" : [ [ 10, -1, 11, -1, -1 ] ] + "bitmap" : "AAw=" } ] -} ] \ No newline at end of file +} ] diff --git a/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-module-new-instrumentation/coverages.ftl b/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-module-new-instrumentation/coverages.ftl index e947ded6455..b11826522dd 100644 --- a/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-module-new-instrumentation/coverages.ftl +++ b/dd-smoke-tests/gradle/src/test/resources/test-succeed-multi-module-new-instrumentation/coverages.ftl @@ -4,7 +4,7 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "submodule-a/src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "ABg=" } ] }, { "test_session_id" : ${content_test_session_id}, @@ -12,6 +12,6 @@ "span_id" : ${content_span_id_2}, "files" : [ { "filename" : "submodule-b/src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "ABg=" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/gradle/src/test/resources/test-succeed-new-instrumentation/coverages.ftl b/dd-smoke-tests/gradle/src/test/resources/test-succeed-new-instrumentation/coverages.ftl index 8fc0ad78841..b6b94b8bcd4 100644 --- a/dd-smoke-tests/gradle/src/test/resources/test-succeed-new-instrumentation/coverages.ftl +++ b/dd-smoke-tests/gradle/src/test/resources/test-succeed-new-instrumentation/coverages.ftl @@ -4,9 +4,9 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "ABg=" }, { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_failed_maven_run_flaky_retries/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_failed_maven_run_flaky_retries/coverages.ftl index 0c9ae04176b..2564a09f96e 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_failed_maven_run_flaky_retries/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_failed_maven_run_flaky_retries/coverages.ftl @@ -4,10 +4,10 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" }, { "filename" : "src/test/java/datadog/smoke/TestFailed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 11, -1, -1 ] ] + "bitmap" : "gAg=" } ] }, { "test_session_id" : ${content_test_session_id}, @@ -15,10 +15,10 @@ "span_id" : ${content_span_id_2}, "files" : [ { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" }, { "filename" : "src/test/java/datadog/smoke/TestFailed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 11, -1, -1 ] ] + "bitmap" : "gAg=" } ] }, { "test_session_id" : ${content_test_session_id}, @@ -26,10 +26,10 @@ "span_id" : ${content_span_id_3}, "files" : [ { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" }, { "filename" : "src/test/java/datadog/smoke/TestFailed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 11, -1, -1 ] ] + "bitmap" : "gAg=" } ] }, { "test_session_id" : ${content_test_session_id}, @@ -37,10 +37,10 @@ "span_id" : ${content_span_id_4}, "files" : [ { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" }, { "filename" : "src/test/java/datadog/smoke/TestFailed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 11, -1, -1 ] ] + "bitmap" : "gAg=" } ] }, { "test_session_id" : ${content_test_session_id}, @@ -48,9 +48,9 @@ "span_id" : ${content_span_id_5}, "files" : [ { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" }, { "filename" : "src/test/java/datadog/smoke/TestFailed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 11, -1, -1 ] ] + "bitmap" : "gAg=" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run/coverages.ftl index 71c1c9ffd26..e396263abc0 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run/coverages.ftl @@ -4,9 +4,9 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "gBg=" }, { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_builtin_coverage/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_builtin_coverage/coverages.ftl index 7b522bb7731..6d41f7aa75f 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_builtin_coverage/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_builtin_coverage/coverages.ftl @@ -3,10 +3,8 @@ "test_suite_id" : ${content_test_suite_id}, "span_id" : ${content_span_id}, "files" : [ { - "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ ] + "filename" : "src/test/java/datadog/smoke/TestSucceed.java" }, { - "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ ] + "filename" : "src/main/java/datadog/smoke/Calculator.java" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_surefire_3_0_0/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_surefire_3_0_0/coverages.ftl index 71c1c9ffd26..e396263abc0 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_surefire_3_0_0/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_surefire_3_0_0/coverages.ftl @@ -4,9 +4,9 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "gBg=" }, { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_arg_line_property/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_arg_line_property/coverages.ftl index f3bb5186115..7313480cedb 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_arg_line_property/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_arg_line_property/coverages.ftl @@ -3,7 +3,6 @@ "test_suite_id" : ${content_test_suite_id}, "span_id" : ${content_span_id}, "files" : [ { - "filename" : "src/test/java/datadog/smoke/TestSucceedPropertyAssertion.java", - "segments" : [ ] + "filename" : "src/test/java/datadog/smoke/TestSucceedPropertyAssertion.java" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_cucumber/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_cucumber/coverages.ftl index de31bcc96d7..ba58ec9f8d1 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_cucumber/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_cucumber/coverages.ftl @@ -4,9 +4,8 @@ "span_id" : ${content_parent_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/calculator/CalculatorSteps.java", - "segments" : [ [ 13, -1, 13, -1, -1 ], [ 19, -1, 20, -1, -1 ], [ 24, -1, 27, -1, -1 ], [ 30, -1, 34, -1, -1 ], [ 36, -1, 40, -1, -1 ], [ 42, -1, 43, -1, -1 ], [ 49, -1, 51, -1, -1 ], [ 53, -1, 53, -1, -1 ], [ 56, -1, 56, -1, -1 ] ] + "bitmap" : "ACAYz/cNLgE=" }, { - "filename" : "src/test/resources/datadog/smoke/basic_arithmetic.feature", - "segments" : [ ] + "filename" : "src/test/resources/datadog/smoke/basic_arithmetic.feature" } ] } ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_jacoco_and_argline/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_jacoco_and_argline/coverages.ftl index 71c1c9ffd26..e396263abc0 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_jacoco_and_argline/coverages.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_with_jacoco_and_argline/coverages.ftl @@ -4,9 +4,9 @@ "span_id" : ${content_span_id}, "files" : [ { "filename" : "src/test/java/datadog/smoke/TestSucceed.java", - "segments" : [ [ 7, -1, 7, -1, -1 ], [ 11, -1, 12, -1, -1 ] ] + "bitmap" : "gBg=" }, { "filename" : "src/main/java/datadog/smoke/Calculator.java", - "segments" : [ [ 5, -1, 5, -1, -1 ] ] + "bitmap" : "IA==" } ] } ] \ No newline at end of file diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java index 90a08f533a4..f7ae747c912 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCovMapperV2.java @@ -27,6 +27,7 @@ import java.nio.channels.WritableByteChannel; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.BitSet; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -42,7 +43,7 @@ public class CiTestCovMapperV2 implements RemoteMapper { private static final byte[] SPAN_ID = "span_id".getBytes(StandardCharsets.UTF_8); private static final byte[] FILES = "files".getBytes(StandardCharsets.UTF_8); private static final byte[] FILENAME = "filename".getBytes(StandardCharsets.UTF_8); - private static final byte[] SEGMENTS = "segments".getBytes(StandardCharsets.UTF_8); + private static final byte[] BITMAP = "bitmap".getBytes(StandardCharsets.UTF_8); private final int size; private final GrowableBuffer headerBuffer; @@ -102,23 +103,17 @@ public void map(List> trace, Writable writable) { writable.startArray(fileEntries.size()); for (TestReportFileEntry entry : fileEntries) { - writable.startMap(2); + BitSet coveredLines = entry.getCoveredLines(); + boolean lineInfoPresent = coveredLines != null; + + writable.startMap(1 + (lineInfoPresent ? 1 : 0)); writable.writeUTF8(FILENAME); writable.writeString(entry.getSourceFileName(), null); - Collection segments = entry.getSegments(); - - writable.writeUTF8(SEGMENTS); - writable.startArray(segments.size()); - - for (TestReportFileEntry.Segment segment : segments) { - writable.startArray(5); - writable.writeInt(segment.getStartLine()); - writable.writeInt(segment.getStartColumn()); - writable.writeInt(segment.getEndLine()); - writable.writeInt(segment.getEndColumn()); - writable.writeInt(segment.getNumberOfExecutions()); + if (lineInfoPresent) { + writable.writeUTF8(BITMAP); + writable.writeBinary(coveredLines.toByteArray()); } } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java b/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java index 3f2002d8a47..f5bda589b3e 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/coverage/TestReportFileEntry.java @@ -1,24 +1,24 @@ package datadog.trace.api.civisibility.coverage; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; +import java.util.BitSet; +import javax.annotation.Nullable; public class TestReportFileEntry { private final String sourceFileName; - private final List segments; + private final @Nullable BitSet coveredLines; - public TestReportFileEntry(String sourceFileName, List segments) { + public TestReportFileEntry(String sourceFileName, @Nullable BitSet coveredLines) { this.sourceFileName = sourceFileName; - this.segments = segments; + this.coveredLines = coveredLines; } public String getSourceFileName() { return sourceFileName; } - public Collection getSegments() { - return segments; + @Nullable + public BitSet getCoveredLines() { + return coveredLines; } @Override @@ -27,65 +27,7 @@ public String toString() { + "sourceFileName='" + sourceFileName + "', lines=[" - + segments.stream().map(s -> String.valueOf(s.startLine)).collect(Collectors.joining(",")) + + coveredLines + "]}"; } - - public static class Segment implements Comparable { - private final int startLine; - private final int startColumn; - private final int endLine; - private final int endColumn; - private final int numberOfExecutions; - - public Segment( - int startLine, int startColumn, int endLine, int endColumn, int numberOfExecutions) { - this.startLine = startLine; - this.startColumn = startColumn; - this.endLine = endLine; - this.endColumn = endColumn; - this.numberOfExecutions = numberOfExecutions; - } - - public int getStartLine() { - return startLine; - } - - public int getStartColumn() { - return startColumn; - } - - public int getEndLine() { - return endLine; - } - - public int getEndColumn() { - return endColumn; - } - - public int getNumberOfExecutions() { - return numberOfExecutions; - } - - @Override - public int compareTo(Segment segment) { - return startLine - segment.startLine; - } - - @Override - public String toString() { - return "Segment{" - + "startLine=" - + startLine - + ", startColumn=" - + startColumn - + ", endLine=" - + endLine - + ", endColumn=" - + endColumn - + ", numberOfExecutions=" - + numberOfExecutions - + '}'; - } - } }