/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.naming;
import org.junit.After;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import javax.naming.Binding;
import javax.naming.CompositeName;
import javax.naming.Context;
import javax.naming.InvalidNameException;
import javax.naming.Name;
import javax.naming.NameClassPair;
import javax.naming.NameNotFoundException;
import javax.naming.Reference;
import javax.naming.spi.ResolveResult;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* @author John E. Bailey
*/
public class InMemoryNamingStoreTestCase {
private final InMemoryNamingStore nameStore = new InMemoryNamingStore();
@After
public void cleanup() throws Exception {
nameStore.close();
}
@Test
public void testBindEmptyName() throws Exception {
try {
nameStore.bind(new CompositeName(), new Object(), Object.class);
fail("Should have thrown and InvalidNameException");
} catch(InvalidNameException expected){}
try {
nameStore.bind(new CompositeName(""), new Object(), Object.class);
fail("Should have thrown and InvalidNameException");
} catch(InvalidNameException expected){}
}
@Test
public void testBindAndLookup() throws Exception {
final Name name = new CompositeName("test");
final Object object = new Object();
nameStore.bind(name, object, Object.class);
final Object result = nameStore.lookup(name);
assertEquals(object, result);
}
@Test
public void testLookupNameNotFound() throws Exception {
try {
nameStore.lookup(new CompositeName("test"));
fail("Should have thrown and NameNotFoundException");
} catch(NameNotFoundException expected) {}
}
@Test
public void testLookupEmptyName() throws Exception {
Object result = nameStore.lookup(new CompositeName());
assertTrue(result instanceof NamingContext);
result = nameStore.lookup(new CompositeName(""));
assertTrue(result instanceof NamingContext);
}
@Test
public void testBindAndLookupResolveResult() throws Exception {
final Name name = new CompositeName("test");
final Reference reference = new Reference(Context.class.getName());
nameStore.bind(name, reference, Context.class);
final Object result = nameStore.lookup(new CompositeName("test/value"));
assertTrue(result instanceof ResolveResult);
}
@Test
public void testUnbindNotFound() throws Exception {
try {
nameStore.unbind(new CompositeName("test"));
fail("Should have thrown and NameNotFoundException");
} catch(NameNotFoundException expected) {}
}
@Test
public void testBindUnbindLookup() throws Exception {
final Name name = new CompositeName("test");
final Object object = new Object();
nameStore.bind(name, object, Object.class);
final Object result = nameStore.lookup(name);
assertEquals(object, result);
nameStore.unbind(name);
try {
nameStore.lookup(name);
fail("Should have thrown and NameNotFoundException");
} catch(NameNotFoundException expected) {}
}
@Test
public void testRebindEmptyName() throws Exception {
try {
nameStore.rebind(new CompositeName(), new Object(), Object.class);
fail("Should have thrown and InvalidNameException");
} catch(InvalidNameException expected){}
try {
nameStore.rebind(new CompositeName(""), new Object(), Object.class);
fail("Should have thrown and InvalidNameException");
} catch(InvalidNameException expected){}
}
@Test
public void testRebindInvalidContext() throws Exception {
try {
nameStore.rebind(new CompositeName("subcontext/test"), new Object(), Object.class);
fail("Should have thrown and NameNotFoundException");
} catch(NameNotFoundException expected){}
}
@Test
public void testRebindAndLookup() throws Exception {
final Name name = new CompositeName("test");
final Object object = new Object();
nameStore.rebind(name, object, Object.class);
final Object result = nameStore.lookup(name);
assertEquals(object, result);
}
@Test
public void testBindAndRebind() throws Exception {
final Name name = new CompositeName("test");
final Object object = new Object();
nameStore.bind(name, object, Object.class);
assertEquals(object, nameStore.lookup(name));
final Object objectTwo = new Object();
nameStore.rebind(name, objectTwo, Object.class);
assertEquals(objectTwo, nameStore.lookup(name));
}
@Test
public void testListNameNotFound() throws Exception {
try {
nameStore.list(new CompositeName("test"));
fail("Should have thrown and NameNotFoundException");
} catch(NameNotFoundException expected) {}
}
@Test
public void testList() throws Exception {
final Name name = new CompositeName("test");
final Object object = new Object();
nameStore.bind(name, object, Object.class);
final Name nameTwo = new CompositeName("testTwo");
final Object objectTwo = new Object();
nameStore.bind(nameTwo, objectTwo, Object.class);
final Name nameThree = new CompositeName("testThree");
final Object objectThree = new Object();
nameStore.bind(nameThree, objectThree, Object.class);
nameStore.bind(new CompositeName("testContext/test"), "test");
final List<NameClassPair> results = nameStore.list(new CompositeName());
assertEquals(4, results.size());
final Set<String> expected = new HashSet<String>(Arrays.asList("test", "testTwo", "testThree", "testContext"));
for(NameClassPair result : results) {
final String resultName = result.getName();
if("test".equals(resultName) || "testTwo".equals(resultName) || "testThree".equals(resultName)) {
assertEquals(Object.class.getName(), result.getClassName());
} else if("testContext".equals(resultName)) {
assertEquals(Context.class.getName(), result.getClassName());
} else {
fail("Unknown result name: " + resultName);
}
expected.remove(resultName);
}
assertTrue("Not all expected results were returned", expected.isEmpty());
}
@Test
public void testListBindingsNameNotFound() throws Exception {
try {
nameStore.listBindings(new CompositeName("test"));
fail("Should have thrown and NameNotFoundException");
} catch(NameNotFoundException expected) {}
}
@Test
public void testListBindings() throws Exception {
final Name name = new CompositeName("test");
final Object object = new Object();
nameStore.bind(name, object);
final Name nameTwo = new CompositeName("testTwo");
final Object objectTwo = new Object();
nameStore.bind(nameTwo, objectTwo);
final Name nameThree = new CompositeName("testThree");
final Object objectThree = new Object();
nameStore.bind(nameThree, objectThree);
nameStore.bind(new CompositeName("testContext/test"), "test");
final List<Binding> results = nameStore.listBindings(new CompositeName());
assertEquals(4, results.size());
final Set<String> expected = new HashSet<String>(Arrays.asList("test", "testTwo", "testThree", "testContext"));
for(Binding result : results) {
final String resultName = result.getName();
if("test".equals(resultName)) {
assertEquals(Object.class.getName(), result.getClassName());
assertEquals(object, result.getObject());
} else if("testTwo".equals(resultName)) {
assertEquals(Object.class.getName(), result.getClassName());
assertEquals(objectTwo, result.getObject());
} else if("testThree".equals(resultName)) {
assertEquals(Object.class.getName(), result.getClassName());
assertEquals(objectThree, result.getObject());
} else if("testContext".equals(resultName)) {
assertEquals(Context.class.getName(), result.getClassName());
} else {
fail("Unknown result name: " + resultName);
}
expected.remove(resultName);
}
assertTrue("Not all expected results were returned", expected.isEmpty());
}
@Test
public void testAutoRemove() throws Exception {
nameStore.bind(new CompositeName("test/item"), new Object());
assertNotNull(nameStore.lookup(new CompositeName("test/item")));
assertNotNull(nameStore.lookup(new CompositeName("test")));
nameStore.unbind(new CompositeName("test/item"));
try {
nameStore.lookup(new CompositeName("test"));
fail("Should have throw name not found exception");
} catch (NameNotFoundException expected){}
}
}