package org.pitest.mutationtest.tooling; import java.io.File; import java.io.IOException; import java.io.Reader; import java.util.Map; import org.pitest.classpath.ClassPath; import org.pitest.classpath.ClassPathByteArraySource; import org.pitest.classpath.CodeSource; import org.pitest.classpath.ProjectClassPaths; import org.pitest.coverage.CoverageGenerator; import org.pitest.coverage.execute.CoverageOptions; import org.pitest.coverage.execute.DefaultCoverageGenerator; import org.pitest.functional.Option; import org.pitest.mutationtest.HistoryStore; import org.pitest.mutationtest.MutationResultListenerFactory; import org.pitest.mutationtest.config.PluginServices; import org.pitest.mutationtest.config.ReportOptions; import org.pitest.mutationtest.config.SettingsFactory; import org.pitest.mutationtest.incremental.WriterFactory; import org.pitest.mutationtest.incremental.XStreamHistoryStore; import org.pitest.process.JavaAgent; import org.pitest.process.LaunchOptions; import org.pitest.util.ResultOutputStrategy; import org.pitest.util.Timings; public class EntryPoint { /** * Convenient entry point for tools to run mutation analysis. * * The big grab bag of config stored in ReportOptions must be setup correctly * first. * * @param baseDir * directory from which analysis will be run * @param data * @param environmentVariables * */ public AnalysisResult execute(File baseDir, ReportOptions data, PluginServices plugins, Map<String, String> environmentVariables) { SettingsFactory settings = new SettingsFactory(data, plugins); return execute(baseDir, data, settings, environmentVariables); } /** * Entry point for tools with tool specific behaviour * * @param baseDir * directory from which analysis will be run * @param data * big mess of configuration options * @param settings * factory for various strategies. Override default to provide tool * specific behaviours */ public AnalysisResult execute(File baseDir, ReportOptions data, SettingsFactory settings, Map<String, String> environmentVariables) { final ClassPath cp = data.getClassPath(); final Option<Reader> reader = data.createHistoryReader(); final WriterFactory historyWriter = data.createHistoryWriter(); // workaround for apparent java 1.5 JVM bug . . . might not play nicely // with distributed testing final JavaAgent jac = new JarCreatingJarFinder( new ClassPathByteArraySource(cp)); final KnownLocationJavaAgentFinder ja = new KnownLocationJavaAgentFinder( jac.getJarLocation().value()); final ResultOutputStrategy reportOutput = settings.getOutputStrategy(); final MutationResultListenerFactory reportFactory = settings .createListener(); final CoverageOptions coverageOptions = settings.createCoverageOptions(); final LaunchOptions launchOptions = new LaunchOptions(ja, settings.getJavaExecutable(), data.getJvmArgs(), environmentVariables); final ProjectClassPaths cps = data.getMutationClassPaths(); final CodeSource code = new CodeSource(cps, coverageOptions.getPitConfig() .testClassIdentifier()); final Timings timings = new Timings(); final CoverageGenerator coverageDatabase = new DefaultCoverageGenerator( baseDir, coverageOptions, launchOptions, code, settings.createCoverageExporter(), timings, !data.isVerbose()); final HistoryStore history = new XStreamHistoryStore(historyWriter, reader); final MutationStrategies strategies = new MutationStrategies( settings.createEngine(), history, coverageDatabase, reportFactory, reportOutput); final MutationCoverage report = new MutationCoverage(strategies, baseDir, code, data, settings, timings); try { return AnalysisResult.success(report.runReport()); } catch (final IOException e) { return AnalysisResult.fail(e); } finally { jac.close(); ja.close(); historyWriter.close(); } } }