/******************************************************************************
* Copyright (c) 2006, 2010 VMware 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.
*****************************************************************************/
package org.eclipse.gemini.blueprint.config;
import java.io.Externalizable;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import junit.framework.TestCase;
import org.eclipse.gemini.blueprint.TestUtils;
import org.eclipse.gemini.blueprint.context.support.BundleContextAwareProcessor;
import org.eclipse.gemini.blueprint.service.importer.OsgiServiceLifecycleListener;
import org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceCollectionProxyFactoryBean;
import org.eclipse.gemini.blueprint.service.importer.support.internal.collection.OsgiServiceList;
import org.eclipse.gemini.blueprint.service.importer.support.internal.collection.OsgiServiceSet;
import org.eclipse.gemini.blueprint.service.importer.support.internal.collection.OsgiServiceSortedList;
import org.eclipse.gemini.blueprint.service.importer.support.internal.collection.OsgiServiceSortedSet;
import org.eclipse.gemini.blueprint.service.importer.support.internal.util.ServiceReferenceComparator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.eclipse.gemini.blueprint.mock.MockBundleContext;
/**
* @author Costin Leau
*
*/
public class OsgiReferenceCollectionNamespaceHandlerTest extends TestCase {
private GenericApplicationContext appContext;
protected void setUp() throws Exception {
// reset counter just to be sure
DummyListener.BIND_CALLS = 0;
DummyListener.UNBIND_CALLS = 0;
DummyListenerServiceSignature.BIND_CALLS = 0;
DummyListenerServiceSignature.UNBIND_CALLS = 0;
DummyListenerServiceSignature2.BIND_CALLS = 0;
DummyListenerServiceSignature2.UNBIND_CALLS = 0;
BundleContext bundleContext = new MockBundleContext() {
// service reference already registered
public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
return new ServiceReference[0];
}
};
appContext = new GenericApplicationContext();
appContext.getBeanFactory().addBeanPostProcessor(new BundleContextAwareProcessor(bundleContext));
appContext.setClassLoader(getClass().getClassLoader());
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext);
// reader.setEventListener(this.listener);
reader.loadBeanDefinitions(new ClassPathResource("osgiReferenceCollectionNamespaceHandlerTests.xml", getClass()));
appContext.refresh();
}
protected void tearDown() throws Exception {
appContext.close();
}
public void testSimpleList() {
Object factoryBean = appContext.getBean("&simpleList");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
// get the factory product
Object bean = appContext.getBean("simpleList");
assertFalse(bean instanceof OsgiServiceList);
assertTrue(bean instanceof List);
}
public void testSimpleSet() {
Object factoryBean = appContext.getBean("&simpleSet");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
// get the factory product
Object bean = appContext.getBean("simpleSet");
assertFalse(bean instanceof OsgiServiceSet);
assertTrue(bean instanceof Set);
}
public void testSimpleListWithGreedyProxyingOn() throws Exception {
Object factoryBean = appContext.getBean("&simpleListWithGreedyProxying");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
assertEquals(Boolean.TRUE, (Boolean) TestUtils.getFieldValue(factoryBean, "greedyProxying"));
// get the factory product
Object bean = appContext.getBean("simpleListWithGreedyProxying");
assertFalse(bean instanceof OsgiServiceList);
assertTrue(bean instanceof List);
}
public void testSimpleListWithDefaultProxying() throws Exception {
Object factoryBean = appContext.getBean("&simpleSet");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
assertEquals(Boolean.FALSE, (Boolean) TestUtils.getFieldValue(factoryBean, "greedyProxying"));
}
public void testImplicitSortedList() {
Object factoryBean = appContext.getBean("&implicitSortedList");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
// get the factory product
Object bean = appContext.getBean("implicitSortedList");
assertFalse(bean instanceof OsgiServiceSortedList);
assertTrue(bean instanceof List);
OsgiServiceSortedList exposedProxy = (OsgiServiceSortedList) TestUtils.getFieldValue(factoryBean,
"exposedProxy");
assertSame(appContext.getBean("defaultComparator"), exposedProxy.comparator());
}
public void testImplicitSortedSet() {
Object factoryBean = appContext.getBean("&implicitSortedSet");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
Object bean = appContext.getBean("implicitSortedSet");
assertFalse(bean instanceof OsgiServiceSortedSet);
assertTrue(bean instanceof SortedSet);
assertSame(appContext.getBean("defaultComparator"), ((SortedSet) bean).comparator());
}
public void testSimpleSortedList() {
Object factoryBean = appContext.getBean("&implicitSortedList");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
Object bean = appContext.getBean("implicitSortedList");
assertFalse(bean instanceof OsgiServiceSortedList);
assertTrue(bean instanceof List);
Class<?>[] intfs = getInterfaces(factoryBean);
assertTrue(Arrays.equals(new Class<?>[] { Serializable.class }, intfs));
}
public void testSimpleSortedSet() {
Object factoryBean = appContext.getBean("&implicitSortedSet");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
Object bean = appContext.getBean("implicitSortedSet");
assertFalse(bean instanceof OsgiServiceSortedSet);
assertTrue(bean instanceof SortedSet);
Class<?>[] intfs = getInterfaces(factoryBean);
assertTrue(Arrays.equals(new Class<?>[] { Externalizable.class }, intfs));
}
public void testSortedSetWithNaturalOrderingOnRefs() throws Exception {
Object factoryBean = appContext.getBean("&sortedSetWithNaturalOrderingOnRefs");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
Comparator comp = getComparator(factoryBean);
assertNotNull(comp);
assertSame(ServiceReferenceComparator.class, comp.getClass());
Class<?>[] intfs = getInterfaces(factoryBean);
assertTrue(Arrays.equals(new Class<?>[] { Externalizable.class }, intfs));
OsgiServiceLifecycleListener[] listeners = getListeners(factoryBean);
assertEquals(2, listeners.length);
Object bean = appContext.getBean("sortedSetWithNaturalOrderingOnRefs");
assertFalse(bean instanceof OsgiServiceSortedSet);
assertTrue(bean instanceof SortedSet);
}
public void testSortedListWithNaturalOrderingOnServs() throws Exception {
Object factoryBean = appContext.getBean("&sortedListWithNaturalOrderingOnServs");
assertTrue(factoryBean instanceof OsgiServiceCollectionProxyFactoryBean);
assertNull(getComparator(factoryBean));
Object bean = appContext.getBean("sortedListWithNaturalOrderingOnServs");
assertFalse(bean instanceof OsgiServiceSortedList);
assertTrue(bean instanceof List);
Class<?>[] intfs = getInterfaces(factoryBean);
assertTrue(Arrays.equals(new Class<?>[] { Externalizable.class }, intfs));
}
private Class<?>[] getInterfaces(Object proxy) {
return (Class[]) TestUtils.getFieldValue(proxy, "interfaces");
}
private Comparator getComparator(Object proxy) {
return (Comparator) TestUtils.getFieldValue(proxy, "comparator");
}
private OsgiServiceLifecycleListener[] getListeners(Object proxy) {
return (OsgiServiceLifecycleListener[]) TestUtils.getFieldValue(proxy, "listeners");
}
}