blob: 3858d8c304d90f06b63530d2bca216b835c97efc [file] [log] [blame]
/*
* 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.aries.jndi;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.Reference;
import javax.naming.StringRefAddr;
import javax.naming.spi.NamingManager;
import javax.naming.spi.ObjectFactory;
import org.apache.aries.jndi.startup.Activator;
import org.apache.aries.jndi.urls.URLObjectFactoryFinder;
import org.apache.aries.mocks.BundleContextMock;
import org.apache.aries.unittest.mocks.MethodCall;
import org.apache.aries.unittest.mocks.Skeleton;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.service.jndi.JNDIConstants;
public class ObjectFactoryTest
{
private Activator activator;
private BundleContext bc;
private Hashtable<Object,Object> env;
/**
* This method does the setup .
* @throws NoSuchFieldException
* @throws SecurityException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
@Before
public void setup() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
bc = Skeleton.newMock(new BundleContextMock(), BundleContext.class);
activator = new Activator();
activator.start(bc);
env = new Hashtable<Object, Object>();
env.put(JNDIConstants.BUNDLE_CONTEXT, bc);
}
/**
* Make sure we clear the caches out before the next test.
*/
@After
public void teardown()
{
activator.stop(bc);
BundleContextMock.clear();
}
@Test
public void testURLReferenceWithNoMatchingHandler() throws Exception
{
Reference ref = new Reference(null);
ref.add(new StringRefAddr("URL", "wibble"));
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertSame("The naming manager should have returned the reference object", ref, obj);
}
@Test
public void testURLReferenceWithMatchingHandler() throws Exception
{
String testObject = "Test object";
ObjectFactory factory = Skeleton.newMock(ObjectFactory.class);
Skeleton.getSkeleton(factory).setReturnValue(new MethodCall(ObjectFactory.class, "getObjectInstance", Object.class, Name.class, Context.class, Hashtable.class), testObject);
Properties props = new Properties();
props.setProperty("osgi.jndi.urlScheme", "wibble");
bc.registerService(ObjectFactory.class.getName(), factory, (Dictionary) props);
Reference ref = new Reference(null);
ref.add(new StringRefAddr("URL", "wibble"));
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@Test
public void testURLReferenceUsingURLObjectFactoryFinder() throws Exception
{
String testObject = "Test object";
URLObjectFactoryFinder factory = Skeleton.newMock(URLObjectFactoryFinder.class);
Skeleton.getSkeleton(factory).setReturnValue(new MethodCall(ObjectFactory.class, "getObjectInstance", Object.class, Name.class, Context.class, Hashtable.class), testObject);
bc.registerService(URLObjectFactoryFinder.class.getName(), factory, (Dictionary) new Properties());
Reference ref = new Reference(null);
ref.add(new StringRefAddr("URL", "wibble"));
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@Test
public void testReferenceWithNoClassName() throws Exception
{
String testObject = "Test object";
ObjectFactory factory = Skeleton.newMock(ObjectFactory.class);
Skeleton.getSkeleton(factory).setReturnValue(new MethodCall(ObjectFactory.class, "getObjectInstance", Object.class, Name.class, Context.class, Hashtable.class), testObject);
bc.registerService(ObjectFactory.class.getName(), factory, null);
Reference ref = new Reference(null);
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@Test
public void testSpecifiedFactoryWithMatchingFactory() throws Exception
{
String testObject = "Test object";
ObjectFactory factory = Skeleton.newMock(ObjectFactory.class);
Skeleton.getSkeleton(factory).setReturnValue(new MethodCall(ObjectFactory.class, "getObjectInstance", Object.class, Name.class, Context.class, Hashtable.class), testObject);
Reference ref = new Reference("dummy.class.name", factory.getClass().getName(), "");
bc.registerService(new String[] {ObjectFactory.class.getName(), factory.getClass().getName()},
factory, null);
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertEquals("The naming manager should have returned the test object", testObject, obj);
}
@Test
public void testSpecifiedFactoryWithRegisteredButNotMatchingFactory() throws Exception
{
String testObject = "Test object";
ObjectFactory factory = Skeleton.newMock(ObjectFactory.class);
Skeleton.getSkeleton(factory).setReturnValue(new MethodCall(ObjectFactory.class, "getObjectInstance", Object.class, Name.class, Context.class, Hashtable.class), testObject);
Reference ref = new Reference("dummy.class.name", "dummy.factory.class.name", "");
bc.registerService(new String[] {ObjectFactory.class.getName(), factory.getClass().getName()},
factory, null);
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertSame("The naming manager should have returned the reference object", ref, obj);
}
@Test
public void testSpecifiedFactoryWithNoMatchingFactory() throws Exception
{
Reference ref = new Reference("dummy.class.name");
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertSame("The naming manager should have returned the reference object", ref, obj);
}
@Test
public void testFactoriesThatDoUnsafeCastsAreIgnored() throws Exception {
Hashtable<String, Object> props = new Hashtable<String, Object>();
props.put("aries.object.factory.requires.reference", Boolean.TRUE);
bc.registerService(ObjectFactory.class.getName(), new ObjectFactory() {
public Object getObjectInstance(Object arg0, Name arg1, Context arg2, Hashtable<?, ?> arg3)
throws Exception
{
return (Reference)arg0;
}
}, props);
NamingManager.getObjectInstance("Some dummy data", null, null, env);
}
public static class DummyObjectFactory implements ObjectFactory {
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable<?, ?> environment) throws Exception {
// TODO Auto-generated method stub
return new String ("pass");
}
}
@Test
public void testContextDotObjectFactories() throws Exception {
env.put(Context.OBJECT_FACTORIES, "org.apache.aries.jndi.ObjectFactoryTest$DummyObjectFactory");
Reference ref = new Reference("anything");
Object obj = NamingManager.getObjectInstance(ref, null, null, env);
assertTrue (obj instanceof String);
assertEquals ((String)obj, "pass");
env.remove(Context.OBJECT_FACTORIES);
}
}