/**
* Copyright (C) 2010-2017 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 <http://www.gnu.org/licenses/>.
*/
package org.evosuite.eclipse.popup.actions;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.BooleanLiteral;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MemberValuePair;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.NormalAnnotation;
import org.eclipse.jdt.ui.actions.OrganizeImportsAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.evosuite.EvoSuite;
import org.evosuite.Properties;
import org.evosuite.classpath.ResourceList;
import org.evosuite.eclipse.Activator;
import org.evosuite.eclipse.properties.EvoSuitePreferencePage;
import org.evosuite.eclipse.properties.EvoSuitePropertyPage;
import org.evosuite.eclipse.quickfixes.MarkerWriter;
import org.evosuite.result.TestGenerationResult;
import org.evosuite.rmi.MasterServices;
import org.evosuite.rmi.service.ClientState;
import org.evosuite.rmi.service.ClientStateInformation;
import org.evosuite.rmi.service.MasterNodeLocal;
/**
* @author Gordon Fraser, Thomas White, Jose Miguel Rojas
*
*/
public class TestGenerationJob extends Job {
protected final String targetClass;
protected final String suiteClass;
protected final IResource target;
protected final Shell shell;
protected boolean running = false;
protected boolean stopped = false;
protected boolean writeAllMarkers = true;
protected ClientStateInformation lastState = null;
protected String lastTest = "";
protected static final double SEED_CHANCE = 0.2;
protected final String ENCODING = "UTF-8";
protected String classPath;
protected final Map<String, Double> coverage = null;
public TestGenerationJob(Shell shell, final IResource target, String targetClass) {
this(shell, target, targetClass, null);
}
public IResource getTarget() {
return target;
}
public TestGenerationJob(Shell shell, final IResource target, String targetClassName, String suiteClassName) {
super("EvoSuite Test Generation: " + targetClassName);
this.targetClass = targetClassName;
if (suiteClassName == null || suiteClassName.isEmpty()) {
String tmp = targetClassName.replace('.', File.separatorChar);
suiteClassName = new String(tmp + Properties.JUNIT_SUFFIX + ".java");
}
this.suiteClass = suiteClassName;
this.target = target;
this.shell = shell;
IJavaProject jProject = JavaCore.create(target.getProject());
try {
classPath = target.getWorkspace().getRoot().findMember(jProject.getOutputLocation()).getLocation().toOSString();
} catch (JavaModelException e) {
e.printStackTrace();
classPath = "";
}
}
@Override
protected IStatus run(final IProgressMonitor monitor) {
Boolean disabled = System.getProperty("evosuite.disable") != null; // && System.getProperty("evosuite.disable").equals("1")
if ( disabled ) {
System.out.println("TestGenerationJob: The EvoSuite plugin is disabled :(");
return Status.OK_STATUS;
}
final String suiteFileName = getSuiteFileName(suiteClass);
final IFile fileSuite = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(suiteFileName));
if ( fileSuite != null && fileSuite.exists()) {
// Open test suite in editor
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
IWorkbenchWindow iw = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = iw.getActivePage();
try {
IDE.openEditor(page, fileSuite, true);
} catch (PartInitException e1) {
System.out.println("Could not open test suite");
e1.printStackTrace();
}
}
});
// Generated tests should be checked by tester?
Boolean checkMarkers = System.getProperty("evosuite.markers.enforce") != null;
if ( checkMarkers ) {
String fileContents = readFileToString(suiteFileName);
ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setStatementsRecovery(true);
@SuppressWarnings("unchecked")
Map<String, String> COMPILER_OPTIONS = new HashMap<String, String>(JavaCore.getOptions());
COMPILER_OPTIONS.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7);
COMPILER_OPTIONS.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7);
COMPILER_OPTIONS.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);
parser.setUnitName(suiteClass);
String[] encodings = { ENCODING };
String[] classpaths = { classPath };
String[] sources = { new File(suiteFileName).getParent() };
parser.setEnvironment(classpaths, sources, encodings, true);
parser.setSource(fileContents.toCharArray());
CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);
final List<String> uncheckedMethods = new ArrayList<String>();
compilationUnit.accept(new ASTVisitor() {
@Override
public boolean visit(MemberValuePair node) {
if (node.getName().toString().equals("checked") && ! ((BooleanLiteral)node.getValue()).booleanValue()) {
NormalAnnotation ann = (NormalAnnotation) node.getParent();
MethodDeclaration method = (MethodDeclaration)ann.getParent();
uncheckedMethods.add(method.getName().toString());
return false;
}
return true;
}
});
if (uncheckedMethods.size() > 0) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
MessageDialog dialog = new MessageDialog(
shell,
"JUnit test suite contains unit tests that need to be checked",
null, // image
"The JUnit test suite "
+ suiteClass
+ " contains test cases that need to be checked:\n"
+ uncheckedMethods.toString(),
MessageDialog.OK, new String[] { "Ok" }, 0);
dialog.open();
}
});
return Status.OK_STATUS;
}
} else
System.out.println("Not checking markers.");
} else {
System.out.println("File " + suiteFileName + " does not exist");
// TODO: Dialog
// Display.getDefault().syncExec(new Runnable() {
// @Override
// public void run() {
// MessageDialog dialog = new MessageDialog(
// shell,
// "Error during test generation",
// null, // image
// "EvoSuite failed to generate tests for class"
// + suiteClass,
// MessageDialog.OK, new String[] { "Ok" }, 0);
// dialog.open();
// }
// });
// return Status.CANCEL_STATUS;
}
setThread(new Thread());
running = true;
clearMarkersTarget();
String oldTgr = getOldTestGenerationResult();
lastTest = oldTgr;
ArrayList<TestGenerationResult> results = runEvoSuite(monitor);
writeMarkersTarget(results);
//uncomment after experiment
if (writeAllMarkers)
writeMarkersTestSuite();
try {
target.getProject().refreshLocal(IProject.DEPTH_INFINITE, null);
// if ("true".equals(target.getProject().getPersistentProperty(
// EvoSuitePropertyPage.REPORT_PROP_KEY))) {
// syncWithUi(target);
// };
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
try {
final IFile generatedSuite = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(suiteFileName));
ICompilationUnit cu=JavaCore.createCompilationUnitFrom(generatedSuite);
IWorkbenchWindow iw = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = iw.getActivePage();
IEditorPart part = IDE.openEditor(page, generatedSuite, true);
if ( Activator.organizeImports() ) {
OrganizeImportsAction a=new OrganizeImportsAction(part.getSite());
a.run(cu);
cu.commitWorkingCopy(true, null);
cu.save(null, true);
}
} catch (PartInitException e1) {
System.out.println("Could not open test suite to organize imports");
e1.printStackTrace();
} catch (JavaModelException e) {
System.out.println("Something went wrong while saving test suite after organizing imports");
e.printStackTrace();
};
}});
} catch (CoreException e) {
System.out.println("Dear me");
e.printStackTrace();
}
Activator.CURRENT_WRITING_FILE = null;
running = false;
monitor.done();
done(ASYNC_FINISH);
Activator.FILE_QUEUE.update();
return Status.OK_STATUS;
}
protected ArrayList<TestGenerationResult> runEvoSuite(final IProgressMonitor monitor) {
monitor.beginTask("EvoSuite test suite generation", 100);
ArrayList<TestGenerationResult> tgrs = new ArrayList<TestGenerationResult>();
try {
List<String> commands = createCommand();
commands.addAll(getAdditionalParameters());
String[] command = new String[commands.size()];
commands.toArray(command);
System.out.println("* EvoSuite command: " + Arrays.asList(command));
setupRMI();
Thread progressMonitor = new Thread() {
@Override
public void run() {
int percent = 0;
int last = 0;
String subTask = "";
//try {
while (percent != -1 && !isInterrupted()) {
MasterNodeLocal masterNode = MasterServices
.getInstance().getMasterNode();
if (masterNode != null) {
Collection<ClientStateInformation> currentStates = MasterServices
.getInstance().getMasterNode()
.getCurrentStateInformation();
if (currentStates.size() == 1) {
ClientStateInformation currentState = currentStates
.iterator().next();
lastState = currentState;
percent = currentState.getOverallProgress();
if (percent >= 100
&& currentState.getState() == ClientState.NOT_STARTED)
continue;
String currentTask = currentState
.getState().getDescription();
// + " ["
// + currentState.getState()
// .getOverallProgress()
// + "%]";
if (percent > last || !subTask.equals(currentTask)) {
subTask = currentTask;
monitor.worked(percent - last);
monitor.subTask(subTask);
last = percent;
}
}
}
try {
sleep(250); // TODO - should use observer pattern
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("* Shut down progress monitor");
}
//} catch (Exception e) {
// System.err.println(this.getClass().getCanonicalName() + ": Exception while reading output of client process " + e);
// System.err.println(e.getStackTrace().toString());
//}
}
}
};
progressMonitor.start();
tgrs = launchProcess(command);
progressMonitor.interrupt();
try {
target.getProject().refreshLocal(IProject.DEPTH_INFINITE, null);
} catch (CoreException e) {
e.printStackTrace();
}
System.out.println("Job returned normally");
monitor.done();
/*
GenerationResult result = new GenerationResult(shell, SWT.DIALOG_TRIM
| SWT.APPLICATION_MODAL);
result.open();
return Status.OK_STATUS;
*/
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
return tgrs;
}
private String buildProjectCP() throws JavaModelException {
IJavaProject jProject = JavaCore.create(target.getProject());
IClasspathEntry[] oldEntries = jProject.getRawClasspath();
String classPath = "";
boolean first = true;
for (int i = 0; i < oldEntries.length; i++) {
IClasspathEntry curr = oldEntries[i];
System.out.println("Current entry: " + curr.getPath());
if (curr.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
IPath path = curr.getPath();
if (path.toFile().getName().startsWith("evosuite")) {
System.out.println("Skipping evosuite.jar");
continue;
}
if (!first)
classPath += File.pathSeparator;
else
first = false;
if (path.toFile().exists()) {
classPath += path.toOSString();
System.out.println("Adding CPE_LIBRARY to classpath: "
+ path.toOSString());
} else {
classPath += target.getWorkspace().getRoot()
.getLocation().toOSString()
+ path.toOSString();
System.out.println("Adding CPE_LIBRARY to classpath: "
+ target.getWorkspace().getRoot().getLocation()
.toOSString() + path.toOSString());
}
} else if (curr.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
if (curr.isExported()) {
if (curr.toString().equals(
"org.eclipse.jdt.launching.JRE_CONTAINER")) {
System.out.println("Found JRE container");
} else if (curr.toString().startsWith(
"org.eclipse.jdt.junit.JUNIT_CONTAINER")) {
System.out.println("Found JUnit container");
} else {
System.out.println("Found unknown container: "
+ curr);
}
} else {
System.out.println("Container not exported: " + curr);
}
} else if (curr.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
// Add binary dirs of this project to classpath
System.out.println("Don't handle CPE_PROJECT yet");
} else if (curr.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
System.out.println("Path: " + curr.getPath());
System.out.println("Resolved Path: "
+ JavaCore.getResolvedVariablePath(curr.getPath()));
if (!first)
classPath += File.pathSeparator;
else
first = false;
classPath += JavaCore.getResolvedVariablePath(curr
.getPath());
} else if (curr.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
System.out.println("Don't handle CPE_SOURCE yet");
} else {
System.out.println("CP type: " + curr.getEntryKind());
}
}
ResourceList.resetAllCaches();
if (!first)
classPath += File.pathSeparator;
classPath += target.getWorkspace().getRoot()
.findMember(jProject.getOutputLocation()).getLocation()
.toOSString();
return classPath;
}
@SuppressWarnings("unused")
private boolean isFinished(Process process) {
try {
process.exitValue();
return true;
} catch (IllegalThreadStateException ex) {
return false;
}
}
private ArrayList<TestGenerationResult> launchProcess(String[] evoSuiteOptions) throws IOException {
EvoSuite evosuite = new EvoSuite();
Vector<String> javaCmd = new Vector<String>();
// javaCmd.add("java");
// javaCmd.add("-jar");
// javaCmd.add(TestGenerationAction.getEvoSuiteJar());
Collections.addAll(javaCmd, evoSuiteOptions);
String[] command = javaCmd.toArray(new String[] {});
@SuppressWarnings("unchecked")
List<List<TestGenerationResult>> results = (List<List<TestGenerationResult>>) evosuite.parseCommandLine(command);
ArrayList<TestGenerationResult> tgrs = new ArrayList<TestGenerationResult>();
System.out.println("Results: "+results.size());
for(List<TestGenerationResult> list : results) {
for(TestGenerationResult result : list) {
tgrs.add(result);
System.out.println("Covered lines: " + result.getCoveredLines());
}
}
return tgrs;
// ProcessBuilder builder = new ProcessBuilder(command);
// builder.directory(new File(baseDir));
// builder.redirectErrorStream(true);
//
// Process process = builder.start();
// InputStream stdout = process.getInputStream();
// do {
// readInputStream("EvoSuite process output - ", stdout);
// } while (!isFinished(process));
}
@SuppressWarnings("unused")
private void readInputStream(String prefix, InputStream in) throws IOException {
InputStreamReader is = new InputStreamReader(in);
BufferedReader br = new BufferedReader(is);
String read = br.readLine();
while (read != null) {
System.out.println(prefix + read);
read = br.readLine();
}
}
protected void syncWithUi(final IResource target) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
GenerationResult result = new GenerationResult(shell,
SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL, target
.getProject().getLocation(), target);
result.open();
// MessageDialog.openInformation(shell, "Your Popup ", "Your job has finished.");
}
});
}
@SuppressWarnings("unused")
private void showFile(IPath targetFile) {
IWorkbench wb = PlatformUI.getWorkbench();
IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
IWorkbenchPage page = win.getActivePage();
try {
IDE.openEditor(page, ResourcesPlugin.getWorkspace().getRoot()
.getFileForLocation(targetFile));
} catch (PartInitException e2) {
//Put your exception handler here if you wish to.
System.out.println("Error: " + e2);
}
}
protected List<String> createCommand() throws CoreException {
List<String> commands = new ArrayList<String>();
String classPath = buildProjectCP();
String baseDir = target.getProject().getLocation().toOSString();
Properties.TARGET_CLASS = targetClass;
int time = Activator.getDefault().getPreferenceStore().getInt("runtime");
commands.addAll(Arrays.asList(new String[] {
"-generateSuite",
"-class", targetClass,
"-evosuiteCP", TestGenerationAction.getEvoSuiteJar(),
"-projectCP", classPath,
"-base_dir", baseDir,
"-Dshow_progress=false",
"-Dstopping_condition=TimeDelta",
"-Dtest_comments=false", // "true"
"-Dsearch_budget=" + time,
"-Dassertion_timeout=" + time,
"-Dpure_inspectors=true",
"-Dnew_statistics=false"
// "-Dsandbox_mode=IO",
// "-Djava.rmi.server.codebase=file:///Remote/evosuite-0.1-SNAPSHOT-jar-minimal.jar"
}));
if ( System.getProperty("evosuite.experiment") != null ) {
commands.add("-Declipse_plugin=true");
}
String budget = target.getProject().getPersistentProperty(
EvoSuitePropertyPage.TIME_PROP_KEY);
if (budget == null) {
commands.add("-Dsearch_budget=20");
} else {
commands.add("-Dsearch_budget=" + budget);
}
String globalBudget = target.getProject().getPersistentProperty(
EvoSuitePropertyPage.GLOBAL_TIME_PROP_KEY);
if (globalBudget == null) {
commands.add("-Dglobal_timeout=60");
} else {
commands.add("-Dglobal_timeout=" + globalBudget);
}
;
if ("false".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.ASSERTION_PROP_KEY))) {
commands.add("-Dassertions=false");
} else {
commands.add("-Dassertions=true");
}
if ("false".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.MINIMIZE_TESTS_PROP_KEY))) {
commands.add("-Dminimize=false");
} else {
commands.add("-Dminimize=true");
}
if (!"false".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.MINIMIZE_VALUES_PROP_KEY))) {
commands.add("-Dminimize_values=true");
} else {
commands.add("-Dminimize_values=false");
}
// if (!"true".equals(target.getProject().getPersistentProperty(EvosuitePropertyPage.RUNNER_PROP_KEY))) {
// // commands.add("-Djunit_runner=false");
// commands.add("-Dreplace_calls=false");
//} else {
// commands.add("-Djunit_runner=true");
if ("true".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.DETERMINISTIC_PROP_KEY))) {
commands.add("-Dreplace_calls=true");
commands.add("-Dreplace_system_in=true");
commands.add("-Dreset_static_fields=true");
commands.add("-Dvirtual_fs=true");
} else {
commands.add("-Dreplace_calls=false");
commands.add("-Dreplace_system_in=false");
commands.add("-Dreset_static_fields=false");
commands.add("-Dvirtual_fs=false");
}
// }
// if (!"true".equals(target.getProject().getPersistentProperty(
// EvoSuitePropertyPage.REPORT_PROP_KEY))) {
// //commands.add("-Dstatistics_backend=none");
// } else {
// if ("true".equals(target.getProject().getPersistentProperty(
// EvoSuitePropertyPage.PLOT_PROP_KEY))) {
// commands.add("-Dplot=true");
// }
// }
if ("false".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.SANDBOX_PROP_KEY))) {
commands.add("-Dsandbox=false");
}
if ("false".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.SCAFFOLDING_PROP_KEY))) {
commands.add("-Dtest_scaffolding=false");
commands.add("-Dno_runtime_dependency=true");
}
if ("true".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.CONTRACTS_PROP_KEY))) {
commands.add("-Dcheck_contracts=true");
}
if ("true".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.ERROR_BRANCHES_PROP_KEY))) {
commands.add("-Derror_branches=true");
}
if ("true".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.DSE_PROP_KEY)) ||
"true".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.LS_PROP_KEY))) {
commands.add("-Dlocal_search_rate=10");
commands.add("-Dlocal_search_probability=1.0");
commands.add("-Dlocal_search_adaptation_rate=1.0");
commands.add("-Dlocal_search_selective=true");
// commands.add("-Dlocal_search_selective_primitives=false");
//commands.add("-Dlocal_search_dse=suite");
commands.add("-Dlocal_search_budget_type=time");
commands.add("-Dlocal_search_budget=15");
}
if ("true".equals(target.getProject().getPersistentProperty(
EvoSuitePropertyPage.DSE_PROP_KEY))) {
// commands.add("-Dlocal_search_rate=1");
// commands.add("-Dlocal_search_probability=1.0");
// commands.add("-Dlocal_search_adaptation_rate=1.0");
// commands.add("-Dlocal_search_selective=false");
// commands.add("-Dlocal_search_selective_primitives=false");
commands.add("-Dlocal_search_dse=suite");
// commands.add("-Dlocal_search_budget_type=time");
// commands.add("-Dlocal_search_budget=15");
}
// if ("true".equals(target.getProject().getPersistentProperty(
// EvosuitePropertyPage.LS_PROP_KEY))) {
// commands.add("-Dlocal_search_rate=1");
// commands.add("-Dlocal_search_probability=1.0");
// commands.add("-Dlocal_search_adaptation_rate=1.0");
// commands.add("-Dlocal_search_selective=false");
// commands.add("-Dlocal_search_selective_primitives=false");
// commands.add("-Dlocal_search_dse=suite");
// commands.add("-Dlocal_search_budget_type=time");
// commands.add("-Dlocal_search_budget=15");
// }
String suffix = target.getProject().getPersistentProperty(
EvoSuitePropertyPage.TEST_SUFFIX_PROP_KEY);
if(suffix != null) {
commands.add("-Djunit_suffix="+suffix);
}
/*
String seed = target.getProject().getPersistentProperty(
EvosuitePropertyPage.SEED_PROP_KEY);
if (seed != null) {
commands.add("-seed");
commands.add(seed);
}
*/
String criterion = target.getProject().getPersistentProperty(
EvoSuitePropertyPage.CRITERIA_PROP_KEY);
if (criterion != null) {
commands.add("-criterion");
commands.add(criterion);
}
if (Activator.getDefault().getPreferenceStore().getBoolean(EvoSuitePreferencePage.TEST_COMMENTS)) {
commands.add("-Dtest_comments=true");
}
return commands;
}
private void createIFolder(IFolder folder) throws CoreException {
if (!folder.exists()) {
createIFolder((IFolder) folder.getParent());
folder.create(IResource.NONE, true, null);
}
}
private void saveTestGenerationResult(TestGenerationResult result) {
if (target.getProject() != null) {
int lastDot = targetClass.lastIndexOf(".");
String filePackage = "";
if (lastDot >= 1) {
filePackage = targetClass.substring(0, lastDot);
}
IProject project = target.getProject();
IFolder folder;
if (filePackage.length() == 0) {
folder = project.getFolder("evosuite-tests/data");
} else {
folder = project.getFolder("evosuite-tests/data/"
+ filePackage.replace('.', '/'));
}
if (!folder.exists()) {
try {
createIFolder(folder);
} catch (CoreException e) {
e.printStackTrace();
}
}
IFile file = folder.getFile(target.getName() + ".gadata");
if (file.exists()) {
try {
file.delete(true, null);
} catch (CoreException e) {
e.printStackTrace();
}
}
try {
while (!file.getParent().exists()) {
IContainer icont = file.getParent();
while (!icont.getParent().exists()) {
if (icont.getParent() == null) {
icont = (IContainer) ResourcesPlugin.getWorkspace();
}
}
IFolder f = project.getFolder(icont
.getProjectRelativePath());
f.create(IResource.NONE, true, null);
}
file.create(new ByteArrayInputStream("".getBytes()), true, null);
FileOutputStream fos = new FileOutputStream(file.getLocation()
.toOSString());
ObjectOutputStream oo = new ObjectOutputStream(fos);
oo.writeObject(result);
// close stream
oo.close();
// file.create(s, IResource.NONE, null);
} catch (IOException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
}
}
}
protected String getOldTestGenerationResult() {
if (target.getProject() != null) {
IProject project = target.getProject();
int lastDot = targetClass.lastIndexOf(".");
String filePackage = "";
if (lastDot >= 1) {
filePackage = targetClass.substring(0, lastDot);
}
IFolder folder;
if (filePackage.length() == 0) {
folder = project.getFolder("evosuite-tests/data");
} else {
folder = project.getFolder("evosuite-tests/data/"
+ filePackage.replace('.', '/'));
}
IFile file = folder.getFile(target.getName() + ".gadata");
return file.getLocation().toOSString();
}
return "";
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.Job#canceling()
*/
@Override
protected void canceling() {
System.out.println("Trying to cancel job");
if (MasterServices.getInstance() != null
&& MasterServices.getInstance().getMasterNode() != null) {
MasterServices.getInstance().getMasterNode().cancelAllClients();
}
super.canceling();
}
/**
* Getting RMI to work in Eclipse is tricky. These hacks are necessary,
* otherwise it won't work
*/
protected void setupRMI() {
// RMI only runs if there is a security manager
if (System.getSecurityManager() == null) {
// As there is no security manager, we can just put a dumb security
// manager that allows everything here, just to make RMI happy
System.setSecurityManager(new DumbSecurityManager());
}
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
}
protected void clearMarkersTarget() {
try {
MarkerWriter.clearMarkers(target);
} catch (CoreException e) {
e.printStackTrace();
}
}
protected void writeMarkersTarget(ArrayList<TestGenerationResult> results) {
clearMarkersTarget();
if (Activator.markersEnabled()) {
System.out.println("********** Writing markers in target class " + targetClass);
for (TestGenerationResult result : results) {
// any lines covered?
if (result.getCoveredLines().size() > 0) {
if (!stopped) {
MarkerWriter.write(target, result);
}
saveTestGenerationResult(result);
}
}
} else
System.out.println("********** Markers are disabled");
}
protected String getSuiteFileName(String suiteClass) {
String tmp = suiteClass.replace('.', File.separatorChar);
String testClassFileName = new String(target.getProject().getLocation() + "/evosuite-tests/" + tmp + ".java");
return testClassFileName;
}
protected void writeMarkersTestSuite() {
if (Activator.markersEnabled()) {
System.out.println("********** Writing markers in test suite" + suiteClass);
String testClassFileName = getSuiteFileName(suiteClass);
final IFile fileTestClass = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(testClassFileName));
String fileContents = readFileToString(testClassFileName);
if (fileContents.isEmpty()) {
System.out.println("Not writing markers in test suite " + testClassFileName + " (not found)");
return;
}
ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setStatementsRecovery(true);
@SuppressWarnings("unchecked")
Map<String, String> COMPILER_OPTIONS = new HashMap<String, String>(JavaCore.getOptions());
COMPILER_OPTIONS.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_7);
COMPILER_OPTIONS.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_7);
COMPILER_OPTIONS.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_7);
parser.setUnitName(suiteClass);
String[] encodings = { ENCODING };
String[] classpaths = { classPath };
String[] sources = { new File(testClassFileName).getParent() };
parser.setEnvironment(classpaths, sources, encodings, true);
parser.setSource(fileContents.toCharArray());
CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);
MethodExtractingVisitor visitor = new MethodExtractingVisitor();
compilationUnit.accept(visitor);
List<MethodDeclaration> methods = visitor.getMethods();
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
IWorkbenchWindow iw = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = iw.getActivePage();
try {
IDE.openEditor(page, fileTestClass, true);
} catch (PartInitException e1) {
System.out.println("Could not open test suite");
e1.printStackTrace();
}
}
});
for (MethodDeclaration m : methods) {
int lineNumber = compilationUnit.getLineNumber(m.getStartPosition());
try {
IMarker mark = fileTestClass.createMarker("EvoSuiteQuickFixes.newtestmarker");
mark.setAttribute(IMarker.MESSAGE, "This test case needs to be verified.");
mark.setAttribute(IMarker.LINE_NUMBER, lineNumber);
mark.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
mark.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
mark.setAttribute(IMarker.LOCATION, fileTestClass.getName());
mark.setAttribute(IMarker.CHAR_START, m.getStartPosition());
mark.setAttribute(IMarker.CHAR_END, m.getStartPosition() + 1);
} catch (CoreException e) {
e.printStackTrace();
}
}
} else
System.out.println("********** Markers are disabled");
}
public static String readFileToString(String fileName) {
StringBuilder content = new StringBuilder();
try {
Reader reader = new InputStreamReader(
new FileInputStream(fileName), "utf-8");
BufferedReader in = new BufferedReader(reader);
try {
String str;
while ((str = in.readLine()) != null) {
content.append(str); content.append("\n");
}
} finally {
in.close();
}
} catch (FileNotFoundException fnfe) {
System.out.println("File not found " + fileName);
return "";
} catch (Exception e) {
e.printStackTrace();
}
return content.toString();
}
public boolean isRunning() {
return running;
}
public List<String> getAdditionalParameters() {
List<String> parameters = new ArrayList<String>();
parameters.add("-Dtest_dir=" + target.getProject().getLocation() + "/evosuite-tests");
return parameters;
}
}