Skip to content

Commit 48a5921

Browse files
Fix code coverage percentage reporting for Android projects (#7815)
* Fix code coverage percentage reporting for Android projects * Fix codenarc violations
1 parent 99b6311 commit 48a5921

13 files changed

+100
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package datadog.trace.instrumentation.gradle
2+
3+
import datadog.trace.api.civisibility.domain.BuildModuleLayout
4+
import datadog.trace.api.civisibility.domain.SourceSet
5+
import org.gradle.api.Project
6+
import org.gradle.api.file.FileTree
7+
import org.gradle.api.logging.Logger
8+
import org.gradle.api.logging.Logging
9+
import org.gradle.api.tasks.testing.Test
10+
11+
class AndroidGradleUtils {
12+
13+
private static final Logger LOGGER = Logging.getLogger(AndroidGradleUtils)
14+
15+
static BuildModuleLayout getAndroidModuleLayout(Project project, Test task) {
16+
try {
17+
def variant = getVariant(project, task)
18+
if (variant == null) {
19+
return null
20+
}
21+
22+
def sources = getSources(variant)
23+
def destinations = getDestinations(variant, project)
24+
return new BuildModuleLayout(Collections.singletonList(new SourceSet(SourceSet.Type.CODE, sources, destinations)))
25+
} catch (Exception e) {
26+
LOGGER.error("Could not get Android module layout for ${project.name} and ${task.path}", e)
27+
return null
28+
}
29+
}
30+
31+
private static getVariant(Project project, Test task) {
32+
def androidPlugin = project.plugins.findPlugin('android') ?: project.plugins.findPlugin('android-library')
33+
34+
def variants
35+
if (androidPlugin.class.simpleName == 'LibraryPlugin') {
36+
variants = project.android.libraryVariants
37+
} else {
38+
variants = project.android.applicationVariants
39+
}
40+
41+
for (def v : variants) {
42+
if (task.path.endsWith("test${v.name.capitalize()}UnitTest")) {
43+
return v
44+
}
45+
}
46+
return null
47+
}
48+
49+
static Collection<File> getSources(variant) {
50+
List<File> sources = []
51+
for (def srcs : variant.sourceSets.java.srcDirs) {
52+
sources.addAll(srcs)
53+
}
54+
return sources
55+
}
56+
57+
private static final EXCLUDES = [
58+
'android/databinding/**/*.class',
59+
'**/android/databinding/*Binding.class',
60+
'**/BR.*',
61+
'**/R.class',
62+
'**/R$*.class',
63+
'**/BuildConfig.*',
64+
'**/Manifest*.*',
65+
'**/*$ViewInjector*.*',
66+
'**/*$ViewBinder*.*',
67+
'**/*_MembersInjector.class',
68+
'**/Dagger*Component.class',
69+
'**/Dagger*Component$Builder.class',
70+
'**/*Module_*Factory.class'
71+
]
72+
73+
private static Collection<File> getDestinations(variant, Project project) {
74+
def javaDestinations = getJavaDestinations(variant)
75+
FileTree javaTree = project.fileTree(dir: javaDestinations, excludes: EXCLUDES)
76+
77+
FileTree destinationsTree
78+
if (project.plugins.findPlugin('kotlin-android') != null) {
79+
def kotlinDestinations = "${project.buildDir}/tmp/kotlin-classes/${variant.name}"
80+
def kotlinTree = project.fileTree(dir: kotlinDestinations, excludes: EXCLUDES)
81+
destinationsTree = javaTree + kotlinTree
82+
} else {
83+
destinationsTree = javaTree
84+
}
85+
return destinationsTree.files
86+
}
87+
88+
private static getJavaDestinations(variant) {
89+
if (variant.hasProperty('javaCompileProvider')) {
90+
return variant.javaCompileProvider.get().destinationDir
91+
}
92+
return variant.javaCompile.destinationDir
93+
}
94+
}

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ public void beforeExecute(TaskIdentity<?> taskIdentity) {
186186
Map<String, Object> inputProperties = task.getInputs().getProperties();
187187
BuildModuleLayout moduleLayout =
188188
(BuildModuleLayout) inputProperties.get(CiVisibilityPluginExtension.MODULE_LAYOUT_PROPERTY);
189+
if (moduleLayout.getSourceSets().isEmpty()
190+
&& project.getExtensions().findByName("android") != null) {
191+
moduleLayout = AndroidGradleUtils.getAndroidModuleLayout(project, task);
192+
}
193+
189194
JavaAgent jacocoAgent = getJacocoAgent(task);
190195

191196
Path jvmExecutable = CiVisibilityPluginExtension.getEffectiveExecutable(task);

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_10.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_10.java

File renamed without changes.

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_3.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityGradleListenerInjector_8_3.java

File renamed without changes.

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/CiVisibilityPlugin.java

File renamed without changes.

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

File renamed without changes.

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

File renamed without changes.

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/GradleBuildScopeServices_8_10_Instrumentation.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleBuildScopeServices_8_10_Instrumentation.java

File renamed without changes.

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/GradleBuildScopeServices_8_3_Instrumentation.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleBuildScopeServices_8_3_Instrumentation.java

File renamed without changes.

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/GradleDaemonLoggingInstrumentation.java renamed to dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonLoggingInstrumentation.java

File renamed without changes.

0 commit comments

Comments
 (0)