From f836ba0c63e6085e6cfaf31ec38ce08592f83141 Mon Sep 17 00:00:00 2001 From: Paul Draper Date: Fri, 22 Jul 2016 10:17:24 -0600 Subject: [PATCH] Fix #2677: Tags.ForkedTestGroup doesn't work Move tag to correct task --- .../src/main/scala/sbt/ForkTests.scala | 5 ++-- main/src/main/scala/sbt/Defaults.scala | 2 +- .../tests/fork-test-group-parallel/build.sbt | 18 +++++++++++++++ .../src/test/scala/example/Test.scala | 23 +++++++++++++++++++ .../tests/fork-test-group-parallel/test | 3 +++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 sbt/src/sbt-test/tests/fork-test-group-parallel/build.sbt create mode 100644 sbt/src/sbt-test/tests/fork-test-group-parallel/src/test/scala/example/Test.scala create mode 100644 sbt/src/sbt-test/tests/fork-test-group-parallel/test diff --git a/main-actions/src/main/scala/sbt/ForkTests.scala b/main-actions/src/main/scala/sbt/ForkTests.scala index 6f6cb97a3..8402b4769 100755 --- a/main-actions/src/main/scala/sbt/ForkTests.scala +++ b/main-actions/src/main/scala/sbt/ForkTests.scala @@ -10,9 +10,10 @@ import java.io._ import Tests.{ Output => TestOutput, _ } import sbt.io.IO import sbt.util.Logger +import sbt.ConcurrentRestrictions.Tag private[sbt] object ForkTests { - def apply(runners: Map[TestFramework, Runner], tests: List[TestDefinition], config: Execution, classpath: Seq[File], fork: ForkOptions, log: Logger): Task[TestOutput] = { + def apply(runners: Map[TestFramework, Runner], tests: List[TestDefinition], config: Execution, classpath: Seq[File], fork: ForkOptions, log: Logger, tag: Tag): Task[TestOutput] = { val opts = processOptions(config, tests, log) import std.TaskExtra._ @@ -24,7 +25,7 @@ private[sbt] object ForkTests { constant(TestOutput(TestResult.Passed, Map.empty[String, SuiteResult], Iterable.empty)) else mainTestTask(runners, opts, classpath, fork, log, config.parallel).tagw(config.tags: _*) - main.dependsOn(all(opts.setup): _*) flatMap { results => + main.tag(tag).dependsOn(all(opts.setup): _*) flatMap { results => all(opts.cleanup).join.map(_ => results) } } diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 11b8b4726..06781d323 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -619,7 +619,7 @@ object Defaults extends BuildCommon { s.log.debug(s"javaOptions: ${opts.runJVMOptions}") val forkedConfig = config.copy(parallel = config.parallel && forkedParallelExecution) s.log.debug(s"Forking tests - parallelism = ${forkedConfig.parallel}") - ForkTests(runners, tests.toList, forkedConfig, cp.files, opts, s.log) tag Tags.ForkedTestGroup + ForkTests(runners, tests.toList, forkedConfig, cp.files, opts, s.log, Tags.ForkedTestGroup) case Tests.InProcess => if (javaOptions.nonEmpty) { s.log.warn("javaOptions will be ignored, fork is set to false") diff --git a/sbt/src/sbt-test/tests/fork-test-group-parallel/build.sbt b/sbt/src/sbt-test/tests/fork-test-group-parallel/build.sbt new file mode 100644 index 000000000..12b577589 --- /dev/null +++ b/sbt/src/sbt-test/tests/fork-test-group-parallel/build.sbt @@ -0,0 +1,18 @@ +concurrentRestrictions in Global := Seq(Tags.limitAll(4)) + +libraryDependencies += "org.specs2" %% "specs2-core" % "3.8.4" % Test + +inConfig(Test)(Seq( + testGrouping := definedTests.value.map { test => new Tests.Group(test.name, Seq(test), Tests.SubProcess( + ForkOptions( + javaHome.value, + outputStrategy.value, + Nil, + Some(baseDirectory.value), + javaOptions.value, + connectInput.value, + envVars.value + ) + ))}, + TaskKey[Unit]("test-failure") := test.failure.value +)) diff --git a/sbt/src/sbt-test/tests/fork-test-group-parallel/src/test/scala/example/Test.scala b/sbt/src/sbt-test/tests/fork-test-group-parallel/src/test/scala/example/Test.scala new file mode 100644 index 000000000..2bd327399 --- /dev/null +++ b/sbt/src/sbt-test/tests/fork-test-group-parallel/src/test/scala/example/Test.scala @@ -0,0 +1,23 @@ +package example + +import java.io.File +import org.specs2.mutable.Specification + +trait Test extends Specification { + "spec" should { + "be run one at time" in { + val lock = new File("lock") + lock.mkdir() should beTrue + Thread.sleep(2000) + lock.delete() should beTrue + } + } +} + +class Test0 extends Test + +class Test1 extends Test + +class Test2 extends Test + +class Test3 extends Test diff --git a/sbt/src/sbt-test/tests/fork-test-group-parallel/test b/sbt/src/sbt-test/tests/fork-test-group-parallel/test new file mode 100644 index 000000000..26c3b2549 --- /dev/null +++ b/sbt/src/sbt-test/tests/fork-test-group-parallel/test @@ -0,0 +1,3 @@ +> testFailure +> set concurrentRestrictions in Global += Tags.limit(Tags.ForkedTestGroup, 1) +> test