All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.evosuite.executionmode.Continuous Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite 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
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
package org.evosuite.executionmode;

import java.io.*;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.evosuite.Properties;
import org.evosuite.classpath.ClassPathHacker;
import org.evosuite.classpath.ClassPathHandler;
import org.evosuite.continuous.ContinuousTestGeneration;
import org.evosuite.continuous.CtgConfiguration;
import org.evosuite.utils.LoggingUtils;
import org.evosuite.utils.SpawnProcessKeepAliveChecker;

public class Continuous {

	public enum Command {EXECUTE, INFO, CLEAN};

	public static final String NAME = "continuous";

	public static Option getOption(){
		String description = "Run Continuous Test Generation (CTG).";
		description += " Valid values are: " + Arrays.toString(Command.values());
		return new Option(NAME,true,description);
	}

	public static Object execute(Options options, List javaOpts, CommandLine line) {

		String opt = line.getOptionValue(NAME);
		if(opt == null){
			LoggingUtils.getEvoLogger().error("Missing option for -"+NAME+". Use any of "+Arrays.toString(Command.values()));
			return null;
		}

		Command command = null;
		try{
			command = Command.valueOf(opt.toUpperCase());
		} catch(Exception e){
			LoggingUtils.getEvoLogger().error("Invalid option: "+opt+". Use any of "+Arrays.toString(Command.values()));
			return null;
		}

		String target = null;

		//we need to define 'target' only for execute mode
		if(line.hasOption("target") && command.equals(Command.EXECUTE)){
			target = line.getOptionValue("target");				
		}


		String cp = ClassPathHandler.getInstance().getTargetProjectClasspath();

		/*
		 * Setup the classpath
		 */
		for (String classPathElement : cp.split(File.pathSeparator)) {			
			try {
				ClassPathHacker.addFile(classPathElement);
			} catch (IOException e) {
				// Ignore?
			}
		}

		String prefix = "";
		if (line.hasOption("prefix")) {
			prefix = line.getOptionValue("prefix");
		} 

		String[] cuts = null;
		if(Properties.CTG_SELECTED_CUTS != null && !Properties.CTG_SELECTED_CUTS.isEmpty()){
			cuts  = Properties.CTG_SELECTED_CUTS.trim().split(",");
		} else if(Properties.CTG_SELECTED_CUTS_FILE_LOCATION != null && !Properties.CTG_SELECTED_CUTS_FILE_LOCATION.isEmpty()){
			File file = new File(Properties.CTG_SELECTED_CUTS_FILE_LOCATION);
			if(file.exists()){
				String cutLine = null;
				try(InputStream in = new BufferedInputStream(new FileInputStream(file))){
					Scanner scanner = new Scanner(in);
					cutLine = scanner.nextLine();
				} catch(Exception e){
					LoggingUtils.getEvoLogger().error("Error while processing "+file.getAbsolutePath()+" : "+e.getMessage());
				}
				if(cutLine != null){
					cuts = cutLine.trim().split(",");
				}
			}
		}

		ContinuousTestGeneration ctg = new ContinuousTestGeneration(
				target,
				cp,
				prefix,
				CtgConfiguration.getFromParameters(),
				cuts,
				Properties.CTG_EXPORT_FOLDER
				);

		/*
		 * Based on command line option, execute one of the different CTG command
		 */
		if(command.equals(Command.EXECUTE)){

			if(Properties.SPAWN_PROCESS_MANAGER_PORT == null){
				//CTG can be very risky to keep running without a spawn process manager
				int port = SpawnProcessKeepAliveChecker.getInstance().startServer();
				Properties.SPAWN_PROCESS_MANAGER_PORT = port;
			}

			String result = ctg.execute();
			LoggingUtils.getEvoLogger().info(result);
		} else if(command.equals(Command.CLEAN)){
			boolean cleaned = ctg.clean();
			if(cleaned){
				LoggingUtils.getEvoLogger().info("Cleaned all project data");
			} else {
				LoggingUtils.getEvoLogger().info("Failed to clean project");
			}
		} else { //INFO
			String info = ctg.info();
			LoggingUtils.getEvoLogger().info(info);
		}

		return null;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy