Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem with Wildfly 8.2.0.Final #63

Open
AcquisioIchi opened this issue Oct 16, 2015 · 6 comments
Open

Problem with Wildfly 8.2.0.Final #63

AcquisioIchi opened this issue Oct 16, 2015 · 6 comments

Comments

@AcquisioIchi
Copy link

I have a problem using cukespace-core v1.6.1 with a managed Wildfly 8.2.0.Final server, with a @deployment routine in server mode (testable = true). If I change the @deployment to "testable = false", it works, but I want to run my test in full server mode where DI is working and I have a fully operational server context.

At some point ArquillianCucumber.performInternalCucumberOperations is calling ArquillianBackend.loadGlue(), then ArquillianBackend.scan(), which is scanning deployed classes for cucumber annotations (Given, When, etc.). And because of Wildfly's VFS filesystem, it ends up producing this exception:

// BEGINNING OF STACK TRACE
cucumber.runtime.CucumberException: Expected a file URL:vfs:/C:/dev/projets/VC8-844_W42/AcquisioSearch/content/JunitTest2.ear/lib/cucumber-junit-1.2.4.jar/cucumber/api/
at cucumber.runtime.io.Helpers.filePath(Helpers.java:16)
at cucumber.runtime.io.FileResourceIteratorFactory.createIterator(FileResourceIteratorFactory.java:28)
at cucumber.runtime.io.ZipThenFileResourceIteratorFactory.createIterator(ZipThenFileResourceIteratorFactory.java:23)
at cucumber.runtime.io.DelegatingResourceIteratorFactory.createIterator(DelegatingResourceIteratorFactory.java:49)
at cucumber.runtime.io.ClasspathResourceIterable.iterator(ClasspathResourceIterable.java:33)
at cucumber.runtime.io.ResourceLoaderClassFinder.getDescendants(ResourceLoaderClassFinder.java:22)
at cucumber.runtime.arquillian.lifecycle.CucumberLifecycle.cucumberAnnotations(CucumberLifecycle.java:129)
at cucumber.runtime.arquillian.backend.ArquillianBackend.readFromJava(ArquillianBackend.java:122)
at cucumber.runtime.arquillian.backend.ArquillianBackend.scan(ArquillianBackend.java:110)
at cucumber.runtime.arquillian.backend.ArquillianBackend.loadGlue(ArquillianBackend.java:80)
at cucumber.runtime.Runtime.(Runtime.java:91)
at cucumber.runtime.Runtime.(Runtime.java:69)
at cucumber.runtime.arquillian.ArquillianCucumber$CucumberRuntime.(ArquillianCucumber.java:467)
at cucumber.runtime.arquillian.ArquillianCucumber.performInternalCucumberOperations(ArquillianCucumber.java:149)
at cucumber.runtime.arquillian.ArquillianCucumber$InstanceControlledFrameworkMethod.invokeExplosively(ArquillianCucumber.java:449)
at org.jboss.arquillian.junit.Arquillian$6$1.invoke(Arquillian.java:270)
at org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter.execute(LocalTestExecuter.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115)
at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67)
at org.jboss.arquillian.container.test.impl.execution.ContainerTestExecuter.execute(ContainerTestExecuter.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)
at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:102)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94)
at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)
at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135)
at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:111)
at org.jboss.arquillian.junit.Arquillian$6.evaluate(Arquillian.java:263)
at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:226)
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)
at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)
at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:240)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at cucumber.runtime.arquillian.ArquillianCucumber.runChild(ArquillianCucumber.java:122)
at cucumber.runtime.arquillian.ArquillianCucumber.runChild(ArquillianCucumber.java:71)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:185)
at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314)
at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46)
at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
at org.jboss.arquillian.junit.container.JUnitTestRunner.execute(JUnitTestRunner.java:65)
at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:160)
at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:126)
at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:90)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76)
at io.undertow.servlet.handlers.ServletInitialHandler$1$1.run(ServletInitialHandler.java:172)
at java.security.AccessController.doPrivileged(Native Method)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:169)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
// END OF STACK TRACE

My main test script is setup with the following annotations:
@RunWith(ArquillianCucumber.class)
@CucumberOptions(features = "src/features/BidRuleJobProcessor.feature", plugin = {"pretty", "html:target/cucumber-reports",
"junit:target/cucumber-reports/cucumber.xml"}, monochrome = true, strict = true, tags = "~@ignore")

So no glue classes at all, all the code is within the main cucumber test class.

My solution has been to make a modification to CukeSpace's CucumberLifecycle:

  1. A static initialization block for CUCUMBER_ANNOTATIONS:
    static {
    CUCUMBER_ANNOTATIONS.addAll(
    (Collection<? extends Class<? extends Annotation>>) Arrays.asList(Given.class, When.class, Then.class, And.class, But.class, Before.class, After.class));
    }

  2. Commenting out a clear of this same collection in the reset() method:
    public void reset(final @observes AfterClass afterClass) {
    System.setOut(ORIGINAL_OUT);
    // CUCUMBER_ANNOTATIONS.clear();
    TEST_ENRICHERS.clear();
    RESOURCES_LOADERS = null;
    }

So my question is: would there be another way to make it work, rather than forking the project to make this change?

Thx

@rmannibucau
Copy link
Member

One of the goal of the project is to get rid of in container scanning, annotations should have been loaded already in loadCucumberAnnotationsAndEnrichers so scanning shouldnt happen at all in container but on client side (https://github.com/cukespace/cukespace/blob/master/core/src/main/java/cucumber/runtime/arquillian/client/CucumberArchiveProcessor.java#L126).

Can you check loadCucumberAnnotationsAndEnrichers is triggered in container please and the processor scans the annotations (your app needs to be a war and not a jar)?

@AcquisioIchi
Copy link
Author

Actually, my app is deployed as an EAR (Enterprise Archive). Haven't been
able to deploy it as a WebArchive, since I'm deploying a few modules (and
WebArchive doesn't define the method addAsModule()).

While debugging the thing, I did investigate whether or not
loadCucumberAnnotationsAndEnrichers() could help, but it only seems to be
called when my deployment uses "testable = false", and I need it at true to
have a fully operational server.

And even then, this method would load the annotations from a text file,
cukespace-annotations.txt, which isn't really documented anywhere, so I'm
not sure how one would use it.

Le ven. 16 oct. 2015 à 14:06, Romain Manni-Bucau notifications@github.com
a écrit :

One of the goal of the project is to get rid of in container scanning,
annotations should have been loaded already in
loadCucumberAnnotationsAndEnrichers so scanning shouldnt happen at all in
container but on client side (
https://github.com/cukespace/cukespace/blob/master/core/src/main/java/cucumber/runtime/arquillian/client/CucumberArchiveProcessor.java#L126
).

Can you check loadCucumberAnnotationsAndEnrichers is triggered in
container please and the processor scans the annotations (your app needs to
be a war and not a jar)?


Reply to this email directly or view it on GitHub
#63 (comment).

Merci!


Patrick ROBERT

Développeur Java | Acquisio

Courriel : probert@acquisio.com

Suivez-nous :

Twitter : http://twitter.com/acquisio

LinkedIn : http://www.linkedin.com/company/acquisio

Facebook : http://www.facebook.com/acquisio

6300, rue Auteuil, bureau 300

Brossard, QC

J4Z 3P2
Sans frais : 1.866.493.9070 | www.acquisio.com

@rmannibucau
Copy link
Member

This is not documented cause an internal detail. Idea is on client side to list extensions and enrich the server with all annotation list to reload them on server without scanning.

Maybe check your arquillian version 1.1.8.Final is known to work

@AcquisioIchi
Copy link
Author

Using Arquillian 1.1.8.Final for this already.

Le ven. 16 oct. 2015 15:46, Romain Manni-Bucau notifications@github.com a
écrit :

This is not documented cause an internal detail. Idea is on client side to
list extensions and enrich the server with all annotation list to reload
them on server without scanning.

Maybe check your arquillian version 1.1.8.Final is known to work


Reply to this email directly or view it on GitHub
#63 (comment).

Merci!


Patrick ROBERT

Développeur Java | Acquisio

Courriel : probert@acquisio.com

Suivez-nous :

Twitter : http://twitter.com/acquisio

LinkedIn : http://www.linkedin.com/company/acquisio

Facebook : http://www.facebook.com/acquisio

6300, rue Auteuil, bureau 300

Brossard, QC

J4Z 3P2
Sans frais : 1.866.493.9070 | www.acquisio.com

@rmannibucau
Copy link
Member

An you share a project reproducing it? Wonder if it can be linked to wildfly ear classloading

@AcquisioIchi
Copy link
Author

Ok, I'll try to reproduce it in a standalone project and share it to demonstrate the problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants