diff --git a/testsuite/integration-arquillian/servers/app-server/pom.xml b/testsuite/integration-arquillian/servers/app-server/pom.xml
index 30260222ef3..a5e877a89af 100644
--- a/testsuite/integration-arquillian/servers/app-server/pom.xml
+++ b/testsuite/integration-arquillian/servers/app-server/pom.xml
@@ -44,7 +44,6 @@
build-app-servers
jboss
- undertow
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/pom.xml b/testsuite/integration-arquillian/servers/app-server/undertow/pom.xml
deleted file mode 100644
index db333880a1e..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/pom.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
- org.keycloak.testsuite
- integration-arquillian-servers-app-server
- 999.0.0-SNAPSHOT
-
-
- 4.0.0
-
- integration-arquillian-servers-app-server-undertow
- jar
- App Server - Undertow
-
-
-
- org.keycloak.testsuite
- keycloak-saml-undertow-adapter-jakarta
- ${project.version}
-
-
- org.keycloak.testsuite
- integration-arquillian-servers-app-server-spi
- ${project.version}
-
-
- org.keycloak.testsuite
- integration-arquillian-util
- ${project.version}
-
-
- org.jboss.resteasy
- resteasy-undertow
-
-
- org.jboss.arquillian.container
- undertow-embedded
-
-
- commons-io
- commons-io
-
-
-
-
-
- org.jboss.spec.javax.servlet.jsp
- jboss-jsp-api_2.3_spec
-
-
-
-
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServer.java b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServer.java
deleted file mode 100644
index f419c4a1bca..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServer.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.arquillian.undertow;
-
-import io.undertow.Undertow;
-import io.undertow.server.handlers.PathHandler;
-import io.undertow.servlet.api.DeploymentInfo;
-import io.undertow.servlet.api.DeploymentManager;
-import io.undertow.servlet.api.ServletContainer;
-import io.undertow.servlet.api.ServletInfo;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.nio.charset.Charset;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-import jakarta.servlet.ServletException;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.core.Application;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.arquillian.undertow.UndertowContainerConfiguration;
-import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
-import org.jboss.arquillian.container.spi.client.container.DeploymentException;
-import org.jboss.arquillian.container.spi.client.container.LifecycleException;
-import org.jboss.arquillian.container.spi.client.protocol.ProtocolDescription;
-import org.jboss.arquillian.container.spi.client.protocol.metadata.HTTPContext;
-import org.jboss.arquillian.container.spi.client.protocol.metadata.ProtocolMetaData;
-import org.jboss.arquillian.container.spi.client.protocol.metadata.Servlet;
-import org.jboss.logging.Logger;
-import org.jboss.resteasy.core.ResteasyDeploymentImpl;
-import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
-import org.jboss.resteasy.spi.ResteasyDeployment;
-import org.jboss.shrinkwrap.api.Archive;
-import org.jboss.shrinkwrap.api.Node;
-import org.jboss.shrinkwrap.api.asset.ClassAsset;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
-import org.jboss.shrinkwrap.descriptor.api.Descriptor;
-import org.jboss.shrinkwrap.undertow.api.UndertowWebArchive;
-import org.keycloak.common.util.reflections.Reflections;
-import org.keycloak.testsuite.arquillian.undertow.saml.util.RestSamlApplicationConfig;
-import org.keycloak.testsuite.utils.undertow.UndertowDeployerHelper;
-import org.keycloak.testsuite.utils.undertow.UndertowWarClassLoader;
-import java.io.InputStream;
-
-/**
- * @author Vlasta Ramik
- */
-public class UndertowAppServer implements DeployableContainer {
-
- private static final Logger log = Logger.getLogger(UndertowAppServer.class);
-
- private UndertowContainerConfiguration configuration;
- private UndertowJaxrsServer undertow;
- Map deployedArchivesToContextPath = new ConcurrentHashMap<>();
-
- @Override
- public Class getConfigurationClass() {
- return UndertowAppServerConfiguration.class;
- }
-
- @Override
- public void setup(UndertowAppServerConfiguration configuration) {
- this.configuration = configuration;
- }
-
- @Override
- public void start() throws LifecycleException {
- long start = System.currentTimeMillis();
-
- undertow = new UndertowJaxrsServer();
- undertow.start(Undertow.builder()
- .addHttpListener(configuration.getBindHttpPort(), configuration.getBindAddress()));
- log.infof("App server started in %dms on http://%s:%d/", (System.currentTimeMillis() - start), configuration.getBindAddress(), configuration.getBindHttpPort());
- }
-
- @Override
- public void stop() throws LifecycleException {
- undertow.stop();
- log.info("App Server stopped.");
- }
-
- @Override
- public ProtocolDescription getDefaultProtocol() {
- return new ProtocolDescription("Servlet 3.1");
- }
-
- @Override
- public ProtocolMetaData deploy(Archive> archive) throws DeploymentException {
- log.info("Deploying archive " + archive.getName());
-
- // Remove jsps
- String ioTMPDir = System.getProperty("java.io.tmpdir", ""); // My Intellij and Terminal stores tmp directory in this property
- if (!ioTMPDir.isEmpty()) {
- ioTMPDir = ioTMPDir.endsWith("/") ? ioTMPDir : ioTMPDir + "/";
- File tmpUndertowJSPDirectory = new File(ioTMPDir + "org/apache/jsp");
- if (tmpUndertowJSPDirectory.exists()) {
- try {
- FileUtils.deleteDirectory(tmpUndertowJSPDirectory);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- DeploymentInfo di;
- if (archive instanceof UndertowWebArchive) {
- di = ((UndertowWebArchive) archive).getDeploymentInfo();
- } else if (archive instanceof WebArchive) {
- WebArchive webArchive = (WebArchive)archive;
-
- Optional applicationClassNode = archive.getContent(archivePath ->
- archivePath.get().startsWith("/WEB-INF/classes/") && archivePath.get().endsWith("Application.class"))
- .values().stream().findFirst();
-
- if (isJaxrsApp(webArchive)) {
- di = new UndertowDeployerHelper().getDeploymentInfo(configuration, webArchive,
- undertow.undertowDeployment(discoverPathAnnotatedClasses(webArchive)));
- } else if (applicationClassNode.isPresent()) {
- String applicationPath = applicationClassNode.get().getPath().get();
-
- ResteasyDeployment deployment = new ResteasyDeploymentImpl();
- deployment.setApplicationClass(extractClassName(applicationPath));
- di = new UndertowDeployerHelper().getDeploymentInfo(configuration, (WebArchive) archive, undertow.undertowDeployment(deployment));
- } else {
- di = new UndertowDeployerHelper().getDeploymentInfo(configuration, webArchive);
- }
- } else {
- throw new IllegalArgumentException("UndertowContainer only supports UndertowWebArchive or WebArchive.");
- }
-
- if ("ROOT.war".equals(archive.getName())) {
- di.setContextPath("/");
- }
-
- ClassLoader parentCl = Thread.currentThread().getContextClassLoader();
- UndertowWarClassLoader classLoader = new UndertowWarClassLoader(parentCl, archive);
- Thread.currentThread().setContextClassLoader(classLoader);
-
- try {
- undertow.deploy(di);
- } finally {
- Thread.currentThread().setContextClassLoader(parentCl);
- }
-
- deployedArchivesToContextPath.put(archive.getName(), di.getContextPath());
-
- return new ProtocolMetaData().addContext(
- createHttpContextForDeploymentInfo(di));
- }
-
- private String extractClassName(String applicationPath) {
- applicationPath = applicationPath
- .substring(0, applicationPath.lastIndexOf(".class")) // Remove .class
- .replaceFirst("^/WEB-INF/classes/", ""); // Remove /WEB-INF/classes/ from beginning
-
- return applicationPath.replaceAll("/", ".");
- }
-
- @Override
- public void undeploy(Archive> archive) throws DeploymentException {
- log.info("Undeploying archive " + archive.getName());
- Field containerField = Reflections.findDeclaredField(UndertowJaxrsServer.class, "container");
- Reflections.setAccessible(containerField);
- ServletContainer container = (ServletContainer) Reflections.getFieldValue(containerField, undertow);
-
- DeploymentManager deploymentMgr = container.getDeployment(archive.getName());
- if (deploymentMgr != null) {
- DeploymentInfo deployment = deploymentMgr.getDeployment().getDeploymentInfo();
-
- try {
- deploymentMgr.stop();
- } catch (ServletException se) {
- throw new DeploymentException(se.getMessage(), se);
- }
-
- deploymentMgr.undeploy();
-
- Field rootField = Reflections.findDeclaredField(UndertowJaxrsServer.class, "root");
- Reflections.setAccessible(rootField);
- PathHandler root = (PathHandler) Reflections.getFieldValue(rootField, undertow);
-
- String path = deployedArchivesToContextPath.get(archive.getName());
- root.removePrefixPath(path);
-
- container.removeDeployment(deployment);
- } else {
- log.warnf("Deployment '%s' not found", archive.getName());
- }
- }
-
- @Override
- public void deploy(Descriptor descriptor) throws DeploymentException {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- @Override
- public void undeploy(Descriptor descriptor) throws DeploymentException {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- private HTTPContext createHttpContextForDeploymentInfo(DeploymentInfo deploymentInfo) {
- HTTPContext httpContext = new HTTPContext(configuration.getBindAddress(), configuration.getBindHttpPort());
- final Map servlets = deploymentInfo.getServlets();
- final Collection servletsInfo = servlets.values();
- for (ServletInfo servletInfo : servletsInfo) {
- httpContext.add(new Servlet(servletInfo.getName(), deploymentInfo.getContextPath()));
- }
- return httpContext;
- }
-
- private boolean isJaxrsApp(WebArchive archive) throws DeploymentException {
- if (! archive.contains("/WEB-INF/web.xml")) {
- return false;
- }
- try (InputStream stream = archive.get("/WEB-INF/web.xml").getAsset().openStream()) {
- return
- IOUtils.toString(stream, Charset.forName("UTF-8"))
- .contains(Application.class.getName());
- } catch (IOException e) {
- throw new DeploymentException("Unable to read archive.", e);
- }
- }
-
- private ResteasyDeployment discoverPathAnnotatedClasses(WebArchive webArchive) {
- //take all classes from war and add those with @Path annotation to RestSamlApplicationConfig
- Set> classes = webArchive.getContent(archivePath ->
- archivePath.get().startsWith("/WEB-INF/classes/") &&
- archivePath.get().endsWith(".class")
- ).values().stream()
- .filter(node -> node.getAsset() instanceof ClassAsset)
- .map(node -> ((ClassAsset)node.getAsset()).getSource())
- .filter(clazz -> clazz.isAnnotationPresent(Path.class))
- .collect(Collectors.toSet());
-
- ResteasyDeployment deployment = new ResteasyDeploymentImpl();
- deployment.setApplication(new RestSamlApplicationConfig(classes));
- return deployment;
- }
-}
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServerArquillianExtension.java b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServerArquillianExtension.java
deleted file mode 100644
index 06d18d691e2..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServerArquillianExtension.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.arquillian.undertow;
-
-import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
-import org.jboss.arquillian.container.test.spi.client.deployment.ApplicationArchiveProcessor;
-import org.jboss.arquillian.core.spi.LoadableExtension;
-import org.keycloak.testsuite.arquillian.undertow.container.UndertowDeploymentArchiveProcessor;
-
-/**
- * @author Vlasta Ramik
- */
-public class UndertowAppServerArquillianExtension implements LoadableExtension {
-
- @Override
- public void register(ExtensionBuilder builder) {
- builder
- .service(DeployableContainer.class, UndertowAppServer.class)
- .service(ApplicationArchiveProcessor.class, UndertowDeploymentArchiveProcessor.class);
-
- }
-
-
-}
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServerConfiguration.java b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServerConfiguration.java
deleted file mode 100644
index 9a6ccce4714..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/UndertowAppServerConfiguration.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.arquillian.undertow;
-
-import org.arquillian.undertow.UndertowContainerConfiguration;
-import org.jboss.arquillian.container.spi.ConfigurationException;
-import org.jboss.logging.Logger;
-
-public class UndertowAppServerConfiguration extends UndertowContainerConfiguration {
-
- protected static final Logger log = Logger.getLogger(UndertowAppServerConfiguration.class);
-
- private int bindHttpPortOffset = 0;
-
- public int getBindHttpPortOffset() {
- return bindHttpPortOffset;
- }
-
- public void setBindHttpPortOffset(int bindHttpPortOffset) {
- this.bindHttpPortOffset = bindHttpPortOffset;
- }
-
- @Override
- public void validate() throws ConfigurationException {
- super.validate();
-
- int basePort = getBindHttpPort();
- int newPort = basePort + bindHttpPortOffset;
- setBindHttpPort(newPort);
- log.info("App server undertow will listen on port: " + newPort);
- }
-
-}
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/container/UndertowAppServerProvider.java b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/container/UndertowAppServerProvider.java
deleted file mode 100644
index f9af9fe725e..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/container/UndertowAppServerProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.arquillian.undertow.container;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.jboss.shrinkwrap.descriptor.spi.node.Node;
-import org.keycloak.testsuite.arquillian.undertow.UndertowAppServer;
-import org.keycloak.testsuite.arquillian.container.AppServerContainerProvider;
-
-/**
- * @author Vlasta Ramik
- */
-public class UndertowAppServerProvider implements AppServerContainerProvider {
-
- private Node configuration;
- private static final String containerName = "undertow";
-
- @Override
- public String getName() {
- return containerName;
- }
-
- @Override
- public List getContainers() {
- List containers = new ArrayList<>();
-
- containers.add(standaloneContainer());
-
- //not supported yet
-// containers.add(haNodeContainer(1));
-// containers.add(haNodeContainer(2));
-
- return containers;
- }
-
- private void createChild(String name, String text) {
- configuration.createChild("property").attribute("name", name).text(text);
- }
-
- private Node standaloneContainer() {
- Node container = new Node("container");
- container.attribute("mode", "manual");
- container.attribute("qualifier", AppServerContainerProvider.APP_SERVER + "-" + containerName);
-
- configuration = container.createChild("configuration");
- createChild("enabled", "true");
- createChild("bindAddress", "0.0.0.0");
- createChild("bindHttpPort", "8280");
- createChild("adapterImplClass", UndertowAppServer.class.getName());
-
- return container;
- }
-
- private Node haNodeContainer(int number) {
- Node container = new Node("container");
- container.attribute("mode", "manual");
- container.attribute("qualifier", AppServerContainerProvider.APP_SERVER + "-" + containerName + "-ha-node-" + number);
-
- configuration = container.createChild("configuration");
- createChild("enabled", "true");
- createChild("bindAddress", "localhost");
- createChild("bindHttpPort", "8280");
- createChild("bindHttpPortOffset", Integer.toString(number));
- createChild("adapterImplClass", UndertowAppServer.class.getName());
-
- return container;
- }
-
-}
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/container/UndertowDeploymentArchiveProcessor.java b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/container/UndertowDeploymentArchiveProcessor.java
deleted file mode 100644
index 9eb5fc19248..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/container/UndertowDeploymentArchiveProcessor.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.arquillian.undertow.container;
-
-import org.jboss.arquillian.container.test.spi.client.deployment.ApplicationArchiveProcessor;
-import org.jboss.arquillian.test.spi.TestClass;
-import org.jboss.logging.Logger;
-import org.jboss.shrinkwrap.api.Archive;
-import org.keycloak.testsuite.utils.arquillian.DeploymentArchiveProcessorUtils;
-
-/**
- *
- * @author Vlasta Ramik
- */
-public class UndertowDeploymentArchiveProcessor implements ApplicationArchiveProcessor {
-
- private final Logger log = Logger.getLogger(UndertowDeploymentArchiveProcessor.class);
-
- @Override
- public void process(Archive> archive, TestClass testClass) {
- if (DeploymentArchiveProcessorUtils.checkRunOnServerDeployment(archive)) return;
- if (!System.getProperty("app.server", "undertow").equals("undertow")) return;
-
- modifyWebXML(archive, testClass);
-
- modifyOIDCAdapterConfig(archive, DeploymentArchiveProcessorUtils.ADAPTER_CONFIG_PATH);
-
- modifySAMLAdapterConfig(archive, DeploymentArchiveProcessorUtils.SAML_ADAPTER_CONFIG_PATH);
- modifySAMLAdapterConfig(archive, DeploymentArchiveProcessorUtils.SAML_ADAPTER_CONFIG_PATH_TENANT1);
- modifySAMLAdapterConfig(archive, DeploymentArchiveProcessorUtils.SAML_ADAPTER_CONFIG_PATH_TENANT2);
-
- modifyOIDCAdapterConfig(archive, DeploymentArchiveProcessorUtils.ADAPTER_CONFIG_PATH_JS);
- }
-
- private void modifyWebXML(Archive> archive, TestClass testClass) {
- if (!archive.contains(DeploymentArchiveProcessorUtils.WEBXML_PATH)) return;
- }
-
- private void modifyOIDCAdapterConfig(Archive> archive, String adapterConfigPath) {
- if (!archive.contains(adapterConfigPath)) return;
-
- log.debug("Modifying adapter config " + adapterConfigPath + " in " + archive.getName());
-
- DeploymentArchiveProcessorUtils.modifyOIDCAdapterConfig(archive, adapterConfigPath);
- }
-
- private void modifySAMLAdapterConfig(Archive> archive, String adapterConfigPath) {
- if (!archive.contains(adapterConfigPath)) return;
-
- log.debug("Modifying adapter config " + adapterConfigPath + " in " + archive.getName());
- DeploymentArchiveProcessorUtils.modifySAMLAdapterConfig(archive, adapterConfigPath);
- }
-}
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/saml/util/RestSamlApplicationConfig.java b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/saml/util/RestSamlApplicationConfig.java
deleted file mode 100644
index 5a624bcaadc..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/java/org/keycloak/testsuite/arquillian/undertow/saml/util/RestSamlApplicationConfig.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.arquillian.undertow.saml.util;
-
-import java.util.Set;
-import jakarta.ws.rs.core.Application;
-
-/**
- * Wildfly JAX-RS Integration has support for scanning deployment for annotations.
- *
- * https://github.com/wildfly/wildfly/blob/14.0.1.Final/jaxrs/src/main/java/org/jboss/as/jaxrs/deployment/JaxrsAnnotationProcessor.java
- *
- * On undertow we have to set Application Class manually:
- *
- * ResteasyDeployment deployment = new ResteasyDeployment();
- * deployment.setApplication(application);
- *
- * @author vramik
- */
-public class RestSamlApplicationConfig extends Application {
-
- private final Set> classes;
-
- public RestSamlApplicationConfig(Set> classes) {
- this.classes = classes;
- }
-
- @Override
- public Set> getClasses() {
- return classes;
- }
-}
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
deleted file mode 100644
index 9201599f3d6..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
+++ /dev/null
@@ -1 +0,0 @@
-org.keycloak.testsuite.arquillian.undertow.UndertowAppServerArquillianExtension
diff --git a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/resources/META-INF/services/org.keycloak.testsuite.arquillian.container.AppServerContainerProvider b/testsuite/integration-arquillian/servers/app-server/undertow/src/main/resources/META-INF/services/org.keycloak.testsuite.arquillian.container.AppServerContainerProvider
deleted file mode 100644
index a00362f31a9..00000000000
--- a/testsuite/integration-arquillian/servers/app-server/undertow/src/main/resources/META-INF/services/org.keycloak.testsuite.arquillian.container.AppServerContainerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.keycloak.testsuite.arquillian.undertow.container.UndertowAppServerProvider
diff --git a/testsuite/integration-arquillian/tests/base/pom.xml b/testsuite/integration-arquillian/tests/base/pom.xml
index 8676cf3e229..1ca1b47b46d 100644
--- a/testsuite/integration-arquillian/tests/base/pom.xml
+++ b/testsuite/integration-arquillian/tests/base/pom.xml
@@ -476,26 +476,6 @@
-
- app-server-undertow
-
-
- app.server
- undertow
-
-
-
- undertow
-
-
-
- org.keycloak.testsuite
- integration-arquillian-servers-app-server-undertow
- ${project.version}
- runtime
-
-
-
app-server-wildfly
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLClockSkewAdapterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLClockSkewAdapterTest.java
index c35c539afe0..bfa53ef3a8c 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLClockSkewAdapterTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLClockSkewAdapterTest.java
@@ -42,7 +42,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.keycloak.testsuite.util.SamlClient.Binding.POST;
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLoginResponseHandlingTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLoginResponseHandlingTest.java
index 9007e655506..decb16bc14a 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLoginResponseHandlingTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLoginResponseHandlingTest.java
@@ -53,7 +53,6 @@ import static org.keycloak.testsuite.util.WaitUtils.waitUntilElement;
/**
* @author mhajas
*/
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLogoutAdapterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLogoutAdapterTest.java
index de14c7bec42..6a4ad5ccb7a 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLogoutAdapterTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLLogoutAdapterTest.java
@@ -49,7 +49,6 @@ import static org.keycloak.testsuite.util.SamlClient.Binding.REDIRECT;
*
* @author hmlnarik
*/
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletAdapterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletAdapterTest.java
index c1dc4814256..2ffe1fce031 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletAdapterTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletAdapterTest.java
@@ -192,7 +192,6 @@ import org.xml.sax.SAXException;
/**
* @author mhajas
*/
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletSessionTimeoutTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletSessionTimeoutTest.java
index 25d5e92a649..2d9b71729ef 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletSessionTimeoutTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SAMLServletSessionTimeoutTest.java
@@ -32,7 +32,6 @@ import static org.keycloak.testsuite.saml.AbstractSamlTest.REALM_NAME;
import static org.keycloak.testsuite.util.Matchers.bodyHC;
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlSignatureTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlSignatureTest.java
index d243e173156..406290d384f 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlSignatureTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlSignatureTest.java
@@ -76,7 +76,6 @@ import static org.keycloak.testsuite.saml.AbstractSamlTest.REALM_SIGNING_CERTIFI
*
* @author hmlnarik
*/
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlXMLAttacksTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlXMLAttacksTest.java
index b8817ce5018..16fc8ea408f 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlXMLAttacksTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/servlet/SamlXMLAttacksTest.java
@@ -33,7 +33,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.keycloak.testsuite.util.Matchers.bodyHC;
import static org.keycloak.testsuite.util.Matchers.statusCodeIsHC;
-@AppServerContainer(ContainerConstants.APP_SERVER_UNDERTOW)
@AppServerContainer(ContainerConstants.APP_SERVER_WILDFLY)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP)
@AppServerContainer(ContainerConstants.APP_SERVER_EAP8)
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/undertow/servlet/UndertowRelaviteUriAdapterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/undertow/servlet/UndertowRelaviteUriAdapterTest.java
deleted file mode 100644
index e69c09e198b..00000000000
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/undertow/servlet/UndertowRelaviteUriAdapterTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright 2018 Red Hat, Inc. and/or its affiliates
- * and other contributors as indicated by the @author tags.
- *
- * 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.keycloak.testsuite.adapter.undertow.servlet;
-
-import java.util.List;
-import java.util.Map;
-import org.jboss.arquillian.container.test.api.Deployment;
-import org.jboss.arquillian.graphene.page.Page;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.keycloak.representations.idm.RealmRepresentation;
-import org.keycloak.testsuite.adapter.AbstractServletsAdapterTest;
-import org.keycloak.testsuite.adapter.filter.AdapterActionsFilter;
-import org.keycloak.testsuite.adapter.page.CustomerDb;
-import org.keycloak.testsuite.adapter.page.CustomerPortal;
-import org.keycloak.testsuite.adapter.page.ProductPortal;
-import org.keycloak.testsuite.adapter.servlet.CustomerDatabaseServlet;
-import org.keycloak.testsuite.adapter.servlet.CustomerServlet;
-import org.keycloak.testsuite.adapter.servlet.ErrorServlet;
-import org.keycloak.testsuite.adapter.servlet.ProductServlet;
-import org.keycloak.testsuite.adapter.servlet.ServletTestUtils;
-import org.keycloak.testsuite.arquillian.annotation.AppServerContainer;
-import org.keycloak.testsuite.util.AccountHelper;
-
-import static org.keycloak.testsuite.arquillian.AuthServerTestEnricher.AUTH_SERVER_CONTAINER_DEFAULT;
-import static org.keycloak.testsuite.auth.page.AuthRealm.DEMO;
-import static org.keycloak.testsuite.utils.io.IOUtil.loadRealm;
-import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlEquals;
-import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWithLoginUrlOf;
-
-/**
- * Also tests relative URIs in the adapter and valid redirect uris.
- * Also tests adapters not configured with public key
- *
- * note: migrated from old testsuite
- *
- * @author Bill Burke
- */
-@AppServerContainer(AUTH_SERVER_CONTAINER_DEFAULT)
-@Ignore(value = "Need to resolve default relative scenario when running on non-undertow")
-public class UndertowRelaviteUriAdapterTest extends AbstractServletsAdapterTest {
-
- @Page
- private CustomerPortal customerPortal;
- @Page
- private ProductPortal productPortal;
-
- @Override
- public void addAdapterTestRealms(List testRealms) {
- testRealms.add(loadRealm("/adapter-test/demorealm-relative.json"));
- }
-
- @Deployment(name = CustomerPortal.DEPLOYMENT_NAME)
- protected static WebArchive customerPortal() {
- return servletDeployment(CustomerPortal.DEPLOYMENT_NAME, "keycloak-relative.json", CustomerServlet.class, ErrorServlet.class, ServletTestUtils.class);
- }
-
- @Deployment(name = CustomerDb.DEPLOYMENT_NAME)
- protected static WebArchive customerDb() {
- return servletDeployment(CustomerDb.DEPLOYMENT_NAME, "keycloak-relative.json", AdapterActionsFilter.class, CustomerDatabaseServlet.class);
- }
-
- @Deployment(name = ProductPortal.DEPLOYMENT_NAME)
- protected static WebArchive productPortal() {
- return servletDeployment(ProductPortal.DEPLOYMENT_NAME, "keycloak-relative.json", ProductServlet.class);
- }
-
- @Test
- public void testLoginSSOAndLogout() {
- // test login to customer-portal which does a bearer request to customer-db
- customerPortal.navigateTo();
- assertCurrentUrlStartsWithLoginUrlOf(testRealmPage);
- testRealmLoginPage.form().login("bburke@redhat.com", "password");
- assertCurrentUrlEquals(customerPortal);
- String pageSource = driver.getPageSource();
- Assert.assertTrue(pageSource.contains("Bill Burke") && pageSource.contains("Stian Thorgersen"));
-
- // test SSO
- productPortal.navigateTo();
- assertCurrentUrlEquals(productPortal);
- pageSource = driver.getPageSource();
- Assert.assertTrue(pageSource.contains("iPhone") && pageSource.contains("iPad"));
-
- // View stats
- List