From a6101d9ffc15c4dfc885db26aaae236fa2a76773 Mon Sep 17 00:00:00 2001 From: Jorge Bescos Gascon Date: Tue, 10 Oct 2023 11:29:37 +0200 Subject: [PATCH] Enable disabled TCKs Signed-off-by: Jorge Bescos Gascon --- .../cdi/HelidonContainerImpl.java | 9 ++- .../config/ConfigCdiExtension.java | 3 +- .../HelidonContainerConfiguration.java | 13 ++++- .../HelidonDeployableContainer.java | 58 +++++-------------- .../arquillian/HelidonMethodExecutor.java | 7 ++- microprofile/tests/tck/tck-cdi/pom.xml | 30 ++-------- .../tck-cdi/src/test/resources/arquillian.xml | 1 + .../tck-core-profile-test/pom.xml | 8 +-- .../src/test/resources/arquillian.xml | 2 +- microprofile/tests/tck/tck-restful/pom.xml | 2 +- pom.xml | 6 +- 11 files changed, 53 insertions(+), 86 deletions(-) diff --git a/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java b/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java index 14d993db4ee..4444c1c6c1d 100644 --- a/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java +++ b/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Map; import java.util.ServiceLoader; -import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Handler; @@ -46,6 +45,8 @@ import jakarta.enterprise.context.BeforeDestroyed; import jakarta.enterprise.context.Destroyed; import jakarta.enterprise.context.Initialized; +import jakarta.enterprise.event.Startup; +import jakarta.enterprise.inject.Any; import jakarta.enterprise.inject.se.SeContainer; import jakarta.enterprise.inject.spi.BeanManager; import jakarta.enterprise.inject.spi.CDI; @@ -96,6 +97,8 @@ final class HelidonContainerImpl extends Weld implements HelidonContainer { private static final Context ROOT_CONTEXT; // whether the current shutdown was invoked by the shutdown hook private static final AtomicBoolean FROM_SHUTDOWN_HOOK = new AtomicBoolean(); + // Default Weld container id. TCKs assumes this value. + private static final String STATIC_INSTANCE = "STATIC_INSTANCE"; static { HelidonFeatures.flavor(HelidonFlavor.MP); @@ -119,7 +122,7 @@ final class HelidonContainerImpl extends Weld implements HelidonContainer { HelidonContainerImpl() { this.bootstrap = new WeldBootstrap(); - id = UUID.randomUUID().toString(); + this.id = STATIC_INSTANCE; } /** @@ -205,6 +208,7 @@ public Collection getResources(String name) { } deployment.getServices().add(ExternalConfiguration.class, configurationBuilder.build()); + // CDI TCK tests expects SE to be excluded, which means Helidon may require to do things that Weld is supposed to do. bootstrap.startContainer(id, Environments.SE, deployment); bootstrap.startInitialization(); @@ -315,6 +319,7 @@ private HelidonContainerImpl doStart() { keepLoggingActive(shutdownHook); bm.getEvent().select(Initialized.Literal.APPLICATION).fire(new ContainerInitialized(id)); + bm.getEvent().select(Any.Literal.INSTANCE).fire(new Startup()); now = System.currentTimeMillis() - now; LOGGER.fine("Container started in " + now + " millis (this excludes the initialization time)"); diff --git a/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java b/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java index 3f1cadb526c..74ed37620b0 100644 --- a/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java +++ b/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java @@ -46,6 +46,7 @@ import jakarta.enterprise.context.Dependent; import jakarta.enterprise.context.spi.CreationalContext; import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.Vetoed; import jakarta.enterprise.inject.spi.AfterBeanDiscovery; import jakarta.enterprise.inject.spi.AfterDeploymentValidation; import jakarta.enterprise.inject.spi.Annotated; @@ -136,7 +137,7 @@ private void processAnnotatedType(@Observes @WithAnnotations(ConfigProperties.cl private void harvestConfigPropertyInjectionPointsFromEnabledObserverMethod(@Observes ProcessObserverMethod event, BeanManager beanManager) { AnnotatedMethod annotatedMethod = event.getAnnotatedMethod(); - if (annotatedMethod != null) { + if (annotatedMethod != null && !annotatedMethod.getDeclaringType().isAnnotationPresent(Vetoed.class)) { List> annotatedParameters = annotatedMethod.getParameters(); if (annotatedParameters != null) { for (AnnotatedParameter annotatedParameter : annotatedParameters) { diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java index 54863b4524e..1094ec8a753 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java @@ -36,7 +36,9 @@ * is empty) *
  • replaceConfigSourcesWithMp: (Optional) defaults to false: whether to replace config sources with microprofile if it * exists
  • - *
  • inWebContainer: defaults to false: sets web app context root, load WEB-INF/beans.xml and find any jakarta.ws.rs.core.Application in the webapp classes
  • + *
  • inWebContainer: (Optional) defaults to false: sets web app context root, load WEB-INF/beans.xml and find any + * jakarta.ws.rs.core.Application in the webapp classes
  • + *
  • useBeanXmlTemplate: (Optional) defaults to true: will create the default templates/beans.xml when beans.xml is missing
  • * */ public class HelidonContainerConfiguration implements ContainerConfiguration { @@ -47,6 +49,7 @@ public class HelidonContainerConfiguration implements ContainerConfiguration { private boolean useRelativePath = false; private boolean useParentClassloader = true; private boolean inWebContainer = false; + private boolean useBeanXmlTemplate = true; private final List> builderConsumers = new ArrayList<>(); /** @@ -114,6 +117,14 @@ public void setInWebContainer(boolean inWebContainer) { this.inWebContainer = inWebContainer; } + public boolean isUseBeanXmlTemplate() { + return useBeanXmlTemplate; + } + + public void setUseBeanXmlTemplate(boolean useBeanXmlTemplate) { + this.useBeanXmlTemplate = useBeanXmlTemplate; + } + @Override public void validate() throws ConfigurationException { if ((port <= 0) || (port > Short.MAX_VALUE)) { diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java index 36e5185b838..3fe786f348b 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java @@ -32,7 +32,6 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; @@ -72,7 +71,6 @@ import org.jboss.arquillian.container.spi.client.protocol.metadata.ProtocolMetaData; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; -import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.descriptor.api.Descriptor; @@ -90,7 +88,7 @@ *
  • The WebArchive contents are written to the temporary directory
  • *
  • beans.xml is created in WEB-INF/classes if not present
  • *
  • WEB-INF/beans.xml will be moved to WEB-INF/classes/META-INF if present
  • - *
  • The server is started with WEB-INF/classes and all libraries in WEB-INF/libon the classpath.
  • + *
  • The server is started with WEB-INF/classes and all libraries in WEB-INF/lib on the classpath.
  • * * * Control is then returned to the test harness (in this case, generally testng) to run tests over HTTP. @@ -226,10 +224,7 @@ public ProtocolMetaData deploy(Archive archive) throws DeploymentException { addServerClasspath(classPath, classesDir, libDir, rootDir); if (containerConfig.isInWebContainer()) { context.rootContext = archive.getName().split("\\.")[0]; - if (!loadApplicationFromWebXml(context, webInfDir)) { - // Search Application in classes - loadApplicationFromClasses(context, archive); - } + loadApplicationFromWebXml(context, webInfDir); } } @@ -263,36 +258,6 @@ public ProtocolMetaData deploy(Archive archive) throws DeploymentException { return new ProtocolMetaData(); } - private boolean loadApplicationFromClasses(RunContext context, Archive archive) - throws ClassNotFoundException, ReflectiveOperationException { - ArchivePath classes = ArchivePaths.create("WEB-INF", "classes"); - org.jboss.shrinkwrap.api.Node root = archive.getContent().get(classes); - Collection> applications = new HashSet<>(); - if (root != null) { - deepApplicationFind(root, applications); - context.applications.addAll(applications); - } - return !context.applications.isEmpty(); - } - - private void deepApplicationFind(org.jboss.shrinkwrap.api.Node parent, - Collection> applications) throws ClassNotFoundException { - for (org.jboss.shrinkwrap.api.Node child : parent.getChildren()) { - if (child.getChildren().isEmpty()) { - String name = child.toString(); - if (name.endsWith(".class")) { - name = name.replaceFirst("\\.class", "").replaceFirst("/WEB-INF/classes/", "").replaceAll("/", "."); - Class clazz = Class.forName(name); - if (Application.class.isAssignableFrom(clazz)) { - applications.add((Class) clazz); - } - } - } else { - deepApplicationFind(child, applications); - } - } - } - private boolean loadApplicationFromWebXml(RunContext context, Path webInfDir) throws IOException, ParserConfigurationException, SAXException, ReflectiveOperationException { Path webXml = webInfDir.resolve("web.xml"); @@ -341,10 +306,12 @@ static Optional lookForSupressedDeploymentException(Throwable t) { } if (jakarta.enterprise.inject.spi.DeploymentException.class.isAssignableFrom(t.getClass())) { return Optional.of((jakarta.enterprise.inject.spi.DeploymentException) t); - } - if (IllegalStateException.class.isAssignableFrom(t.getClass())) { + } else if (IllegalStateException.class.isAssignableFrom(t.getClass())) { return Optional.of((IllegalStateException) t); + } else if (java.lang.Error.class.isAssignableFrom(t.getClass())) { + return Optional.of((new jakarta.enterprise.inject.spi.DeploymentException(t))); } + var deploymentException = lookForSupressedDeploymentException(t.getCause()); for (Throwable suppressed : t.getSuppressed()) { var candicate = lookForSupressedDeploymentException(suppressed); @@ -519,12 +486,13 @@ private void ensureBeansXml(Path classesDir, Path webinfDir) throws IOException if (Files.exists(beansPath)) { return; } - try (InputStream beanXmlTemplate = HelidonDeployableContainer.class.getResourceAsStream("/templates/beans.xml")) { - if (null == beanXmlTemplate) { - Files.write(beansPath, new byte[0]); - } else { - - Files.copy(beanXmlTemplate, beansPath); + if (containerConfig.isUseBeanXmlTemplate()) { + try (InputStream beanXmlTemplate = HelidonDeployableContainer.class.getResourceAsStream("/templates/beans.xml")) { + if (null == beanXmlTemplate) { + Files.write(beansPath, new byte[0]); + } else { + Files.copy(beanXmlTemplate, beansPath); + } } } } diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonMethodExecutor.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonMethodExecutor.java index 7af711de2a6..619c747e1db 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonMethodExecutor.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonMethodExecutor.java @@ -33,6 +33,7 @@ import io.helidon.microprofile.arquillian.HelidonContainerExtension.HelidonCDIInjectionEnricher; +import jakarta.enterprise.context.ContextNotActiveException; import jakarta.enterprise.context.control.RequestContextController; import org.jboss.arquillian.container.test.spi.ContainerMethodExecutor; import org.jboss.arquillian.test.api.ArquillianResource; @@ -83,7 +84,11 @@ public TestResult invoke(TestMethodExecutor testMethodExecutor) { } catch (Throwable t) { return TestResult.failed(t); } finally { - controller.deactivate(); + try { + controller.deactivate(); + } catch (ContextNotActiveException e) { + LOGGER.log(Level.WARNING, "Controller " + controller + " was already deactivated"); + } } return TestResult.passed(); } diff --git a/microprofile/tests/tck/tck-cdi/pom.xml b/microprofile/tests/tck/tck-cdi/pom.xml index 9b079fe2595..2e437f82067 100644 --- a/microprofile/tests/tck/tck-cdi/pom.xml +++ b/microprofile/tests/tck/tck-cdi/pom.xml @@ -73,37 +73,19 @@ org.apache.maven.plugins maven-surefire-plugin + + false + 1 false - cdi-full,se + + cdi-full,integration,javaee-full,se jakarta.enterprise:cdi-tck-core-impl - org/jboss/cdi/tck/tests/**/*Test.java - org/jboss/cdi/tck/interceptors/DependentContextTesttests/**/*Test.java + org/jboss/cdi/tck/**/*Test.java - - org/jboss/cdi/tck/tests/fulSyntheticBeanWithLookupTestl/extensions/lifecycle/bbd/broken/passivatingScope/AddingPassivatingScopeTest.java - - org/jboss/cdi/tck/tests/build/compatible/extensions/changeObserverQualifier/ChangeObserverQualifierTest.java - org/jboss/cdi/tck/tests/build/compatible/extensions/customStereotype/CustomStereotypeTest.java - org/jboss/cdi/tck/tests/build/compatible/extensions/syntheticBeanWithLookup/SyntheticBeanWithLookupTest.java - org/jboss/cdi/tck/tests/context/dependent/DependentContextTest.java - org/jboss/cdi/tck/tests/definition/bean/types/ManagedBeanTypesTest.java - org/jboss/cdi.tck/tests/event/EventTest.java - org/jboss/cdi/tck/tests/event/lifecycle/StartupShutdownTest.java - org/jboss/cdi/tck/tests/event/observer/broken/validation/unsatisfied/ObserverMethodParameterInjectionValidationTest.java - org/jboss/cdi/tck/tests/event/observer/broken/validation/ambiguous/ObserverMethodParameterInjectionValidationTest.java - org/jboss/cdi/tck/tests/event/observer/runtimeException/ObserverExceptionRethrownTest.java - org/jboss/cdi/tck/tests/event/observer/conditional/ConditionalObserverTest.java - org/jboss/cdi/tck/tests/event/observer/ObserverNotificationTest.java - org/jboss/cdi/tck/tests/event/observer/async/executor/FireAsyncWithCustomExecutorTest.java - org/jboss/cdi/tck/tests/inheritance/generics/MemberLevelInheritanceTest.java - org/jboss/cdi/tck/tests/lookup/clientProxy/unproxyable/privateConstructor/PrivateConstructorTest.java - org/jboss/cdi/tck/tests/lookup/clientProxy/unproxyable/beanConstructor/BeanConstructorWithParametersTest.java - org/jboss/cdi/tck/tests/implementation/simple/lifecycle/unproxyable/UnproxyableManagedBeanTest.java - diff --git a/microprofile/tests/tck/tck-cdi/src/test/resources/arquillian.xml b/microprofile/tests/tck/tck-cdi/src/test/resources/arquillian.xml index 5320417c279..8e8c9ca0132 100644 --- a/microprofile/tests/tck/tck-cdi/src/test/resources/arquillian.xml +++ b/microprofile/tests/tck/tck-cdi/src/test/resources/arquillian.xml @@ -29,6 +29,7 @@ true + false \ No newline at end of file diff --git a/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/pom.xml b/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/pom.xml index 0c8fa9bce52..15a2b139640 100644 --- a/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/pom.xml +++ b/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/pom.xml @@ -33,7 +33,7 @@ io.helidon.microprofile.bundles - helidon-microprofile-core + helidon-microprofile test @@ -77,12 +77,6 @@ *IT.java - - - ee/jakarta/tck/core/jsonb/JsonbApplicationIT.java - ee/jakarta/tck/core/json/ApplicationJsonpIT.java - ee/jakarta/tck/core/rest/jsonb/cdi/CustomJsonbSerializationIT.java - diff --git a/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/src/test/resources/arquillian.xml b/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/src/test/resources/arquillian.xml index f47555c4b3a..2ecdca68d32 100644 --- a/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/src/test/resources/arquillian.xml +++ b/microprofile/tests/tck/tck-core-profile/tck-core-profile-test/src/test/resources/arquillian.xml @@ -27,7 +27,7 @@ - true + true \ No newline at end of file diff --git a/microprofile/tests/tck/tck-restful/pom.xml b/microprofile/tests/tck/tck-restful/pom.xml index 50a2e7f7a0b..28e3c8666b5 100644 --- a/microprofile/tests/tck/tck-restful/pom.xml +++ b/microprofile/tests/tck/tck-restful/pom.xml @@ -48,7 +48,7 @@ - + diff --git a/pom.xml b/pom.xml index 1eaeaa3bf26..6b763be284d 100644 --- a/pom.xml +++ b/pom.xml @@ -61,9 +61,9 @@ 9.1 2.11.0 2.4.14 - 10.0.1 - 4.0.10 - 3.1.3 + 10.0.2 + 4.0.12 + 3.1.4 2.2.1.Final 1.15.3