in project/SbtMultiJvm.scala [508:567]
def multiNode(
name: String,
classes: Seq[String],
marker: String,
defaultJava: String,
options: Options,
srcDir: File,
input: Boolean,
testJar: String,
hostsAndUsers: IndexedSeq[String],
javas: IndexedSeq[String],
targetDir: String,
createLogger: String => Logger,
log: Logger): (String, sbt.TestResult) = {
val logName = "* " + name
log.info(logName)
val classesHostsJavas = getClassesHostsJavas(classes, hostsAndUsers, javas, defaultJava)
val hosts = classesHostsJavas.map(_._2)
// TODO move this out, maybe to the hosts string as well?
val syncProcesses = classesHostsJavas.map {
case ((testClass, hostAndUser, java)) =>
(testClass + " sync", Jvm.syncJar(testJar, hostAndUser, targetDir, log))
}
val syncResult = processExitCodes(name, syncProcesses, log)
if (syncResult._2 == TestResult.Passed) {
val processes = classesHostsJavas.zipWithIndex.map {
case ((testClass, hostAndUser, java), index) => {
val jvmName = "JVM-" + (index + 1)
val jvmLogger = createLogger(jvmName)
val className = multiSimpleName(testClass)
val optionsFile = (srcDir ** (className + ".opts")).get.headOption
val optionsFromFile = optionsFile
.map(IO.read(_))
.map(_.trim.replace("\\n", " ").split("\\s+").toList)
.getOrElse(Seq.empty[String])
val multiNodeOptions = getMultiNodeCommandLineOptions(hosts, index, classes.size)
val allJvmOptions = options.jvm ++ optionsFromFile ++ options.extra(className) ++ multiNodeOptions
val runOptions = options.run(testClass)
val connectInput = input && index == 0
log.debug("Starting %s for %s".format(jvmName, testClass))
log.debug(" with JVM options: %s".format(allJvmOptions.mkString(" ")))
(
testClass,
Jvm.forkRemoteJava(
java,
allJvmOptions,
runOptions,
testJar,
hostAndUser,
targetDir,
jvmLogger,
connectInput,
log))
}
}
processExitCodes(name, processes, log)
} else {
syncResult
}
}