package eu.swiec.bearballin.tools;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import eu.swiec.bearballin.common.io.Environment;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
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.jbehave.core.io.StoryFinder;
import org.junit.runner.JUnitCore;
public class Main {
public static final String STORIESPATH = "STORIESDIR"; // environment
// varialble name
// for relative path
// to STORIES
// location
private static final List<String> STORIES = initStories();
/**
* @param args
*/
public static void main(final String[] args) {
System.setProperty(STORIESPATH, Environment.getRelativePathFromProperty());
final Options options = initializeOptions();
parseOptions(args, options, new PosixParser(), new HelpFormatter());
}
private static List<String> initStories() {
System.setProperty(STORIESPATH, Environment.getRelativePathFromProperty());
List<String> stories;
String basePath = System.getenv(STORIESPATH) == null ? "" : System.getenv(STORIESPATH);
if (basePath.isEmpty()) {
basePath = Environment.getRelativePathFromProperty();
}
stories = new StoryFinder().findPaths(basePath, StoryRun.asList("**/*.story"), null);
return stories;
}
@SuppressWarnings("static-access")
private static Options initializeOptions() {
final Option property = OptionBuilder.withArgName("property=value")
.hasArgs(2)
.withValueSeparator()
.withDescription("use value for given property")
.create("D");
final Option properties = OptionBuilder.withLongOpt("properties")
.withArgName("variableName")
.hasOptionalArg()
.withDescription("show environment propErties and variables")
.create("e");
final Option runSpecified = OptionBuilder.withLongOpt("runSpec")
.withArgName("StoryPath")
.hasArg()
.withDescription("runs specified story")
.create("s");
final Option testNumber = OptionBuilder.withLongOpt("invoke")
.withType(int.class)
.withArgName("test number")
.hasArg()
.withDescription("run test number (to see tests numeration run with --list arg.")
.create("i");
final Option targetMach = OptionBuilder
.withLongOpt("targetAdd")
.withType(String.class)
.hasArg()
.withArgName("target address")
.withDescription("address where test will take place")
.create("t");
final Option runTests = new Option("r", "run", false, "runs all STORIES");
final Option help = new Option("h", "help", false, "print this message");
final Options options = new Options();
options.addOption("l", "list", false, "lists available tests");
options.addOption(help);
options.addOption(property);
options.addOption(runTests);
options.addOption(runSpecified);
options.addOption(properties);
options.addOption(testNumber);
options.addOption(targetMach);
return options;
}
private static void parseOptions(final String[] args, final Options options, final CommandLineParser parser, final HelpFormatter hf) {
try {
final CommandLine cmd = parser.parse(options, args);
if (cmd.hasOption("D")) {
if (cmd.getOptionValues("D").length == 2) {
System.setProperty(cmd.getOptionValues("D")[0], cmd.getOptionValues("D")[1]);
}
}
if (cmd.hasOption("t")) {
//set target variable
System.setProperty("TARGETENV", cmd.getOptionValue("t"));
}
if (cmd.hasOption("l") || cmd.hasOption("list")) {
// list available tests
listAvailableTests();
}
// run all available tests
if (cmd.hasOption("r") || cmd.hasOption("run")) {
System.out.println("Not yet implemented");
}
if (cmd.hasOption("e")) {
printoutEnvVariables();
printoutProperties();
if (cmd.getOptionValue("e") != null) {
System.out.println("Variable '" + cmd.getOptionValue("e") + "' has value: " + Environment.getPropOrVar(cmd.getOptionValue("e")));
}
}
if (cmd.hasOption("i")) {
try {
final int tCase = Integer.parseInt(cmd.getOptionValue("i"));
System.setProperty("TESTNAME", STORIES.get(tCase));
runTests();
} catch (NumberFormatException e) {
hf.printHelp("syntax", options, true);
} catch (IndexOutOfBoundsException e) {
System.out.println("Test Index out of bound Exception!");
listAvailableTests();
}
}
if (cmd.hasOption("s") || cmd.hasOption("runSpec")) {
System.setProperty("TESTNAME", cmd.getOptionValue("s"));
runTests();
}
if (cmd.hasOption("h") || !cmd.getArgList().isEmpty() || cmd.getOptions().length == 0) {
hf.printHelp("syntax", options, true);
}
} catch (ParseException e) {
hf.printHelp("syntax", options, true);
}
}
private static void runTests() {
JUnitCore.main("eu.swiec.themis.tools.StoryRun");
generateDumbAntJUnitReport();
}
private static void listAvailableTests() {
System.out.println("Available tests:");
int testNum = 0;
for (String testPath : STORIES) {
System.out.println("[" + testNum + "] " + testPath);
testNum++;
}
}
private static void generateDumbAntJUnitReport() {
final File dumbReport = new File("./DumbTEST.xml");
FileWriter fileWriter;
try {
fileWriter = new FileWriter(dumbReport);
fileWriter.append("<testsuite><testcase name=\"agregationTEsts\"></testcase></testsuite>");
fileWriter.write("<testsuite><testcase name=\"agregationTEsts\"></testcase></testsuite>");
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Prints out system environment variables (System thing - System.getenv()).
*/
public static void printoutEnvVariables() {
System.out.println("**********************************\n\nE N V V A R I A B L E S --printout: \n\n**********************************");
final Map<String, String> envs = System.getenv();
for (String key : envs.keySet()) {
System.out.println(key + ": \'" + envs.get(key) + "\'");
}
}
/**
* Prints out all properties (Java thing - System.getProperties()).
*/
public static void printoutProperties() {
final Properties sysP = System.getProperties();
System.out.println("**********************************\n\nP R O P E R T I E S --printout:\n\n**********************************");
sysP.list(System.out);
}
}