> consumer) {
+ final var libDir = archive.get(LIB_DIR_PATH);
+
+ if (libDir != null) {
+ for (var node : libDir.getChildren()) {
+ final var asset = node.getAsset();
+ if (asset instanceof ArchiveAsset) {
+ LOGGER.info(() -> format("Processing subarchive [%s]", node.getPath()));
+ consumer.accept(((ArchiveAsset) asset).getArchive());
+ }
+ }
+ }
+ }
+}
diff --git a/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/ConfigDeploymentExceptionTransformer.java b/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/ConfigDeploymentExceptionTransformer.java
new file mode 100644
index 00000000000..e61c135b0fe
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/ConfigDeploymentExceptionTransformer.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.glassfish.microprofile.health.tck.client;
+
+import jakarta.enterprise.inject.spi.DeploymentException;
+
+import org.jboss.arquillian.container.spi.client.container.DeploymentExceptionTransformer;
+
+/**
+ * The common GlassFishClientCommon handler will always throw a GlassfishClientException,
+ * with a message from the response. Deployment errors can safely be converted to the expected
+ * exception type.
+ */
+public class ConfigDeploymentExceptionTransformer implements DeploymentExceptionTransformer {
+
+ @Override
+ public Throwable transform(Throwable throwable) {
+ if (throwable != null && throwable.getMessage().contains("Error occurred during deployment")) {
+ return new DeploymentException(throwable);
+ }
+ return throwable;
+ }
+
+}
diff --git a/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/MicroProfileConfigPropertiesTransformer.java b/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/MicroProfileConfigPropertiesTransformer.java
new file mode 100644
index 00000000000..9d74d7ff564
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/MicroProfileConfigPropertiesTransformer.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.glassfish.microprofile.health.tck.client;
+
+import java.util.logging.Logger;
+
+import org.jboss.arquillian.container.test.spi.client.deployment.ApplicationArchiveProcessor;
+import org.jboss.arquillian.test.spi.TestClass;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.Node;
+
+import static java.lang.String.format;
+/**
+ * This class addresses a discrepancy in MicroProfile specifications regarding the location of
+ * the `microprofile-config.properties` file. Originally, MicroProfile Config specifies that
+ * `microprofile-config.properties` should be located at `META-INF/` within the `classes` directory
+ * of a WAR (i.e., `WEB-INF/classes/META-INF/microprofile-config.properties`). However, some implementations
+ * (such as those supporting MP OpenAPI) also recognize the top-level `META-INF/microprofile-config.properties`.
+ *
+ * The MicroProfile Health TCK, which does not explicitly require OpenAPI, still expects the file at
+ * the top-level `META-INF/` location, creating inconsistency in the configuration support across
+ * implementations. This divergence means implementations supporting only MP Config are restricted
+ * to `WEB-INF/classes/META-INF`, while those supporting both Config and OpenAPI may support both
+ * locations.
+ *
+ * To address this in GlassFish and ensure compatibility with the Health TCK, this class leverages
+ * an Arquillian `ApplicationArchiveProcessor` to move the file from the unsupported top-level
+ * `META-INF` to the standard `WEB-INF/classes/META-INF` in the archive, ensuring that the tests
+ * align with the expected location for all base MP APIs.
+ */
+public class MicroProfileConfigPropertiesTransformer implements ApplicationArchiveProcessor {
+ private static final Logger LOGGER = Logger.getLogger(MicroProfileConfigPropertiesTransformer.class.getName());
+ private static final String ORIGINAL_META_INF_CONFIG = "/META-INF/microprofile-config.properties";
+ private static final String TARGET_META_INF_CONFIG = "/WEB-INF/classes" + ORIGINAL_META_INF_CONFIG;
+
+ @Override
+ public void process(Archive> archive, TestClass testClass) {
+ Node node = archive.get(ORIGINAL_META_INF_CONFIG);
+ if (node != null) {
+ LOGGER.info(() -> format("Moving %s to %s in archive [%s]", ORIGINAL_META_INF_CONFIG, TARGET_META_INF_CONFIG, archive.getName()));
+ archive.delete(ORIGINAL_META_INF_CONFIG);
+ archive.add(node.getAsset(), TARGET_META_INF_CONFIG);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/RootResourceProvider.java b/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/RootResourceProvider.java
new file mode 100644
index 00000000000..54fb7d3d819
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/src/main/java/org/glassfish/microprofile/health/tck/client/RootResourceProvider.java
@@ -0,0 +1,26 @@
+package org.glassfish.microprofile.health.tck.client;
+
+import org.jboss.arquillian.container.test.impl.enricher.resource.URIResourceProvider;
+import org.jboss.arquillian.test.api.ArquillianResource;
+
+import java.lang.annotation.Annotation;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class RootResourceProvider extends URIResourceProvider {
+
+ @Override
+ public Object lookup(ArquillianResource arquillianResource, Annotation... annotations) {
+ Object lookup = super.lookup(arquillianResource, annotations);
+ // remove the context path from the URI
+ if (lookup instanceof URI) {
+ URI uri = (URI) lookup;
+ try {
+ return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), "", uri.getQuery(), uri.getFragment());
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return null;
+ }
+}
diff --git a/appserver/tests/tck/microprofile/health/src/main/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/appserver/tests/tck/microprofile/health/src/main/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
new file mode 100644
index 00000000000..9df6669abeb
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/src/main/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
@@ -0,0 +1 @@
+org.glassfish.microprofile.health.tck.HealthArquillianExtension
\ No newline at end of file
diff --git a/appserver/tests/tck/microprofile/health/src/main/resources/beans.xml b/appserver/tests/tck/microprofile/health/src/main/resources/beans.xml
new file mode 100644
index 00000000000..eea1bce2d91
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/src/main/resources/beans.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/appserver/tests/tck/microprofile/health/src/test/java/org/glassfish/microprofile/health/tck/ContainerSetup.java b/appserver/tests/tck/microprofile/health/src/test/java/org/glassfish/microprofile/health/tck/ContainerSetup.java
new file mode 100644
index 00000000000..a3984367c39
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/src/test/java/org/glassfish/microprofile/health/tck/ContainerSetup.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.glassfish.microprofile.health.tck;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.testng.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.testng.annotations.Test;
+
+/**
+ * Setup the container via a test that runs before the TCK
+ */
+public class ContainerSetup extends Arquillian {
+
+ @Deployment
+ public static Archive> deployment() {
+ return ShrinkWrap.create(WebArchive.class, "container-setup.war");
+ }
+
+ @Test
+ public void setup() {
+ // Setup TCK required system properties
+ System.setProperty("mp.health.disable-default-procedures", "true");
+ }
+}
diff --git a/appserver/tests/tck/microprofile/health/tck-suite.xml b/appserver/tests/tck/microprofile/health/tck-suite.xml
new file mode 100644
index 00000000000..ce1b99b477c
--- /dev/null
+++ b/appserver/tests/tck/microprofile/health/tck-suite.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appserver/tests/tck/microprofile/pom.xml b/appserver/tests/tck/microprofile/pom.xml
index a903078e860..9bd2d023f85 100644
--- a/appserver/tests/tck/microprofile/pom.xml
+++ b/appserver/tests/tck/microprofile/pom.xml
@@ -1,7 +1,7 @@