From 1ff5ff45bdce7f7669738237f1f93a95efb17440 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sat, 11 Jan 2020 16:22:53 -0800 Subject: [PATCH] Remove launcher based scriped runner After the changes to `RunFromSourceMain` and the addition of `Compile / exportJars` to the build, all of the tests pass with RunFromSourceMain so I decided to remove the launcher based ones. The RunFromSourceMain based tests are faster because they don't recompile the various compiler bridges every time. --- .../sbt/scriptedtest/RemoteSbtCreator.scala | 25 ---- .../sbt/scriptedtest/ScriptedTests.scala | 114 ++---------------- 2 files changed, 9 insertions(+), 130 deletions(-) diff --git a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala index 3719e5cd8..ba2f3f1ae 100644 --- a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala +++ b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala @@ -17,35 +17,10 @@ import sbt.util.Logger import xsbt.IPC -private[sbt] sealed trait RemoteSbtCreatorKind -private[sbt] object RemoteSbtCreatorKind { - case object LauncherBased extends RemoteSbtCreatorKind - case object RunFromSourceBased extends RemoteSbtCreatorKind -} - abstract class RemoteSbtCreator private[sbt] { def newRemote(server: IPC.Server): Process } -final class LauncherBasedRemoteSbtCreator( - directory: File, - launcher: File, - log: Logger, - launchOpts: Seq[String] = Nil, -) extends RemoteSbtCreator { - def newRemote(server: IPC.Server) = { - val launcherJar = launcher.getAbsolutePath - val globalBase = "-Dsbt.global.base=" + (new File(directory, "global")).getAbsolutePath - val args = List("<" + server.port) - val cmd = "java" :: launchOpts.toList ::: globalBase :: "-jar" :: launcherJar :: args ::: Nil - val io = BasicIO(false, log).withInput(_.close()) - val p = Process(cmd, directory) run (io) - val thread = new Thread() { override def run() = { p.exitValue(); server.close() } } - thread.start() - p - } -} - final class RunFromSourceBasedRemoteSbtCreator( directory: File, log: Logger, diff --git a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala index 419af51f6..fdabad941 100644 --- a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala +++ b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala @@ -16,7 +16,7 @@ import java.util.concurrent.ForkJoinPool import sbt.internal.io.Resources import sbt.internal.scripted._ -import sbt.internal.util.{ BufferedLogger, ConsoleOut, FullLogger, Util } +import sbt.internal.util.{ BufferedLogger, ConsoleOut, FullLogger } import sbt.io.FileFilter._ import sbt.io.syntax._ import sbt.io.{ DirectoryFilter, HiddenFileFilter, IO } @@ -24,8 +24,8 @@ import sbt.nio.file._ import sbt.nio.file.syntax._ import sbt.util.{ AbstractLogger, Level, Logger } -import scala.collection.{ GenSeq, mutable } import scala.collection.parallel.ForkJoinTaskSupport +import scala.collection.{ GenSeq, mutable } import scala.util.Try import scala.util.control.NonFatal @@ -70,8 +70,7 @@ final class ScriptedTests( val result = testResources.readWriteResourceDirectory(g, n) { testDirectory => val buffer = new BufferedLogger(new FullLogger(log)) val singleTestRunner = () => { - val handlers = - createScriptedHandlers(testDirectory, buffer, RemoteSbtCreatorKind.LauncherBased) + val handlers = createScriptedHandlers(testDirectory, buffer) val runner = new BatchScriptRunner val states = new mutable.HashMap[StatementHandler, StatementHandler#State]() try commonRunTest(label, testDirectory, prescripted, handlers, runner, states, buffer) @@ -87,15 +86,9 @@ final class ScriptedTests( private def createScriptedHandlers( testDir: File, buffered: Logger, - remoteSbtCreatorKind: RemoteSbtCreatorKind, ): Map[Char, StatementHandler] = { val fileHandler = new FileCommands(testDir) - val remoteSbtCreator = remoteSbtCreatorKind match { - case RemoteSbtCreatorKind.LauncherBased => - new LauncherBasedRemoteSbtCreator(testDir, launcher, buffered, launchOpts) - case RemoteSbtCreatorKind.RunFromSourceBased => - new RunFromSourceBasedRemoteSbtCreator(testDir, buffered, launchOpts) - } + val remoteSbtCreator = new RunFromSourceBasedRemoteSbtCreator(testDir, buffered, launchOpts) val sbtHandler = new SbtHandler(remoteSbtCreator) Map('$' -> fileHandler, '>' -> sbtHandler, '#' -> CommentHandler) } @@ -134,15 +127,7 @@ final class ScriptedTests( case s => s } - val (launcherBasedTestsUnfiltered, runFromSourceBasedTestsUnfiltered) = - labelsAndDirs.partition { - case (testName, _) => - determineRemoteSbtCreatorKind(testName) match { - case RemoteSbtCreatorKind.LauncherBased => true - case RemoteSbtCreatorKind.RunFromSourceBased => false - } - } - val launcherBasedTests = launcherBasedTestsUnfiltered.filterNot(windowsExclude) + val runFromSourceBasedTestsUnfiltered = labelsAndDirs val runFromSourceBasedTests = runFromSourceBasedTestsUnfiltered.filterNot(windowsExclude) def logTests(size: Int, how: String) = @@ -150,24 +135,19 @@ final class ScriptedTests( f"Running $size / $totalSize (${size * 100d / totalSize}%3.2f%%) scripted tests with $how" ) logTests(runFromSourceBasedTests.size, "RunFromSourceMain") - logTests(launcherBasedTests.size, "sbt/launcher") - def createTestRunners( - tests: Seq[TestInfo], - remoteSbtCreatorKind: RemoteSbtCreatorKind, - ): Seq[TestRunner] = { + def createTestRunners(tests: Seq[TestInfo]): Seq[TestRunner] = { tests .grouped(batchSize) .map { batch => () => IO.withTemporaryDirectory { - runBatchedTests(batch, _, prescripted, remoteSbtCreatorKind, log) + runBatchedTests(batch, _, prescripted, log) } } .toList } - createTestRunners(runFromSourceBasedTests, RemoteSbtCreatorKind.RunFromSourceBased) ++ - createTestRunners(launcherBasedTests, RemoteSbtCreatorKind.LauncherBased) + createTestRunners(runFromSourceBasedTests) } } @@ -183,81 +163,6 @@ final class ScriptedTests( } } else _ => false - private def determineRemoteSbtCreatorKind(testName: (String, String)): RemoteSbtCreatorKind = { - import RemoteSbtCreatorKind._ - val (group, name) = testName - s"$group/$name" match { - case "actions/add-alias" => LauncherBased // sbt/Package$ - case "actions/cross-incremental" => LauncherBased // tbd - case "actions/cross-multiproject" => LauncherBased // tbd - case "actions/cross-multi-parser" => - LauncherBased // java.lang.ClassNotFoundException: javax.tools.DiagnosticListener when run with java 11 and an old sbt launcher - case "actions/multi-command" => - LauncherBased // java.lang.ClassNotFoundException: javax.tools.DiagnosticListener when run with java 11 and an old sbt launcher - case "actions/cross-test-only" => LauncherBased // tbd - case "actions/external-doc" => LauncherBased // sbt/Package$ - case "actions/input-task" => LauncherBased // sbt/Package$ - case "actions/input-task-dyn" => LauncherBased // sbt/Package$ - case gn if gn.startsWith("classloader-cache/") => - LauncherBased // This should be tested using launcher - case "compiler-project/dotty-compiler-plugin" => LauncherBased // sbt/Package$ - case "compiler-project/run-test" => LauncherBased // sbt/Package$ - case "compiler-project/src-dep-plugin" => LauncherBased // sbt/Package$ - case gn if gn.startsWith("dependency-management/") => LauncherBased // sbt/Package$ - case gn if gn.startsWith("plugins/") => LauncherBased // sbt/Package$ - case "java/argfile" => LauncherBased // sbt/Package$ - case "java/cross" => LauncherBased // sbt/Package$ - case "java/basic" => LauncherBased // sbt/Package$ - case "java/varargs-main" => LauncherBased // sbt/Package$ - case "package/lazy-name" => LauncherBased // sbt/Package$ - case "package/manifest" => LauncherBased // sbt/Package$ - case "package/mappings" => LauncherBased // sbt/Package$ - case "package/resources" => LauncherBased // sbt/Package$ - case "project/Class.forName" => LauncherBased // sbt/Package$ - case "project/binary-plugin" => LauncherBased // sbt/Package$ - case "project/default-settings" => LauncherBased // sbt/Package$ - case "project/extra" => LauncherBased // tbd - case "project/flatten" => LauncherBased // sbt/Package$ - case "project/generated-root-no-publish" => LauncherBased // tbd - case "project/giter8-plugin" => LauncherBased // tbd - case "project/lib" => LauncherBased // sbt/Package$ - case "project/scripted-plugin" => LauncherBased // tbd - case "project/scripted-skip-incompatible" => LauncherBased // sbt/Package$ - case "project/session-update-from-cmd" => LauncherBased // tbd - case "project/transitive-plugins" => LauncherBased // tbd - case "run/awt" => LauncherBased // sbt/Package$ - case "run/classpath" => LauncherBased // sbt/Package$ - case "run/daemon" => LauncherBased // sbt/Package$ - case "run/daemon-exit" => LauncherBased // sbt/Package$ - case "run/error" => LauncherBased // sbt/Package$ - case "run/fork" => LauncherBased // sbt/Package$ - case "run/fork-loader" => LauncherBased // sbt/Package$ - case "run/non-local-main" => LauncherBased // sbt/Package$ - case "run/spawn" => LauncherBased // sbt/Package$ - case "run/spawn-exit" => LauncherBased // sbt/Package$ - case "source-dependencies/binary" => LauncherBased // sbt/Package$ - case "source-dependencies/export-jars" => LauncherBased // sbt/Package$ - case "source-dependencies/implicit-search" => LauncherBased // sbt/Package$ - case "source-dependencies/java-basic" => LauncherBased // sbt/Package$ - case "source-dependencies/less-inter-inv" => LauncherBased // sbt/Package$ - case "source-dependencies/less-inter-inv-java" => LauncherBased // sbt/Package$ - case "source-dependencies/linearization" => LauncherBased // sbt/Package$ - case "source-dependencies/named" => LauncherBased // sbt/Package$ - case "source-dependencies/specialized" => LauncherBased // sbt/Package$ - case gn if gn.startsWith("watch/") && Util.isWindows => - LauncherBased // there is an issue with jansi and coursier - case "watch/commands" => - LauncherBased // java.lang.ClassNotFoundException: javax.tools.DiagnosticListener when run with java 11 and an old sbt launcher - case "watch/managed" => LauncherBased // sbt/Package$ - case "tests/scalatest" => LauncherBased - case "tests/test-cross" => - LauncherBased // the sbt metabuild classpath leaks into the test interface classloader in older versions of sbt - case _ => RunFromSourceBased - } - // sbt/Package$ means: - // java.lang.NoClassDefFoundError: sbt/Package$ (wrong name: sbt/package$) - // Typically from Compile / packageBin / packageOptions - } /** Defines an auto plugin that is injected to sbt between every scripted session. * @@ -314,13 +219,12 @@ final class ScriptedTests( groupedTests: Seq[((String, String), File)], tempTestDir: File, preHook: File => Unit, - remoteSbtCreatorKind: RemoteSbtCreatorKind, log: Logger, ): Seq[Option[String]] = { val runner = new BatchScriptRunner val buffer = new BufferedLogger(new FullLogger(log)) - val handlers = createScriptedHandlers(tempTestDir, buffer, remoteSbtCreatorKind) + val handlers = createScriptedHandlers(tempTestDir, buffer) val states = new BatchScriptRunner.States val seqHandlers = handlers.values.toList runner.initStates(states, seqHandlers)