Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Gradle 7.4 Aggregated Test Reports #2821

Merged
merged 1 commit into from
Apr 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ plugins {
id 'opensearch.global-build-info'
id "com.diffplug.spotless" version "6.4.2" apply false
id "org.gradle.test-retry" version "1.3.2" apply false
id "test-report-aggregation"
id 'jacoco-report-aggregation'
}

apply from: 'gradle/build-complete.gradle'
Expand Down Expand Up @@ -385,6 +387,15 @@ gradle.projectsEvaluated {
}
}
}

dependencies {
subprojects.findAll { it.pluginManager.hasPlugin('java') }.forEach {
testReportAggregation it
}
subprojects.findAll { it.pluginManager.hasPlugin('jacoco') }.forEach {
jacocoAggregation it
}
}
}

// test retry configuration
Expand All @@ -402,6 +413,7 @@ subprojects {
// eclipse configuration
allprojects {
apply plugin: 'eclipse'

// Name all the non-root projects after their path so that paths get grouped together when imported into eclipse.
if (path != ':') {
eclipse.project.name = path
Expand Down Expand Up @@ -558,3 +570,15 @@ subprojects {
}
}
}

reporting {
reports {
testAggregateTestReport(AggregateTestReport) {
testType = TestSuiteType.UNIT_TEST
}
}
}

tasks.named(JavaBasePlugin.CHECK_TASK_NAME) {
dependsOn tasks.named('testAggregateTestReport', TestReport)
}
83 changes: 14 additions & 69 deletions gradle/code-coverage.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,92 +10,37 @@ apply plugin: 'jacoco'

repositories {
mavenCentral()
gradlePluginPortal()
}

allprojects {
plugins.withId('jacoco') {
// The default JaCoCo version in Gradle 6.6.1 is 0.8.5, but at least version 0.8.6 officially supports Java 14
jacoco.toolVersion = '0.8.7'
jacoco.toolVersion = '0.8.8'
}
}

def codeCoverageReportTask = tasks.register("codeCoverageReport", JacocoReport) {
description = 'Generates aggregate report from all subprojects.'
executionData.setFrom fileTree(dir: '.', include: '**/build/jacoco/*.exec')
dependsOn subprojects.findAll(s -> s.tasks.findByName('check') != null).check
}

tasks.register("codeCoverageReportForUnitTest", JacocoReport) {
description = 'Generates aggregate report from all subprojects for unit test.'
executionData.setFrom fileTree(dir: '.', include: '**/build/jacoco/test.exec')
}

tasks.register("codeCoverageReportForIntegrationTest", JacocoReport) {
description = 'Generates aggregate report from all subprojects for integration test.'
// These kinds of tests are integration test, and the tests can be ran by Gradle tasks with the same name
def integrationTestExecPathList = ['**/build/jacoco/integTest.exec',
'**/build/jacoco/internalClusterTest.exec',
'**/build/jacoco/javaRestTest.exec',
'**/build/jacoco/yamlRestTest.exec' ]
executionData.setFrom fileTree(dir: '.', include: integrationTestExecPathList)
}

tasks.withType(JacocoReport).configureEach {
group = JavaBasePlugin.VERIFICATION_GROUP

// Select projects with corresponding tests in order to run proper tests and select proper classes to generate the report
def projectsWithJavaPlugin = subprojects.findAll { it.pluginManager.hasPlugin('java') }
def projectsWithUnitTest = projectsWithJavaPlugin.findAll { it.tasks.findByName('test').enabled }
def projectsWithIntegTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('integTest')}
def projectsWithAsyncIntegTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('asyncIntegTest')}
def projectsWithInternalClusterTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('internalClusterTest')}
def projectsWithPooledInternalClusterTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('pooledInternalClusterTest')}
def projectsWithJavaRestTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('javaRestTest')}
def projectsWithYamlRestTest = projectsWithJavaPlugin.findAll {it.tasks.findByName('yamlRestTest')}
def projectsWithIntegrationTest = projectsWithIntegTest + projectsWithAsyncIntegTest + projectsWithInternalClusterTest + projectsWithPooledInternalClusterTest + projectsWithJavaRestTest + projectsWithYamlRestTest
def projectsWithTest = projectsWithUnitTest + projectsWithIntegrationTest

def selectedProjects
switch (name) {
case "codeCoverageReportForUnitTest":
dependsOn projectsWithUnitTest.test
selectedProjects = projectsWithUnitTest
break
case "codeCoverageReportForIntegrationTest":
dependsOn projectsWithIntegTest.integTest
dependsOn projectsWithAsyncIntegTest.asyncIntegTest
dependsOn projectsWithInternalClusterTest.internalClusterTest
dependsOn projectsWithPooledInternalClusterTest.pooledInternalClusterTest
dependsOn projectsWithJavaRestTest.javaRestTest
dependsOn projectsWithYamlRestTest.yamlRestTest
selectedProjects = projectsWithIntegrationTest
break
default:
dependsOn projectsWithUnitTest.test
dependsOn projectsWithIntegTest.integTest
dependsOn projectsWithAsyncIntegTest.asyncIntegTest
dependsOn projectsWithInternalClusterTest.internalClusterTest
dependsOn projectsWithPooledInternalClusterTest.pooledInternalClusterTest
dependsOn projectsWithJavaRestTest.javaRestTest
dependsOn projectsWithYamlRestTest.yamlRestTest
selectedProjects = projectsWithJavaPlugin
break
}

sourceDirectories.setFrom files(selectedProjects.sourceSets.main.allSource.srcDirs)
classDirectories.setFrom files(selectedProjects.sourceSets.main.output)

reports {
// Code coverage report in HTML and CSV formats are on demand, in case they take extra disk space.
xml.getRequired().set(System.getProperty('tests.coverage.report.xml', 'true').toBoolean())
html.getRequired().set(System.getProperty('tests.coverage.report.html', 'false').toBoolean())
csv.getRequired().set(System.getProperty('tests.coverage.report.csv', 'false').toBoolean())
xml.required = System.getProperty('tests.coverage.report.xml', 'true').toBoolean()
html.required = System.getProperty('tests.coverage.report.html', 'false').toBoolean()
csv.required = System.getProperty('tests.coverage.report.csv', 'false').toBoolean()
}
}

if (System.getProperty("tests.coverage")) {
reporting {
reports {
testCodeCoverageReport(JacocoCoverageReport) {
testType = TestSuiteType.UNIT_TEST
}
}
}

// Attach code coverage report task to Gradle check task
project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME).configure {
dependsOn codeCoverageReportTask
dependsOn tasks.named('testCodeCoverageReport', JacocoReport)
}
}