diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index 60025a961..b7f0ea4d8 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -18,7 +18,7 @@ jobs:
matrix:
# test against latest update of each major Java version, as well as specific updates of LTS versions:
RUNTIME: [ol, wlp]
- RUNTIME_VERSION: [24.0.0.6]
+ RUNTIME_VERSION: [24.0.0.9]
java: [21, 17, 11, 8]
exclude:
- java: 8
@@ -101,7 +101,7 @@ jobs:
matrix:
# test against latest update of each major Java version, as well as specific updates of LTS versions:
RUNTIME: [ol, wlp]
- RUNTIME_VERSION: [24.0.0.6]
+ RUNTIME_VERSION: [24.0.0.9]
java: [21, 17, 11, 8]
exclude:
- java: 8
diff --git a/src/test/groovy/io/openliberty/tools/gradle/KernelInstallVersionlessFeatureTest.groovy b/src/test/groovy/io/openliberty/tools/gradle/KernelInstallVersionlessFeatureTest.groovy
new file mode 100644
index 000000000..c6cc7f6e0
--- /dev/null
+++ b/src/test/groovy/io/openliberty/tools/gradle/KernelInstallVersionlessFeatureTest.groovy
@@ -0,0 +1,99 @@
+/*
+ * (C) Copyright IBM Corporation 2024.
+ *
+ * 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 io.openliberty.tools.gradle
+
+import static junit.framework.Assert.assertEquals
+import static org.junit.Assert.*
+
+import org.junit.Before
+import org.junit.BeforeClass
+import org.junit.Test
+
+import io.openliberty.tools.common.plugins.util.InstallFeatureUtil
+
+class KernelInstallVersionlessFeatureTest extends AbstractIntegrationTest{
+ static File resourceDir = new File("build/resources/test/kernel-install-versionless-feature-test")
+ static File buildDir = new File(integTestDir, "/kernel-install-versionless-feature-test")
+ static String buildFilename = "build.gradle"
+
+ @BeforeClass
+ public static void setup() {
+ createDir(buildDir)
+ createTestProject(buildDir, resourceDir, buildFilename)
+ }
+
+ @Before
+ public void before() {
+ runTasks(buildDir, "libertyCreate")
+ copyServer("server_empty.xml")
+ deleteDir(new File(buildDir, "build/wlp/lib/features"))
+ }
+
+ @Test
+ /**
+ * Install with only server.xml features
+ */
+ public void testInstallVersionlessFeaturesServer() {
+ copyBuildFiles(new File(resourceDir, "install_features_server.gradle"), buildDir)
+ runTasks(buildDir, "libertyCreate")
+ copyServer("server_versionless_feature.xml")
+ runTasks(buildDir, "installFeature")
+ assertInstalled("beanValidation-2.0")
+ assertInstalled("servlet-4.0")
+ assertInstalled("jpa-2.2")
+ assertInstalled("ejb-3.2")
+ assertNotInstalled("couchdb-1.0")
+ assertNotInstalled("distributedMap-1.0")
+ }
+
+ private copyServer(String serverFile) {
+ copyFile(new File(resourceDir, serverFile), new File(buildDir, "build/wlp/usr/servers/defaultServer/server.xml"))
+ }
+
+ private void assertInstallStatus(String feature, boolean expectation) throws Exception {
+ String expectationString = (expectation ? "installed" : "not installed");
+ assertEquals("Feature " + feature + " was expected to be " + expectationString + " in the lib/features directory", expectation, existsInFeaturesDirectory(feature));
+ String featureInfo = getFeatureInfo();
+ assertEquals("Feature " + feature + " was expected to be " + expectationString + " according to productInfo featureInfo: " + featureInfo, expectation, featureInfo.contains(feature));
+ }
+
+ protected void assertInstalled(String feature) throws Exception {
+ assertInstallStatus(feature, true);
+ }
+
+ protected void assertNotInstalled(String feature) throws Exception {
+ assertInstallStatus(feature, false);
+ }
+
+ private boolean existsInFeaturesDirectory(String feature) {
+ File[] features;
+ File featuresDir = new File(buildDir, "build/wlp/lib/features")
+
+ features = featuresDir.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().equals("com.ibm.websphere.appserver." + feature.toLowerCase() + ".mf");
+ }
+ });
+
+ return features.size() >= 1;
+ }
+
+ private String getFeatureInfo() throws Exception {
+ File installDirectory = new File(buildDir, "build/wlp")
+ return InstallFeatureUtil.productInfo(installDirectory, "featureInfo");
+ }
+
+}
diff --git a/src/test/resources/kernel-install-feature-test/server_versionless_feature.xml b/src/test/resources/kernel-install-feature-test/server_versionless_feature.xml
new file mode 100644
index 000000000..2435856c5
--- /dev/null
+++ b/src/test/resources/kernel-install-feature-test/server_versionless_feature.xml
@@ -0,0 +1,9 @@
+
+
+ beanValidation
+ servlet
+ jpa
+ ejb
+ javaee-8.0
+
+
diff --git a/src/test/resources/kernel-install-versionless-feature-test/build.gradle b/src/test/resources/kernel-install-versionless-feature-test/build.gradle
new file mode 100644
index 000000000..ab4fdcb8f
--- /dev/null
+++ b/src/test/resources/kernel-install-versionless-feature-test/build.gradle
@@ -0,0 +1,24 @@
+apply plugin: 'liberty'
+
+buildscript {
+ repositories{
+ mavenLocal()
+ mavenCentral()
+ maven {
+ name = 'Sonatype Nexus Snapshots'
+ url = 'https://oss.sonatype.org/content/repositories/snapshots/'
+ }
+ }
+ dependencies {
+ classpath "io.openliberty.tools:liberty-gradle-plugin:$lgpVersion"
+ }
+}
+
+repositories {
+ mavenLocal()
+ mavenCentral()
+}
+
+liberty {
+ runtime = ['group': runtimeGroup,'name':kernelArtifactId,'version':runtimeVersion]
+}
diff --git a/src/test/resources/kernel-install-versionless-feature-test/build_wlp.gradle b/src/test/resources/kernel-install-versionless-feature-test/build_wlp.gradle
new file mode 100644
index 000000000..f37474797
--- /dev/null
+++ b/src/test/resources/kernel-install-versionless-feature-test/build_wlp.gradle
@@ -0,0 +1,24 @@
+apply plugin: 'liberty'
+
+buildscript {
+ repositories{
+ mavenLocal()
+ mavenCentral()
+ maven {
+ name = 'Sonatype Nexus Snapshots'
+ url = 'https://oss.sonatype.org/content/repositories/snapshots/'
+ }
+ }
+ dependencies {
+ classpath "io.openliberty.tools:liberty-gradle-plugin:$lgpVersion"
+ }
+}
+
+repositories {
+ mavenLocal()
+ mavenCentral()
+}
+
+dependencies {
+ libertyRuntime group: 'com.ibm.websphere.appserver.runtime', name: 'wlp-kernel', version: runtimeVersion
+}
diff --git a/src/test/resources/kernel-install-versionless-feature-test/install_features_server.gradle b/src/test/resources/kernel-install-versionless-feature-test/install_features_server.gradle
new file mode 100644
index 000000000..09ab788b7
--- /dev/null
+++ b/src/test/resources/kernel-install-versionless-feature-test/install_features_server.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ repositories {
+ mavenLocal()
+ mavenCentral()
+ maven {
+ name = 'Sonatype Nexus Snapshots'
+ url = 'https://oss.sonatype.org/content/repositories/snapshots/'
+ }
+ }
+ dependencies {
+ classpath "io.openliberty.tools:liberty-gradle-plugin:$lgpVersion"
+ }
+}
+
+apply plugin: 'liberty'
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ libertyRuntime group: runtimeGroup, name: kernelArtifactId, version: runtimeVersion
+}
+
+liberty {
+ server{
+ features {
+ acceptLicense = true
+ }
+ }
+}
diff --git a/src/test/resources/kernel-install-versionless-feature-test/server_empty.xml b/src/test/resources/kernel-install-versionless-feature-test/server_empty.xml
new file mode 100644
index 000000000..3bd4b2b88
--- /dev/null
+++ b/src/test/resources/kernel-install-versionless-feature-test/server_empty.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/test/resources/kernel-install-versionless-feature-test/server_versionless_feature.xml b/src/test/resources/kernel-install-versionless-feature-test/server_versionless_feature.xml
new file mode 100644
index 000000000..2435856c5
--- /dev/null
+++ b/src/test/resources/kernel-install-versionless-feature-test/server_versionless_feature.xml
@@ -0,0 +1,9 @@
+
+
+ beanValidation
+ servlet
+ jpa
+ ejb
+ javaee-8.0
+
+
diff --git a/src/test/resources/kernel-install-versionless-feature-test/settings.gradle b/src/test/resources/kernel-install-versionless-feature-test/settings.gradle
new file mode 100644
index 000000000..c2d3edc19
--- /dev/null
+++ b/src/test/resources/kernel-install-versionless-feature-test/settings.gradle
@@ -0,0 +1 @@
+//Empty
\ No newline at end of file