/* * 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' id 'com.github.kt3k.coveralls' } // 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 } } coveralls { jacocoReportPath = "build/reports/jacoco/codeCoverageReport/codeCoverageReport.xml" afterEvaluate { sourceDirs = sourcesPath.incoming.artifactView { lenient(true) }.files as List } } def coverallsTask = tasks.named('coveralls') coverallsTask.configure { dependsOn 'codeCoverageReport' } // 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(':nullaway') implementation project(':jar-infer:jar-infer-lib') implementation project(':jar-infer:nullaway-integration-test') implementation project(':jdk17-unit-tests') }