001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.testsupport;
021
022 import java.io.File;
023
024 import junit.framework.TestCase;
025
026 import org.apache.commons.logging.Log;
027 import org.apache.commons.logging.LogFactory;
028
029 /**
030 * Provides support for tests.
031 *
032 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
033 */
034 public abstract class TestSupport
035 extends TestCase
036 {
037 /**
038 * The base-directory which tests should be run from.
039 *
040 * @see #getBaseDir() This field is initialized from the return of this method on instance construction.
041 */
042 protected final File BASEDIR = getBaseDir();
043
044 //
045 // NOTE: Logging must be initialized after BASEDIR has been discovered, as it is used
046 // by the log4j logging-config properties to set the target/test.log file.
047 //
048
049 /**
050 * Instance logger which tests should use to produce tracing information.
051 *
052 * <p>
053 * Unless you have a really good reason to, do not change this field from your sub-class.
054 * And if you do, please document why you have done so.
055 */
056 protected Log log = LogFactory.getLog(getClass());
057
058 /**
059 * Constructor for tests that specify a specific test name.
060 *
061 * @see #TestSupport() This is the prefered constructor for sub-classes to use.
062 */
063 protected TestSupport(final String name) {
064 super(name);
065
066 log.info("Initialized");
067 }
068
069 /**
070 * Default constructor.
071 */
072 protected TestSupport() {
073 super();
074
075 log.info("Initialized");
076 }
077
078 /**
079 * Determine the value of <tt>${basedir}</tt>, which should be the base directory of
080 * the module which the concreate test class is defined in.
081 *
082 * <p>
083 * If The system property <tt>basedir</tt> is already set, then that value is used,
084 * otherwise we determine the value from the codesource of the containing concrete class
085 * and set the <tt>basedir</tt> system property to that value.
086 *
087 * @see #BASEDIR This field is always initialized to the value which this method returns.
088 *
089 * @return The base directory of the module which contains the concreate test class.
090 */
091 protected final File getBaseDir() {
092 File dir;
093
094 // If ${basedir} is set, then honor it
095 String tmp = System.getProperty("basedir");
096 if (tmp != null) {
097 dir = new File(tmp);
098 }
099 else {
100 // Find the directory which this class (or really the sub-class of TestSupport) is defined in.
101 String path = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
102
103 // We expect the file to be in target/test-classes, so go up 2 dirs
104 dir = new File(path).getParentFile().getParentFile();
105
106 // Set ${basedir} which is needed by logging to initialize
107 System.setProperty("basedir", dir.getPath());
108 }
109
110 // System.err.println("Base Directory: " + dir);
111
112 return dir;
113 }
114
115 /**
116 * Resolve the given path to a file rooted to {@link #BASEDIR}.
117 *
118 * @param path The path to resolve.
119 * @return The resolved file for the given path.
120 */
121 protected final File resolveFile(final String path) {
122 assert path != null;
123
124 File file = new File(path);
125
126 // Complain if the file is already absolute... probably an error
127 if (file.isAbsolute()) {
128 log.warn("Given path is already absolute; nothing to resolve: " + file);
129 }
130 else {
131 file = new File(BASEDIR, path);
132 }
133
134 return file;
135 }
136
137 /**
138 * Resolve the given path to a path rooted to {@link #BASEDIR}.
139 *
140 * @param path The path to resolve.
141 * @return The resolved path for the given path.
142 *
143 * @see #resolveFile(String)
144 */
145 protected final String resolvePath(final String path) {
146 assert path != null;
147
148 return resolveFile(path).getPath();
149 }
150 }