Skip to content

Commit 217b146

Browse files
Fix Jacoco coverage exclusion (#7808)
1 parent 67e94a0 commit 217b146

File tree

8 files changed

+101
-71
lines changed

8 files changed

+101
-71
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,11 @@ private Map<String, String> getPropertiesPropagatedToChildProcess(
191191
CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT),
192192
String.valueOf(signalServerAddress != null ? signalServerAddress.getPort() : 0));
193193

194-
List<String> coverageEnabledPackages = sessionSettings.getCoverageEnabledPackages();
194+
List<String> coverageIncludedPackages = sessionSettings.getCoverageIncludedPackages();
195195
propagatedSystemProperties.put(
196196
Strings.propertyNameToSystemPropertyName(
197197
CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_INCLUDES),
198-
String.join(":", coverageEnabledPackages));
198+
String.join(":", coverageIncludedPackages));
199199

200200
if (jacocoAgent != null && !config.isCiVisibilityCoverageLinesDisabled()) {
201201
// If the module is using Jacoco,

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemSessionImpl.java

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@
4040
import java.util.ArrayList;
4141
import java.util.Collection;
4242
import java.util.Collections;
43-
import java.util.Iterator;
4443
import java.util.List;
45-
import java.util.stream.Collectors;
4644
import javax.annotation.Nullable;
4745

4846
public class BuildSystemSessionImpl<T extends CoverageCalculator> extends AbstractTestSession
@@ -92,7 +90,10 @@ public BuildSystemSessionImpl(
9290
this.repoIndexProvider = repoIndexProvider;
9391
this.coverageCalculatorFactory = coverageCalculatorFactory;
9492
this.coverageCalculator = coverageCalculatorFactory.sessionCoverage(span.getSpanId());
95-
this.settings = new BuildSessionSettings(getCoverageEnabledPackages(config, repoIndexProvider));
93+
this.settings =
94+
new BuildSessionSettings(
95+
getCoverageIncludedPackages(config, repoIndexProvider),
96+
config.getCiVisibilityCodeCoverageExcludes());
9697

9798
signalServer.registerSignalHandler(
9899
SignalType.MODULE_EXECUTION_RESULT, moduleSignalRouter::onModuleSignalReceived);
@@ -107,48 +108,19 @@ public BuildSystemSessionImpl(
107108
setTag(Tags.TEST_COMMAND, startCommand);
108109
}
109110

110-
private static List<String> getCoverageEnabledPackages(
111+
private static List<String> getCoverageIncludedPackages(
111112
Config config, RepoIndexProvider repoIndexProvider) {
112113
if (!config.isCiVisibilityCodeCoverageEnabled()) {
113114
return Collections.emptyList();
114115
}
115116

116117
List<String> includedPackages = config.getCiVisibilityCodeCoverageIncludes();
117-
List<String> packages;
118118
if (includedPackages != null && !includedPackages.isEmpty()) {
119-
packages = includedPackages;
119+
return new ArrayList<>(includedPackages);
120120
} else {
121121
RepoIndex repoIndex = repoIndexProvider.getIndex();
122-
packages = new ArrayList<>(repoIndex.getRootPackages());
122+
return new ArrayList<>(repoIndex.getRootPackages());
123123
}
124-
125-
List<String> excludedPackages = config.getCiVisibilityCodeCoverageExcludes();
126-
if (excludedPackages != null && !excludedPackages.isEmpty()) {
127-
removeMatchingPackages(packages, excludedPackages);
128-
}
129-
return packages;
130-
}
131-
132-
private static void removeMatchingPackages(List<String> packages, List<String> excludedPackages) {
133-
List<String> excludedPrefixes =
134-
excludedPackages.stream()
135-
.map(BuildSystemSessionImpl::trimTrailingAsterisk)
136-
.collect(Collectors.toList());
137-
Iterator<String> packagesIterator = packages.iterator();
138-
while (packagesIterator.hasNext()) {
139-
String p = packagesIterator.next();
140-
141-
for (String excludedPrefix : excludedPrefixes) {
142-
if (p.startsWith(excludedPrefix)) {
143-
packagesIterator.remove();
144-
break;
145-
}
146-
}
147-
}
148-
}
149-
150-
private static String trimTrailingAsterisk(String s) {
151-
return s.endsWith("*") ? s.substring(0, s.length() - 1) : s;
152124
}
153125

154126
private SignalResponse onRepoIndexRequestReceived(RepoIndexRequest request) {

dd-java-agent/instrumentation/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleProjectConfigurator.groovy

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,19 @@ class GradleProjectConfigurator {
203203
}
204204
}
205205

206-
def coverageEnabledPackages = sessionSettings.getCoverageEnabledPackages()
206+
def coverageIncludedPackages = sessionSettings.getCoverageIncludedPackages()
207+
def coverageExcludedPackages = sessionSettings.getCoverageExcludedPackages()
207208
forEveryTestTask project, { task ->
208209
task.jacoco.excludeClassLoaders += [DatadogClassLoader.name]
209210

210-
for (String coverageEnabledPackage : coverageEnabledPackages) {
211-
if (Strings.isNotBlank(coverageEnabledPackage)) {
212-
task.jacoco.includes += coverageEnabledPackage
211+
for (String includedPackage : coverageIncludedPackages) {
212+
if (Strings.isNotBlank(includedPackage)) {
213+
task.jacoco.includes += includedPackage
214+
}
215+
}
216+
for (String excludedPackage : coverageExcludedPackages) {
217+
if (Strings.isNotBlank(excludedPackage)) {
218+
task.jacoco.excludes += excludedPackage
213219
}
214220
}
215221
}

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityPluginExtension.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,28 @@ private void applyJacocoSettings(JacocoTaskExtension jacocoTaskExtension) {
170170
new ArrayList<>(ciVisibilityService.getExcludeClassLoaders()));
171171
}
172172

173-
List<String> taskIncludePackages = jacocoTaskExtension.getIncludes();
174-
if (taskIncludePackages == null) {
175-
taskIncludePackages = new ArrayList<>();
176-
jacocoTaskExtension.setIncludes(taskIncludePackages);
177-
}
178-
for (String coverageEnabledPackage : ciVisibilityService.getCoverageEnabledPackages()) {
179-
if (coverageEnabledPackage != null && !coverageEnabledPackage.isEmpty()) {
180-
taskIncludePackages.add(coverageEnabledPackage);
173+
jacocoTaskExtension.setIncludes(
174+
merge(
175+
jacocoTaskExtension.getIncludes(), ciVisibilityService.getCoverageIncludedPackages()));
176+
jacocoTaskExtension.setExcludes(
177+
merge(
178+
jacocoTaskExtension.getExcludes(), ciVisibilityService.getCoverageExcludedPackages()));
179+
}
180+
181+
@SafeVarargs
182+
private static List<String> merge(List<String>... packageLists) {
183+
List<String> merged = new ArrayList<>();
184+
for (List<String> packageList : packageLists) {
185+
if (packageList == null) {
186+
continue;
187+
}
188+
for (String pkg : packageList) {
189+
if (pkg != null && !pkg.isEmpty()) {
190+
merged.add(pkg);
191+
}
181192
}
182193
}
194+
return merged;
183195
}
184196

185197
private void applyTracerSettings(

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityService.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,14 @@ public List<String> getCoverageEnabledSourceSets() {
5656
return config.getCiVisibilityJacocoGradleSourceSets();
5757
}
5858

59-
public List<String> getCoverageEnabledPackages() {
59+
public List<String> getCoverageIncludedPackages() {
6060
BuildSessionSettings sessionSettings = buildEventsHandler.getSessionSettings(SESSION_KEY);
61-
return sessionSettings.getCoverageEnabledPackages();
61+
return sessionSettings.getCoverageIncludedPackages();
62+
}
63+
64+
public List<String> getCoverageExcludedPackages() {
65+
BuildSessionSettings sessionSettings = buildEventsHandler.getSessionSettings(SESSION_KEY);
66+
return sessionSettings.getCoverageExcludedPackages();
6267
}
6368

6469
@SuppressForbidden

dd-java-agent/instrumentation/jacoco/src/main/java/datadog/trace/instrumentation/jacoco/ProbeInserterInstrumentation.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,23 @@ static void exit(
139139
classNameField.setAccessible(true);
140140
String className = (String) classNameField.get(arrayStrategy);
141141

142-
String[] excludedClassnames = Config.get().getCiVisibilityCodeCoverageExcludedPackages();
143-
for (String excludedClassname : excludedClassnames) {
144-
if (className.startsWith(excludedClassname)) {
142+
String[] excludedPackages = Config.get().getCiVisibilityCodeCoverageExcludedPackages();
143+
for (String excludedPackage : excludedPackages) {
144+
if (className.startsWith(excludedPackage)) {
145+
return;
146+
}
147+
}
148+
149+
String[] includedPackages = Config.get().getCiVisibilityCodeCoverageIncludedPackages();
150+
if (includedPackages.length > 0) {
151+
boolean included = false;
152+
for (String includedPackage : includedPackages) {
153+
if (className.startsWith(includedPackage)) {
154+
included = true;
155+
break;
156+
}
157+
}
158+
if (!included) {
145159
return;
146160
}
147161
}

dd-java-agent/instrumentation/maven-3.2.1/src/main/java/datadog/trace/instrumentation/maven3/MavenProjectConfigurator.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,9 @@ private static void configureJacocoPlugin(
312312
jacocoPlugin.addExecution(prepareAgentExecution);
313313

314314
configureJacocoInstrumentedPackages(
315-
prepareAgentExecution, sessionSettings.getCoverageEnabledPackages());
315+
prepareAgentExecution,
316+
sessionSettings.getCoverageIncludedPackages(),
317+
sessionSettings.getCoverageExcludedPackages());
316318
}
317319

318320
private static Plugin getJacocoPlugin(MavenProject project) {
@@ -345,20 +347,32 @@ private static Plugin getJacocoPlugin(MavenProject project) {
345347
}
346348

347349
private static void configureJacocoInstrumentedPackages(
348-
PluginExecution execution, List<String> instrumentedPackages) {
349-
Xpp3Dom includes = new Xpp3Dom("includes");
350-
for (String instrumentedPackage : instrumentedPackages) {
351-
if (Strings.isNotBlank(instrumentedPackage)) {
352-
Xpp3Dom include = new Xpp3Dom("include");
353-
include.setValue(instrumentedPackage);
354-
includes.addChild(include);
350+
PluginExecution execution, List<String> includedPackages, List<String> excludedPackages) {
351+
Xpp3Dom configuration = new Xpp3Dom("configuration");
352+
execution.setConfiguration(configuration);
353+
354+
if (!includedPackages.isEmpty()) {
355+
Xpp3Dom includes = new Xpp3Dom("includes");
356+
for (String instrumentedPackage : includedPackages) {
357+
if (Strings.isNotBlank(instrumentedPackage)) {
358+
Xpp3Dom include = new Xpp3Dom("include");
359+
include.setValue(instrumentedPackage);
360+
includes.addChild(include);
361+
}
355362
}
363+
configuration.addChild(includes);
356364
}
357365

358-
if (includes.getChildCount() > 0) {
359-
Xpp3Dom configuration = new Xpp3Dom("configuration");
360-
configuration.addChild(includes);
361-
execution.setConfiguration(configuration);
366+
if (!excludedPackages.isEmpty()) {
367+
Xpp3Dom excludes = new Xpp3Dom("excludes");
368+
for (String excludedPackage : excludedPackages) {
369+
if (Strings.isNotBlank(excludedPackage)) {
370+
Xpp3Dom exclude = new Xpp3Dom("exclude");
371+
exclude.setValue(excludedPackage);
372+
excludes.addChild(exclude);
373+
}
374+
}
375+
configuration.addChild(excludes);
362376
}
363377
}
364378
}

internal-api/src/main/java/datadog/trace/api/civisibility/domain/BuildSessionSettings.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@
44

55
public class BuildSessionSettings {
66

7-
private final List<String> coverageEnabledPackages;
7+
private final List<String> coverageIncludedPackages;
8+
private final List<String> coverageExcludedPackages;
89

9-
public BuildSessionSettings(List<String> coverageEnabledPackages) {
10-
this.coverageEnabledPackages = coverageEnabledPackages;
10+
public BuildSessionSettings(
11+
List<String> coverageIncludedPackages, List<String> coverageExcludedPackages) {
12+
this.coverageIncludedPackages = coverageIncludedPackages;
13+
this.coverageExcludedPackages = coverageExcludedPackages;
1114
}
1215

13-
public List<String> getCoverageEnabledPackages() {
14-
return coverageEnabledPackages;
16+
public List<String> getCoverageIncludedPackages() {
17+
return coverageIncludedPackages;
18+
}
19+
20+
public List<String> getCoverageExcludedPackages() {
21+
return coverageExcludedPackages;
1522
}
1623
}

0 commit comments

Comments
 (0)