From f7e3b7002d1eefbeaac3970be4ac729843d6a939 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Mon, 27 Mar 2017 14:11:23 +0200 Subject: Restore partest and enable it to run alongside new partest --- project/Build.scala | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 2 deletions(-) (limited to 'project/Build.scala') diff --git a/project/Build.scala b/project/Build.scala index ae7672248..baebaedf5 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -131,7 +131,27 @@ object Build { settings( triggeredMessage in ThisBuild := Watched.clearWhenTriggered, - addCommandAlias("run", "dotty-compiler/run") + addCommandAlias("run", "dotty-compiler/run") ++ + addCommandAlias( + "partest", + ";publishLocal" + // Non-bootstrapped dotty needs to be published first + ";dotty-compiler-bootstrapped/lockPartestFile" + + ";dotty-compiler-bootstrapped/test:test" + + ";dotty-compiler-bootstrapped/runPartestRunner" + ) ++ + addCommandAlias( + "partest-only", + ";publishLocal" + // Non-bootstrapped dotty needs to be published first + ";dotty-compiler-bootstrapped/lockPartestFile" + + ";dotty-compiler-bootstrapped/test:test-only dotc.tests" + + ";dotty-compiler-bootstrapped/runPartestRunner" + ) ++ + addCommandAlias( + "partest-only-no-bootstrap", + ";dotty-compiler/lockPartestFile" + + ";dotty-compiler/test:test-only dotc.tests" + + ";dotty-compiler/runPartestRunner" + ) ). settings(publishing) @@ -264,6 +284,44 @@ object Build { "org.scala-lang" % "scala-reflect" % scalacVersion, "org.scala-lang" % "scala-library" % scalacVersion % "test"), + // start partest specific settings: + libraryDependencies += "org.scala-lang.modules" %% "scala-partest" % "1.0.11" % "test", + testOptions in Test += Tests.Cleanup({ () => partestLockFile.delete }), + // this option is needed so that partest doesn't run + testOptions += Tests.Argument(TestFrameworks.JUnit, "--exclude-categories=dotty.tools.dotc.ParallelTesting"), + partestDeps := Seq( + scalaCompiler, + "org.scala-lang" % "scala-reflect" % scalacVersion, + "org.scala-lang" % "scala-library" % scalacVersion % "test" + ), + lockPartestFile := { + // When this file is present, running `test` generates the files for + // partest. Otherwise it just executes the tests directly. + val lockDir = partestLockFile.getParentFile + lockDir.mkdirs + // Cannot have concurrent partests as they write to the same directory. + if (lockDir.list.size > 0) + throw new RuntimeException("ERROR: sbt partest: another partest is already running, pid in lock file: " + lockDir.list.toList.mkString(" ")) + partestLockFile.createNewFile + partestLockFile.deleteOnExit + }, + runPartestRunner := Def.inputTaskDyn { + // Magic! This is both an input task and a dynamic task. Apparently + // command line arguments get passed to the last task in an aliased + // sequence (see partest alias below), so this works. + val args = Def.spaceDelimited("").parsed + val jars = List( + (packageBin in Compile).value.getAbsolutePath, + packageAll.value("dotty-library"), + packageAll.value("dotty-interfaces") + ) ++ getJarPaths(partestDeps.value, ivyPaths.value.ivyHome) + val dottyJars = + s"""-dottyJars ${jars.length + 2} dotty.jar dotty-lib.jar ${jars.mkString(" ")}""" + // Provide the jars required on the classpath of run tests + runTask(Test, "dotty.partest.DPConsoleRunner", dottyJars + " " + args.mkString(" ")) + }.evaluated, + // end partest specific settings + // enable improved incremental compilation algorithm incOptions := incOptions.value.withNameHashing(true), @@ -403,10 +461,35 @@ object Build { "-Ddotty.tests.classes.compiler=" + pA("dotty-compiler") ) - jars ::: tuning ::: agentOptions ::: ci_build ::: path.toList + ("-DpartestParentID=" + pid) :: jars ::: tuning ::: agentOptions ::: ci_build ::: path.toList } ) + // Partest tasks + lazy val partestDeps = + SettingKey[Seq[ModuleID]]("partestDeps", "Finds jars for partest dependencies") + lazy val runPartestRunner = + InputKey[Unit]("runPartestRunner", "Runs partest") + lazy val lockPartestFile = + TaskKey[Unit]("lockPartestFile", "Creates the lock file at ./tests/locks/partest-.lock") + lazy val partestLockFile = + new File("." + File.separator + "tests" + File.separator + "locks" + File.separator + s"partest-$pid.lock") + + def pid = java.lang.Long.parseLong(java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")(0)) + + def getJarPaths(modules: Seq[ModuleID], ivyHome: Option[File]): Seq[String] = ivyHome match { + case Some(home) => + modules.map({ module => + val file = Path(home) / Path("cache") / + Path(module.organization) / Path(module.name) / Path("jars") / + Path(module.name + "-" + module.revision + ".jar") + if (!file.isFile) throw new RuntimeException("ERROR: sbt getJarPaths: dependency jar not found: " + file) + else file.jfile.getAbsolutePath + }) + case None => throw new RuntimeException("ERROR: sbt getJarPaths: ivyHome not defined") + } + // end partest tasks + lazy val `dotty-compiler` = project.in(file("compiler")). dependsOn(`dotty-interfaces`). dependsOn(`dotty-library`). -- cgit v1.2.3