blob: 1bb9be36ea5e47f4faea595c06be5d2d19fd4acd [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.openjpa.lib.conf.test;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
import org.apache.openjpa.lib.conf.Configuration;
import org.apache.openjpa.lib.conf.ConfigurationImpl;
import org.apache.openjpa.lib.conf.ObjectValue;
import org.apache.openjpa.lib.conf.PluginValue;
import org.apache.openjpa.lib.conf.StringValue;
import org.apache.openjpa.lib.conf.Value;
import org.apache.openjpa.lib.test.AbstractTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Tests the {@link ConfigurationImpl} type. This needs to be placed
* in a sub-package so that it can have its own localizer.properties
* properties, which are required for the bean descriptors used by the
* configuration framework {@link Value}.
*
* This test assumes a <code>"test.properties"</code> file available in
* classpath and also system property <code>"openjpatest.properties"</code>
* is set to <code>"test.properties"</code>.
*
* @author Abe White
* @author Pinaki Poddar
*/
public class TestConfigurationImpl extends AbstractTestCase {
private ConfigurationTest _conf = new ConfigurationTest();
@Before
public void setUp() {
System.setProperty("openjpatest.properties", "test.properties");
}
@After
public void tearDown() throws Exception {
System.setProperty("openjpatest.properties", "");
}
/**
* Test that global properties are found and loaded.
*/
@Test
public void testGlobals() {
System.setProperty("openjpa.sysKey", "sysvalue");
assertNull(_conf.getTestKey());
assertNull(_conf.getSysKey());
assertNull(_conf.getPluginKey());
assertNull(_conf.getObjectKey());
assertTrue(_conf.loadGlobals());
assertEquals("testvalue", _conf.getTestKey());
assertEquals("sysvalue", _conf.getSysKey());
assertNull(_conf.getPluginKey());
assertNull(_conf.getObjectKey());
// override the properties location to a non-existant value
_conf.setTestKey(null);
_conf.setSysKey(null);
System.setProperty("openjpatest.properties", "foo.properties");
try {
assertTrue(!_conf.loadGlobals());
fail("Should have thrown exception for missing resource.");
} catch (MissingResourceException mre) {
}
// set back for remainder of tests
System.setProperty("openjpatest.properties", "test.properties");
System.setProperty("openjpa.pluginKey", "java.lang.Object");
assertTrue(_conf.loadGlobals());
assertEquals("testvalue", _conf.getTestKey());
assertEquals("sysvalue", _conf.getSysKey());
assertEquals("java.lang.Object", _conf.getPluginKey());
assertNotNull(_conf.getPluginKeyInstance());
assertNull(_conf.getObjectKey());
}
/**
* Test that the configuration is serialized to properties correctly.
*/
@Test
public void testToProperties() {
assertTrue(_conf.loadGlobals());
assertEquals("testvalue", _conf.getTestKey());
Map props = _conf.toProperties(false);
assertEquals("testvalue", props.get("openjpa.testKey"));
assertFalse(props.containsKey("openjpa.objectKey"));
_conf.setTestKey("foo");
_conf.setPluginKey(new Object());
_conf.setObjectKey(new Object());
props = _conf.toProperties(false);
assertEquals("foo", props.get("openjpa.testKey"));
assertEquals("java.lang.Object", props.get("openjpa.pluginKey"));
assertFalse(props.containsKey("openjpa.objectKey"));
}
/**
* Tests properties caching.
*/
@Test
public void testPropertiesCaching() {
_conf.setTestKey("val");
_conf.setPluginKey("java.lang.Object");
Map props1 = _conf.toProperties(false);
Map props2 = _conf.toProperties(false);
_conf.setObjectKey(new Object());
assertNotNull(_conf.getPluginKeyInstance()); // instantiate
Map props3 = _conf.toProperties(false);
_conf.setTestKey("changed");
Map props4 = _conf.toProperties(false);
_conf.setPluginKey(1);
Map props5 = _conf.toProperties(false);
assertEquals(props1, props2);
assertEquals(props1, props3);
assertNotEquals(props1, props4);
assertNotEquals(props4, props5);
}
/**
* Test the equals method.
*/
@Test
public void testEquals() {
ConfigurationTest conf = new ConfigurationTest();
conf.setTestKey(_conf.getTestKey());
conf.setSysKey(_conf.getSysKey());
conf.setPluginKey(_conf.getPluginKey());
conf.setObjectKey(_conf.getObjectKey());
assertEquals(_conf, conf);
conf.setTestKey("newval");
assertTrue(!_conf.equals(conf));
conf.setTestKey(_conf.getTestKey());
assertEquals(_conf, conf);
conf.setObjectKey(new Object());
assertEquals(_conf, conf);
conf.setPluginKey(new StringBuffer());
assertTrue(!_conf.equals(conf));
}
/**
* Test using bean introspection.
*/
@Test
public void testBeanAccessors() throws Exception {
PropertyDescriptor[] pds = _conf.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
assertNotNull(pd.getShortDescription());
assertNotNull(pd.getDisplayName());
assertNotNull(pd.getWriteMethod());
assertNotNull(pd.getReadMethod());
pd.getReadMethod().invoke(_conf, (Object[]) null);
Method setter = pd.getWriteMethod();
Method getter = pd.getReadMethod();
Class param = pd.getReadMethod().getReturnType();
Object setVal = null;
if (param == int.class)
setVal = randomInt();
else if (param == long.class)
setVal = randomLong();
else if (param == String.class)
setVal = randomString();
else if (param == boolean.class)
setVal = !(((Boolean) getter.invoke(_conf,
(Object[]) null)).booleanValue());
else
continue;
setter.invoke(_conf, new Object[]{setVal});
assertEquals(setVal, getter.invoke(_conf, (Object[]) null));
}
}
/**
* Test freezing.
*/
@Test
public void testFreezing() {
assertTrue(!_conf.isReadOnly());
_conf.setReadOnly(Configuration.INIT_STATE_FROZEN);
assertTrue(_conf.isReadOnly());
try {
_conf.setTestKey("bar");
fail("Allowed set on read only configuration.");
} catch (RuntimeException re) {
}
try {
Properties p = new Properties();
p.put("x", "y");
_conf.fromProperties(p);
fail("Allowed fromMap on read only configuration.");
} catch (RuntimeException re) {
}
}
/**
* Test serialization.
*/
@Test
public void testSerialization() throws Exception {
assertTrue(_conf.loadGlobals());
_conf.setTestKey("testvalue");
_conf.setSysKey("sysvalue");
_conf.setObjectKey(new Object());
_conf.setPluginKey(new Object());
ConfigurationTest copy = (ConfigurationTest) roundtrip(_conf, true);
assertEquals("testvalue", copy.getTestKey());
assertEquals("sysvalue", copy.getSysKey());
assertNull(copy.getObjectKey());
assertEquals("java.lang.Object", copy.getPluginKey());
assertNotNull(copy.getPluginKeyInstance());
copy.setTestKey("testvalue2");
copy.setSysKey("sysvalue2");
copy.setPluginKey(new StringBuffer());
ConfigurationTest copy2 = (ConfigurationTest) roundtrip(copy, true);
assertEquals("testvalue2", copy2.getTestKey());
assertEquals("sysvalue2", copy2.getSysKey());
assertNull(copy2.getObjectKey());
assertEquals("java.lang.StringBuffer", copy2.getPluginKey());
assertEquals("", copy2.getPluginKeyInstance().toString());
}
@Test
public void testProductDerivationCloseCallback() {
// toggle the static. This will be reset by the close invocation.
ConfigurationTestProductDerivation.closed = false;
_conf.close();
assertTrue(ConfigurationTestProductDerivation.closed);
}
private static class ConfigurationTest extends ConfigurationImpl {
private final StringValue _testKey;
private final StringValue _sysKey;
private final PluginValue _pluginKey;
private final ObjectValue _objectKey;
public ConfigurationTest() {
this(true);
}
public ConfigurationTest(boolean canSetPlugin) {
super(false);
_testKey = addString("testKey");
_sysKey = addString("sysKey");
_pluginKey = addPlugin("pluginKey", canSetPlugin);
_objectKey = addObject("objectKey");
}
public String getTestKey() {
return _testKey.get();
}
public void setTestKey(String val) {
_testKey.set(val);
}
public String getSysKey() {
return _sysKey.get();
}
public void setSysKey(String val) {
_sysKey.set(val);
}
public String getPluginKey() {
return _pluginKey.getString();
}
public void setPluginKey(String val) {
_pluginKey.setString(val);
}
public Object getPluginKeyInstance() {
if (_pluginKey.get() == null)
return _pluginKey.instantiate(Object.class, this);
return _pluginKey.get();
}
public void setPluginKey(Object val) {
_pluginKey.set(val);
}
public Object getObjectKey() {
return _objectKey.get();
}
public void setObjectKey(Object val) {
_objectKey.set(val);
}
public void deriveObjectKey(Object val) {
_objectKey.set(val, true);
}
@Override
protected boolean isInvalidProperty(String s) {
if ("openjpatest.properties".equals(s))
return false;
else
return super.isInvalidProperty(s);
}
}
}