From d71137dd15f4e36c26388830f854ab4c7dea8446 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 6 Apr 2017 17:28:59 -0700 Subject: [PATCH 1/4] Clean unused imports --- .../tools/partest/nest/DirectCompiler.scala | 6 +++--- .../scala/tools/partest/nest/FileManager.scala | 2 +- .../tools/partest/nest/PathSettings.scala | 4 ++-- .../scala/tools/partest/nest/Runner.scala | 18 +++++++++--------- .../scala/scala/tools/partest/package.scala | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/scala/scala/tools/partest/nest/DirectCompiler.scala b/src/main/scala/scala/tools/partest/nest/DirectCompiler.scala index ac16414..66406e3 100644 --- a/src/main/scala/scala/tools/partest/nest/DirectCompiler.scala +++ b/src/main/scala/scala/tools/partest/nest/DirectCompiler.scala @@ -7,10 +7,10 @@ package scala.tools.partest package nest import scala.collection.mutable.ListBuffer -import scala.tools.nsc.{ Global, Settings, CompilerCommand } -import scala.tools.nsc.reporters.{ Reporter, ConsoleReporter } +import scala.tools.nsc.{Global, Settings, CompilerCommand} +import scala.tools.nsc.reporters.{Reporter, ConsoleReporter} import scala.reflect.io.AbstractFile -import java.io.{ PrintWriter, FileWriter } +import java.io.{PrintWriter, FileWriter} class ExtConsoleReporter(settings: Settings, val writer: PrintWriter) extends ConsoleReporter(settings, Console.in, writer) { shortname = true diff --git a/src/main/scala/scala/tools/partest/nest/FileManager.scala b/src/main/scala/scala/tools/partest/nest/FileManager.scala index 2be2a50..48e82f5 100644 --- a/src/main/scala/scala/tools/partest/nest/FileManager.scala +++ b/src/main/scala/scala/tools/partest/nest/FileManager.scala @@ -8,7 +8,7 @@ package scala.tools.partest package nest -import java.io.{ File, IOException } +import java.io.{File, IOException} import java.net.URLClassLoader object FileManager { diff --git a/src/main/scala/scala/tools/partest/nest/PathSettings.scala b/src/main/scala/scala/tools/partest/nest/PathSettings.scala index 67c1633..b22bc35 100644 --- a/src/main/scala/scala/tools/partest/nest/PathSettings.scala +++ b/src/main/scala/scala/tools/partest/nest/PathSettings.scala @@ -41,6 +41,6 @@ object PathSettings { // Directory /test/files or .../scaladoc def srcDir = Directory(testRoot / testSourcePath toCanonical) - def srcSpecLib = findJar("instrumented", Directory(srcDir / "speclib")) - def srcCodeLib = findJar("code", Directory(srcDir / "codelib"), Directory(testRoot / "files" / "codelib") /* work with --srcpath pending */) + def srcSpecLib = findJar("instrumented", Directory(srcDir / "speclib")) + def srcCodeLib = findJar("code", Directory(srcDir / "codelib"), Directory(testRoot / "files" / "codelib") /* work with --srcpath pending */) } diff --git a/src/main/scala/scala/tools/partest/nest/Runner.scala b/src/main/scala/scala/tools/partest/nest/Runner.scala index 4876204..543e8ea 100644 --- a/src/main/scala/scala/tools/partest/nest/Runner.scala +++ b/src/main/scala/scala/tools/partest/nest/Runner.scala @@ -5,23 +5,23 @@ package scala.tools.partest package nest -import java.io.{ Console => _, _ } +import java.io.{Console => _, _} import java.util.concurrent.Executors import java.util.concurrent.TimeUnit.NANOSECONDS import scala.collection.mutable.ListBuffer import scala.concurrent.duration.Duration import scala.reflect.internal.FatalError import scala.reflect.internal.util.ScalaClassLoader -import scala.sys.process.{ Process, ProcessLogger } -import scala.tools.nsc.Properties.{ envOrNone, isWin, javaHome, propOrEmpty, versionMsg, javaVmName, javaVmVersion, javaVmInfo } -import scala.tools.nsc.{ Settings, CompilerCommand, Global } +import scala.sys.process.{Process, ProcessLogger} +import scala.tools.nsc.Properties.{envOrNone, isWin, javaHome, propOrEmpty, versionMsg, javaVmName, javaVmVersion, javaVmInfo} +import scala.tools.nsc.{Settings, CompilerCommand, Global} import scala.tools.nsc.reporters.ConsoleReporter import scala.tools.nsc.util.stackTraceString -import scala.util.{ Try, Success, Failure } +import scala.util.{Try, Success, Failure} import ClassPath.join -import TestState.{ Pass, Fail, Crash, Uninitialized, Updated } +import TestState.{Pass, Fail, Crash, Uninitialized, Updated} -import FileManager.{ compareContents, joinPaths, withTempFile } +import FileManager.{compareContents, joinPaths, withTempFile} trait TestInfo { /** pos/t1234 */ @@ -785,8 +785,8 @@ class SuiteRunner( def runTestsForFiles(kindFiles: Array[File], kind: String): Array[TestState] = { nestUI.resetTestNumber(kindFiles.size) - val pool = Executors newFixedThreadPool numThreads - val futures = kindFiles map (f => pool submit callable(runTest(f.getAbsoluteFile))) + val pool = Executors.newFixedThreadPool(numThreads) + val futures = kindFiles.map(f => pool.submit(callable(runTest(f.getAbsoluteFile)))) pool.shutdown() Try (pool.awaitTermination(waitTime) { diff --git a/src/main/scala/scala/tools/partest/package.scala b/src/main/scala/scala/tools/partest/package.scala index 7aa60be..b1d6200 100644 --- a/src/main/scala/scala/tools/partest/package.scala +++ b/src/main/scala/scala/tools/partest/package.scala @@ -4,7 +4,7 @@ package scala.tools -import java.util.concurrent.{ Callable, ExecutorService } +import java.util.concurrent.{Callable, ExecutorService} import scala.concurrent.duration.Duration import scala.sys.process.javaVmArguments import scala.tools.nsc.util.Exceptional From f56d0eee6146ce6022079ccbe1ad23b84914825b Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 6 Apr 2017 22:43:32 -0700 Subject: [PATCH 2/4] Compiles with -Ywarn-unused --- .../scala/tools/partest/nest/AbstractRunner.scala | 2 +- .../scala/scala/tools/partest/nest/AntRunner.scala | 2 +- src/main/scala/scala/tools/partest/nest/Runner.scala | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala b/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala index fbbc07e..191b4f7 100644 --- a/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala +++ b/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala @@ -173,7 +173,7 @@ abstract class AbstractRunner { val num = paths.size val ss = if (num == 1) "" else "s" comment(s"starting $num test$ss in $kind") - val results = suiteRunner.runTestsForFiles(paths map (_.jfile.getAbsoluteFile), kind) + val results = suiteRunner.runTestsForFiles(paths map (_.jfile.getAbsoluteFile)) val (passed, failed) = results partition (_.isOk) passedTests ++= passed diff --git a/src/main/scala/scala/tools/partest/nest/AntRunner.scala b/src/main/scala/scala/tools/partest/nest/AntRunner.scala index 12b4190..ab4f522 100644 --- a/src/main/scala/scala/tools/partest/nest/AntRunner.scala +++ b/src/main/scala/scala/tools/partest/nest/AntRunner.scala @@ -33,7 +33,7 @@ abstract class AntRunner(srcDir: String, testClassLoader: URLClassLoader, javaCm else { log(s"Running ${files.length} tests in '$kind' at $now") // log(s"Tests: ${files.toList}") - val results = runTestsForFiles(files, kind) + val results = runTestsForFiles(files) val (passed, failed) = results partition (_.isOk) val numPassed = passed.size val numFailed = failed.size diff --git a/src/main/scala/scala/tools/partest/nest/Runner.scala b/src/main/scala/scala/tools/partest/nest/Runner.scala index 543e8ea..c6d2568 100644 --- a/src/main/scala/scala/tools/partest/nest/Runner.scala +++ b/src/main/scala/scala/tools/partest/nest/Runner.scala @@ -93,7 +93,7 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU System.err.println(stackTraceString(t)) } protected def crashHandler: PartialFunction[Throwable, TestState] = { - case t: InterruptedException => + case _: InterruptedException => genTimeout() case t: Throwable => showCrashInfo(t) @@ -209,7 +209,7 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU val p = Process(args) run pl try p.exitValue catch { - case e: InterruptedException => + case _: InterruptedException => nestUI.verbose(s"Interrupted waiting for command to finish (${args mkString " "})") p.destroy nonzero @@ -312,7 +312,7 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU "\n" + diff } - catch { case t: Exception => None } + catch { case _: Exception => None } } /** Normalize the log output by applying test-specific filters @@ -759,7 +759,7 @@ class SuiteRunner( // |Java Classpath: ${sys.props("java.class.path")} } - def onFinishTest(testFile: File, result: TestState): TestState = result + def onFinishTest(@deprecated("unused","") testFile: File, result: TestState): TestState = result def runTest(testFile: File): TestState = { val runner = new Runner(testFile, this, nestUI) @@ -782,7 +782,7 @@ class SuiteRunner( onFinishTest(testFile, state) } - def runTestsForFiles(kindFiles: Array[File], kind: String): Array[TestState] = { + def runTestsForFiles(kindFiles: Array[File]): Array[TestState] = { nestUI.resetTestNumber(kindFiles.size) val pool = Executors.newFixedThreadPool(numThreads) @@ -795,7 +795,7 @@ class SuiteRunner( case Success(_) => futures map (_.get) case Failure(e) => e match { - case TimeoutException(d) => + case TimeoutException(_) => nestUI.warning("Thread pool timeout elapsed before all tests were complete!") case ie: InterruptedException => nestUI.warning("Thread pool was interrupted") From 8b5f550654f2646d65337dc39cc67f0cb2f3cc67 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Fri, 7 Apr 2017 00:28:13 -0700 Subject: [PATCH 3/4] Fail after partest.timeout The result `TestState` is determined when the test is run (rather than throwing exceptions to enclosing infrastructure). Tests which haven't completed are deemed pending. Previously, tests that hadn't completed were deemed skipped. But skipping tests doesn't fail the build. Sample output with very short partest.timeout: ``` Selected 1815 tests drawn from 1 named test categories ok 1 - run/Course-2002-01.scala Thread pool timeout elapsed before all tests were complete! !! 2 - run/Course-2002-03.scala [non-zero exit code] !! 4 - run/Course-2002-02.scala [non-zero exit code] !! 3 - run/Course-2002-04.scala [non-zero exit code] !! 5 - run/Course-2002-05.scala [non-zero exit code] !! 6 - run/Course-2002-06.scala [non-zero exit code] !! 7 - run/Course-2002-08.scala [non-zero exit code] partest --update-check \ /home/apm/projects/snytt/test/files/run/Course-2002-02.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-03.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-04.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-05.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-06.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-07.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-08.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-09.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-10.scala \ /home/apm/projects/snytt/test/files/run/Course-2002-13.scala \ /home/apm/projects/snytt/test/files/run/Meter.scala \ /home/apm/projects/snytt/test/files/run/MeterCaseClass.scala \ /home/apm/projects/snytt/test/files/run/MutableListTest.scala \ /home/apm/projects/snytt/test/files/run/NestedClasses.scala \ /home/apm/projects/snytt/test/files/run/OrderingTest.scala \ /home/apm/projects/snytt/test/files/run/Predef.readLine.scala \ [etc] ``` Incomplete tests (in the category running when interrupted) are reported as pending: ``` ok 38 - pos/cls1.scala Thread pool timeout elapsed before all tests were complete! ok 39 - pos/cls.scala !! 40 - pos/collectGenericCC.scala [compilation failed] !! 41 - pos/chang [timed out] ok 42 - pos/clsrefine.scala [error] Failed: Total 41, Failed 2, Errors 0, Passed 39, Pending 1371 [error] Failed tests: [error] partest [error] (test/it:testOnly) sbt.TestsFailedException: Tests unsuccessful [error] Total time: 14 s, completed Apr 12, 2017 10:37:58 AM ``` --- .../tools/partest/nest/AbstractRunner.scala | 41 +++++---- .../scala/tools/partest/nest/AntRunner.scala | 2 +- .../scala/tools/partest/nest/Runner.scala | 84 ++++++++++--------- .../scala/scala/tools/partest/package.scala | 2 +- 4 files changed, 68 insertions(+), 61 deletions(-) diff --git a/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala b/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala index 191b4f7..04f606b 100644 --- a/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala +++ b/src/main/scala/scala/tools/partest/nest/AbstractRunner.scala @@ -63,7 +63,7 @@ abstract class AbstractRunner { oempty(p, f, s) mkString ", " } - private[this] def isSuccess = failedTests.size == expectedFailures + private[this] def isSuccess = failedTests.size == expectedFailures && failedTests.size + passedTests.size > 0 def issueSummaryReport() { // Don't run twice @@ -87,12 +87,12 @@ abstract class AbstractRunner { echo(state.transcriptString + "\n") } } - - def files_s = failed0.map(_.testFile).mkString(""" \""" + "\n ") - echo("# Failed test paths (this command will update checkfiles)") - echo(partestCmd + " --update-check \\\n " + files_s + "\n") + if (nestUI.verbose || failed0.size <= 50) { + def files_s = failed0.map(_.testFile).mkString(""" \""" + "\n ") + echo("# Failed test paths (this command will update checkfiles)") + echo(partestCmd + " --update-check \\\n " + files_s + "\n") + } } - if (printSummary) { echo(message) levyJudgment() @@ -118,10 +118,7 @@ abstract class AbstractRunner { if (!nestUI.terse) nestUI.echo(suiteRunner.banner) - val partestTests = ( - if (config.optSelfTest) TestKinds.testsForPartest - else Nil - ) + val partestTests = if (config.optSelfTest) TestKinds.testsForPartest else Nil val grepExpr = config.optGrep getOrElse "" @@ -140,9 +137,11 @@ abstract class AbstractRunner { def miscTests = partestTests ++ individualTests ++ greppedTests ++ rerunTests val givenKinds = standardKinds filter config.parsed.isSet + // named kinds to run, or else --all kinds, unless individual tests were specified + // (by path, --grep, --failed, even if there were invalid files specified) val kinds = ( if (givenKinds.nonEmpty) givenKinds - else if (miscTests.isEmpty && invalid.isEmpty) standardKinds // If no kinds, --grep, or individual tests were given, assume --all, unless there were invalid files specified + else if (miscTests.isEmpty && invalid.isEmpty) standardKinds else Nil ) val kindsTests = kinds flatMap testsFor @@ -168,18 +167,24 @@ abstract class AbstractRunner { val expectedFailureMessage = if (expectedFailures == 0) "" else s" (expecting $expectedFailures to fail)" echo(s"Selected $totalTests tests drawn from $testContributors$expectedFailureMessage\n") + var limping = false val (_, millis) = timed { for ((kind, paths) <- grouped) { val num = paths.size val ss = if (num == 1) "" else "s" comment(s"starting $num test$ss in $kind") - val results = suiteRunner.runTestsForFiles(paths map (_.jfile.getAbsoluteFile)) - val (passed, failed) = results partition (_.isOk) - - passedTests ++= passed - failedTests ++= failed - if (failed.nonEmpty) { - comment(passFailString(passed.size, failed.size, 0) + " in " + kind) + if (limping) comment(s"suite already in failure, skipping") else { + val results = suiteRunner.runTestsForFiles(paths.map(_.jfile.getAbsoluteFile)) match { + case Left((_, states)) => limping = true ; states + case Right(states) => states + } + val (passed, failed) = results partition (_.isOk) + + passedTests ++= passed + failedTests ++= failed + if (failed.nonEmpty) { + comment(passFailString(passed.size, failed.size, 0) + " in " + kind) + } } echo("") } diff --git a/src/main/scala/scala/tools/partest/nest/AntRunner.scala b/src/main/scala/scala/tools/partest/nest/AntRunner.scala index ab4f522..89960f2 100644 --- a/src/main/scala/scala/tools/partest/nest/AntRunner.scala +++ b/src/main/scala/scala/tools/partest/nest/AntRunner.scala @@ -33,7 +33,7 @@ abstract class AntRunner(srcDir: String, testClassLoader: URLClassLoader, javaCm else { log(s"Running ${files.length} tests in '$kind' at $now") // log(s"Tests: ${files.toList}") - val results = runTestsForFiles(files) + val results = runTestsForFiles(files).fold(x => x._2, ss => ss) val (passed, failed) = results partition (_.isOk) val numPassed = passed.size val numFailed = failed.size diff --git a/src/main/scala/scala/tools/partest/nest/Runner.scala b/src/main/scala/scala/tools/partest/nest/Runner.scala index c6d2568..d050e39 100644 --- a/src/main/scala/scala/tools/partest/nest/Runner.scala +++ b/src/main/scala/scala/tools/partest/nest/Runner.scala @@ -6,7 +6,7 @@ package scala.tools.partest package nest import java.io.{Console => _, _} -import java.util.concurrent.Executors +import java.util.concurrent.{Executors, ExecutionException} import java.util.concurrent.TimeUnit.NANOSECONDS import scala.collection.mutable.ListBuffer import scala.concurrent.duration.Duration @@ -63,11 +63,11 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU // except for a . per passing test to show progress. def isEnumeratedTest = false - private var _lastState: TestState = null - private val _transcript = new TestTranscript + private[this] var _lastState: TestState = null + private[this] val _transcript = new TestTranscript def lastState = if (_lastState == null) Uninitialized(testFile) else _lastState - def setLastState(s: TestState) = _lastState = s + def lastState_=(s: TestState) = _lastState = s def transcript: List[String] = _transcript.fail ++ logFile.fileLines def pushTranscript(msg: String) = _transcript add msg @@ -141,7 +141,7 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU */ def nextTestAction[T](body: => T)(failFn: PartialFunction[T, TestState]): T = { val result = body - setLastState( if (failFn isDefinedAt result) failFn(result) else genPass() ) + lastState = failFn.applyOrElse(result, (_: T) => genPass()) result } def nextTestActionExpectTrue(reason: String, body: => Boolean): Boolean = ( @@ -204,15 +204,14 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU protected def runCommand(args: Seq[String], outFile: File): Boolean = { //(Process(args) #> outFile !) == 0 or (Process(args) ! pl) == 0 val pl = ProcessLogger(outFile) - val nonzero = 17 // rounding down from 17.3 def run: Int = { val p = Process(args) run pl try p.exitValue catch { - case _: InterruptedException => + case ie: InterruptedException => nestUI.verbose(s"Interrupted waiting for command to finish (${args mkString " "})") p.destroy - nonzero + throw ie case t: Throwable => nestUI.verbose(s"Exception waiting for command to finish: $t (${args mkString " "})") p.destroy @@ -399,9 +398,6 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU else diff _transcript append bestDiff genFail("output differs") - // TestState.fail("output differs", "output differs", - // genFail("output differs") - // TestState.Fail("output differs", bestDiff) case None => genPass() // redundant default case } getOrElse true } @@ -636,7 +632,7 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU // and just looking at the diff, so I made them all do that // because this is long enough. if (!Output.withRedirected(logWriter)(try loop() finally resReader.close())) - setLastState(genPass()) + lastState = genPass() (diffIsOk, LogContext(logFile, swr, wr)) } @@ -645,16 +641,22 @@ class Runner(val testFile: File, val suiteRunner: SuiteRunner, val nestUI: NestU // javac runner, for one, would merely append to an existing log file, so just delete it before we start logFile.delete() - if (kind == "neg" || (kind endsWith "-neg")) runNegTest() - else kind match { - case "pos" => runTestCommon(true) - case "ant" => runAntTest() - case "res" => runResidentTest() - case "scalap" => runScalapTest() - case "script" => runScriptTest() - case _ => runTestCommon(execTest(outDir, logFile) && diffIsOk) - } + def runWhatever() = + if (kind == "neg" || (kind endsWith "-neg")) runNegTest() + else kind match { + case "pos" => runTestCommon(true) + case "ant" => runAntTest() + case "res" => runResidentTest() + case "scalap" => runScalapTest() + case "script" => runScriptTest() + case _ => runTestCommon(execTest(outDir, logFile) && diffIsOk) + } + try runWhatever() + catch { + case _: InterruptedException => lastState = genTimeout() + case t: Throwable => lastState = genCrash(t) + } lastState } @@ -731,7 +733,7 @@ class SuiteRunner( val javaOpts: String = PartestDefaults.javaOpts, val scalacOpts: String = PartestDefaults.scalacOpts) { - import PartestDefaults.{ numThreads, waitTime } + import PartestDefaults.{numThreads, waitTime} setUncaughtHandler @@ -770,11 +772,8 @@ class SuiteRunner( if (failed && !runner.logFile.canRead) runner.genPass() else { - val (state, _) = - try timed(runner.run()) - catch { - case t: Throwable => throw new RuntimeException(s"Error running $testFile", t) - } + val (state, time) = timed(runner.run()) + nestUI.verbose(s"$testFile completed in $time") nestUI.reportTest(state, runner) runner.cleanup() state @@ -782,35 +781,38 @@ class SuiteRunner( onFinishTest(testFile, state) } - def runTestsForFiles(kindFiles: Array[File]): Array[TestState] = { + def runTestsForFiles(kindFiles: Array[File]): Either[(Exception, Array[TestState]), Array[TestState]] = { nestUI.resetTestNumber(kindFiles.size) val pool = Executors.newFixedThreadPool(numThreads) val futures = kindFiles.map(f => pool.submit(callable(runTest(f.getAbsoluteFile)))) pool.shutdown() - Try (pool.awaitTermination(waitTime) { - throw TimeoutException(waitTime) - }) match { - case Success(_) => futures map (_.get) - case Failure(e) => + Try (pool.awaitTermination(waitTime)(throw TimeoutException(waitTime))) match { + case Success(_) => Right(futures.map(_.get)) + case Failure(e: Exception) => e match { case TimeoutException(_) => - nestUI.warning("Thread pool timeout elapsed before all tests were complete!") + nestUI.echoWarning("Thread pool timeout elapsed before all tests were complete!") case ie: InterruptedException => - nestUI.warning("Thread pool was interrupted") + nestUI.echoWarning("Thread pool was interrupted") ie.printStackTrace() } - pool.shutdownNow() // little point in continuing - // try to get as many completions as possible, in case someone cares - val results = for (f <- futures) yield { + pool.shutdownNow() + val states = (kindFiles, futures).zipped.map {(testFile, future) => try { - Some(f.get(0, NANOSECONDS)) + if (future.isDone) future.get(0, NANOSECONDS) else { + val s = Uninitialized(testFile) + onFinishTest(testFile, s) // reported as pending + s + } } catch { - case _: Throwable => None + case e: ExecutionException => new Runner(testFile, this, nestUI).genCrash(e.getCause) + case _: Throwable => new Runner(testFile, this, nestUI).genTimeout() } } - results.flatten + Left((e, states)) + case Failure(t) => throw t } } diff --git a/src/main/scala/scala/tools/partest/package.scala b/src/main/scala/scala/tools/partest/package.scala index b1d6200..9ea8b63 100644 --- a/src/main/scala/scala/tools/partest/package.scala +++ b/src/main/scala/scala/tools/partest/package.scala @@ -104,7 +104,7 @@ package object partest { implicit class ExecutorOps(val executor: ExecutorService) { def awaitTermination[A](wait: Duration)(failing: => A = ()): Option[A] = ( - if (executor awaitTermination (wait.length, wait.unit)) None + if (executor.awaitTermination(wait.length, wait.unit)) None else Some(failing) ) } From 453d4e47f6e94cb10839ae59cd7409f820571977 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Mon, 4 Dec 2017 11:05:04 -0800 Subject: [PATCH 4/4] Elidably consume unused param --- build.sbt | 1 + project/build.properties | 2 +- src/main/scala/scala/tools/partest/nest/Runner.scala | 2 +- src/main/scala/scala/tools/partest/package.scala | 4 ++++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 283c048..5fd012e 100644 --- a/build.sbt +++ b/build.sbt @@ -17,6 +17,7 @@ scalaVersionsByJvm in ThisBuild := { scalaXmlVersion := "1.0.6" scalacOptions += "-Xfatal-warnings" +scalacOptions ++= "-Xelide-below" :: "0" :: "-Ywarn-unused" :: Nil enableOptimizer // dependencies diff --git a/project/build.properties b/project/build.properties index 64317fd..c091b86 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.13.15 +sbt.version=0.13.16 diff --git a/src/main/scala/scala/tools/partest/nest/Runner.scala b/src/main/scala/scala/tools/partest/nest/Runner.scala index d050e39..da8e0a8 100644 --- a/src/main/scala/scala/tools/partest/nest/Runner.scala +++ b/src/main/scala/scala/tools/partest/nest/Runner.scala @@ -761,7 +761,7 @@ class SuiteRunner( // |Java Classpath: ${sys.props("java.class.path")} } - def onFinishTest(@deprecated("unused","") testFile: File, result: TestState): TestState = result + def onFinishTest(testFile: File, result: TestState): TestState = { unused(testFile) ; result } def runTest(testFile: File): TestState = { val runner = new Runner(testFile, this, nestUI) diff --git a/src/main/scala/scala/tools/partest/package.scala b/src/main/scala/scala/tools/partest/package.scala index 9ea8b63..4a4629f 100644 --- a/src/main/scala/scala/tools/partest/package.scala +++ b/src/main/scala/scala/tools/partest/package.scala @@ -5,6 +5,7 @@ package scala.tools import java.util.concurrent.{Callable, ExecutorService} +import scala.annotation.elidable, elidable.ALL import scala.concurrent.duration.Duration import scala.sys.process.javaVmArguments import scala.tools.nsc.util.Exceptional @@ -180,4 +181,7 @@ package object partest { import scala.collection.JavaConverters._ System.getProperties.asScala.toList.sorted map { case (k, v) => "%s -> %s\n".format(k, v) } mkString "" } + + // consume a value elidably to avoid unused warning + @elidable(ALL) def unused[A](a: A): A = a }