blob: 2f01f4b3b4ec31d03d59990bc7dfe248e28b8c30 [file] [log] [blame]
/******************************************************************************
* 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.compendium.config;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
import junit.framework.TestCase;
import static org.easymock.EasyMock.*;
import org.easymock.IMocksControl;
import org.eclipse.gemini.blueprint.context.support.BundleContextAwareProcessor;
import org.eclipse.gemini.blueprint.service.exporter.support.ServicePropertiesChangeEvent;
import org.eclipse.gemini.blueprint.service.exporter.support.ServicePropertiesChangeListener;
import org.eclipse.gemini.blueprint.service.exporter.support.ServicePropertiesListenerManager;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ManagedService;
import org.springframework.beans.factory.config.BeanDefinition;
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 ConfigPropertiesHandlerTest extends TestCase {
private GenericApplicationContext appContext;
private BundleContext bundleContext;
private IMocksControl adminControl;
private ConfigurationAdmin admin;
private Dictionary<String, String> config;
private String persistentId = "foo.bar";
private Configuration cfg;
private ManagedService msCallback;
protected void setUp() throws Exception {
adminControl = createControl();
admin = adminControl.createMock(ConfigurationAdmin.class);
cfg = createMock(Configuration.class);
config = new Hashtable<String, String>();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
expect(cfg.getProperties()).andReturn(config).atLeastOnce();
adminControl.replay();
replay(cfg);
bundleContext = new MockBundleContext() {
// add Configuration admin support
@Override
public Object getService(ServiceReference reference) {
return admin;
}
// ManagedService registration
@Override
public ServiceRegistration registerService(String clazz, Object service, Dictionary properties) {
// save the callback
if (ManagedService.class.getName().equals(clazz)) {
msCallback = (ManagedService) service;
}
return super.registerService(clazz, service, properties);
}
};
appContext = new GenericApplicationContext();
appContext.getBeanFactory().addBeanPostProcessor(new BundleContextAwareProcessor(bundleContext));
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext);
// reader.setEventListener(this.listener);
reader.loadBeanDefinitions(new ClassPathResource("configProperties.xml", getClass()));
appContext.refresh();
}
protected void tearDown() throws Exception {
adminControl.verify();
}
public void testPropertiesLazyInit() throws Exception {
adminControl.reset();
adminControl.replay();
}
public void testBlankConfigProperties() throws Exception {
config.put("Spring", "Source");
Object bean = appContext.getBean("named");
assertTrue(bean instanceof Properties);
assertEquals(config, bean);
}
public void testPropertiesWithDefaultsAndNoOverride() throws Exception {
persistentId = "noLocalOverride";
adminControl.reset();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
adminControl.replay();
config.put("foo", "foo");
config.put("Spring", "Source");
Object bean = appContext.getBean(persistentId);
assertTrue(bean instanceof Properties);
Properties props = (Properties) bean;
assertFalse(config.equals(bean));
// the local property has been replaced
assertEquals("foo", props.getProperty("foo"));
// but the one not present on the CM are still present
assertTrue(props.containsKey("kry"));
assertTrue(props.containsKey("Spring"));
assertEquals(3, props.entrySet().size());
}
public void testPropertiesWithDefaultsAndOverride() throws Exception {
persistentId = "localOverride";
adminControl.reset();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
adminControl.replay();
config.put("foo", "foo");
config.put("Spring", "Source");
Object bean = appContext.getBean(persistentId);
assertTrue(bean instanceof Properties);
Properties props = (Properties) bean;
assertFalse(config.equals(bean));
// the local property is still present
assertEquals("bar", props.getProperty("foo"));
// the CM props are still there
assertTrue(props.containsKey("kry"));
// and so are the local props
assertTrue(props.containsKey("Spring"));
assertEquals(3, props.entrySet().size());
}
// disabled until custom attributes are enabled again
public void tstPropertiesWithPropRef() throws Exception {
persistentId = "custom-attributes";
adminControl.reset();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
adminControl.replay();
config.put("foo", "foo");
config.put("Spring", "Source");
Object bean = appContext.getBean(persistentId);
BeanDefinition bd = appContext.getBeanDefinition(persistentId);
System.out.println(bd.getScope());
assertTrue(bean instanceof Properties);
Properties props = (Properties) bean;
assertFalse(config.equals(bean));
// the local property is still present
assertEquals("bar", props.getProperty("foo"));
// the CM props are still there
assertTrue(props.containsKey("kry"));
// and so are the local props
assertTrue(props.containsKey("Spring"));
assertEquals(3, props.entrySet().size());
}
public void testDynamicNoOverride() throws Exception {
persistentId = "noLocalOverride";
String beanId = "dynamic-noOverride";
adminControl.reset();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
adminControl.replay();
// initial config
config.put("bo", "bozo");
config.put("Spring", "Source");
Object bean = appContext.getBean(beanId);
assertTrue(bean instanceof Properties);
Properties props = (Properties) bean;
assertFalse(config.equals(bean));
// the local property has been replaced
assertEquals("bozo", props.getProperty("bo"));
// but the one not present on the CM are still present
assertTrue(props.containsKey("kry"));
assertEquals("pton", props.getProperty("kry"));
assertEquals("Source", props.getProperty("Spring"));
assertEquals(3, props.entrySet().size());
// CM updates
assertNotNull(msCallback);
Dictionary<String, String> newProps = new Hashtable<String, String>();
newProps.put("bo", "b0z0");
newProps.put("new", "prop");
// trigger update
msCallback.updated(newProps);
// verify properties
assertSame(props, appContext.getBean(beanId));
assertEquals("b0z0", props.getProperty("bo"));
assertEquals("prop", props.getProperty("new"));
assertNull(props.getProperty("Spring"));
// verify local properties
assertEquals("pton", props.getProperty("kry"));
}
public void testDynamicOverride() throws Exception {
persistentId = "localOverride";
String beanId = "dynamic-override";
adminControl.reset();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
adminControl.replay();
// initial config
config.put("bo", "bozo");
config.put("Spring", "Source");
Object bean = appContext.getBean(beanId);
assertTrue(bean instanceof Properties);
Properties props = (Properties) bean;
assertFalse(config.equals(bean));
// the local property has been replaced
assertEquals("zo", props.getProperty("bo"));
// but the one not present on the CM are still present
assertEquals("pton", props.getProperty("kry"));
assertEquals("Source", props.getProperty("Spring"));
assertEquals(3, props.entrySet().size());
// CM updates
assertNotNull(msCallback);
Dictionary<String, String> newProps = new Hashtable<String, String>();
newProps.put("bo", "b0z0");
newProps.put("new", "prop");
// trigger update
msCallback.updated(newProps);
// verify properties
assertSame(props, appContext.getBean(beanId));
assertEquals("zo", props.getProperty("bo"));
assertEquals("prop", props.getProperty("new"));
assertNull(props.getProperty("Spring"));
// verify local properties
assertEquals("pton", props.getProperty("kry"));
}
public void testExtendedProperties() throws Exception {
persistentId = "noLocalOverride";
String beanId = "dynamic-noOverride";
adminControl.reset();
expect(admin.getConfiguration(persistentId)).andReturn(cfg).atLeastOnce();
adminControl.replay();
// initial config
config.put("bo", "bozo");
config.put("Spring", "Source");
Object bean = appContext.getBean(beanId);
assertTrue(bean instanceof Properties);
assertTrue(bean instanceof ServicePropertiesListenerManager);
Properties props = (Properties) bean;
ServicePropertiesListenerManager manager = (ServicePropertiesListenerManager) bean;
final Map<?, ?>[] updatedProps = new Map<?, ?>[1];
manager.addListener(new ServicePropertiesChangeListener() {
public void propertiesChange(ServicePropertiesChangeEvent event) {
updatedProps[0] = event.getServiceProperties();
}
});
// CM updates
assertNotNull(msCallback);
Dictionary<String, String> newProps = new Hashtable<String, String>();
newProps.put("bo", "b0z0");
newProps.put("new", "prop");
// trigger update
msCallback.updated(newProps);
// verify listener properties
assertNotNull(updatedProps[0]);
// the properties contains both the CM props
assertEquals("b0z0", updatedProps[0].get("bo"));
assertEquals("prop", updatedProps[0].get("new"));
// and the local defined ones
assertEquals("pton", updatedProps[0].get("kry"));
assertEquals(3, updatedProps[0].size());
}
}