blob: bc215b5d9cb78d3d42485ae19a57b34846ff3dc1 [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 javax.jdo.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.io.PrintStream;
import junit.framework.Test;
import junit.framework.TestResult;
import junit.framework.TestSuite;
import junit.textui.ResultPrinter;
import junit.textui.TestRunner;
/**
* TestRunner class for running a single test or a test suite in batch
* mode. The format of the test output is specified by the result printer
* class. The main method sets an exit code according to the test result:
* <ul>
* <li><code>0</code>: success
* <li><code>1</code>: failure, the test shows an unexpected behavior
* <li><code>2</code>: exception, the test throws an unhandled excption
* </ul>
*
* @author Michael Bouschen
*/
public class BatchTestRunner
extends TestRunner
{
/** Name of the system property to specify the result printer class. */
public static final String RESULTPRINTER_PROPERTY = "ResultPrinterClass";
/** Default of the system property ResultPrinterClass. */
public static final String RESULTPRINTER_DEFAULT = BatchResultPrinter.class.getName();
/**
* Constructor.
* It creates a result printer instance based on the system property
* and delegates to the constructor taking a result printer argument.
*/
public BatchTestRunner() {
super();
setPrinter(getResultPrinter());
}
/**
* Constructor. USes teh specified resultPrinter to format the test result.
*/
public BatchTestRunner(ResultPrinter resultPrinter) {
super(resultPrinter);
}
/** Runs all test methods from the specified class. */
public static void run(Class clazz) {
run(new TestSuite(clazz));
}
/** Runs the specified test. */
public static TestResult run(Test test) {
return new BatchTestRunner().doRun(test);
}
/** Runs the specified test and waits until the user types RETURN. */
public static void runAndWait(Test suite) {
new BatchTestRunner().doRun(suite, true);
}
/**
* Runs in batch mode and sets an exit code. If the specified String
* array includes a single fully qualified class name, this test class
* is executed. If it is empty it runs the TestListSuite.
*/
public static void main(String args[]) {
BatchTestRunner aTestRunner= new BatchTestRunner();
try {
/*
if ((args == null) || args.length == 0)
args = new String[] { TestListSuite.class.getName() };
*/
TestResult r = aTestRunner.start(args);
if (!r.wasSuccessful())
System.exit(FAILURE_EXIT);
System.exit(SUCCESS_EXIT);
} catch(Exception e) {
System.err.println(e.getMessage());
System.exit(EXCEPTION_EXIT);
}
}
/** Returns a result printer instance. n instance of tCheck the system property */
protected ResultPrinter getResultPrinter() {
String className = System.getProperty(RESULTPRINTER_PROPERTY);
if (className != null) {
className = className.trim();
if (className.length() != 0) {
String msg = null;
try {
// get class instance
Class clazz = Class.forName(className);
// constructor taking PrintStream arg
Constructor ctor = clazz.getConstructor(
new Class[] { PrintStream.class } );
// create instance
return (ResultPrinter)ctor.newInstance(
new Object[] { System.out });
}
catch (ClassNotFoundException ex) {
// specified ResultPrinter class not
msg = "Cannot find specified result printer class " +
className + ".";
}
catch (NoSuchMethodException ex) {
msg = "Class " + className +
" does not provide constructor taking a PrintStream.";
}
catch (InstantiationException ex) {
msg = "Class " + className + " is abstract.";
}
catch (IllegalAccessException ex) {
msg = "Constructor taking a PrintStream of class " +
className + " is not accessible.";
}
catch (InvocationTargetException ex) {
msg = "Constructor call results in exception " + ex + ".";
}
// ResultPrinter class specified, but not avaiable
System.out.println(msg);
ResultPrinter printer = getDefaultResultPrinter();
System.out.println("Using default result printer of class " +
printer.getClass().getName());
}
}
// ResultPrinter class not specified => use default
return getDefaultResultPrinter();
}
/**
* Returns an instance of the default result printer class
* BatchResultPrinter.
*/
protected ResultPrinter getDefaultResultPrinter() {
return new BatchResultPrinter(System.out);
}
}