diff --git a/changelog/3.99.0-rc1/pr-1824.v2.yml b/changelog/3.99.0-rc1/pr-1824.v2.yml new file mode 100644 index 000000000..5e9ffdb71 --- /dev/null +++ b/changelog/3.99.0-rc1/pr-1824.v2.yml @@ -0,0 +1,5 @@ +type: improvement +improvement: + description: Add Gradle 7 support + links: + - https://github.com/palantir/gradle-baseline/pull/1824 diff --git a/changelog/@unreleased/pr-1824.v2.yml b/changelog/@unreleased/pr-1824.v2.yml new file mode 100644 index 000000000..22a48a104 --- /dev/null +++ b/changelog/@unreleased/pr-1824.v2.yml @@ -0,0 +1,5 @@ +type: break +break: + description: Add Gradle 7 support. Increase minimum required Gradle version to 6.7. + links: + - https://github.com/palantir/gradle-baseline/pull/1824 diff --git a/gradle-baseline-java/build.gradle b/gradle-baseline-java/build.gradle index d7d2eddaa..7b646fcaa 100644 --- a/gradle-baseline-java/build.gradle +++ b/gradle-baseline-java/build.gradle @@ -14,6 +14,7 @@ dependencies { compile 'net.ltgt.gradle:gradle-errorprone-plugin' compile 'org.apache.maven.shared:maven-dependency-analyzer' compile 'org.github.ngbinh.scalastyle:gradle-scalastyle-plugin_2.11' + implementation 'commons-lang:commons-lang' implementation 'com.palantir.javaformat:palantir-java-format-spi' // Add an explicit dependency to ensure consumers can use JDK14 source compat implementation 'org.ow2.asm:asm' diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/Baseline.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/Baseline.java index d7d1619f7..738af5dee 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/Baseline.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/Baseline.java @@ -16,14 +16,23 @@ package com.palantir.baseline.plugins; +import org.gradle.api.GradleException; import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.util.GradleVersion; /** A Plugin that configures a project with all Baseline settings. */ public final class Baseline implements Plugin { + public static final GradleVersion MIN_GRADLE_VERSION = GradleVersion.version("6.7"); @Override public void apply(Project project) { + if (GradleVersion.current().compareTo(MIN_GRADLE_VERSION) < 0) { + throw new GradleException(String.format( + "The minimum supported Gradle version is version %s but got version %s", + MIN_GRADLE_VERSION, GradleVersion.current())); + } + Project rootProject = project.getRootProject(); if (!project.equals(rootProject)) { project.getLogger() @@ -50,11 +59,6 @@ public void apply(Project project) { proj.getPluginManager().apply(BaselineTestHeap.class); proj.getPluginManager().apply(BaselineJavaParameters.class); proj.getPluginManager().apply(BaselineImmutables.class); - - // TODO(dsanduleac): enable this when people's idea{} blocks no longer reference things like - // configurations.integrationTestCompile - // proj.getPluginManager().apply(BaselineFixGradleJava.class); - }); } } diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java index 17aefc615..5fb3c234c 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineExactDependencies.java @@ -27,12 +27,14 @@ import java.io.File; import java.io.IOException; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.concurrent.ThreadSafe; +import org.apache.commons.lang3.StringUtils; import org.apache.maven.shared.dependency.analyzer.ClassAnalyzer; import org.apache.maven.shared.dependency.analyzer.DefaultClassAnalyzer; import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzer; @@ -89,15 +91,17 @@ private static void configureSourceSet( TaskProvider checkImplicitDependencies) { Configuration implementation = project.getConfigurations().getByName(sourceSet.getImplementationConfigurationName()); - Configuration compile = project.getConfigurations().getByName(sourceSet.getCompileConfigurationName()); + Optional maybeCompile = + Optional.ofNullable(project.getConfigurations().findByName(getCompileConfigurationName(sourceSet))); Configuration compileClasspath = project.getConfigurations().getByName(sourceSet.getCompileClasspathConfigurationName()); Configuration explicitCompile = project.getConfigurations() .create("baseline-exact-dependencies-" + sourceSet.getName(), conf -> { conf.setDescription(String.format( - "Tracks the explicit (not inherited) dependencies added to either %s or %s", - compile.toString(), implementation.toString())); + "Tracks the explicit (not inherited) dependencies added to either %s " + + "or compile (deprecated)", + implementation)); conf.setVisible(false); conf.setCanBeConsumed(false); @@ -137,18 +141,25 @@ private static void configureSourceSet( // configurations (belonging to our source set) project.afterEvaluate(p -> { Configuration implCopy = implementation.copy(); - Configuration compileCopy = compile.copy(); - // Ensure it's not resolvable, otherwise plugins that resolve all configurations might have - // a bad time resolving this with GCV, if you have direct dependencies without corresponding entries in - // versions.props, but instead rely on getting a version for them from the lock file. - compileCopy.setCanBeResolved(false); - compileCopy.setCanBeConsumed(false); // Without these, explicitCompile will successfully resolve 0 files and you'll waste 1 hour trying // to figure out why. project.getConfigurations().add(implCopy); - project.getConfigurations().add(compileCopy); - explicitCompile.extendsFrom(implCopy, compileCopy); + explicitCompile.extendsFrom(implCopy); + + // For Gradle 6 and below, the compile configuration might still be used. + maybeCompile.ifPresent(compile -> { + Configuration compileCopy = compile.copy(); + // Ensure it's not resolvable, otherwise plugins that resolve all configurations might have + // a bad time resolving this with GCV, if you have direct dependencies without corresponding entries in + // versions.props, but instead rely on getting a version for them from the lock file. + compileCopy.setCanBeResolved(false); + compileCopy.setCanBeConsumed(false); + + project.getConfigurations().add(compileCopy); + + explicitCompile.extendsFrom(compileCopy); + }); }); explicitCompile.withDependencies(deps -> { @@ -208,6 +219,18 @@ static String checkUnusedDependenciesNameForSourceSet(SourceSet sourceSet) { return GUtil.toLowerCamelCase("checkUnusedDependencies " + sourceSet.getName()); } + /** + * The {@link SourceSet#getCompileConfigurationName()} method got removed in Gradle 7. Because we want to stay + * compatible with Gradle 6 but can't compile this method, we reimplement it temporarily. + * TODO(fwindheuser): Remove after dropping support for Gradle 6. + */ + private static String getCompileConfigurationName(SourceSet sourceSet) { + String baseName = sourceSet.getName().equals(SourceSet.MAIN_SOURCE_SET_NAME) + ? "" + : GUtil.toCamelCase(sourceSet.getName()); + return StringUtils.uncapitalize(baseName + StringUtils.capitalize("compile")); + } + private static Map excludeRuleAsMap(ExcludeRule rule) { Builder excludeRule = ImmutableMap.builder(); if (rule.getGroup() != null) { diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineFixGradleJava.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineFixGradleJava.java deleted file mode 100644 index bf17c33bf..000000000 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineFixGradleJava.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * (c) Copyright 2020 Palantir Technologies Inc. All rights reserved. - * - * 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. - */ - -package com.palantir.baseline.plugins; - -import java.util.stream.Stream; -import org.gradle.api.Plugin; -import org.gradle.api.Project; -import org.gradle.api.artifacts.ConfigurationContainer; -import org.gradle.api.plugins.JavaBasePlugin; -import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.SourceSetContainer; - -/** - * Fixes up java configurations that are left resolvable and consumable for legacy reasons, in order to prepare for - * Gradle 7 and to showcase code that resolves these when it shouldn't. - * - *

This will probably break some plugins in the wild, but we'd rather deal with that now than later. - */ -public final class BaselineFixGradleJava implements Plugin { - @Override - public void apply(Project project) { - project.getPluginManager().withPlugin("java-base", javaPlugin -> { - SourceSetContainer sourceSets = project.getConvention() - .getPlugin(JavaPluginConvention.class) - .getSourceSets(); - - sourceSets.configureEach(sourceSet -> { - fixLegacyJavaConfigurationsForSourceSet(project.getConfigurations(), sourceSet); - }); - }); - } - - /** - * Fixes up the legacy java configurations that should be set as {@code !canBeConsumed} and {@code !canBeResolved}. - * Note: configurations are set up in {@link JavaBasePlugin#defineConfigurationsForSourceSet}. - */ - private void fixLegacyJavaConfigurationsForSourceSet(ConfigurationContainer configurations, SourceSet sourceSet) { - Stream.of( - sourceSet.getCompileOnlyConfigurationName(), - sourceSet.getCompileConfigurationName(), - sourceSet.getRuntimeConfigurationName()) - .forEach(confName -> configurations.named(confName, conf -> { - conf.setCanBeConsumed(false); - conf.setCanBeResolved(false); - })); - } -} diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineReleaseCompatibility.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineReleaseCompatibility.java index 870ef7996..66ce717f3 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineReleaseCompatibility.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/plugins/BaselineReleaseCompatibility.java @@ -22,6 +22,8 @@ import org.gradle.api.JavaVersion; import org.gradle.api.Project; import org.gradle.api.tasks.compile.JavaCompile; +import org.gradle.jvm.toolchain.JavaCompiler; +import org.gradle.jvm.toolchain.JavaInstallationMetadata; import org.gradle.process.CommandLineArgumentProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,8 +58,8 @@ private ReleaseFlagProvider(JavaCompile javaCompile) { @Override public Iterable asArguments() { - JavaVersion jdkVersion = - JavaVersion.toVersion(javaCompile.getToolChain().getVersion()); + JavaVersion jdkVersion = getJdkVersion(javaCompile); + if (!supportsReleaseFlag(jdkVersion)) { log.debug( "BaselineReleaseCompatibility is a no-op for {} in {} as {} doesn't support --release", @@ -104,4 +106,14 @@ private static boolean supportsReleaseFlag(JavaVersion jdkVersion) { return jdkVersion.isJava9Compatible(); } } + + private static JavaVersion getJdkVersion(JavaCompile javaCompile) { + return javaCompile + .getJavaCompiler() + .map(JavaCompiler::getMetadata) + .map(JavaInstallationMetadata::getLanguageVersion) + .map(version -> JavaVersion.toVersion(version.asInt())) + // Fallback to current java version if toolchain is not configured + .getOrElse(JavaVersion.current()); + } } diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckExplicitSourceCompatibilityTask.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckExplicitSourceCompatibilityTask.java index fa2d110a5..e50a2bd50 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckExplicitSourceCompatibilityTask.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckExplicitSourceCompatibilityTask.java @@ -17,6 +17,7 @@ package com.palantir.baseline.tasks; import java.io.IOException; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardOpenOption; @@ -28,6 +29,7 @@ import org.gradle.api.Task; import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Property; import org.gradle.api.publish.PublishingExtension; import org.gradle.api.specs.Spec; @@ -92,12 +94,7 @@ public final void setShouldFix(boolean value) { @TaskAction public final void taskAction() throws IOException { - // We're doing this naughty casting because we need access to the `getRawSourceCompatibility` method. - org.gradle.api.plugins.internal.DefaultJavaPluginConvention convention = - (org.gradle.api.plugins.internal.DefaultJavaPluginConvention) - getProject().getConvention().getPlugin(JavaPluginConvention.class); - - if (convention.getRawSourceCompatibility() != null) { + if (getRawSourceCompat() != null) { // In theory, users could configure the fancy new 'java toolchain' as an alternative to explicit // sourceCompatibility, but there's no method to access this yet (as of Gradle 6.8). return; @@ -127,4 +124,29 @@ public final void taskAction() throws IOException { JavaVersion.current(), getPath())); } + + private JavaVersion getRawSourceCompat() { + // TODO(fwindheuser): Remove internal api usage. Maybe through adopting toolchains? + // We're doing this naughty casting because we need access to the `getRawSourceCompatibility` method. + if (GradleVersion.current().compareTo(GradleVersion.version("7.0")) < 0) { + org.gradle.api.plugins.internal.DefaultJavaPluginConvention convention = + (org.gradle.api.plugins.internal.DefaultJavaPluginConvention) + getProject().getConvention().getPlugin(JavaPluginConvention.class); + return convention.getRawSourceCompatibility(); + } + + // TODO(fwindheuser): Don't use reflection after building with Gradle 7 + org.gradle.api.plugins.internal.DefaultJavaPluginExtension extension = + (org.gradle.api.plugins.internal.DefaultJavaPluginExtension) + getProject().getExtensions().getByType(JavaPluginExtension.class); + try { + Method rawSourceCompat = org.gradle.api.plugins.internal.DefaultJavaPluginExtension.class.getMethod( + "getRawSourceCompatibility"); + return (JavaVersion) rawSourceCompat.invoke(extension); + } catch (Exception e) { + throw new RuntimeException( + "Error calling DefaultJavaPluginExtension#getRawSourceCompatibility for " + GradleVersion.current(), + e); + } + } } diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CompileRefasterTask.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CompileRefasterTask.java index 59ea77df8..f29d5fddc 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CompileRefasterTask.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CompileRefasterTask.java @@ -27,7 +27,7 @@ import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.compile.JavaCompile; -import org.gradle.api.tasks.incremental.IncrementalTaskInputs; +import org.gradle.work.InputChanges; public class CompileRefasterTask extends JavaCompile { @@ -37,16 +37,14 @@ public class CompileRefasterTask extends JavaCompile { public CompileRefasterTask() { // Don't care about .class files - setDestinationDir(getTemporaryDir()); + getDestinationDirectory().set(getTemporaryDir()); // Ensure we hit the incremental code-path since we override it getOptions().setIncremental(true); } @Override - // TODO(forozco): override compile(InputChanges inputs) once we can raise our minimum version 6.0 - @SuppressWarnings("deprecated") - protected final void compile(IncrementalTaskInputs inputs) { + protected final void compile(InputChanges inputs) { // Clear out the default error-prone providers getOptions().getCompilerArgumentProviders().clear(); getOptions() diff --git a/gradle-baseline-java/src/main/resources/META-INF/gradle-plugins/com.palantir.baseline-fix-gradle-java.properties b/gradle-baseline-java/src/main/resources/META-INF/gradle-plugins/com.palantir.baseline-fix-gradle-java.properties deleted file mode 100644 index f4565c8af..000000000 --- a/gradle-baseline-java/src/main/resources/META-INF/gradle-plugins/com.palantir.baseline-fix-gradle-java.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=com.palantir.baseline.plugins.BaselineFixGradleJava diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy index 0d38183bb..5ef22d1a1 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineExactDependenciesTest.groovy @@ -46,6 +46,20 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { with('checkUnusedDependencies', 'checkImplicitDependencies', '--stacktrace').build() } + def '#gradleVersion: both tasks work with different gradle versions'() { + when: + buildFile << standardBuildFile + file('src/main/java/pkg/Foo.java') << minimalJavaFile + + then: + with('checkUnusedDependencies', 'checkImplicitDependencies', '--stacktrace') + .withGradleVersion(gradleVersion) + .build() + + where: + gradleVersion << GradleTestVersions.VERSIONS + } + def 'both tasks vacuously pass with no dependencies when entire baseline is applied'() { when: buildFile << standardBuildFile @@ -81,7 +95,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { mavenCentral() } dependencies { - compile 'com.google.guava:guava:27.0.1-jre' + implementation 'com.google.guava:guava:27.0.1-jre' } """ file('src/main/java/pkg/Foo.java') << minimalJavaFile @@ -120,7 +134,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { buildFile << standardBuildFile buildFile << """ dependencies { - compile project(':needs-building-first') + implementation project(':needs-building-first') } """ @@ -156,7 +170,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { mavenCentral() } dependencies { - compile 'com.google.guava:guava:28.0-jre' + implementation 'com.google.guava:guava:28.0-jre' } """ file('src/main/java/pkg/Foo.java') << ''' @@ -181,7 +195,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { mavenCentral() } dependencies { - compile 'com.fasterxml.jackson.datatype:jackson-datatype-guava:2.9.8' // pulls in guava transitively + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-guava:2.9.8' // pulls in guava transitively } """ file('src/main/java/pkg/Foo.java') << ''' @@ -248,7 +262,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { then: BuildResult result = with(':checkUnusedDependencies', '--stacktrace').withDebug(true).buildAndFail() - result.output.contains "project(':sub-project-with-deps') (sub-project-with-deps.jar (project :sub-project-with-deps))" + result.output.contains "project(':sub-project-with-deps') (main (project :sub-project-with-deps))" result.output.contains "project(':sub-project-no-deps')" } @@ -264,7 +278,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { } /** - * Sets up a multi-module project with 2 sub projects. The root project has a transitive dependency on sub-project-no-deps + * Sets up a multi-module project with 2 sub projects. The root project has a transitive dependency on sub-project-no-deps * and so checkImplicitDependencies should fail on it. */ private void setupMultiProject() { @@ -275,7 +289,7 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { apply plugin: 'com.palantir.baseline-exact-dependencies' } dependencies { - compile project(':sub-project-with-deps') + implementation project(':sub-project-with-deps') } """.stripIndent() @@ -283,8 +297,10 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { //properly declare dependency between two sub-projects subProjects['sub-project-with-deps'].buildGradle << ''' + apply plugin: 'java-library' + dependencies { - compile project(':sub-project-no-deps') + api project(':sub-project-no-deps') } '''.stripIndent() @@ -323,6 +339,5 @@ class BaselineExactDependenciesTest extends AbstractPluginTest { } } '''.stripIndent() - } } diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineFormatIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineFormatIntegrationTest.groovy index 141508079..570880bf1 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineFormatIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineFormatIntegrationTest.groovy @@ -16,6 +16,8 @@ package com.palantir.baseline +import spock.lang.Unroll + import java.nio.file.Files import java.nio.file.Path import org.apache.commons.io.FileUtils @@ -27,6 +29,7 @@ import org.gradle.testkit.runner.TaskOutcome import static org.assertj.core.api.Assertions.assertThat +@Unroll class BaselineFormatIntegrationTest extends AbstractPluginTest { def setup() { @@ -89,7 +92,10 @@ class BaselineFormatIntegrationTest extends AbstractPluginTest { buildFile << standardBuildFile then: - with('format', '--stacktrace').build() + with('format', '--stacktrace').withGradleVersion(gradleVersion).build() + + where: + gradleVersion << GradleTestVersions.VERSIONS } def 'eclipse formatter integration test'() { @@ -108,12 +114,15 @@ class BaselineFormatIntegrationTest extends AbstractPluginTest { file('gradle.properties') << "com.palantir.baseline-format.eclipse=true\n" when: - BuildResult result = with(':format').build() + BuildResult result = with(':format').withGradleVersion(gradleVersion).build() result.task(":format").outcome == TaskOutcome.SUCCESS result.task(":spotlessApply").outcome == TaskOutcome.SUCCESS then: assertThatFilesAreTheSame(testedDir, expectedDir) + + where: + gradleVersion << GradleTestVersions.VERSIONS } def 'palantir java format works'() { @@ -138,12 +147,15 @@ class BaselineFormatIntegrationTest extends AbstractPluginTest { file('gradle.properties') << "com.palantir.baseline-format.palantir-java-format=true\n" when: - BuildResult result = with(':format').build() + BuildResult result = with(':format').withGradleVersion(gradleVersion).build() then: result.task(":format").outcome == TaskOutcome.SUCCESS result.task(":spotlessApply").outcome == TaskOutcome.SUCCESS assertThatFilesAreTheSame(testedDir, expectedDir) + + where: + gradleVersion << GradleTestVersions.VERSIONS } private static void assertThatFilesAreTheSame(File outputDir, File expectedDir) throws IOException { diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineIntegrationTest.groovy index 51e6b77aa..b5be60509 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineIntegrationTest.groovy @@ -44,6 +44,6 @@ class BaselineIntegrationTest extends AbstractPluginTest { with().withArguments('-s').withGradleVersion(gradleVersion).build() where: - gradleVersion << ['6.1', '6.2'] + gradleVersion << GradleTestVersions.VERSIONS } } diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineReleaseCompatibilityIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineReleaseCompatibilityIntegrationTest.groovy index 2978399c8..6dc11b0ae 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineReleaseCompatibilityIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineReleaseCompatibilityIntegrationTest.groovy @@ -20,7 +20,9 @@ import org.gradle.api.JavaVersion import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.TaskOutcome import org.junit.Assume +import spock.lang.Unroll +@Unroll class BaselineReleaseCompatibilityIntegrationTest extends AbstractPluginTest { def standardBuildFile = ''' @@ -33,7 +35,6 @@ class BaselineReleaseCompatibilityIntegrationTest extends AbstractPluginTest { repositories { mavenLocal() - jcenter() } '''.stripIndent() @@ -46,17 +47,20 @@ class BaselineReleaseCompatibilityIntegrationTest extends AbstractPluginTest { } '''.stripIndent() - def 'compileJava fails when features from Java9 are used'() { + def '#gradleVersion: compileJava fails when features from Java9 are used'() { when: buildFile << standardBuildFile file('src/main/java/test/Invalid.java').text = useJava9Features then: - BuildResult result = with('compileJava').buildAndFail() + BuildResult result = with('compileJava').withGradleVersion(gradleVersion)buildAndFail() result.task(":compileJava").outcome == TaskOutcome.FAILED + + where: + gradleVersion << GradleTestVersions.VERSIONS } - def 'compileJava succeeds when sourceCompatibility = 11 and Java9 features are used'() { + def '#gradleVersion: compileJava succeeds when sourceCompatibility = 11 and Java9 features are used'() { Assume.assumeTrue( "This test can only pass when run from a Java9+ JVM.", JavaVersion.current().isJava9Compatible()) @@ -67,7 +71,10 @@ class BaselineReleaseCompatibilityIntegrationTest extends AbstractPluginTest { file('src/main/java/test/Invalid.java').text = useJava9Features then: - BuildResult result = with('compileJava').build() + BuildResult result = with('compileJava').withGradleVersion(gradleVersion).build() result.task(":compileJava").outcome == TaskOutcome.SUCCESS + + where: + gradleVersion << GradleTestVersions.VERSIONS } } diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineTestingIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineTestingIntegrationTest.groovy index aa361c237..d10847e2d 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineTestingIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineTestingIntegrationTest.groovy @@ -18,7 +18,9 @@ package com.palantir.baseline import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Unroll +@Unroll class BaselineTestingIntegrationTest extends AbstractPluginTest { def standardBuildFile = ''' plugins { @@ -27,11 +29,11 @@ class BaselineTestingIntegrationTest extends AbstractPluginTest { } repositories { - jcenter() + mavenCentral() } dependencies { - testCompile 'junit:junit:4.12' + testImplementation 'junit:junit:4.12' } '''.stripIndent() @@ -72,10 +74,13 @@ class BaselineTestingIntegrationTest extends AbstractPluginTest { file('src/test/java/test/TestClass5.java') << junit5Test then: - BuildResult result = with('test').build() + BuildResult result = with('test').withGradleVersion(gradleVersion).build() result.task(':test').outcome == TaskOutcome.SUCCESS new File(projectDir, "build/reports/tests/test/classes/test.TestClass4.html").exists() new File(projectDir, "build/reports/tests/test/classes/test.TestClass5.html").exists() + + where: + gradleVersion << GradleTestVersions.VERSIONS } def 'runs integration tests with junit5'() { diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/GradleTestVersions.java b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/GradleTestVersions.java new file mode 100644 index 000000000..032365b97 --- /dev/null +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/GradleTestVersions.java @@ -0,0 +1,27 @@ +/* + * (c) Copyright 2021 Palantir Technologies Inc. All rights reserved. + * + * 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. + */ + +package com.palantir.baseline; + +import com.google.common.collect.ImmutableList; +import com.palantir.baseline.plugins.Baseline; + +public final class GradleTestVersions { + public static final ImmutableList VERSIONS = + ImmutableList.of(Baseline.MIN_GRADLE_VERSION.getVersion(), "7.1.1"); + + private GradleTestVersions() {} +} diff --git a/gradle-junit-reports/src/main/java/com/palantir/gradle/junit/JunitReportsPlugin.java b/gradle-junit-reports/src/main/java/com/palantir/gradle/junit/JunitReportsPlugin.java index a5c85d038..624084e35 100644 --- a/gradle-junit-reports/src/main/java/com/palantir/gradle/junit/JunitReportsPlugin.java +++ b/gradle-junit-reports/src/main/java/com/palantir/gradle/junit/JunitReportsPlugin.java @@ -36,7 +36,7 @@ public void apply(Project project) { JunitTaskResultExtension ext = JunitTaskResultExtension.register(project); project.getTasks().withType(Test.class, test -> { - test.getReports().getJunitXml().setEnabled(true); + test.getReports().getJunitXml().getRequired().set(true); test.getReports().getJunitXml().setDestination(junitPath(rootExt.getReportsDirectory(), test.getPath())); }); diff --git a/versions.lock b/versions.lock index 8c646fd23..672c264d7 100644 --- a/versions.lock +++ b/versions.lock @@ -43,6 +43,7 @@ com.palantir.safe-logging:safe-logging:1.16.0 (4 constraints: f3361a52) com.palantir.tritium:tritium-registry:0.25.0 (1 constraints: 3905363b) com.typesafe:config:1.2.0 (1 constraints: d60cb924) commons-io:commons-io:2.6 (1 constraints: 3414465b) +commons-lang:commons-lang:2.6 (1 constraints: ac04232c) io.dropwizard.metrics:metrics-core:3.2.6 (1 constraints: 95108ba5) io.github.java-diff-utils:java-diff-utils:4.0 (1 constraints: 811205f6) junit:junit:4.13.2 (10 constraints: ae9100f0) @@ -98,7 +99,6 @@ com.palantir.conjure.java:conjure-lib:6.0.0 (1 constraints: 08050936) com.palantir.conjure.java.api:errors:2.19.0 (1 constraints: 2410a5a9) com.palantir.ri:resource-identifier:1.3.0 (1 constraints: ec0f6e99) com.palantir.tokens:auth-tokens:3.10.0 (2 constraints: 51158fd9) -commons-lang:commons-lang:2.6 (1 constraints: ac04232c) io.r2dbc:r2dbc-spi:0.9.0.M1 (1 constraints: 6f073a6f) jakarta.annotation:jakarta.annotation-api:1.3.5 (1 constraints: f10f7399) jakarta.ws.rs:jakarta.ws.rs-api:2.1.6 (1 constraints: f10f7399) diff --git a/versions.props b/versions.props index 06f2b09b1..516f8564d 100644 --- a/versions.props +++ b/versions.props @@ -6,6 +6,7 @@ com.google.errorprone:error_prone_refaster = 2.7.1 com.google.errorprone:error_prone_test_helpers = 2.7.1 com.google.guava:guava = 30.1.1-jre com.palantir.safe-logging:* = 1.16.0 +commons-lang:commons-lang = 2.6 org.apache.maven.shared:maven-dependency-analyzer = 1.11.3 org.github.ngbinh.scalastyle:gradle-scalastyle-plugin_2.11 = 1.0.1 org.inferred:freebuilder = 1.14.6 @@ -23,7 +24,6 @@ com.netflix.nebula:nebula-test = 9.0.0 com.palantir.tokens:auth-tokens = 3.10.0 com.palantir.conjure.java:conjure-lib = 6.0.0 com.palantir.tritium:tritium-registry = 0.25.0 -commons-lang:commons-lang = 2.6 junit:junit = 4.13.2 net.lingala.zip4j:zip4j = 1.3.2 net.ltgt.gradle:gradle-errorprone-plugin = 2.0.2