OPENEJB-2119 test for OPENEJB-2119
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c38e30dc Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c38e30dc Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c38e30dc Branch: refs/heads/tomee-7.0.0-M1 Commit: c38e30dc9ef2bed4360249de7bde89f36638e992 Parents: d617e8b Author: Romain Manni-Bucau <rmann...@gmail.com> Authored: Sun Oct 18 19:11:25 2015 +0200 Committer: Romain Manni-Bucau <rmann...@gmail.com> Committed: Sun Oct 18 19:11:25 2015 +0200 ---------------------------------------------------------------------- .../openejb/core/ivm/naming/NameNode.java | 6 ++ .../openejb/ivm/naming/IvmContextTest.java | 71 ++++++++++++++++++++ 2 files changed, 77 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/c38e30dc/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java index 9c175e7..73f1326 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/NameNode.java @@ -82,6 +82,12 @@ public class NameNode implements Serializable { } catch (final NameNotFoundException e) { n = e; } + } else if (!unbound) { + try { + return IvmContext.class.cast(getBinding()).mynode.resolve(name); + } catch (final NameNotFoundException e) { + n = e; + } } } else if (!unbound) { return getBinding(); http://git-wip-us.apache.org/repos/asf/tomee/blob/c38e30dc/container/openejb-core/src/test/java/org/apache/openejb/ivm/naming/IvmContextTest.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/test/java/org/apache/openejb/ivm/naming/IvmContextTest.java b/container/openejb-core/src/test/java/org/apache/openejb/ivm/naming/IvmContextTest.java index 9322a95..398dc27 100644 --- a/container/openejb-core/src/test/java/org/apache/openejb/ivm/naming/IvmContextTest.java +++ b/container/openejb-core/src/test/java/org/apache/openejb/ivm/naming/IvmContextTest.java @@ -17,17 +17,38 @@ package org.apache.openejb.ivm.naming; import org.apache.openejb.core.ivm.naming.IvmContext; +import org.apache.openejb.core.ivm.naming.NameNode; import org.apache.openejb.util.Contexts; import org.junit.Test; import javax.naming.Context; import javax.naming.NamingException; +import java.lang.reflect.Field; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class IvmContextTest { @Test + public void rebind() throws NamingException { + final IvmContext root = IvmContext.createRootContext(); + root.rebind("global/App.EAR/foo", "test"); + final Context last = Contexts.createSubcontexts(root, "global/App.EAR/foo"); + last.bind("foo", "test"); + + // first ensure all is bound correctly + assertEquals("test", root.lookup("global/App.EAR/foo")); + assertEquals("test", last.lookup("foo")); + + // now rebound, shouldnt throw any exception + final Context lastContext = Contexts.createSubcontexts(root, "global/App.EAR/foo"); + lastContext.rebind("foo", "test2"); + root.rebind("global/App.EAR/foo", "test2"); + assertEquals("test2", root.lookup("global/App.EAR/foo")); + assertEquals("test2", last.lookup("foo")); + } + + @Test public void unbind() throws NamingException { final IvmContext context = new IvmContext(); context.bind("global/foo/Bar", "Bar"); @@ -78,4 +99,54 @@ public class IvmContextTest { // ok } } + + private void check(final NameNode node) { + if (node == null) { + return; + } + + final int atomicHash = getAtomicHash(node); + + checkLess(node, node.getLessTree(), atomicHash); + checkGrtr(node.getGrtrTree(), atomicHash); + + check(node.getLessTree()); + check(node.getGrtrTree()); + } + + private void checkLess(final NameNode reference, final NameNode node, final int hash) { + if (node == null) { + return; + } + + if (getAtomicHash(node) >= hash) { + throw new IllegalStateException(node + " >= " + reference); + } + + checkLess(node, node.getLessTree(), hash); + checkLess(node, node.getGrtrTree(), hash); + } + + private void checkGrtr(final NameNode node, final int hash) { + if (node == null) { + return; + } + + if (getAtomicHash(node) <= hash) { + throw new IllegalStateException(); + } + + checkGrtr(node.getLessTree(), hash); + checkGrtr(node.getGrtrTree(), hash); + } + + private int getAtomicHash(final NameNode node) { + try { + final Field field = NameNode.class.getDeclaredField("atomicHash"); + field.setAccessible(true); + return Integer.class.cast(field.get(node)); + } catch (Exception e) { + throw new AssertionError(); + } + } }