/* * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright * statements and notices. Redistributions must also contain a * copy of this document. * * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote * products derived from this Software without prior written * permission of Intalio, Inc. For written permission, * please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" * nor may "Exolab" appear in their names without prior written * permission of Intalio, Inc. Exolab is a registered * trademark of Intalio, Inc. * * 5. Due credit should be given to the Exolab Project * (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 2001-2003 (C) Intalio, Inc. All Rights Reserved. * * $Id:CastorTestSuiteRunner.java 6775 2007-01-28 20:04:11Z ekuns $ */ package org.castor.xmlctf; import java.io.File; import junit.framework.Test; import junit.framework.TestCase; /** * Start tests for the Castor Testing Framework. This is the main class for the * Castor Testing Framework. It is all driven from here. * * @author <a href="mailto:gignoux@kernelcenter.org">Sebastien Gignoux</a> * @author <a href="mailto:blandin@intalio.com">Arnaud Blandin</a> * @version $Revision:6775 $ $Date: 2005-12-31 08:08:19 -0700 (Sat, 31 Dec 2005) $ */ public class CastorTestSuiteRunner extends TestCase { /** * The root directory of the place where all the files generated by the * different tests have to be put. */ public static final String TEST_OUTPUT_ROOT = "../xmlctf/build/tests/output/"; /** * Name of the system property storing the root directory of all test cases. * @see #_testRoot */ private static final String TEST_ROOT_PROPERTY = "org.exolab.castor.tests.TestRoot"; /** * Root directory of all test cases we will process. We look for test cases * recursively starting in this directory. */ private static String _testRoot; /** * Command line argument that causes the help/options to be displayed. */ private static final String HELP_ARG = "-help"; /** * Command line argument that sets verbose mode true. */ private static final String VERBOSE_ARG = "-verbose"; /** * Command line argument that sets text mode true (no GUI). */ private static final String TEXT_MODE_ARG = "-text"; /** * Command line argument to print or not the stack trace. */ private static final String PRINT_STACK = "-printStack"; /** * Command line argument specifying the seed for the pseudo-random number * generator. */ private static final String SEED_ARG = "-seed"; /** * Default constructor that takes a name per test case. * @param name test case name */ public CastorTestSuiteRunner(final String name) { super(name); } /** * Starts a TestCaseAggregator to collect all the tests in the test root * directory and its subdirectories. * * @return A non-null test suite. */ public static Test suite() { _testRoot = System.getProperty(TEST_ROOT_PROPERTY); if (_testRoot.equals(".") || _testRoot.equals("..")) { //-- convert relative directories "." and ".." to a Canonical path File tmp = new File(_testRoot); try { _testRoot = tmp.getCanonicalPath(); } catch (java.io.IOException iox) { iox.printStackTrace(); System.exit(1); } } else if (_testRoot.startsWith("./") || _testRoot.startsWith(".\\")) { //-- Remove leading ./ or .\ -- URLClassLoader can't handle such file URLs _testRoot = _testRoot.substring(2); } File testRoot = new File(_testRoot); if (!testRoot.exists()) { System.out.println("\nUnable to locate the root directory for the test cases"); System.exit(1); } return new TestCaseAggregator(testRoot, TEST_OUTPUT_ROOT).suite(); } /** * Runs the Castor Testing Framework. * @param args the standard command-line arguments */ public static void main(final String[] args) { if (args.length == 0) { error(); // Does not return } boolean text = processArguments(args); if (System.getProperty(TEST_ROOT_PROPERTY) == null) { error(); // Does not return } System.out.println("Pseudo-random number generator seed: " + RandomHelper.getSeed()); if (text) { String[] testCaseName = {CastorTestSuiteRunner.class.getName()}; junit.textui.TestRunner.main(testCaseName); } else { //TODO: re-enable if a Maven dependency exists // String[] testCaseName = {"-noloading", CastorTestSuiteRunner.class.getName()}; // junit.swingui.TestRunner.main(testCaseName); } } /** * Processes command-line arguments for main() and returns whether or not to * use the text or GUI JUnit. * * @param args command-line arguments from main() * @return true if JUnit should be run in text mode, not GUI */ private static boolean processArguments(final String[] args) { boolean textModeJUnit = true; // text by default for (int i = 0; i < args.length; ++i) { String argument = args[i]; System.out.println("arg: '" + argument + "'"); if (argument.equals(VERBOSE_ARG)) { System.out.println("Verbose on"); System.setProperty(TestCaseAggregator.VERBOSE_PROPERTY, "true"); } else if (argument.equals(PRINT_STACK)) { System.out.println("Printing stack traces on error on."); System.setProperty(TestCaseAggregator.PRINT_STACK_TRACE, "true"); } else if (argument.equals(TEXT_MODE_ARG)) { System.out.println("Running in text mode."); textModeJUnit = true; } else if (argument.equals(SEED_ARG)) { // The next argument should be a number... try { long seed = new Long(args[++i]).longValue(); RandomHelper.setSeed(seed); } catch (NumberFormatException nfe) { System.out.println("Unable to parse the number for the seed"); error(); // Does not return } } else if (argument.equals(HELP_ARG)) { usage(); System.exit(0); } else if (System.getProperty(TEST_ROOT_PROPERTY) == null) { System.setProperty(TEST_ROOT_PROPERTY, argument); } else { System.out.println("Unexpected command-line argument: '" + argument + "'"); error(); // Does not return } } return textModeJUnit; } /** * Print usage and exit with a non-zero return code. */ private static void error() { usage(); System.exit(1); } /** * Print usage. */ private static void usage() { System.out.println("Castor Testing Framework "); System.out.println("------------------------ "); System.out.println("argument: [" + VERBOSE_ARG + "] [" + TEXT_MODE_ARG + "] [" + PRINT_STACK + "] [" + SEED_ARG + " <seed value>] <root test directory or a castor jar test file>"); System.out.println(" " + HELP_ARG + " : displays this screen."); System.out.println(" " + VERBOSE_ARG + " : give detailed execution information for the each test"); System.out.println(" " + TEXT_MODE_ARG + " : run the test without starting the swing gui"); System.out.println(" " + PRINT_STACK + " : Print the full stack trace if an exception is thrown"); System.out.println(" " + SEED_ARG + " <seed value>: " + "set a specific seed for the pseudo-random number generator"); } }