Skip to content

Commit

Permalink
Add JavaToolchainResolverRegistry to updateDaemonJvm task to generate…
Browse files Browse the repository at this point in the history
… download URLs on the build properties

Signed-off-by: Madalin Valceleanu <vmadalin@google.com>
  • Loading branch information
vmadalin committed May 6, 2024
1 parent 2cd0467 commit 8ca37de
Show file tree
Hide file tree
Showing 39 changed files with 731 additions and 62 deletions.
4 changes: 3 additions & 1 deletion platforms/core-runtime/build-configuration/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ dependencies {
api(project(":base-services"))
api(project(":core"))
api(project(":core-api"))
api(project(":jvm-services"))
api(project(":toolchains-jvm-shared"))
api(project(":base-annotations"))
api(project(":platform-jvm"))
implementation(project(":logging"))
implementation(project(":jvm-services"))

testImplementation(testFixtures(project(":core")))
testImplementation(testFixtures(project(":toolchains-jvm-shared")))

testFixturesImplementation(project(":core-api"))
testFixturesImplementation(project(":internal-integ-testing"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ import org.gradle.internal.jvm.Jvm
import org.gradle.test.precondition.Requires
import org.gradle.test.preconditions.IntegTestPreconditions

import static org.gradle.jvm.toolchain.JavaToolchainDownloadUtil.applyToolchainResolverPlugin
import static org.gradle.jvm.toolchain.JavaToolchainDownloadUtil.noUrlResolverCode

class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements DaemonJvmPropertiesFixture, JavaToolchainFixture {

def "root project has an updateDaemonJvm task only"() {
Expand All @@ -47,7 +50,19 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
fails(":sub:updateDaemonJvm") // should not exist
}

def "When execute updateDaemonJvm without options Then build properties are populated with default values"() {
def "When execute updateDaemonJvm without toolchain download repositories configured Then fails with expected exception message"() {
when:
fails "updateDaemonJvm"

then:
failureDescriptionContains("Execution failed for task ':updateDaemonJvm'.")
failureHasCause("Toolchain download repositories have not been configured.")
}

def "When execute updateDaemonJvm without options Then daemon jvm properties are populated with default values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm"

Expand All @@ -56,7 +71,10 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
outputContains("Daemon JVM criteria is an incubating feature.")
}

def "When execute updateDaemonJvm for valid version Then build properties are populated with expected values"() {
def "When execute updateDaemonJvm for valid version Then daemon jvm properties are populated with expected values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm", "--jvm-version=${version.majorVersion}"

Expand All @@ -67,7 +85,10 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
version << [JavaVersion.VERSION_11, JavaVersion.VERSION_15, JavaVersion.VERSION_HIGHER]
}

def "When execute updateDaemonJvm for valid Java 8 versions Then build properties are populated with expected values"() {
def "When execute updateDaemonJvm for valid Java 8 versions Then daemon jvm properties are populated with expected values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm", "--jvm-version=${version}"

Expand All @@ -79,6 +100,9 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
}

def "When execute updateDaemonJvm with invalid argument --jvm-version option Then fails with expected exception message"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
fails "updateDaemonJvm", "--jvm-version=$invalidVersion"

Expand All @@ -91,6 +115,9 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
}

def "When execute updateDaemonJvm with unsupported Java version Then fails with expected exception message"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
fails "updateDaemonJvm", "--jvm-version=7"

Expand All @@ -100,12 +127,18 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
}

def "When execute updateDaemonJvm with unsupported future Java version"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

// Captures current, but maybe not desired behavior
expect:
succeeds( "updateDaemonJvm", "--jvm-version=10000")
}

def "When execute updateDaemonJvm for valid vendor option Then build properties are populated with expected values"() {
def "When execute updateDaemonJvm for valid vendor option Then daemon jvm properties are populated with expected values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm", "--jvm-vendor=$vendor"

Expand All @@ -117,7 +150,10 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
}

@NotYetImplemented
def "When execute updateDaemonJvm for valid implementation option Then build properties are populated with expected values"() {
def "When execute updateDaemonJvm for valid implementation option Then daemon jvm properties are populated with expected values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm", "--toolchain-implementation=$implementation"

Expand All @@ -128,15 +164,21 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
implementation << ["VENDOR_SPECIFIC", "J9"]
}

def "When execute updateDaemonJvm specifying different options Then build properties are populated with expected values"() {
def "When execute updateDaemonJvm specifying different options Then daemon jvm properties are populated with expected values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm", "--jvm-version=17", "--jvm-vendor=IBM"

then:
assertJvmCriteria(JavaVersion.VERSION_17, "IBM")
}

def "When execute updateDaemonJvm specifying different options in lower case Then build properties are populated with expected values"() {
def "When execute updateDaemonJvm specifying different options in lower case Then daemon jvm properties are populated with expected values"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
run "updateDaemonJvm", "--jvm-version=17", "--jvm-vendor=ibm"

Expand All @@ -145,6 +187,9 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
}

def "When execute updateDaemonJvm with unexpected --jvm-vendor option Then fails with expected exception message"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
fails "updateDaemonJvm", "--jvm-vendor=unknown-vendor"

Expand All @@ -155,6 +200,9 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements

@NotYetImplemented
def "When execute updateDaemonJvm with unexpected --toolchain-implementation option Then fails with expected exception message"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

when:
fails "updateDaemonJvm", "--toolchain-implementation=unknown-implementation"

Expand All @@ -164,8 +212,9 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
"(valid case insensitive values: VENDOR_SPECIFIC, J9)")
}

def "Given already existing build properties When execute updateDaemonJvm with different criteria Then criteria get modified"() {
def "Given already existing daemon jvm properties When execute updateDaemonJvm with different criteria Then criteria get modified"() {
given:
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())
def otherJvm = AvailableJavaHomes.differentVersion
writeJvmCriteria(Jvm.current())

Expand All @@ -177,11 +226,11 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements
}

def "Given defined invalid criteria When execute updateDaemonJvm with different criteria Then criteria get modified using java home"() {
def currentJvm = JavaVersion.current()

given:
def currentJvm = JavaVersion.current()
writeJvmCriteria(currentJvm, "invalidVendor")
captureJavaHome()
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

expect:
succeeds("updateDaemonJvm", "--jvm-version=20", "--jvm-vendor=AZUL")
Expand All @@ -191,16 +240,52 @@ class UpdateDaemonJvmIntegrationTest extends AbstractIntegrationSpec implements

@Requires(IntegTestPreconditions.JavaHomeWithDifferentVersionAvailable)
def "Given defined valid criteria matching with local toolchain When execute updateDaemonJvm with different criteria Then criteria get modified using the expected local toolchain"() {
given:
def otherJvm = AvailableJavaHomes.differentVersion
def otherMetadata = AvailableJavaHomes.getJvmInstallationMetadata(otherJvm)

given:
writeJvmCriteria(otherJvm.javaVersion, otherMetadata.vendor.knownVendor.name())
captureJavaHome()
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", noUrlResolverCode())

expect:
withInstallations(otherJvm).succeeds("updateDaemonJvm", "--jvm-version=20", "--jvm-vendor=AZUL")
assertJvmCriteria(JavaVersion.VERSION_20, "AZUL")
assertDaemonUsedJvm(otherJvm)
}

def "Given custom applied toolchain resolver When execute updateDaemonJvm Then daemon jvm properties are populated with download toolchain urls"() {
given:
writeJvmCriteria(Jvm.current())
settingsFile << applyToolchainResolverPlugin("CustomToolchainResolver", """
@Override
public Optional<JavaToolchainDownload> resolve(JavaToolchainRequest request) {
def version = request.getJavaToolchainSpec().getLanguageVersion().get().asInt();
def vendor = request.getJavaToolchainSpec().getVendor().get();
def operatingSystem = request.getBuildPlatform().operatingSystem;
def architecture = request.getBuildPlatform().architecture;
URI uri = URI.create("https://server?platform=\$operatingSystem.\$architecture&toolchain=\$version.\$vendor");
return Optional.of(JavaToolchainDownload.fromUri(uri));
}
""")

when:
run "updateDaemonJvm", "--jvm-version=20", "--jvm-vendor=AZUL"

then:
assertJvmCriteria(JavaVersion.VERSION_20, "AZUL")
assertToolchainDownloadUrlsProperties([
["FreeBsd", "X8664"]: "https://server?platform=FREE_BSD.X86_64&toolchain=20.AZUL",
["FreeBsd", "Aarch64"]: "https://server?platform=FREE_BSD.AARCH64&toolchain=20.AZUL",
["Linux", "X8664"]: "https://server?platform=LINUX.X86_64&toolchain=20.AZUL",
["Linux", "Aarch64"]: "https://server?platform=LINUX.AARCH64&toolchain=20.AZUL",
["MacOs", "X8664"]: "https://server?platform=MAC_OS.X86_64&toolchain=20.AZUL",
["MacOs", "Aarch64"]: "https://server?platform=MAC_OS.AARCH64&toolchain=20.AZUL",
["Solaris", "X8664"]: "https://server?platform=SOLARIS.X86_64&toolchain=20.AZUL",
["Solaris", "Aarch64"]: "https://server?platform=SOLARIS.AARCH64&toolchain=20.AZUL",
["Unix", "X8664"]: "https://server?platform=UNIX.X86_64&toolchain=20.AZUL",
["Unix", "Aarch64"]: "https://server?platform=UNIX.AARCH64&toolchain=20.AZUL",
["Windows", "X8664"]: "https://server?platform=WINDOWS.X86_64&toolchain=20.AZUL",
["Windows", "Aarch64"]: "https://server?platform=WINDOWS.AARCH64&toolchain=20.AZUL"
])
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,29 +50,26 @@
public abstract class UpdateDaemonJvm extends DefaultTask {

private final Property<JvmVendorSpec> jvmVendorSpec = getProject().getObjects().property(JvmVendorSpec.class);
private final UpdateDaemonJvmModifier updateDaemonJvmModifier;

/**
* Constructor.
*
* @since 8.8
*/
@Inject
public UpdateDaemonJvm() {

public UpdateDaemonJvm(UpdateDaemonJvmModifier updateDaemonJvmModifier) {
this.updateDaemonJvmModifier = updateDaemonJvmModifier;
}

@TaskAction
void generate() {
IncubationLogger.incubatingFeatureUsed("Daemon JVM criteria");

JvmVendor jvmVendor = null;
if (jvmVendorSpec.isPresent()) {
jvmVendor = JvmVendor.KnownJvmVendor.valueOf(jvmVendorSpec.get().toString()).asJvmVendor();
}
UpdateDaemonJvmModifier.updateJvmCriteria(
updateDaemonJvmModifier.updateJvmCriteria(
getPropertiesFile().get().getAsFile(),
getJvmVersion().get(),
jvmVendor,
jvmVendorSpec.getOrNull(),
null
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,21 @@
package org.gradle.internal.buildconfiguration;

import org.gradle.api.JavaVersion;
import org.gradle.platform.Architecture;
import org.gradle.platform.OperatingSystem;

import java.util.Arrays;
import java.util.List;

public class DaemonJvmPropertiesDefaults {
public static final String DAEMON_JVM_PROPERTIES_FILE = "gradle/gradle-daemon-jvm.properties";

public static final String TOOLCHAIN_VERSION_PROPERTY = "toolchainVersion";
public static final String TOOLCHAIN_VENDOR_PROPERTY = "toolchainVendor";
public static final String TOOLCHAIN_IMPLEMENTATION_PROPERTY = "toolchainImplementation";
public static final String TOOLCHAIN_URL_PROPERTY_FORMAT = "toolchain%s%sUrl";

public static final JavaVersion TOOLCHAIN_VERSION = JavaVersion.current();
public static final List<Architecture> TOOLCHAIN_SUPPORTED_ARCHITECTURES = Arrays.asList(Architecture.AARCH64, Architecture.X86_64);
public static final List<OperatingSystem> TOOLCHAIN_SUPPORTED_OPERATING_SYSTEM = Arrays.asList(OperatingSystem.values());
}

0 comments on commit 8ca37de

Please sign in to comment.