blob: e0d7940207b35b6fa25ef1d45135cb3ba4d37451 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc., Oracle Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
* Oracle Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.service.importer;
import java.io.Serializable;
import java.util.Dictionary;
import java.util.Hashtable;
import junit.framework.TestCase;
import static org.easymock.EasyMock.*;
import org.eclipse.gemini.blueprint.service.importer.ImportedOsgiServiceProxy;
import org.eclipse.gemini.blueprint.service.importer.support.ImportContextClassLoaderEnum;
import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean;
import org.junit.Ignore;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.springframework.aop.SpringProxy;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.eclipse.gemini.blueprint.mock.MockBundleContext;
import org.eclipse.gemini.blueprint.mock.MockServiceReference;
/**
* @author Adrian Colyer
* @author Hal Hildebrand
* @author Costin Leau
*
*/
public class OsgiSingleServiceProxyFactoryBeanTest extends TestCase {
private OsgiServiceProxyFactoryBean serviceFactoryBean;
private BundleContext bundleContext;
protected void setUp() throws Exception {
super.setUp();
this.serviceFactoryBean = new OsgiServiceProxyFactoryBean();
this.serviceFactoryBean.setBeanClassLoader(getClass().getClassLoader());
this.bundleContext = createMock(BundleContext.class);
}
public void testAfterPropertiesSetNoBundle() throws Exception {
try {
this.serviceFactoryBean.afterPropertiesSet();
fail("should have throw IllegalArgumentException since bundle context was not set");
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testAfterPropertiesSetNoClassLoader() throws Exception {
this.serviceFactoryBean.setBundleContext(this.bundleContext);
try {
this.serviceFactoryBean.afterPropertiesSet();
fail("should have throw IllegalArgumentException since classLoader was not set");
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testAfterPropertiesSetNoServiceType() throws Exception {
this.serviceFactoryBean.setBundleContext(this.bundleContext);
try {
this.serviceFactoryBean.afterPropertiesSet();
fail("should have throw IllegalArgumentException since service type was not set");
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testAfterPropertiesSetBadFilter() throws Exception {
this.serviceFactoryBean.setBundleContext(this.bundleContext);
this.serviceFactoryBean.setInterfaces(new Class<?>[] { ApplicationContext.class });
this.serviceFactoryBean.setFilter("this is not a valid filter expression");
try {
this.serviceFactoryBean.afterPropertiesSet();
fail("should have throw IllegalArgumentException since filter has invalid syntax");
} catch (IllegalArgumentException ex) {
// expected
}
}
public void testGetObjectTypeCompositeInterface() {
this.serviceFactoryBean.setInterfaces(new Class<?>[] { ApplicationContext.class });
this.serviceFactoryBean.setBundleContext(this.bundleContext);
this.serviceFactoryBean.afterPropertiesSet();
assertTrue("composite interface not properly created", ApplicationContext.class
.isAssignableFrom(this.serviceFactoryBean.getObjectType()));
assertTrue("mixing interface not introduced", ImportedOsgiServiceProxy.class
.isAssignableFrom(this.serviceFactoryBean.getObjectType()));
}
// @Ignore("Ignored for spring 3.2.2 as cglib is inlined in spring-core in now.")
// public void testObjectTypeWOCompositeInterface() {
// this.serviceFactoryBean.setInterfaces(new Class<?>[] { AbstractApplicationContext.class });
// this.serviceFactoryBean.setBundleContext(this.bundleContext);
// this.serviceFactoryBean.afterPropertiesSet();
//
// try {
// this.serviceFactoryBean.getObjectType();
// fail("should not be able to create composite interface when a class is specified since CGLIB is not in the classpath");
// } catch (Exception ex) {
//
// }
// }
// OsgiServiceUtils are tested independently in error cases, here we
// test the
// correct behaviour of the ProxyFactoryBean when OsgiServiceUtils
// succesfully
// finds the service.
public void testGetObjectWithFilterOnly() throws Exception {
this.serviceFactoryBean.setBundleContext(new MockBundleContext());
this.serviceFactoryBean.setInterfaces(new Class<?>[] { Serializable.class });
String filter = "(beanName=myBean)";
this.serviceFactoryBean.setFilter(filter);
MockServiceReference ref = new MockServiceReference();
Dictionary dict = new Hashtable();
dict.put(Constants.OBJECTCLASS, new String[] { Serializable.class.getName() });
ref.setProperties(dict);
serviceFactoryBean.setBeanClassLoader(getClass().getClassLoader());
serviceFactoryBean.afterPropertiesSet();
Object proxy = serviceFactoryBean.getObject();
assertTrue(proxy instanceof Serializable);
assertTrue("should be proxied", proxy instanceof SpringProxy);
}
public void testClassLoadingOptionsConstant() throws Exception {
serviceFactoryBean.setImportContextClassLoader(ImportContextClassLoaderEnum.CLIENT);
serviceFactoryBean.setImportContextClassLoader(ImportContextClassLoaderEnum.SERVICE_PROVIDER);
serviceFactoryBean.setImportContextClassLoader(ImportContextClassLoaderEnum.UNMANAGED);
}
public void testNoInterfaceSpecified() throws Exception {
serviceFactoryBean.setBundleContext(new MockBundleContext());
serviceFactoryBean.setInterfaces(null);
serviceFactoryBean.setFilter(null);
serviceFactoryBean.setServiceBeanName("foo");
serviceFactoryBean.afterPropertiesSet();
serviceFactoryBean.getObject();
}
}