/* * Copyright (C) 2021. Uber Technologies * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Mostly taken from official Gradle sample: https://docs.gradle.org/current/samples/sample_jvm_multi_project_with_code_coverage.html plugins { id 'java' id 'jacoco' } // Use JDK 21 for this module, via a toolchain. We need JDK 21 since this module // depends on jdk-recent-unit-tests. // We must null out sourceCompatibility and targetCompatibility to use toolchains. java.sourceCompatibility = null java.targetCompatibility = null java.toolchain.languageVersion.set JavaLanguageVersion.of(21) // A resolvable configuration to collect source code def sourcesPath = configurations.create("sourcesPath") { visible = false canBeResolved = true canBeConsumed = false extendsFrom(configurations.implementation) attributes { attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION)) attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType, 'source-folders')) } } // A resolvable configuration to collect JaCoCo coverage data def coverageDataPath = configurations.create("coverageDataPath") { visible = false canBeResolved = true canBeConsumed = false extendsFrom(configurations.implementation) attributes { attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION)) attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType, 'jacoco-coverage-data')) } } // Task to gather code coverage from multiple subprojects def codeCoverageReport = tasks.register('codeCoverageReport', JacocoReport) { additionalClassDirs(configurations.runtimeClasspath.filter{it.path.contains(rootProject.name) }) additionalSourceDirs(sourcesPath.incoming.artifactView { lenient(true) }.files) executionData(coverageDataPath.incoming.artifactView { lenient(true) }.files.filter { it.exists() }) reports { // xml is usually used to integrate code coverage with // other tools like SonarQube, Coveralls or Codecov xml.required = true // HTML reports can be used to see code coverage // without any external tools html.required = true } } // These dependencies indicate which projects have tests or tested code we want to include // when computing overall coverage. We aim to measure coverage for all code that actually ships // in a Maven artifact (so, e.g., we do not measure coverage for the jmh module) dependencies { implementation project(':annotations') implementation project(':nullaway') implementation project(':jar-infer:jar-infer-lib') implementation project(':jar-infer:nullaway-integration-test') implementation project(':guava-recent-unit-tests') implementation project(':jdk-recent-unit-tests') }