diff options
author | Paul Phillips <paulp@improving.org> | 2011-01-19 03:54:08 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-01-19 03:54:08 +0000 |
commit | 9d29de3084b4aab3aa01b9e2b91ea9ced0358a2c (patch) | |
tree | 843fa88b7c9184ddd324ce9cb434f277fa1993ac /src | |
parent | d6816e01433d88b474bbd0a7290bdc96890b9f37 (diff) | |
download | scala-9d29de3084b4aab3aa01b9e2b91ea9ced0358a2c.tar.gz scala-9d29de3084b4aab3aa01b9e2b91ea9ced0358a2c.tar.bz2 scala-9d29de3084b4aab3aa01b9e2b91ea9ced0358a2c.zip |
Simplifying some partest internal structure.
Diffstat (limited to 'src')
-rw-r--r-- | src/partest/scala/tools/partest/nest/DirectRunner.scala | 4 | ||||
-rw-r--r-- | src/partest/scala/tools/partest/nest/FileManager.scala | 6 | ||||
-rw-r--r-- | src/partest/scala/tools/partest/nest/Worker.scala | 153 |
3 files changed, 82 insertions, 81 deletions
diff --git a/src/partest/scala/tools/partest/nest/DirectRunner.scala b/src/partest/scala/tools/partest/nest/DirectRunner.scala index 2b0c55d4d7..52bdb10b54 100644 --- a/src/partest/scala/tools/partest/nest/DirectRunner.scala +++ b/src/partest/scala/tools/partest/nest/DirectRunner.scala @@ -41,7 +41,7 @@ trait DirectRunner { * signs of dementia. */ private var workers: List[Worker] = Nil - private var logsToDelete: List[LogFile] = Nil + private var logsToDelete: List[File] = Nil private var outdirsToDelete: List[File] = Nil private val results = new mutable.HashMap[String, Int]() private def addResults(kvs: Traversable[(String, Int)]) = synchronized { results ++= kvs } @@ -83,7 +83,7 @@ trait DirectRunner { workers foreach { w => receiveWithin(3600 * 1000) { case Results(res, logs, outdirs) => - logsToDelete ++= (logs filter (_.toDelete)) + logsToDelete ++= logs outdirsToDelete ++= outdirs addResults(res) case TIMEOUT => diff --git a/src/partest/scala/tools/partest/nest/FileManager.scala b/src/partest/scala/tools/partest/nest/FileManager.scala index b0b0c326e4..5689c71134 100644 --- a/src/partest/scala/tools/partest/nest/FileManager.scala +++ b/src/partest/scala/tools/partest/nest/FileManager.scala @@ -62,10 +62,10 @@ trait FileManager { testTimings.toList sortBy (-_._2) foreach { case (k, v) => println("%s: %s".format(k, v)) } } - def getLogFile(dir: File, fileBase: String, kind: String): LogFile = - new LogFile(dir, fileBase + "-" + kind + ".log") + def getLogFile(dir: File, fileBase: String, kind: String): File = + new File(dir, fileBase + "-" + kind + ".log") - def getLogFile(file: File, kind: String): LogFile = { + def getLogFile(file: File, kind: String): File = { val dir = file.getParentFile val fileBase = basename(file.getName) diff --git a/src/partest/scala/tools/partest/nest/Worker.scala b/src/partest/scala/tools/partest/nest/Worker.scala index 3be3c34a62..ad09baae23 100644 --- a/src/partest/scala/tools/partest/nest/Worker.scala +++ b/src/partest/scala/tools/partest/nest/Worker.scala @@ -27,9 +27,17 @@ import scala.tools.nsc.interactive.{ BuildManager, RefinedBuildManager } import scala.sys.process._ case class RunTests(kind: String, files: List[File]) -case class Results(results: Map[String, Int], logs: List[LogFile], outdirs: List[File]) +case class Results(results: Map[String, Int], logs: List[File], outdirs: List[File]) -case class LogContext(file: LogFile, writers: Option[(StringWriter, PrintWriter)]) +class LogContext(val file: File, val writers: Option[(StringWriter, PrintWriter)]) + +object LogContext { + def apply(file: File, swr: StringWriter, wr: PrintWriter): LogContext = { + require (file != null) + new LogContext(file, Some((swr, wr))) + } + def apply(file: File): LogContext = new LogContext(file, None) +} abstract class TestResult { def file: File @@ -37,10 +45,6 @@ abstract class TestResult { case class Result(override val file: File, context: LogContext) extends TestResult case class Timeout(override val file: File) extends TestResult -class LogFile(parent: File, child: String) extends File(parent, child) { - var toDelete = false -} - class ScalaCheckFileManager(val origmanager: FileManager) extends FileManager { def testRootDir: Directory = origmanager.testRootDir def testRootPath: String = origmanager.testRootPath @@ -127,9 +131,12 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor * I can see what they're doing when the world comes to a premature stop. */ private val filesRemaining = new mutable.HashSet[File] - private def addFilesRemaining(xs: Traversable[File]) = synchronized { filesRemaining ++= xs } private var currentTestFile: File = _ private var currentFileStart: Long = System.currentTimeMillis + private val logsToDelete = new mutable.HashSet[File] + + private def addFilesRemaining(xs: Traversable[File]) = synchronized { filesRemaining ++= xs } + private def addLogToDelete(f: File) = synchronized { logsToDelete += f } def currentFileElapsed = (System.currentTimeMillis - currentFileStart) / 1000 def forceTimeout() = { @@ -162,25 +169,26 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor new java.util.Date() ) } - private def getNextFile(): File = synchronized { - if (filesRemaining.isEmpty) null + private def getNextFile(): File = { + if (filesRemaining.isEmpty) { + currentTestFile = null + } else { currentTestFile = filesRemaining.head filesRemaining -= currentTestFile currentFileStart = System.currentTimeMillis - currentTestFile } + + currentTestFile } // maps canonical file names to the test result (0: OK, 1: FAILED, 2: TIMOUT) private val status = new mutable.HashMap[String, Int] - private def updateStatus(key: String, num: Int) = synchronized { - status(key) = num - } + private def updateStatus(key: String, num: Int) = status(key) = num + override def toString = ( ">> Partest Worker in state " + getState + ":\n" + currentFileString + "\n" + "There are " + filesRemaining.size + " files remaining:\n" + - filesRemaining.toList.sortBy(_.toString).map(" " + _ + "\n").mkString("") + "\nstatus hashmap contains " + status.size + " entries:\n" + status.toList.map(x => " " + x._1 + " -> " + x._2).sorted.mkString("\n") + "\n" ) @@ -230,10 +238,10 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor } var log = "" - var createdLogFiles: List[LogFile] = Nil + var createdLogFiles: List[File] = Nil var createdOutputDirs: List[File] = Nil - def createLogFile(file: File, kind: String): LogFile = { + def createLogFile(file: File, kind: String): File = { val logFile = fileManager.getLogFile(file, kind) createdLogFiles ::= logFile logFile @@ -422,7 +430,7 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor val logFile = createLogFile(file, kind) if (fileManager.failed && !logFile.canRead) - LogContext(logFile, None) + LogContext(logFile) else { val (swr, wr) = initNextTest() printInfoStart(file, wr) @@ -444,7 +452,7 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor } catch exHandler(logFile) - LogContext(logFile, Some((swr, wr))) + LogContext(logFile, swr, wr) } } @@ -695,11 +703,11 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor diffCheck(compareOutput(file, fileBase, kind, logFile)) } - LogContext(logFile, Some((swr, wr))) + LogContext(logFile, swr, wr) } else - LogContext(logFile, None) + LogContext(logFile) } else - LogContext(logFile, None) + LogContext(logFile) case "res" => { // simulate resident compiler loop @@ -779,9 +787,9 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor } fileManager.mapFile(logFile, "tmp", dir, replaceSlashes(dir, _)) diffCheck(compareOutput(dir, fileBase, kind, logFile)) - LogContext(logFile, Some((swr, wr))) + LogContext(logFile, swr, wr) } else - LogContext(logFile, None) + LogContext(logFile) } case "shootout" => { @@ -822,10 +830,10 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor diffCheck(compareOutput(dir, fileBase, kind, logFile)) } - LogContext(logFile, Some((swr, wr))) + LogContext(logFile, swr, wr) } else - LogContext(logFile, None) + LogContext(logFile) } case "scalap" => @@ -901,9 +909,9 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor succeeded = false } - LogContext(logFile, Some((swr, wr))) + LogContext(logFile, swr, wr) } else - LogContext(logFile, None) + LogContext(logFile) } } @@ -918,36 +926,32 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor val Timeout = 2 } - def reportResult(state: Int, logFile: Option[LogFile], writers: Option[(StringWriter, PrintWriter)]) { + def reportResult(state: Int, logFile: File, writers: Option[(StringWriter, PrintWriter)]) { val isGood = state == TestState.Ok val isFail = state == TestState.Fail val isTimeout = state == TestState.Timeout + val hasLog = logFile != null - if (!isGood) { + // delete log file only if test was successful + if (isGood && hasLog) { + if (!isPartestDebug) + addLogToDelete(logFile) + } + else { errors += 1 NestUI.verbose("incremented errors: "+errors) } - // delete log file only if test was successful - if (isGood && !isPartestDebug) - logFile foreach (_.toDelete = true) - writers foreach { case (swr, wr) => - if (swr == null || wr == null || fileManager == null || logFile.exists(_ == null)) { - NestUI.normal("Something is wrong, why are you sending nulls here?") - NestUI.normal(List(swr, wr, fileManager, logFile) mkString " ") - } - else { - if (isTimeout) printInfoTimeout(wr) - else printInfoEnd(isGood, wr) - wr.flush() - swr.flush() - NestUI.normal(swr.toString) - if (isFail && fileManager.showDiff && diff != "") - NestUI.normal(diff) - if (isFail && fileManager.showLog) - logFile foreach showLog - } + if (isTimeout) printInfoTimeout(wr) + else printInfoEnd(isGood, wr) + wr.flush() + swr.flush() + NestUI.normal(swr.toString) + if (isFail && fileManager.showDiff && diff != "") + NestUI.normal(diff) + if (isFail && fileManager.showLog && hasLog) + showLog(logFile) } } @@ -961,7 +965,11 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor actor { val testFile = getNextFile() - if (testFile == null) done = true + if (testFile == null) { + done = true + cancelTimerTask() + reportAll(status.toMap, topcont) + } else { updateTimerTask(parent ! Timeout(testFile)) @@ -971,39 +979,32 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor case t: Throwable => val logFile = createLogFile(testFile, kind) logStackTrace(logFile, t, "Possible compiler crash during test of: " + testFile) - LogContext(logFile, None) + LogContext(logFile) } parent ! Result(testFile, context) } } react { - case res: TestResult => - val path = res.file.getCanonicalPath - if (status contains path) { - // ignore message - NestUI.debug("Why are we receiving duplicate messages? Received: " + res + "\nPath is " + path) - } - else res match { - case Timeout(_) => - updateStatus(path, TestState.Timeout) - val swr = new StringWriter - val wr = new PrintWriter(swr) - printInfoStart(res.file, wr) - reportResult(TestState.Timeout, None, Some((swr, wr))) - case Result(_, logs) => - val state = if (succeeded) TestState.Ok else TestState.Fail - updateStatus(path, state) - reportResult( - state, - Option(logs) map (_.file), - Option(logs) flatMap (_.writers) - ) - } - if (filesRemaining.isEmpty) { - cancelTimerTask() - reportAll(status.toMap, topcont) - } + case Timeout(file) => + updateStatus(file.getCanonicalPath, TestState.Timeout) + val swr = new StringWriter + val wr = new PrintWriter(swr) + printInfoStart(file, wr) + reportResult( + TestState.Timeout, + null, + Some((swr, wr)) + ) + + case Result(file, logs) => + val state = if (succeeded) TestState.Ok else TestState.Fail + updateStatus(file.getCanonicalPath, state) + reportResult( + state, + logs.file, + logs.writers + ) } } } |