/*
* $Id$
*
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.javatest.junit;
import com.sun.javatest.Status;
import com.sun.javatest.lib.MultiStatus;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.Vector;
import junit.framework.TestCase;
/**
*
*/
public class JUnitBareMultiTest extends JUnitMultiTest {
/** Creates a new instance of JUnitBareMultiTest using specified ClassLoader */
public JUnitBareMultiTest(ClassLoader loader) {
super(loader);
}
/**
* Common method for running the test, used by all entry points.
* setTestCaseClass()
should have been invoked before calling this.
*/
public Status run0(String[] argv) {
MultiStatus ms = new MultiStatus(log);
getListAllJunitTestCases();
if (tests == null) {
return Status.failed("No test cases found in test.");
}
Iterator> iterator = tests.entrySet().iterator();
while (iterator.hasNext()) {
Method method = iterator.next().getValue();
Status status = null;
try {
status = invokeTestCase(method);
} catch (Throwable e) {
printStackTrace(e);
status = Status.failed("Error in test case: " + method.getName());
}
ms.add(method.getName(), status);
}
return ms.getStatus();
}
/**
* Entry point for direct execution, not used by the harness.
* Note that the provided class name should be a subclass of TestCase.
*/
public static void main(String args[]) {
String executeClass = System.getProperty("javaTestExecuteClass");
JUnitMultiTest multiTest = new JUnitBareMultiTest(ClassLoader.getSystemClassLoader());
multiTest.setup(executeClass);
multiTest.run0(args);
}
/**
* Entry point for standalone mode.
*/
protected void setup(String executeClass) {
TestCase test;
try {
Class> tc = getClassLoader().loadClass(executeClass);
String name = tc.getName();
String constructor = tc.getConstructors()[0].toGenericString();
test = (constructor.indexOf("java.lang.String") > -1)?
(TestCase)tc.getConstructors()[0].newInstance(new Object[] {name}):
(TestCase)tc.newInstance();
setTestCaseClass(test);
} catch(InstantiationException e){
log.println("Cannot instantiate test: " + executeClass + " (" + exceptionToString(e) + ")");
} catch(InvocationTargetException e){
log.println("Exception in constructor: " + executeClass + " (" + exceptionToString(e.getTargetException()) + ")");
} catch(IllegalAccessException e){
log.println("Cannot access test: " + executeClass + " (" + exceptionToString(e) + ")");
} catch (ClassNotFoundException e){
log.println("Cannot find test: " + executeClass + " (" + exceptionToString(e) + ")");
}
}
protected void setTestCaseClass(TestCase test){
testCaseClass = test;
}
protected Status invokeTestCase(Method m)
throws IllegalAccessException, InvocationTargetException {
try {
testCaseClass.setName(m.getName());
testCaseClass.runBare();
} catch (Throwable e) {
e.printStackTrace(log);
return Status.failed("test case " + m.getName() + "in test " + testCaseClass.getName()+ " failed: " + e);
}
return Status.passed("OKAY");
}
protected void getListAllJunitTestCases(){
tests = new TreeMap();
try {
Method[] methods = AccessController.doPrivileged(
new PrivilegedAction() {
public Method[] run() {
return testCaseClass.getClass().getMethods();
}
});
for (Method m: methods){
if(m == null || excludeTestCases.contains(m.getName())){
continue;
}
Class>[] paramTypes = m.getParameterTypes();
Class> returnType = m.getReturnType();
String name = m.getName();
if ((paramTypes.length == 0) &&
Void.TYPE.isAssignableFrom(returnType) && name.startsWith("test") ) {
tests.put(name, m);
}
}
} catch (Throwable e ) {
tests = null;
}
}
protected TestCase testCaseClass;
protected SortedMap tests;
protected String testCases[] = null;
protected Vector excludeTestCases = new Vector<>();
}