/****************************************************************************** | |
* 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.internal; | |
import java.io.IOException; | |
import java.util.ArrayList; | |
import java.util.Collections; | |
import java.util.Dictionary; | |
import java.util.List; | |
import java.util.Map; | |
import junit.framework.TestCase; | |
import static org.easymock.EasyMock.*; | |
import org.eclipse.gemini.blueprint.config.internal.adapter.OsgiServiceRegistrationListenerAdapter; | |
import org.eclipse.gemini.blueprint.service.exporter.OsgiServiceRegistrationListener; | |
import org.eclipse.gemini.blueprint.util.internal.MapBasedDictionary; | |
import org.osgi.framework.Bundle; | |
import org.osgi.framework.ServiceFactory; | |
import org.osgi.framework.ServiceRegistration; | |
import org.springframework.beans.factory.BeanFactory; | |
/** | |
* @author Costin Leau | |
* | |
*/ | |
public class OsgiServiceRegistrationListenerAdapterTest extends TestCase { | |
protected static class JustListener implements OsgiServiceRegistrationListener { | |
public static int REG_CALLS = 0; | |
public static int UNREG_CALLS = 0; | |
public void registered(Object service, Map serviceProperties) throws Exception { | |
REG_CALLS++; | |
} | |
public void unregistered(Object service, Map serviceProperties) throws Exception { | |
UNREG_CALLS++; | |
} | |
} | |
protected static class CustomListener { | |
public static int REG_CALLS = 0; | |
public static int UNREG_CALLS = 0; | |
public static List REG_PROPS = new ArrayList(); | |
public static List UNREG_PROPS = new ArrayList(); | |
public void myReg(Object service, Map properties) throws Exception { | |
REG_CALLS++; | |
REG_PROPS.add(properties); | |
} | |
public void myUnreg(Object service, Map properties) throws Exception { | |
UNREG_CALLS++; | |
UNREG_PROPS.add(properties); | |
} | |
public void wrongReg() { | |
REG_CALLS++; | |
} | |
public void wrongUnreg() { | |
UNREG_CALLS--; | |
} | |
} | |
protected static class CustomAndListener extends JustListener { | |
public Integer aReg(Object service, Map props) throws Exception { | |
super.registered(service, props); | |
return null; | |
} | |
public void aUnreg(Object service, Map props) throws Exception { | |
super.unregistered(service, props); | |
} | |
} | |
/** | |
* Override standard methods with ones that throw exceptions. | |
* | |
* @author Costin Leau | |
* | |
*/ | |
protected static class ExceptionListener extends CustomAndListener { | |
public void registered(Object service, Map properties) throws Exception { | |
throw new Exception("expected!") { | |
public synchronized Throwable fillInStackTrace() { | |
return null; | |
} | |
}; | |
} | |
public void unregistered(Object service, Map properties) throws Exception { | |
throw new Exception("expected!") { | |
public synchronized Throwable fillInStackTrace() { | |
return null; | |
} | |
}; | |
} | |
} | |
protected static class ExceptionCustomListener extends CustomListener { | |
public void myReg(Map properties) { | |
REG_CALLS++; | |
throw (RuntimeException) new RuntimeException("expected!") { | |
public synchronized Throwable fillInStackTrace() { | |
return null; | |
} | |
}; | |
} | |
public void myUnreg(Map properties) throws IOException { | |
UNREG_CALLS++; | |
throw new IOException("expected!") { | |
public synchronized Throwable fillInStackTrace() { | |
return null; | |
} | |
}; | |
} | |
} | |
protected static class DictionaryAndMapCustomListener { | |
public void registered(Object service, Dictionary properties) { | |
JustListener.REG_CALLS++; | |
} | |
public void unregistered(Object service, Map props) { | |
JustListener.UNREG_CALLS++; | |
} | |
public void unregistered(Object service, Dictionary props) throws Exception { | |
JustListener.UNREG_CALLS++; | |
} | |
} | |
protected static class JustReg { | |
private void myReg(Object service, Map properties) { | |
JustListener.REG_CALLS++; | |
} | |
} | |
protected static class JustUnreg { | |
protected void myUnreg(Object service, Map properties) { | |
JustListener.UNREG_CALLS++; | |
} | |
} | |
protected static class ServiceFactoryListener { | |
public static int REG_CALLS = 0; | |
public static int UNREG_CALLS = 0; | |
public void registered(ServiceFactory service, Map serviceProperties) throws Exception { | |
ServiceFactoryListener.REG_CALLS++; | |
} | |
public void unregistered(ServiceFactory service, Map serviceProperties) throws Exception { | |
ServiceFactoryListener.UNREG_CALLS++; | |
} | |
} | |
protected static class ExtServiceFactoryListener extends ServiceFactoryListener { | |
public void registered(ExtendedServiceFactory service, Map serviceProperties) { | |
ServiceFactoryListener.REG_CALLS++; | |
} | |
public void unregistered(ExtendedServiceFactory service, Map serviceProperties) { | |
ServiceFactoryListener.UNREG_CALLS++; | |
} | |
} | |
protected static interface ExtendedServiceFactory extends ServiceFactory { | |
} | |
private OsgiServiceRegistrationListenerAdapter listener; | |
private Map props; | |
private static final String BEAN_NAME = "bla"; | |
protected void setUp() throws Exception { | |
JustListener.REG_CALLS = 0; | |
JustListener.UNREG_CALLS = 0; | |
CustomListener.REG_CALLS = 0; | |
CustomListener.UNREG_CALLS = 0; | |
ServiceFactoryListener.REG_CALLS = 0; | |
ServiceFactoryListener.UNREG_CALLS = 0; | |
CustomListener.REG_PROPS = new ArrayList(); | |
CustomListener.UNREG_PROPS = new ArrayList(); | |
props = new MapBasedDictionary(0); | |
} | |
protected void tearDown() throws Exception { | |
listener = null; | |
CustomListener.REG_PROPS = null; | |
CustomListener.UNREG_PROPS = null; | |
props = null; | |
} | |
public void testWrapperOverListener() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new JustListener()); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, JustListener.REG_CALLS); | |
listener.registered(service, props); | |
assertEquals(1, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(2, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(1, JustListener.UNREG_CALLS); | |
assertEquals(2, JustListener.REG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(2, JustListener.UNREG_CALLS); | |
assertEquals(2, JustListener.REG_CALLS); | |
} | |
public void testWrapperOverNoInvalidClass() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new Object()); | |
try { | |
listener.afterPropertiesSet(); | |
fail("should have thrown exception"); | |
} catch (IllegalArgumentException ex) { | |
// expected | |
} | |
} | |
public void testWrapperWithIncorrectCustomMethodNames() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new Object()); | |
listener.setRegistrationMethod("pop"); | |
listener.setUnregistrationMethod("corn"); | |
try { | |
listener.afterPropertiesSet(); | |
fail("should have thrown exception"); | |
} catch (IllegalArgumentException ex) { | |
// expected | |
} | |
} | |
public void testWrapperWithCorrectCustomMethodNamesButIncorrectArgumentTypes() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new CustomListener()); | |
listener.setRegistrationMethod("wrongReg"); | |
listener.setUnregistrationMethod("wrongUnreg"); | |
assertEquals(0, CustomListener.REG_CALLS); | |
assertEquals(0, CustomListener.UNREG_CALLS); | |
try { | |
listener.afterPropertiesSet(); | |
fail("should have thrown exception"); | |
} catch (IllegalArgumentException ex) { | |
// expected | |
} | |
assertEquals(0, CustomListener.REG_CALLS); | |
assertEquals(0, CustomListener.UNREG_CALLS); | |
} | |
public void testWrapperWithCustomMethods() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new CustomListener()); | |
listener.setRegistrationMethod("myReg"); | |
listener.setUnregistrationMethod("myUnreg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Map props = Collections.EMPTY_MAP; | |
assertEquals(0, CustomListener.REG_CALLS); | |
assertEquals(0, CustomListener.UNREG_CALLS); | |
Object service = new Object(); | |
listener.registered(service, props); | |
assertEquals(1, CustomListener.REG_CALLS); | |
assertEquals(0, CustomListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(2, CustomListener.REG_CALLS); | |
assertEquals(0, CustomListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(2, CustomListener.REG_CALLS); | |
assertEquals(1, CustomListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(2, CustomListener.REG_CALLS); | |
assertEquals(2, CustomListener.UNREG_CALLS); | |
} | |
public void testWrapperWithCustomMethodsAndNullProperties() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new CustomListener()); | |
listener.setRegistrationMethod("myReg"); | |
listener.setUnregistrationMethod("myUnreg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, CustomListener.REG_CALLS); | |
assertEquals(0, CustomListener.UNREG_CALLS); | |
listener.registered(service, null); | |
assertEquals("null properties allowed", 1, CustomListener.REG_CALLS); | |
listener.unregistered(service, null); | |
assertEquals("null properties allowed", 1, CustomListener.UNREG_CALLS); | |
} | |
public void testWrapperWithBothCustomAndInterfaceMethods() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new CustomAndListener()); | |
listener.setRegistrationMethod("aReg"); | |
listener.setUnregistrationMethod("aUnreg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, CustomAndListener.REG_CALLS); | |
assertEquals(0, CustomAndListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(2, CustomAndListener.REG_CALLS); | |
assertEquals(0, CustomAndListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(2, CustomAndListener.REG_CALLS); | |
assertEquals(2, CustomAndListener.UNREG_CALLS); | |
} | |
public void testExceptionOnListenerMethod() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new ExceptionListener()); | |
listener.setRegistrationMethod("aReg"); | |
listener.setUnregistrationMethod("aUnreg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(1, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(1, JustListener.REG_CALLS); | |
assertEquals(1, JustListener.UNREG_CALLS); | |
} | |
public void testExceptionOnCustomMethods() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new ExceptionCustomListener()); | |
listener.setRegistrationMethod("myReg"); | |
listener.setUnregistrationMethod("myUnreg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, ExceptionCustomListener.REG_CALLS); | |
assertEquals(0, ExceptionCustomListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(1, ExceptionCustomListener.REG_CALLS); | |
assertEquals(0, ExceptionCustomListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(1, ExceptionCustomListener.REG_CALLS); | |
assertEquals(1, ExceptionCustomListener.UNREG_CALLS); | |
} | |
public void testStandardListenerWithListeningMethodsSpecifiedAsCustomOnes() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new JustListener()); | |
listener.setRegistrationMethod("registered"); | |
listener.setUnregistrationMethod("unregistered"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, JustListener.REG_CALLS); | |
listener.registered(service, props); | |
// only the interface is being called since the service is null | |
assertEquals(2, JustListener.REG_CALLS); | |
listener.registered(service, props); | |
assertEquals(4, JustListener.REG_CALLS); | |
} | |
public void testListenerWithOverloadedTypesAndMultipleParameterTypes() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new DictionaryAndMapCustomListener()); | |
listener.setRegistrationMethod("registered"); | |
listener.setUnregistrationMethod("unregistered"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(1, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(1, JustListener.REG_CALLS); | |
assertEquals("only one unregistered method should be called", 1, JustListener.UNREG_CALLS); | |
} | |
public void testJustCustomRegMethod() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new JustReg()); | |
listener.setRegistrationMethod("myReg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.registered(service, props); | |
assertEquals(1, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
} | |
public void testJustCustomUnregMethod() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new JustUnreg()); | |
listener.setUnregistrationMethod("myUnreg"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, JustListener.REG_CALLS); | |
assertEquals(0, JustListener.UNREG_CALLS); | |
listener.unregistered(service, props); | |
assertEquals(0, JustListener.REG_CALLS); | |
assertEquals(1, JustListener.UNREG_CALLS); | |
} | |
public void testServiceFactoryListener() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new ServiceFactoryListener()); | |
listener.setRegistrationMethod("registered"); | |
listener.setUnregistrationMethod("unregistered"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, ServiceFactoryListener.REG_CALLS); | |
assertEquals(0, ServiceFactoryListener.UNREG_CALLS); | |
listener.registered(service, props); | |
listener.unregistered(service, props); | |
assertEquals(0, ServiceFactoryListener.REG_CALLS); | |
assertEquals(0, ServiceFactoryListener.UNREG_CALLS); | |
ServiceFactory factory = new MockServiceFactory(); | |
listener.registered(factory, props); | |
listener.unregistered(factory, props); | |
assertEquals(1, ServiceFactoryListener.REG_CALLS); | |
assertEquals(1, ServiceFactoryListener.UNREG_CALLS); | |
} | |
public void testExtServiceFactoryListener() throws Exception { | |
listener = new OsgiServiceRegistrationListenerAdapter(); | |
listener.setTarget(new ExtServiceFactoryListener()); | |
listener.setRegistrationMethod("registered"); | |
listener.setUnregistrationMethod("unregistered"); | |
listener.setBeanFactory(createMockBF()); | |
listener.afterPropertiesSet(); | |
Object service = new Object(); | |
assertEquals(0, ServiceFactoryListener.REG_CALLS); | |
assertEquals(0, ServiceFactoryListener.UNREG_CALLS); | |
listener.registered(service, props); | |
listener.unregistered(service, props); | |
assertEquals(0, ServiceFactoryListener.REG_CALLS); | |
assertEquals(0, ServiceFactoryListener.UNREG_CALLS); | |
ServiceFactory factory = new MockServiceFactory(); | |
listener.registered(factory, props); | |
listener.unregistered(factory, props); | |
assertEquals(1, ServiceFactoryListener.REG_CALLS); | |
assertEquals(1, ServiceFactoryListener.UNREG_CALLS); | |
ServiceFactory extFactory = new MockExtendedServiceFactory(); | |
listener.registered(extFactory, props); | |
listener.unregistered(extFactory, props); | |
assertEquals(3, ServiceFactoryListener.REG_CALLS); | |
assertEquals(3, ServiceFactoryListener.UNREG_CALLS); | |
} | |
private BeanFactory createMockBF() { | |
BeanFactory cbf = createNiceMock(BeanFactory.class); | |
// ctrl.expectAndReturn(cbf.getBean(BEAN_NAME), target); | |
// ctrl.expectAndReturn(cbf.getType(BEAN_NAME), target.getClass()); | |
replay(cbf); | |
return cbf; | |
} | |
private class MockServiceFactory implements ServiceFactory { | |
public Object getService(Bundle bundle, ServiceRegistration registration) { | |
return null; | |
} | |
public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) { | |
} | |
} | |
private class MockExtendedServiceFactory extends MockServiceFactory implements ExtendedServiceFactory { | |
} | |
} |