blob: d402077963ae07cc6ac5ccac9639431b18dd05b2 [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.qpid.junit.extensions.util;
import java.util.Properties;
/**
* TestContextProperties is an extension of {@link ParsedProperties} that keeps track of property key/value pairs
* that are used by tests being run under the {@link org.apache.qpid.junit.extensions.TKTestRunner}. To keep the
* test runner notified of configurable test parameters, tests should establish their required property values by
* initiliazing fields or statics or in the constructor, through this class. The tk test runner automatically places
* any additional properties specified on the command line into the this class, and these are held statically.
*
* <p/>Here is an example:
*
* <pre>
* public class MyTestClass extends TestCase {
* ParsedProperties testProps = TestContextProperties.getInstance();
* private int testParam = testProps.setPropertyIfNull("testParam", 1);
* ...
* </pre>
*
* <p/>This has the effect of setting up the field testParam with the default value of 1, unless it is overridden
* by values passed to the tk test runner. It also notifies the tk test runner of the name and value of the test
* parameter actually used for the test, so that this can be logged in the test output file.
*
* <p/><table id="crc"><caption>CRC Card</caption>
* <tr><th> Responsibilities <th> Collaborations
* <tr><td> Log all name/value pairs read or written.
* </table>
*
* @author Rupert Smith
*/
public class TestContextProperties extends ParsedProperties
{
/** Used for debugging. */
// Logger log = Logger.getLogger(TestContextProperties.class);
/** Holds all properties set or read through this property extension class. */
private Properties accessedProps = new Properties();
/** The singleton instance of the test context properties. */
private static TestContextProperties singleton = null;
/**
* Default constructor that builds a ContextualProperties that uses environment defaults.
*/
private TestContextProperties()
{
super();
}
/**
* Gets the singleton instance of the test context properties.
*
* @return The singleton instance of the test context properties.
*/
public static synchronized ParsedProperties getInstance()
{
if (singleton == null)
{
singleton = new TestContextProperties();
}
return singleton;
}
/**
* Gets the singleton instance of the test context properties, applying a specified set of default properties to
* it, if they are not already set.
*
* @param defaults The defaults to apply for properties not already set.
*
* @return The singleton instance of the test context properties.
*/
public static synchronized ParsedProperties getInstance(Properties defaults)
{
ParsedProperties props = getInstance();
for (Object key : defaults.keySet())
{
String stringKey = (String) key;
String value = defaults.getProperty(stringKey);
props.setPropertyIfNull(stringKey, value);
}
return props;
}
/*
* Creates a ContextualProperties that uses environment defaults and is initialized with the specified properties.
*
* @param props The properties to initialize this with.
*/
/*public TestContextProperties(Properties props)
{
super();
}*/
/**
* Gets all of the properties (with their most recent values) that have been set or read through this class.
*
* @return All of the properties accessed through this class.
*/
public static Properties getAccessedProps()
{
return (singleton == null) ? new Properties() : singleton;
// return accessedProps;
}
/**
* Looks up a property value relative to the environment, callers class and method. The default environment will be
* checked for a matching property if defaults are being used. The property key/value pair is remembered and made
* available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
*
* @param key The property key.
*
* @return The value of this property searching from the most specific definition (environment, class, method, key)
* to the most general (key only), unless use of default environments is turned off in which case the most general
* proeprty searched is (environment, key).
*/
public String getProperty(String key)
{
// log.debug("public String getProperty(String key = " + key + "): called");
String value = super.getProperty(key);
if (value != null)
{
accessedProps.setProperty(key, value);
}
// log.debug("value = " + value);
return value;
}
/**
* Calls the <tt>Hashtable</tt> method <code>put</code>. Provided for parallelism with the <tt>getProperty</tt>
* method. Enforces use of strings for property keys and values. The value returned is the result of the
* <tt>Hashtable</tt> call to <code>put</code>. The property key/value pair is remembered and made
* available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
*
* @param key The key to be placed into this property list.
* @param value The value corresponding to <tt>key</tt>.
*
* @return The previous value of the specified key in this property list, or <code>null</code> if it did not have one.
*/
public synchronized Object setProperty(String key, String value)
{
// log.debug("public synchronized Object setProperty(String key = " + key + ", String value = " + value + "): called");
Object result = super.setProperty(key, value);
accessedProps.setProperty(key, value);
return result;
}
/**
* Helper method for setting properties to defaults when they are not already set. The property key/value pair is
* remembered and made available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
*
* @param key The name of the system property to set.
* @param value The value to set it to.
*
* @return The value of the property, which will be the value passed in if it was null, or the existing value otherwise.
*/
public String setPropertyIfNull(String key, String value)
{
// log.debug("public String setPropertyIfNull(String key = " + key + ", String value = " + value + "): called");
String result = super.setPropertyIfNull(key, value);
if (value != null)
{
accessedProps.setProperty(key, result);
}
// log.debug("result = " + result);
return result;
}
}