Skip to content

Commit

Permalink
Merge pull request #23075 Handle inconsistent vendor info for IBM Sem…
Browse files Browse the repository at this point in the history
…eru runtimes

Fixes #23053

Co-authored-by: József Bartók <jbartok@gradle.com>
  • Loading branch information
bot-gradle and jbartok committed Dec 14, 2022
2 parents bfa5455 + 807904a commit 7d72bae
Show file tree
Hide file tree
Showing 15 changed files with 362 additions and 115 deletions.
1 change: 0 additions & 1 deletion subprojects/docs/src/docs/userguide/jvm/toolchains.adoc
Expand Up @@ -363,7 +363,6 @@ Sorting is done based on the following rules:
.. GRAAL_VM
.. HEWLETT_PACKARD
.. IBM
.. IBM_SEMERU
.. MICROSOFT
.. ORACLE
.. SAP
Expand Down
179 changes: 115 additions & 64 deletions subprojects/docs/src/docs/userguide/migration/upgrading_version_7.adoc

Large diffs are not rendered by default.

Expand Up @@ -30,7 +30,7 @@ java {
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
vendor = JvmVendorSpec.IBM_SEMERU
vendor = JvmVendorSpec.IBM
implementation = JvmImplementation.J9
}
}
Expand Down
Expand Up @@ -31,7 +31,7 @@ java {
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
vendor.set(JvmVendorSpec.IBM_SEMERU)
vendor.set(JvmVendorSpec.IBM)
implementation.set(JvmImplementation.J9)
}
}
Expand Down
@@ -1,5 +1,5 @@
plugins {
id 'org.gradle.toolchains.foojay-resolver' version '0.2'
id 'org.gradle.toolchains.foojay-resolver' version '0.3.0'
}

import java.util.Optional
Expand Down
@@ -1,5 +1,5 @@
plugins {
id("org.gradle.toolchains.foojay-resolver") version("0.2")
id("org.gradle.toolchains.foojay-resolver") version("0.3.0")
}

import org.gradle.api.Plugin
Expand Down
Expand Up @@ -29,8 +29,7 @@ enum KnownJvmVendor {
BELLSOFT("bellsoft", "BellSoft Liberica"),
GRAAL_VM("graalvm community", "GraalVM Community"),
HEWLETT_PACKARD("hewlett-packard", "HP-UX"),
IBM("ibm", "IBM"),
IBM_SEMERU("international business machines corporation", "IBM Semeru Runtimes"),
IBM("ibm", "ibm|international business machines corporation", "IBM"),
MICROSOFT("microsoft", "Microsoft"),
ORACLE("oracle", "Oracle"),
SAP("sap se", "SAP SapMachine"),
Expand Down
Expand Up @@ -120,12 +120,9 @@ class DefaultJvmMetadataDetectorTest extends Specification {
'temurinjdk17' | temurinJvm('17') | JavaVersion.VERSION_17 | 'Eclipse Temurin JDK 17' | false
'temurinjre8' | temurin8Jvm('8') | JavaVersion.VERSION_1_8 | 'Eclipse Temurin JRE 8' | true
'temurinjre11' | temurin11Jvm('11') | JavaVersion.VERSION_11 | 'Eclipse Temurin JRE 11' | true
'semerujdk8' | semeruJvm('8') | JavaVersion.VERSION_1_8 | 'IBM Semeru Runtimes JDK 8' | false
'semerujdk11' | semeruJvm('11') | JavaVersion.VERSION_11 | 'IBM Semeru Runtimes JDK 11' | false
'semerujdk16' | semeruJvm('16') | JavaVersion.VERSION_16 | 'IBM Semeru Runtimes JDK 16' | false
'semerujre8' | semeruJvm('8') | JavaVersion.VERSION_1_8 | 'IBM Semeru Runtimes JRE 8' | true
'semerujre11' | semeruJvm('11') | JavaVersion.VERSION_11 | 'IBM Semeru Runtimes JRE 11' | true
'semerujre16' | semeruJvm('16') | JavaVersion.VERSION_16 | 'IBM Semeru Runtimes JRE 16' | true
'semerujdk11' | semeruJvm11() | JavaVersion.VERSION_11 | 'IBM JDK 11' | false
'semerujdk16' | semeruJvm16() | JavaVersion.VERSION_16 | 'IBM JDK 16' | false
'semerujdk17' | semeruJvm17() | JavaVersion.VERSION_17 | 'IBM JDK 17' | false
'whitespaces' | whitespaces('11.0.3') | JavaVersion.VERSION_11 | 'AdoptOpenJDK JRE 11' | true
}

Expand Down Expand Up @@ -154,9 +151,8 @@ class DefaultJvmMetadataDetectorTest extends Specification {
'ibmJdk7' | ibmJvm('7') | true
'ibmJdk8' | ibmJvm('8') | true
'ibmJdk9' | ibmJvm('9') | true
'semeru8' | semeruJvm('8') | true
'semeru11' | semeruJvm('11') | true
'semeru16' | semeruJvm('16') | true
'semeru11' | semeruJvm11() | true
'semeru16' | semeruJvm16() | true
'temurin8' | temurin8Jvm('8') | false
'temurin11' | temurin11Jvm('11') | false
'temurin17' | temurinJvm('17') | false
Expand Down Expand Up @@ -436,16 +432,42 @@ class DefaultJvmMetadataDetectorTest extends Specification {
]
}

private static Map<String, String> semeruJvm(String version) {
private static Map<String, String> semeruJvm11() {
['java.home': "java-home",
'java.version': "${version}",
'java.version': "11.0.17",
'java.vendor': "IBM Corporation",
'os.arch': "x86_64",
'java.vm.name': "Eclipse OpenJ9 VM",
'java.vm.version': "openj9-0.35.0",
'java.vm.vendor': "Eclipse OpenJ9",
'java.runtime.name': "IBM Semeru Runtime Open Edition",
'java.runtime.version': "11.0.17+8"
]
}

private static Map<String, String> semeruJvm16() {
['java.home': "java-home",
'java.version': "16.0.2",
'java.vendor': "International Business Machines Corporation",
'os.arch': "x86_64",
'java.vm.name': "Eclipse OpenJ9 VM",
'java.vm.version': "openj9-0.27.0",
'java.vm.vendor': "International Business Machines Corporation",
'java.vm.vendor': "Eclipse OpenJ9",
'java.runtime.name': "IBM Semeru Runtime Open Edition",
'java.runtime.version': "${version}-b08"
'java.runtime.version': "16.0.2+7"
]
}

private static Map<String, String> semeruJvm17() {
['java.home': "java-home",
'java.version': "17.0.5",
'java.vendor': "IBM Corporation",
'os.arch': "x86_64",
'java.vm.name': "Eclipse OpenJ9 VM",
'java.vm.version': "openj9-0.35.0",
'java.vm.vendor': "Eclipse OpenJ9",
'java.runtime.name': "IBM Semeru Runtime Open Edition",
'java.runtime.version': "17.0.5+8"
]
}

Expand Down
Expand Up @@ -119,7 +119,7 @@ class JavaToolchainDownloadIntegrationTest extends AbstractIntegrationSpec {
private TestFile setFoojayDiscoToolchainProvider() {
settingsFile << """
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.2'
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.3.0'
}
"""
}
Expand Down
Expand Up @@ -33,10 +33,15 @@ public abstract class JvmVendorSpec {
* @since 7.4
*/
public static final JvmVendorSpec ADOPTIUM = matching(KnownJvmVendor.ADOPTIUM);

public static final JvmVendorSpec ADOPTOPENJDK = matching(KnownJvmVendor.ADOPTOPENJDK);

public static final JvmVendorSpec AMAZON = matching(KnownJvmVendor.AMAZON);

public static final JvmVendorSpec APPLE = matching(KnownJvmVendor.APPLE);

public static final JvmVendorSpec AZUL = matching(KnownJvmVendor.AZUL);

public static final JvmVendorSpec BELLSOFT = matching(KnownJvmVendor.BELLSOFT);

/**
Expand All @@ -47,21 +52,27 @@ public abstract class JvmVendorSpec {
public static final JvmVendorSpec GRAAL_VM = matching(KnownJvmVendor.GRAAL_VM);

public static final JvmVendorSpec HEWLETT_PACKARD = matching(KnownJvmVendor.HEWLETT_PACKARD);

public static final JvmVendorSpec IBM = matching(KnownJvmVendor.IBM);

/**
* A constant for using <a href="https://developer.ibm.com/languages/java/semeru-runtimes/">IBM Semeru Runtimes</a> as the JVM vendor.
*
* @since 7.4
* @deprecated We are grouping all IBM runtimes under the '{@code IBM}' vendor, won't keep a separate constant for Semeru ones. Just use '{@code IBM}' instead.
*/
public static final JvmVendorSpec IBM_SEMERU = matching(KnownJvmVendor.IBM_SEMERU);
@Deprecated
public static final JvmVendorSpec IBM_SEMERU = IBM;

/**
* A constant for using <a href="https://www.microsoft.com/openjdk">Microsoft OpenJDK</a> as the JVM vendor.
*
* @since 7.3
*/
public static final JvmVendorSpec MICROSOFT = matching(KnownJvmVendor.MICROSOFT);

public static final JvmVendorSpec ORACLE = matching(KnownJvmVendor.ORACLE);

public static final JvmVendorSpec SAP = matching(KnownJvmVendor.SAP);

/**
Expand Down
Expand Up @@ -21,7 +21,6 @@
import org.gradle.jvm.toolchain.JavaLanguageVersion;
import org.gradle.jvm.toolchain.JavaToolchainSpec;
import org.gradle.jvm.toolchain.JvmImplementation;
import org.gradle.jvm.toolchain.JvmVendorSpec;

import java.util.function.Predicate;

Expand Down Expand Up @@ -69,12 +68,12 @@ private static boolean isJ9ExplicitlyRequested(JavaToolchainSpec spec) {

private static boolean isJ9RequestedViaVendor(JavaToolchainSpec spec) {
DefaultJvmVendorSpec vendorSpec = (DefaultJvmVendorSpec) spec.getVendor().get();
return vendorSpec != DefaultJvmVendorSpec.any() && vendorSpec.test(JvmVendor.KnownJvmVendor.IBM_SEMERU.asJvmVendor());
return vendorSpec != DefaultJvmVendorSpec.any() && vendorSpec.test(JvmVendor.KnownJvmVendor.IBM.asJvmVendor());
}

@SuppressWarnings("unchecked")
private Predicate<? super JvmInstallationMetadata> vendorPredicate() {
JvmVendorSpec vendorSpec = spec.getVendor().get();
return (Predicate<? super JvmInstallationMetadata>) vendorSpec;
private Predicate<JvmInstallationMetadata> vendorPredicate() {
return (DefaultJvmVendorSpec) spec.getVendor().get();
}

}
@@ -0,0 +1,162 @@
/*
* Copyright 2022 the original author or authors.
*
* 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 org.gradle.jvm.toolchain.internal

import org.gradle.api.JavaVersion
import org.gradle.api.internal.file.TestFiles
import org.gradle.internal.jvm.inspection.DefaultJvmMetadataDetector
import org.gradle.internal.jvm.inspection.MetadataProbe
import org.gradle.internal.jvm.inspection.ProbedSystemProperty
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.jvm.toolchain.JvmImplementation
import org.gradle.jvm.toolchain.JvmVendorSpec
import org.gradle.process.ExecResult
import org.gradle.process.internal.ExecHandle
import org.gradle.process.internal.ExecHandleBuilder
import org.gradle.process.internal.ExecHandleFactory
import org.gradle.test.fixtures.file.TestFile
import org.gradle.util.TestUtil
import spock.lang.Specification
import spock.lang.TempDir

class JavaToolchainMatcherTest extends Specification {

@TempDir
File temporaryFolder

TestFile tmpDir
def setup() {
tmpDir = new TestFile(new File(temporaryFolder, "tmp").tap { mkdirs() })
}

def "ibm vendors match semeru runtime metadata (java version: #javaVersion, vendor: #vendor, implementation: #implementation)"() {
given:
def execHandleFactory = createExecHandleFactory(systemProperties)
def detector = createDefaultJvmMetadataDetector(execHandleFactory)
def javaHome = new File(temporaryFolder, jdk).tap { mkdirs() }
def metadata = detector.getMetadata(testLocation(javaHome))
when:
def spec = new DefaultToolchainSpec(TestUtil.objectFactory())
spec.getLanguageVersion().set(JavaLanguageVersion.of(javaVersion.getMajorVersion()))
spec.getVendor().set(vendor)
spec.getImplementation().set(implementation)
then:
new JavaToolchainMatcher(spec).test(metadata)
where:
jdk | systemProperties | javaVersion | vendor | implementation
'semeru11' | semeruJvm11() | JavaVersion.VERSION_11 | JvmVendorSpec.IBM | JvmImplementation.VENDOR_SPECIFIC
'semeru16' | semeruJvm16() | JavaVersion.VERSION_16 | JvmVendorSpec.IBM | JvmImplementation.VENDOR_SPECIFIC
'semeru17' | semeruJvm17() | JavaVersion.VERSION_17 | JvmVendorSpec.IBM | JvmImplementation.VENDOR_SPECIFIC
'semeru11' | semeruJvm11() | JavaVersion.VERSION_11 | JvmVendorSpec.IBM | JvmImplementation.J9
'semeru16' | semeruJvm16() | JavaVersion.VERSION_16 | JvmVendorSpec.IBM | JvmImplementation.J9
'semeru17' | semeruJvm17() | JavaVersion.VERSION_17 | JvmVendorSpec.IBM | JvmImplementation.J9
'semeru11' | semeruJvm11() | JavaVersion.VERSION_11 | JvmVendorSpec.IBM_SEMERU | JvmImplementation.VENDOR_SPECIFIC
'semeru16' | semeruJvm16() | JavaVersion.VERSION_16 | JvmVendorSpec.IBM_SEMERU | JvmImplementation.VENDOR_SPECIFIC
'semeru17' | semeruJvm17() | JavaVersion.VERSION_17 | JvmVendorSpec.IBM_SEMERU | JvmImplementation.VENDOR_SPECIFIC
'semeru11' | semeruJvm11() | JavaVersion.VERSION_11 | JvmVendorSpec.IBM_SEMERU | JvmImplementation.J9
'semeru16' | semeruJvm16() | JavaVersion.VERSION_16 | JvmVendorSpec.IBM_SEMERU | JvmImplementation.J9
'semeru17' | semeruJvm17() | JavaVersion.VERSION_17 | JvmVendorSpec.IBM_SEMERU | JvmImplementation.J9
}
def createExecHandleFactory(Map<String, String> actualProperties) {
def probedSystemProperties = ProbedSystemProperty.values().findAll { it != ProbedSystemProperty.Z_ERROR }
if (!actualProperties.isEmpty()) {
assert actualProperties.keySet() == probedSystemProperties.collect { it.systemPropertyKey }.toSet()
}
def execHandleFactory = Mock(ExecHandleFactory)
def exec = Mock(ExecHandleBuilder)
execHandleFactory.newExec() >> exec
PrintStream output
exec.setStandardOutput(_ as OutputStream) >> { OutputStream outputStream ->
output = new PrintStream(outputStream)
null
}
def handle = Mock(ExecHandle)
handle.start() >> handle
handle.waitForFinish() >> {
// important to output in the order of the enum members as parsing uses enum ordinals
probedSystemProperties.each {
def actualValue = actualProperties[it.systemPropertyKey]
// write conditionally to simulate wrong number of outputs
if (actualValue != null) {
output.println(MetadataProbe.MARKER_PREFIX + actualValue)
}
}
Mock(ExecResult)
}
exec.build() >> handle
execHandleFactory
}
private DefaultJvmMetadataDetector createDefaultJvmMetadataDetector(ExecHandleFactory execHandleFactory) {
return new DefaultJvmMetadataDetector(
execHandleFactory,
TestFiles.tmpDirTemporaryFileProvider(tmpDir)
)
}
private InstallationLocation testLocation(File javaHome) {
new InstallationLocation(javaHome, "test")
}
private static Map<String, String> semeruJvm11() {
['java.home': "java-home",
'java.version': "11.0.17",
'java.vendor': "IBM Corporation",
'os.arch': "x86_64",
'java.vm.name': "Eclipse OpenJ9 VM",
'java.vm.version': "openj9-0.35.0",
'java.vm.vendor': "Eclipse OpenJ9",
'java.runtime.name': "IBM Semeru Runtime Open Edition",
'java.runtime.version': "11.0.17+8"
]
}
private static Map<String, String> semeruJvm16() {
['java.home': "java-home",
'java.version': "16.0.2",
'java.vendor': "International Business Machines Corporation",
'os.arch': "x86_64",
'java.vm.name': "Eclipse OpenJ9 VM",
'java.vm.version': "openj9-0.27.0",
'java.vm.vendor': "Eclipse OpenJ9",
'java.runtime.name': "IBM Semeru Runtime Open Edition",
'java.runtime.version': "16.0.2+7"
]
}
private static Map<String, String> semeruJvm17() {
['java.home': "java-home",
'java.version': "17.0.5",
'java.vendor': "IBM Corporation",
'os.arch': "x86_64",
'java.vm.name': "Eclipse OpenJ9 VM",
'java.vm.version': "openj9-0.35.0",
'java.vm.vendor': "Eclipse OpenJ9",
'java.runtime.name': "IBM Semeru Runtime Open Edition",
'java.runtime.version': "17.0.5+8"
]
}
}

0 comments on commit 7d72bae

Please sign in to comment.