blob: caf613823f1e1e6ce613c6e8d15bc23bbe25a456 [file]
/*
*
* Derby - Class org.apache.derbyTesting.functionTests.util.SystemPropertyTestSetup
*
* 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.derbyTesting.junit;
import java.security.PrivilegedActionException;
import java.util.Enumeration;
import java.util.Properties;
import junit.extensions.TestSetup;
import junit.framework.Test;
/**
* Test decorator to set a set of system properties on setUp
* and restore them to the previous values on tearDown.
*
*/
public class SystemPropertyTestSetup extends TestSetup {
protected Properties newValues;
private Properties oldValues;
private boolean staticProperties;
/**
* Create a test decorator that sets and restores the passed
* in properties. Assumption is that the contents of
* properties and values will not change during execution.
* @param test test to be decorated
* @param newValues properties to be set
*/
public SystemPropertyTestSetup(Test test,
Properties newValues,
boolean staticProperties)
{
super(test);
this.newValues = newValues;
this.staticProperties = staticProperties;
}
/**
* Create a test decorator that sets and restores
* System properties. Do not shutdown engine after
* setting properties
* @param test
* @param newValues
*/
public SystemPropertyTestSetup(Test test,
Properties newValues)
{
super(test);
this.newValues = newValues;
this.staticProperties = false;
}
/**
* Decorate a test so that it sets a single system property in
* {@code setUp()} and resets it in {@code tearDown()}. The engine is
* not shut down after the property is set.
*/
public static Test singleProperty(Test test, String property, String value)
{
return singleProperty(test, property, value, false);
}
/**
* Decorate a test so that it sets a single system property in
* {@code setUp()} and resets it in {@code tearDown()}. The engine is
* shut down after the property is set if {@code staticProperty} is
* {@code true}.
*/
public static Test singleProperty(Test test, String property, String value,
boolean staticProperty)
{
Properties properties = new Properties();
properties.setProperty(property, value);
return new SystemPropertyTestSetup(test, properties, staticProperty);
}
/**
* For each property store the current value and
* replace it with the new value, unless there is no change.
*/
protected void setUp()
throws java.lang.Exception
{
//DERBY-5663 Getting NPE when trying to set
// derby.language.logStatementText property to true inside a junit
// suite.
//The same instance of SystemPropertyTestSetup can be used again
// and hence we want to make sure that oldValues is not null as set
// in the tearDown() method. If we leave it null, we will run into NPE
// during the tearDown of SystemPropertyTestSetup during the
// decorator's reuse.
this.oldValues = new Properties();
// Shutdown engine so static properties take effect.
// Shutdown the engine before setting the properties. This
// is because the properties may change authentication settings
// to NATIVE authentication and we may be missing a credentials DB.
if (staticProperties) {
// Use deregister == false here lest in client server mode
// we try to connect to a network server without an embedded
// driver registered. Issue seen with ConstraintCharacteristicsTest.
TestConfiguration.getCurrent().shutdownEngine(false);
}
setProperties(newValues);
}
/**
* Revert the properties to their values prior to the setUp call.
*/
protected void tearDown()
throws java.lang.Exception
{
// Shut down the engine to restore any static properties. Do that
// before the properties are reset to their old values, since the
// engine shutdown may rely on some of the system properties. For
// example, the system properties could contain the user database
// (in derby.user.* style properties), and clearing those first
// would lead to "invalid authentication" errors when attempting
// to shut down the engine.
try {
if (staticProperties) {
TestConfiguration.getCurrent().shutdownEngine();
}
} finally {
restoreOldPropertyValues();
oldValues = null;
}
}
private void restoreOldPropertyValues() throws Exception {
// Clear all the system properties set by the new set
// that will not be reset by the old set.
for (Enumeration e = newValues.propertyNames(); e.hasMoreElements();)
{
String key = (String) e.nextElement();
if (oldValues.getProperty(key) == null)
BaseTestCase.removeSystemProperty(key);
}
// and then reset nay old values
setProperties(oldValues);
}
private void setProperties(Properties values)
throws PrivilegedActionException
{
for (Enumeration e = values.propertyNames(); e.hasMoreElements();)
{
String key = (String) e.nextElement();
String value = values.getProperty(key);
String old = BaseTestCase.getSystemProperty(key);
boolean change;
if (old != null)
{
// set, might need to be changed.
change = !old.equals(value);
//Reference equality is ok here.
if (values != oldValues)
oldValues.setProperty(key, old);
}
else {
// notset, needs to be set
change = true;
}
if (change) {
BaseTestCase.setSystemProperty(key, value);
}
}
}
}