net.bpelunit.framework.ui.command.BPELUnitCommandLineRunner.java Source code

Java tutorial

Introduction

Here is the source code for net.bpelunit.framework.ui.command.BPELUnitCommandLineRunner.java

Source

/**
 * This file belongs to the BPELUnit utility and Eclipse plugin set. See enclosed
 * license file for more information.
 * 
 */
package net.bpelunit.framework.ui.command;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import net.bpelunit.framework.base.BPELUnitBaseRunner;
import net.bpelunit.framework.control.result.XMLResultProducer;
import net.bpelunit.framework.control.util.BPELUnitConstants;
import net.bpelunit.framework.control.util.BPELUnitUtil;
import net.bpelunit.framework.exception.ConfigurationException;
import net.bpelunit.framework.exception.DeploymentException;
import net.bpelunit.framework.exception.SpecificationException;
import net.bpelunit.framework.exception.TestCaseNotFoundException;
import net.bpelunit.framework.model.test.ITestResultListener;
import net.bpelunit.framework.model.test.PartnerTrack;
import net.bpelunit.framework.model.test.TestCase;
import net.bpelunit.framework.model.test.TestSuite;
import net.bpelunit.framework.model.test.data.XMLData;
import net.bpelunit.framework.model.test.report.ITestArtefact;
import net.bpelunit.util.Console;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.varia.NullAppender;

/**
 * The command line runner for BPELUnit.
 * 
 * This class is intended to be run from the command line. Note that you need to have all libraries,
 * including those referenced in the extensions.xml extension file, on the class path. You also need
 * to set the BPELUNIT_HOME environment variable.
 * 
 * Invoke this class from the root directory of your test suite. All relative paths inside the test
 * suite document will be resolved from the current directory.
 * 
 * @version $Id$
 * @author Philip Mayer
 * 
 */
public class BPELUnitCommandLineRunner extends BPELUnitBaseRunner implements ITestResultListener {

    private static final String PARAMETER_DETAILEDCOVERAGEFILE = "d"; //$NON-NLS-1$
    private static final String PARAMETER_COVERAGEFILE = "c"; //$NON-NLS-1$
    private static final String PARAMETER_LOGFILE = "l"; //$NON-NLS-1$
    private static final String PARAMETER_XMLFILE = "x"; //$NON-NLS-1$
    private static final String PARAMETER_VERBOSE = "v"; //$NON-NLS-1$
    private static final int MAX_LINE_LENGTH = 800;
    private final Logger logger = Logger.getLogger(getClass());
    private Console console;

    private boolean saveCoverageDetails = false;
    private boolean verbose;
    private String xmlFileName;
    private String logFileName;
    private PrintWriter screen;
    private File testSuiteFile;
    private List<String> testCaseNames;
    private Options options;

    public BPELUnitCommandLineRunner(String[] args) {
        this(new Console(), args);
    }

    public BPELUnitCommandLineRunner(Console consoleToUse, String[] args) {
        this.console = consoleToUse;
        this.screen = console.getScreen();

        this.createOptions();
        this.parseOptionsFromCommandLine(args);
    }

    @SuppressWarnings("static-access")
    private final void createOptions() {
        options = new Options();

        options.addOption(PARAMETER_VERBOSE, false,
                Messages.getString("BPELUnitCommandLineRunner.PARAMTER_DESCRIPTION_VERBOSE")); //$NON-NLS-1$
        options.addOption(OptionBuilder
                .withDescription(Messages.getString("BPELUnitCommandLineRunner.PARAMETER_DESCRIPTION_XMLFILE")) //$NON-NLS-1$
                .hasArg().withArgName("FILE").create(PARAMETER_XMLFILE));
        options.addOption(OptionBuilder
                .withDescription(Messages.getString("BPELUnitCommandLineRunner.PARAMETER_DESCRIPTION_LOGFILE")) //$NON-NLS-1$
                .hasArg().withArgName("FILE").create(PARAMETER_LOGFILE));
        options.addOption(OptionBuilder
                .withDescription(Messages.getString("BPELUnitCommandLineRunner.PARAMETER_DESCRIPTION_COVERAGEFILE")) //$NON-NLS-1$
                .hasArg().withArgName("FILE").create(PARAMETER_COVERAGEFILE));
        options.addOption(OptionBuilder
                .withDescription(
                        Messages.getString("BPELUnitCommandLineRunner.PARAMTER_DESCRIPTION_DETAILEDCOVERAGEFILE")) //$NON-NLS-1$
                .hasArg().withArgName("FILE").create(PARAMETER_DETAILEDCOVERAGEFILE));
    }

    @SuppressWarnings("unchecked")
    private final void parseOptionsFromCommandLine(String[] args) {
        saveCoverageDetails = false;

        CommandLineParser parser = new PosixParser();
        try {
            CommandLine cmd = parser.parse(options, args);

            verifyCommandLineArguments(cmd);

            verbose = cmd.hasOption(PARAMETER_VERBOSE);
            xmlFileName = trimEqualsSignFromStart(cmd.getOptionValue(PARAMETER_XMLFILE));
            logFileName = trimEqualsSignFromStart(cmd.getOptionValue(PARAMETER_LOGFILE));

            ArrayList<String> remainingOptions = new ArrayList<String>(cmd.getArgList());
            setAndValidateTestSuiteFileName(remainingOptions.remove(0));
            testCaseNames = remainingOptions;
        } catch (ParseException e) {
            showHelpAndExit();
        }
    }

    private void setAndValidateTestSuiteFileName(String testSuiteFileName) {
        testSuiteFile = new File(testSuiteFileName);
        if (!testSuiteFile.exists()) {
            abort(String.format(Messages.getString("BPELUnitCommandLineRunner.MSG_ERR_TESTSUITE_FILE_NOT_EXISTING"),
                    testSuiteFile)); //$NON-NLS-1$
        }
    }

    private String trimEqualsSignFromStart(String optionValue) {
        if (optionValue == null) {
            return null;
        }

        if (!optionValue.startsWith("=")) { //$NON-NLS-1$
            return optionValue;
        }

        return optionValue.substring(1);
    }

    private void verifyCommandLineArguments(CommandLine cmd) {
        if (cmd.hasOption(PARAMETER_COVERAGEFILE) && cmd.hasOption(PARAMETER_DETAILEDCOVERAGEFILE)) {
            abort(String.format(
                    Messages.getString(
                            "BPELUnitCommandLineRunner.MSG_ERR_PARAMETER_COVERAGE_DETAILEDCOVERAGE_ARE_EXCLUSIVE"), //$NON-NLS-1$
                    PARAMETER_COVERAGEFILE, PARAMETER_DETAILEDCOVERAGEFILE));
        }

        if (cmd.getArgList().size() == 0) {
            showHelpAndExit();
        }
    }

    /**
     * Main method, to be started by the user.
     * 
     * @param args
     */
    public static void main(String[] args) {
        new BPELUnitCommandLineRunner(args).run();
    }

    // ************************* Implementation *********************

    private void abort(String message) {
        abort(message, null);
    }

    private void abort(String message, Exception e) {
        screen.println(message);
        if (e != null) {
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MESSAGE_DESCRIPTION") + e.getMessage()); //$NON-NLS-1$
            logger.error(
                    Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_CANNOT_WRITE_COVERAGE_INFORMATION"), e); //$NON-NLS-1$
        }
        console.exit(1);
    }

    private void showHelpAndExit() {
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp(Messages.getString("BPELUnitCommandLineRunner.MSG_HELP_USAGE"), //$NON-NLS-1$
                options);
        console.exit(1);
    }

    void run() {
        String bpelUnitRunner = Messages
                .getString("BPELUnitCommandLineRunner.MSG_TITLE_BPELUNIT_COMMANDLINE_RUNNER");
        screen.println(bpelUnitRunner); //$NON-NLS-1$
        screen.println(StringUtils.repeat("-", bpelUnitRunner.length())); //$NON-NLS-1$

        try {
            Map<String, String> options;
            options = BPELUnitConstants.NULL_OPTIONS;

            initialize(options);

            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_LOADING_TESTSUITE")); //$NON-NLS-1$
            TestSuite suite = loadTestSuite(testSuiteFile);

            // Test if all the test names are ok
            for (String testCaseName : testCaseNames) {
                if (!suite.hasTestCase(testCaseName)) {
                    abort(String.format(Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_UNKNOWN_TESTCASE"), //$NON-NLS-1$
                            testCaseName));
                }
            }

            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_TESTSUITE_LOADED")); //$NON-NLS-1$
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_DEPLOYING_SERVICES")); //$NON-NLS-1$

            try {
                suite.setUp();
            } catch (DeploymentException e) {
                try {
                    suite.shutDown();
                } catch (DeploymentException e1) {
                    // do nothing
                }
                abort(Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_DEPLOYMENT_ERROR"), e); //$NON-NLS-1$
            }

            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_DEPLOYMENT_DONE")); //$NON-NLS-1$
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_RUNNING_TEST_CASES")); //$NON-NLS-1$

            suite.addResultListener(this);
            if (testCaseNames.size() > 0) {
                try {
                    suite.setFilter(testCaseNames);
                } catch (TestCaseNotFoundException e1) {
                    // tested before, should not happen.
                }
            }

            suite.run();

            suite.removeResultListener(this);
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_TESTCASES_FINISHED")); //$NON-NLS-1$

            if (xmlFileName != null) {
                try {
                    XMLResultProducer.writeXML(new FileOutputStream(xmlFileName), suite);
                } catch (Exception e) {
                    abort(String.format(
                            Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_ERROR_WRITING_XML_FILE"), //$NON-NLS-1$
                            xmlFileName), e);
                }
            }

            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_UNDEPLOY")); //$NON-NLS-1$

            try {
                suite.shutDown();
            } catch (DeploymentException e) {
                abort(Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_UNDEPLOY"), e); //$NON-NLS-1$
            }
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_UNDEPLOYED")); //$NON-NLS-1$
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_BYE")); //$NON-NLS-1$
        } catch (ConfigurationException e) {
            abort(Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_COFIGURATION_ERROR"), e); //$NON-NLS-1$
        } catch (SpecificationException e) {
            abort(Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_BPTS_ERROR"), e); //$NON-NLS-1$
        }
    }

    public void testCaseEnded(TestCase test) {
        String status = "ended"; //$NON-NLS-1$
        String error = null;
        if (test.getStatus().isError()) {
            status = "had an error"; //$NON-NLS-1$
            error = test.getStatus().getMessage();
        }
        if (test.getStatus().isFailure()) {
            status = "failed"; //$NON-NLS-1$
            error = test.getStatus().getMessage();
        }
        if (test.getStatus().isAborted()) {
            status = "was aborted"; //$NON-NLS-1$
        }
        if (test.getStatus().isPassed()) {
            status = "passed"; //$NON-NLS-1$
        }
        screen.println("Test Case " + status + ": " + test.getName() + "." //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                + ((error != null) ? error : "")); //$NON-NLS-1$
    }

    public void testCaseStarted(TestCase test) {
        if (verbose) {
            screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_PROGRESS_TESTCASE_STARTED") //$NON-NLS-1$
                    + test.getName() + ".\n"); //$NON-NLS-1$
        }
    }

    public void progress(ITestArtefact test) {
        if (verbose && test instanceof PartnerTrack) {
            screen.println(createReadableOutput(test, false));
        }
    }

    private String createReadableOutput(ITestArtefact artefact, boolean recursive) {
        return createReadableOutputInternal(artefact, recursive, ""); //$NON-NLS-1$
    }

    private String createReadableOutputInternal(ITestArtefact artefact, boolean recursive, String inline) {
        StringBuffer output = new StringBuffer();
        output.append(inline + "<Artefact \"" + artefact.getName() + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$
        String internalInline = inline + "  "; //$NON-NLS-1$
        output.append(internalInline + "Status: " //$NON-NLS-1$
                + artefact.getStatus().toString() + "\n"); //$NON-NLS-1$
        if (recursive) {
            for (ITestArtefact child : artefact.getChildren()) {
                if (artefact instanceof XMLData) {
                    XMLData sd = (XMLData) artefact;
                    output.append(internalInline + sd.getName() + " : " //$NON-NLS-1$
                            + StringUtils.abbreviate(BPELUnitUtil.removeSpaceLineBreaks(sd.getXmlData()),
                                    MAX_LINE_LENGTH)
                            + "\n"); //$NON-NLS-1$
                } else {
                    output.append(createReadableOutputInternal(child, recursive, internalInline));
                }
            }
        }
        output.append(inline + "</Artefact \"" + artefact.getName() + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$
        return output.toString();
    }

    public void configureLogging() throws ConfigurationException {
        Logger.getRootLogger().removeAllAppenders();
        if (logFileName != null) {
            try {
                Logger.getRootLogger().addAppender(new FileAppender(new PatternLayout(), logFileName));
            } catch (IOException e) {
                screen.println(Messages.getString("BPELUnitCommandLineRunner.MSG_ERROR_LOGFILE")); //$NON-NLS-1$
            }
            Logger.getRootLogger().setLevel(Level.INFO);
        } else {
            Logger.getRootLogger().addAppender(new NullAppender());
        }
    }

    /**
     * Only for tests
     */
    File getTestSuiteFile() {
        return testSuiteFile;
    }

    /**
     * Only for tests
     */
    List<String> getTestCaseNames() {
        return new ArrayList<String>(testCaseNames);
    }

    /**
     * Only for tests
     */
    boolean isVerbose() {
        return verbose;
    }

    /**
     * Only for tests
     */
    String getXmlFileName() {
        return xmlFileName;
    }

    /**
     * Only for tests
     */
    String getLogFileName() {
        return logFileName;
    }
}