package org.pitest.mutationtest.build; import static org.pitest.functional.prelude.Prelude.printWith; import java.io.File; import java.util.Collection; import org.pitest.classinfo.ClassName; import org.pitest.functional.SideEffect1; import org.pitest.functional.prelude.Prelude; import org.pitest.mutationtest.MutationConfig; import org.pitest.mutationtest.TimeoutLengthStrategy; import org.pitest.mutationtest.engine.MutationDetails; import org.pitest.mutationtest.execute.MutationTestProcess; import org.pitest.mutationtest.execute.MinionArguments; import org.pitest.process.ProcessArgs; import org.pitest.testapi.Configuration; import org.pitest.util.Log; import org.pitest.util.SocketFinder; public class WorkerFactory { private final String classPath; private final File baseDir; private final Configuration pitConfig; private final TimeoutLengthStrategy timeoutStrategy; private final boolean verbose; private final MutationConfig config; public WorkerFactory(final File baseDir, final Configuration pitConfig, final MutationConfig mutationConfig, final TimeoutLengthStrategy timeoutStrategy, final boolean verbose, final String classPath) { this.pitConfig = pitConfig; this.timeoutStrategy = timeoutStrategy; this.verbose = verbose; this.classPath = classPath; this.baseDir = baseDir; this.config = mutationConfig; } public MutationTestProcess createWorker( final Collection<MutationDetails> remainingMutations, final Collection<ClassName> testClasses) { final MinionArguments fileArgs = new MinionArguments(remainingMutations, testClasses, this.config.getEngine(), this.timeoutStrategy, Log.isVerbose(), this.pitConfig); final ProcessArgs args = ProcessArgs.withClassPath(this.classPath) .andLaunchOptions(this.config.getLaunchOptions()) .andBaseDir(this.baseDir).andStdout(captureStdOutIfVerbose()) .andStderr(printWith("stderr ")); final SocketFinder sf = new SocketFinder(); final MutationTestProcess worker = new MutationTestProcess( sf.getNextAvailableServerSocket(), args, fileArgs); return worker; } private SideEffect1<String> captureStdOutIfVerbose() { if (this.verbose) { return Prelude.printWith("stdout "); } else { return Prelude.noSideEffect(String.class); } } }