Simplify the test and add test case for listBindings()
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/da488afb Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/da488afb Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/da488afb Branch: refs/heads/master Commit: da488afbd93489a65b483ce1ac35052728f2a9d6 Parents: 52c72b6 Author: Svetlin Zarev <svetlin.za...@sap.com> Authored: Tue Jul 11 10:20:08 2017 +0300 Committer: Svetlin Zarev <svetlin.za...@sap.com> Committed: Tue Jul 11 10:20:08 2017 +0300 ---------------------------------------------------------------------- .../tests/naming/IvmContextServlet.java | 55 ------------------- .../arquillian/tests/naming/IvmContextTest.java | 55 +++---------------- .../arquillian/tests/naming/NamingBean.java | 58 +++++++++++++++++--- 3 files changed, 59 insertions(+), 109 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/da488afb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextServlet.java ---------------------------------------------------------------------- diff --git a/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextServlet.java b/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextServlet.java deleted file mode 100644 index d4db5c8..0000000 --- a/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextServlet.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.openejb.arquillian.tests.naming; - - -import javax.ejb.EJB; -import javax.naming.NamingException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class IvmContextServlet extends HttpServlet { - @EJB - NamingBean namingBean; - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - final PrintWriter writer = resp.getWriter(); - final String testToExecute = req.getParameter("test"); - - try { - final Method method = this.getClass().getDeclaredMethod(testToExecute, PrintWriter.class); - method.invoke(this, writer); - writer.println(testToExecute + "=true"); - } catch (Exception ex) { - final Throwable rootCause = ex instanceof InvocationTargetException ? ex.getCause() : ex; - writer.println(testToExecute + "=false"); - rootCause.printStackTrace(writer); - } - } - - public void testListContextTree(PrintWriter printWriter) throws NamingException { - namingBean.verifyListContext(printWriter); - } -} http://git-wip-us.apache.org/repos/asf/tomee/blob/da488afb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextTest.java ---------------------------------------------------------------------- diff --git a/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextTest.java b/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextTest.java index 5459ac5..a3eef2c 100644 --- a/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextTest.java +++ b/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/IvmContextTest.java @@ -21,22 +21,13 @@ import org.apache.openejb.arquillian.tests.Runner; import org.apache.ziplock.JarLocation; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset; -import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; -import org.jboss.shrinkwrap.descriptor.api.Descriptors; -import org.jboss.shrinkwrap.descriptor.api.webapp30.WebAppDescriptor; -import org.jboss.shrinkwrap.descriptor.api.webcommon30.WebAppVersionType; import org.junit.Test; import org.junit.runner.RunWith; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.logging.Level; +import javax.ejb.EJB; import java.util.logging.Logger; import static org.junit.Assert.assertNotNull; @@ -46,59 +37,31 @@ import static org.junit.Assert.assertTrue; public class IvmContextTest { private static final Logger logger = Logger.getLogger(IvmContextTest.class.getName()); private static final String TEST_NAME = IvmContextTest.class.getSimpleName(); - private static final String SERVLET_NAME = "TestServlet"; private static final String RESOURCE_EJB_JAR_XML = "ejb-jar.xml"; private static final String CONTENT_LOCATION_EJB_JAR_XML = "org/apache/openejb/arquillian/tests/naming/list-context-ejbjar.xml"; - @ArquillianResource - private URL url; + @EJB + NamingBean namingBean; @Deployment(testable = false) public static WebArchive createDeployment() { - WebAppDescriptor descriptor = Descriptors.create(WebAppDescriptor.class) - .version(WebAppVersionType._3_0) - .createServlet() - .servletName(SERVLET_NAME) - .servletClass(IvmContextServlet.class.getName()).up() - .createServletMapping() - .servletName(SERVLET_NAME) - .urlPattern("/" + TEST_NAME).up(); - WebArchive archive = ShrinkWrap.create(WebArchive.class, TEST_NAME + ".war") .addClass(IvmContextTest.class) - .addClass(IvmContextServlet.class) .addClass(NamingBean.class) .addClass(Runner.class) .addAsLibraries(JarLocation.jarLocation(Test.class)) - .addAsWebInfResource(new ClassLoaderAsset(CONTENT_LOCATION_EJB_JAR_XML), RESOURCE_EJB_JAR_XML) - .setWebXML(new StringAsset(descriptor.exportAsString())); - + .addAsWebInfResource(new ClassLoaderAsset(CONTENT_LOCATION_EJB_JAR_XML), RESOURCE_EJB_JAR_XML); return archive; } - private void validateTest(String testName) throws IOException { - final String expectedOutput = testName + "=true"; - - try (InputStream is = new URL(url.toExternalForm() + TEST_NAME + "?test=" + testName).openStream()) { - final ByteArrayOutputStream os = new ByteArrayOutputStream(); - int bytesRead; - byte[] buffer = new byte[8192]; - while ((bytesRead = is.read(buffer)) > -1) { - os.write(buffer, 0, bytesRead); - } - - final String output = new String(os.toByteArray(), "UTF-8"); - logger.log(Level.FINE, output); - - assertNotNull("Response shouldn't be null", output); - assertTrue("Output should contain: " + expectedOutput - + "\nActual output:\n" + output, output.contains(expectedOutput)); - } + @Test + public void testListContextTree() throws Exception { + namingBean.verifyContextList(); } @Test - public void testListContextTree() throws IOException, InterruptedException { - validateTest("testListContextTree"); + public void testContextListBindings() throws Exception { + namingBean.verifyContextListBindings(); } } http://git-wip-us.apache.org/repos/asf/tomee/blob/da488afb/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/NamingBean.java ---------------------------------------------------------------------- diff --git a/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/NamingBean.java b/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/NamingBean.java index 9a7daf2..abf2d8d 100644 --- a/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/NamingBean.java +++ b/arquillian/arquillian-tomee-tests/arquillian-tomee-webprofile-tests/src/test/java/org/apache/openejb/arquillian/tests/naming/NamingBean.java @@ -17,43 +17,80 @@ package org.apache.openejb.arquillian.tests.naming; +import org.apache.openejb.core.interceptor.Interceptor; import org.apache.openejb.core.ivm.naming.SystemComponentReference; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.naming.*; +import java.io.ByteArrayOutputStream; import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @Stateless @LocalBean public class NamingBean { + private interface ListOperation { + NamingEnumeration<? extends NameClassPair> execute(Context context, String address) throws NamingException; + } + + public void verifyContextList() throws NamingException { + verifyContextListInternal(new ListOperation() { + @Override + public NamingEnumeration<NameClassPair> execute(Context context, String address) throws NamingException { + return context.list(address); + } + }); + } + + public void verifyContextListBindings() throws NamingException { + verifyContextListInternal(new ListOperation() { + @Override + public NamingEnumeration<Binding> execute(Context context, String address) throws NamingException { + return context.listBindings(address); + } + }); + } + + private void verifyContextListInternal(ListOperation listOperation) throws NamingException { + final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + final PrintWriter logSink = new PrintWriter(buffer); - public void verifyListContext(PrintWriter out) throws NamingException { final InitialContext ctx = new InitialContext(); - final boolean hasErrors = listContext(ctx, "", out); + final boolean hasErrors = listContext(ctx, "", listOperation, logSink); + logSink.flush(); if (hasErrors) { - throw new IllegalStateException("Failed to lookup some of the listed entries"); + throw new IllegalStateException("Failed to lookup some of the listed entries:\n" + getPrintedJndiTree(buffer)); + } + } + + private String getPrintedJndiTree(ByteArrayOutputStream buffer) { + try { + return buffer.toString("utf-8"); + } catch (UnsupportedEncodingException e) { + return null; //should never happen } } /* * Verifies TOMEE-2087: context.list()/listBindings() * returns more entries than it should. The false positives - * cannot be looked up, so try to list the context and look - * up every name-class pair. If the lookup fails, then list() + * cannot be looked up, so try to execute the context and look + * up every name-class pair. If the lookup fails, then execute() * returns incorrect results. */ - public static boolean listContext(Context context, String ctxName, PrintWriter writer) throws javax.naming.NamingException { + private static boolean listContext(Context context, String ctxName, ListOperation listOperation, PrintWriter writer) throws javax.naming.NamingException { writer.println("\n### Context: " + ctxName); boolean hasErrors = false; final Map<Context, String> subContexts = new HashMap<>(); final String namespace = context instanceof InitialContext ? "java:" : ""; - final NamingEnumeration<NameClassPair> content = context.list(namespace); + final NamingEnumeration<? extends NameClassPair> content = listOperation.execute(context, namespace); while (content.hasMoreElements()) { final NameClassPair nameClassPair = content.nextElement(); final String name = nameClassPair.getName(); @@ -63,6 +100,11 @@ public class NamingBean { writer.print("\tClass=" + className); writer.print("\t[looking up: " + (namespace + name) + "]"); + /* + * Skip the SystemComponentReference because they might internally + * throw NameNotFoundException althoug being correctly bound to the + * provided name. + */ if (!SystemComponentReference.class.getName().equals(className)) { try { final Object object = context.lookup(namespace + name); @@ -86,7 +128,7 @@ public class NamingBean { writer.println(); for (Context subContext : subContexts.keySet()) { - hasErrors |= listContext(subContext, subContexts.get(subContext), writer); + hasErrors |= listContext(subContext, subContexts.get(subContext), listOperation, writer); } return hasErrors;