From 526ea5c0b9509036ff7ba9058a8c9d2440568b16 Mon Sep 17 00:00:00 2001 From: Jackson Bailey Date: Tue, 15 Nov 2022 01:45:07 -0500 Subject: [PATCH 1/2] Add test for Java 19 toolchain --- .../jvm/JavaToolchainSpec.groovy | 36 ++++++++ .../jvm/projects/JavaToolchainProject.groovy | 87 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy create mode 100644 src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy diff --git a/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy b/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy new file mode 100644 index 000000000..023457d07 --- /dev/null +++ b/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy @@ -0,0 +1,36 @@ +package com.autonomousapps.jvm + +import com.autonomousapps.jvm.projects.JavaToolchainProject + +import static com.autonomousapps.utils.Runner.build +import static com.google.common.truth.Truth.assertThat + +final class JavaToolchainSpec extends AbstractJvmSpec { + def "does not fail with Java #javaToolchainVersion toolchain (#gradleVersion)"() { + given: "a Gradle project using Java toolchain version #javaToolchainVersion that has been built" + def project = new JavaToolchainProject(javaToolchainVersion) + gradleProject = project.gradleProject + build(gradleVersion, gradleProject.rootDir, 'build') + + when: 'running buildHealth' + def result = build(gradleVersion, gradleProject.rootDir, 'buildHealth') + + then: 'abiAnalysisMain and explodeByteCodeSourceMain tasks were ran' + // These two are the ones that were actually failing, sanity check that java library plugin is applied + assert result.tasks.any { (it.getPath() == ':proj:abiAnalysisMain') } + assert result.tasks.any { (it.getPath() == ':proj:explodeByteCodeSourceMain') } + + and: 'the report should be empty' + assertThat(project.actualBuildHealth()).containsExactlyElementsIn(project.expectedBuildHealth) + + where: + // Comment out all but the last for speed + gradleVersion | javaToolchainVersion + GRADLE_7_5 | 18 + GRADLE_7_5 | 19 + GRADLE_7_6 | 18 + GRADLE_7_6 | 19 + + classFileMajorVersion = javaToolchainVersion + 44 // 19 + 44 = 63, is this safe? + } +} diff --git a/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy b/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy new file mode 100644 index 000000000..01c223b9f --- /dev/null +++ b/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy @@ -0,0 +1,87 @@ +package com.autonomousapps.jvm.projects + +import com.autonomousapps.AbstractProject +import com.autonomousapps.kit.Dependency +import com.autonomousapps.kit.GradleProject +import com.autonomousapps.kit.Plugin +import com.autonomousapps.kit.Source +import com.autonomousapps.kit.SourceType +import com.autonomousapps.model.ProjectAdvice + +import static com.autonomousapps.AdviceHelper.actualProjectAdvice +import static com.autonomousapps.AdviceHelper.emptyProjectAdviceFor + +final class JavaToolchainProject extends AbstractProject { + + final GradleProject gradleProject + + JavaToolchainProject(int javaToolchainVersion) { + this.gradleProject = build(javaToolchainVersion) + } + + private GradleProject build(int javaToolchainVersion) { + def builder = newGradleProjectBuilder() + builder.withSubproject('proj') { s -> + s.sources = sources + s.withBuildScript { bs -> + bs.plugins.add(Plugin.javaLibraryPlugin) + bs.dependencies = [ + new Dependency('implementation', 'org.projectlombok:lombok:1.18.24'), + new Dependency('annotationProcessor', 'org.projectlombok:lombok:1.18.24') + ] + bs.additions = "java { toolchain { languageVersion.set(JavaLanguageVersion.of(${javaToolchainVersion})) } }" + } + } + + def project = builder.build() + project.writer().write() + return project + } + + private List sources = [ + new Source( + SourceType.JAVA, "Country", "com/example", + """\ + package com.example; + + import lombok.AccessLevel; + import lombok.Getter; + import lombok.NoArgsConstructor; + + @Getter + @NoArgsConstructor(access = AccessLevel.PROTECTED) + public class Country { + private Long id; + private String alpha2; + private String alpha3; + private String name; + private boolean active; + + private Country(final String alpha2, final String alpha3, final String name) { + this.alpha2 = alpha2; + this.alpha3 = alpha3; + this.name = name; + this.active = Boolean.TRUE; + } + + public static Country of(final String alpha2, final String alpha3, final String name) { + return new Country(alpha2, alpha3, name); + } + + public void setActive(boolean active) { + this.active = active; + } + } + """.stripIndent() + ) + ] + + Set actualBuildHealth() { + return actualProjectAdvice(gradleProject) + } + + // In reality we merely hope for unsupported class file major version error + final Set expectedBuildHealth = [ + emptyProjectAdviceFor(':proj'), + ] +} From 300e2d9a7dbad82cd5480cb88473dae256ee55d3 Mon Sep 17 00:00:00 2001 From: Tony Robalik Date: Sat, 13 Jan 2024 12:27:35 -0800 Subject: [PATCH 2/2] fixup JavaToolchainSpec. --- .../jvm/JavaToolchainSpec.groovy | 11 +++++-- .../jvm/projects/JavaToolchainProject.groovy | 33 +++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy b/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy index 023457d07..fe67fa6f5 100644 --- a/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy +++ b/src/functionalTest/groovy/com/autonomousapps/jvm/JavaToolchainSpec.groovy @@ -6,6 +6,7 @@ import static com.autonomousapps.utils.Runner.build import static com.google.common.truth.Truth.assertThat final class JavaToolchainSpec extends AbstractJvmSpec { + def "does not fail with Java #javaToolchainVersion toolchain (#gradleVersion)"() { given: "a Gradle project using Java toolchain version #javaToolchainVersion that has been built" def project = new JavaToolchainProject(javaToolchainVersion) @@ -25,11 +26,15 @@ final class JavaToolchainSpec extends AbstractJvmSpec { where: // Comment out all but the last for speed + // See https://docs.gradle.org/8.5/userguide/compatibility.html#java gradleVersion | javaToolchainVersion - GRADLE_7_5 | 18 - GRADLE_7_5 | 19 - GRADLE_7_6 | 18 +// GRADLE_7_5 | 18 +// GRADLE_7_5 | 19 +// GRADLE_7_6 | 18 GRADLE_7_6 | 19 + // TODO(tsr): some errors running these two scenarios +// GRADLE_8_3 | 20 +// GRADLE_8_5 | 21 classFileMajorVersion = javaToolchainVersion + 44 // 19 + 44 = 63, is this safe? } diff --git a/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy b/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy index 01c223b9f..81087a1a9 100644 --- a/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy +++ b/src/functionalTest/groovy/com/autonomousapps/jvm/projects/JavaToolchainProject.groovy @@ -1,15 +1,16 @@ package com.autonomousapps.jvm.projects import com.autonomousapps.AbstractProject -import com.autonomousapps.kit.Dependency import com.autonomousapps.kit.GradleProject -import com.autonomousapps.kit.Plugin import com.autonomousapps.kit.Source import com.autonomousapps.kit.SourceType +import com.autonomousapps.kit.gradle.Plugin import com.autonomousapps.model.ProjectAdvice import static com.autonomousapps.AdviceHelper.actualProjectAdvice import static com.autonomousapps.AdviceHelper.emptyProjectAdviceFor +import static com.autonomousapps.kit.gradle.Dependency.annotationProcessor +import static com.autonomousapps.kit.gradle.Dependency.implementation final class JavaToolchainProject extends AbstractProject { @@ -20,22 +21,18 @@ final class JavaToolchainProject extends AbstractProject { } private GradleProject build(int javaToolchainVersion) { - def builder = newGradleProjectBuilder() - builder.withSubproject('proj') { s -> - s.sources = sources - s.withBuildScript { bs -> - bs.plugins.add(Plugin.javaLibraryPlugin) - bs.dependencies = [ - new Dependency('implementation', 'org.projectlombok:lombok:1.18.24'), - new Dependency('annotationProcessor', 'org.projectlombok:lombok:1.18.24') - ] - bs.additions = "java { toolchain { languageVersion.set(JavaLanguageVersion.of(${javaToolchainVersion})) } }" - } - } - - def project = builder.build() - project.writer().write() - return project + return newGradleProjectBuilder() + .withSubproject('proj') { s -> + s.sources = sources + s.withBuildScript { bs -> + bs.plugins(Plugin.javaLibrary) + bs.dependencies( + implementation('org.projectlombok:lombok:1.18.24'), + annotationProcessor('org.projectlombok:lombok:1.18.24'), + ) + bs.withGroovy("java { toolchain { languageVersion.set(JavaLanguageVersion.of(${javaToolchainVersion})) } }") + } + }.write() } private List sources = [