Skip to content

Commit 4eb8cba

Browse files
committed
Add test filtering via filterTest <regex>
1 parent ef6ea1d commit 4eb8cba

File tree

7 files changed

+68
-32
lines changed

7 files changed

+68
-32
lines changed

.drone.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pipeline:
66
- ln -s /var/cache/drone/scala-scala scala-scala
77
- ln -s /var/cache/drone/ivy2 "$HOME/.ivy2"
88
- ./scripts/update-scala-library
9-
- sbt -J-Xmx4096m -J-XX:ReservedCodeCacheSize=512m -J-XX:MaxMetaspaceSize=1024m -Ddotty.drone.mem=4096m "${TEST}"
9+
- sbt -J-Xmx24G -J-XX:ReservedCodeCacheSize=512m -J-XX:MaxMetaspaceSize=4G -Ddotty.drone.mem=4096m "${TEST}"
1010
when:
1111
branch:
1212
exclude: gh-pages
@@ -34,9 +34,9 @@ pipeline:
3434

3535
matrix:
3636
TEST:
37-
- ;test;dotty-bin-tests/test
38-
- ;publishLocal;dotty-bootstrapped/test
39-
- partest-only-no-bootstrap --show-diff --verbose
40-
- partest-only --show-diff --verbose
41-
- ;set testOptions in LocalProject("dotty-compiler") := Seq() ;dotty-compiler/testOnly dotty.tools.dotc.CompilationTests
42-
- ;publishLocal ;set testOptions in LocalProject("dotty-compiler-bootstrapped") := Seq() ;dotty-bootstrapped/testOnly dotty.tools.dotc.CompilationTests
37+
- ;set testOptions in LocalProject("dotty-compiler") += Tests.Argument(TestFrameworks.JUnit, "--exclude-categories=dotty.tools.dotc.ParallelTesting") ;test ;dotty-bin-tests/test
38+
- ;set testOptions in LocalProject("dotty-compiler-bootstrapped") += Tests.Argument(TestFrameworks.JUnit, "--exclude-categories=dotty.tools.dotc.ParallelTesting") ;publishLocal ;dotty-bootstrapped/test
39+
- ;set testOptions in LocalProject("dotty-compiler") += Tests.Argument(TestFrameworks.JUnit, "--exclude-categories=dotty.tools.dotc.ParallelTesting") ;partest-only-no-bootstrap --show-diff --verbose
40+
- ;set testOptions in LocalProject("dotty-compiler-bootstrapped") += Tests.Argument(TestFrameworks.JUnit, "--exclude-categories=dotty.tools.dotc.ParallelTesting") ;partest-only --show-diff --verbose
41+
- ;dotty-compiler/testOnly dotty.tools.dotc.CompilationTests
42+
- ;publishLocal ;dotty-bootstrapped/testOnly dotty.tools.dotc.CompilationTests

.drone.yml.sig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgdGVzdDoKICAgIGltYWdlOiBsYW1wZXBmbC9kb3R0eTpsYXRlc3QKICAgIHB1bGw6IHRydWUKICAgIGNvbW1hbmRzOgogICAgICAtIGxuIC1zIC92YXIvY2FjaGUvZHJvbmUvc2NhbGEtc2NhbGEgc2NhbGEtc2NhbGEKICAgICAgLSBsbiAtcyAvdmFyL2NhY2hlL2Ryb25lL2l2eTIgIiRIT01FLy5pdnkyIgogICAgICAtIC4vc2NyaXB0cy91cGRhdGUtc2NhbGEtbGlicmFyeQogICAgICAtIHNidCAtSi1YbXg0MDk2bSAtSi1YWDpSZXNlcnZlZENvZGVDYWNoZVNpemU9NTEybSAtSi1YWDpNYXhNZXRhc3BhY2VTaXplPTEwMjRtIC1EZG90dHkuZHJvbmUubWVtPTQwOTZtICIke1RFU1R9IgogICAgd2hlbjoKICAgICAgYnJhbmNoOgogICAgICAgIGV4Y2x1ZGU6IGdoLXBhZ2VzCgogIGRvY3VtZW50YXRpb246CiAgICBpbWFnZTogbGFtcGVwZmwvZG90dHk6bGF0ZXN0CiAgICBwdWxsOiB0cnVlCiAgICBjb21tYW5kczoKICAgICAgLSAuL3Byb2plY3Qvc2NyaXB0cy9nZW5Eb2NzICIke1RFU1R9IiAkQk9UX1BBU1MKICAgIHdoZW46CiAgICAgIGJyYW5jaDogbWFzdGVyCgogIGdpdHRlcjoKICAgIGltYWdlOiBwbHVnaW5zL2dpdHRlcgogICAgd2hlbjoKICAgICAgYnJhbmNoOiBtYXN0ZXIKICAgICAgc3RhdHVzOiBjaGFuZ2VkCgogIHNsYWNrOgogICAgaW1hZ2U6IHBsdWdpbnMvc2xhY2sKICAgIGNoYW5uZWw6IGRvdHR5CiAgICB3aGVuOgogICAgICBicmFuY2g6IG1hc3RlcgogICAgICBzdGF0dXM6IGNoYW5nZWQKCm1hdHJpeDoKICBURVNUOgogICAgLSA7dGVzdDtkb3R0eS1iaW4tdGVzdHMvdGVzdAogICAgLSA7cHVibGlzaExvY2FsO2RvdHR5LWJvb3RzdHJhcHBlZC90ZXN0CiAgICAtIHBhcnRlc3Qtb25seS1uby1ib290c3RyYXAgLS1zaG93LWRpZmYgLS12ZXJib3NlCiAgICAtIHBhcnRlc3Qtb25seSAtLXNob3ctZGlmZiAtLXZlcmJvc2UKICAgIC0gO3NldCB0ZXN0T3B0aW9ucyBpbiBMb2NhbFByb2plY3QoImRvdHR5LWNvbXBpbGVyIikgOj0gU2VxKCkgO2RvdHR5LWNvbXBpbGVyL3Rlc3RPbmx5IGRvdHR5LnRvb2xzLmRvdGMuQ29tcGlsYXRpb25UZXN0cwogICAgLSA7cHVibGlzaExvY2FsIDtzZXQgdGVzdE9wdGlvbnMgaW4gTG9jYWxQcm9qZWN0KCJkb3R0eS1jb21waWxlci1ib290c3RyYXBwZWQiKSA6PSBTZXEoKSA7ZG90dHktYm9vdHN0cmFwcGVkL3Rlc3RPbmx5IGRvdHR5LnRvb2xzLmRvdGMuQ29tcGlsYXRpb25UZXN0cwo.qsDrUBsZtyXeEeRXf9CnC0Rh5FF0lZpKCgf2iZvPckE
1+
eyJhbGciOiJIUzI1NiJ9.cGlwZWxpbmU6CiAgdGVzdDoKICAgIGltYWdlOiBsYW1wZXBmbC9kb3R0eTpsYXRlc3QKICAgIHB1bGw6IHRydWUKICAgIGNvbW1hbmRzOgogICAgICAtIGxuIC1zIC92YXIvY2FjaGUvZHJvbmUvc2NhbGEtc2NhbGEgc2NhbGEtc2NhbGEKICAgICAgLSBsbiAtcyAvdmFyL2NhY2hlL2Ryb25lL2l2eTIgIiRIT01FLy5pdnkyIgogICAgICAtIC4vc2NyaXB0cy91cGRhdGUtc2NhbGEtbGlicmFyeQogICAgICAtIHNidCAtSi1YbXgyNEcgLUotWFg6UmVzZXJ2ZWRDb2RlQ2FjaGVTaXplPTUxMm0gLUotWFg6TWF4TWV0YXNwYWNlU2l6ZT00RyAtRGRvdHR5LmRyb25lLm1lbT00MDk2bSAiJHtURVNUfSIKICAgIHdoZW46CiAgICAgIGJyYW5jaDoKICAgICAgICBleGNsdWRlOiBnaC1wYWdlcwoKICBkb2N1bWVudGF0aW9uOgogICAgaW1hZ2U6IGxhbXBlcGZsL2RvdHR5OmxhdGVzdAogICAgcHVsbDogdHJ1ZQogICAgY29tbWFuZHM6CiAgICAgIC0gLi9wcm9qZWN0L3NjcmlwdHMvZ2VuRG9jcyAiJHtURVNUfSIgJEJPVF9QQVNTCiAgICB3aGVuOgogICAgICBicmFuY2g6IG1hc3RlcgoKICBnaXR0ZXI6CiAgICBpbWFnZTogcGx1Z2lucy9naXR0ZXIKICAgIHdoZW46CiAgICAgIGJyYW5jaDogbWFzdGVyCiAgICAgIHN0YXR1czogY2hhbmdlZAoKICBzbGFjazoKICAgIGltYWdlOiBwbHVnaW5zL3NsYWNrCiAgICBjaGFubmVsOiBkb3R0eQogICAgd2hlbjoKICAgICAgYnJhbmNoOiBtYXN0ZXIKICAgICAgc3RhdHVzOiBjaGFuZ2VkCgptYXRyaXg6CiAgVEVTVDoKICAgIC0gO3NldCB0ZXN0T3B0aW9ucyBpbiBMb2NhbFByb2plY3QoImRvdHR5LWNvbXBpbGVyIikgKz0gVGVzdHMuQXJndW1lbnQoVGVzdEZyYW1ld29ya3MuSlVuaXQsICItLWV4Y2x1ZGUtY2F0ZWdvcmllcz1kb3R0eS50b29scy5kb3RjLlBhcmFsbGVsVGVzdGluZyIpIDt0ZXN0IDtkb3R0eS1iaW4tdGVzdHMvdGVzdAogICAgLSA7c2V0IHRlc3RPcHRpb25zIGluIExvY2FsUHJvamVjdCgiZG90dHktY29tcGlsZXItYm9vdHN0cmFwcGVkIikgKz0gVGVzdHMuQXJndW1lbnQoVGVzdEZyYW1ld29ya3MuSlVuaXQsICItLWV4Y2x1ZGUtY2F0ZWdvcmllcz1kb3R0eS50b29scy5kb3RjLlBhcmFsbGVsVGVzdGluZyIpIDtwdWJsaXNoTG9jYWwgO2RvdHR5LWJvb3RzdHJhcHBlZC90ZXN0CiAgICAtIDtzZXQgdGVzdE9wdGlvbnMgaW4gTG9jYWxQcm9qZWN0KCJkb3R0eS1jb21waWxlciIpICs9IFRlc3RzLkFyZ3VtZW50KFRlc3RGcmFtZXdvcmtzLkpVbml0LCAiLS1leGNsdWRlLWNhdGVnb3JpZXM9ZG90dHkudG9vbHMuZG90Yy5QYXJhbGxlbFRlc3RpbmciKSA7cGFydGVzdC1vbmx5LW5vLWJvb3RzdHJhcCAtLXNob3ctZGlmZiAtLXZlcmJvc2UKICAgIC0gO3NldCB0ZXN0T3B0aW9ucyBpbiBMb2NhbFByb2plY3QoImRvdHR5LWNvbXBpbGVyLWJvb3RzdHJhcHBlZCIpICs9IFRlc3RzLkFyZ3VtZW50KFRlc3RGcmFtZXdvcmtzLkpVbml0LCAiLS1leGNsdWRlLWNhdGVnb3JpZXM9ZG90dHkudG9vbHMuZG90Yy5QYXJhbGxlbFRlc3RpbmciKSA7cGFydGVzdC1vbmx5IC0tc2hvdy1kaWZmIC0tdmVyYm9zZQogICAgLSA7ZG90dHktY29tcGlsZXIvdGVzdE9ubHkgZG90dHkudG9vbHMuZG90Yy5Db21waWxhdGlvblRlc3RzCiAgICAtIDtwdWJsaXNoTG9jYWwgO2RvdHR5LWJvb3RzdHJhcHBlZC90ZXN0T25seSBkb3R0eS50b29scy5kb3RjLkNvbXBpbGF0aW9uVGVzdHMK.IAe3X-XmMyf3-GnA1ENr-D3t_YM_28CAhHX6lP0EB6E

compiler/test/dotc/comptest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import dotty.tools.dotc.ParallelTesting
55
object comptest extends ParallelTesting {
66

77
def interactive: Boolean = true
8+
def regex: Option[String] = None
89

910
implicit val defaultOutputDir: String = "."
1011

compiler/test/dotty/tools/dotc/CompilationTests.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import java.io.{ File => JFile }
77

88
import org.junit.experimental.categories.Category
99

10-
1110
@Category(Array(classOf[ParallelTesting]))
1211
class CompilationTests extends ParallelTesting {
1312
import CompilationTests._
1413

1514
def interactive: Boolean = !sys.env.contains("DRONE")
1615

16+
def regex: Option[String] = sys.props.get("dotty.partest.filter")
17+
1718
// Positive tests ------------------------------------------------------------
1819

1920
@Test def compilePos: Unit = {

compiler/test/dotty/tools/dotc/ParallelTestTests.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class ParallelTestTests extends ParallelTesting {
1212

1313
def interactive: Boolean = !sys.env.contains("DRONE")
1414

15+
def regex: Option[String] = None
16+
1517
@Test def missingFile: Unit =
1618
try {
1719
compileFile("../tests/partest-test/i-dont-exist.scala", defaultOptions).expectFailure.neg()

compiler/test/dotty/tools/dotc/ParallelTesting.scala

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import scala.io.Source
1414
import scala.util.control.NonFatal
1515
import scala.util.Try
1616
import scala.collection.mutable
17+
import scala.util.matching.Regex
1718

1819
import core.Contexts._
1920
import reporting.{ Reporter, TestReporter }
@@ -25,6 +26,10 @@ trait ParallelTesting {
2526

2627
def interactive: Boolean
2728

29+
def regex: Option[String]
30+
31+
private lazy val filter: Option[Regex] = regex.map(str => new Regex(str))
32+
2833
private sealed trait Target { self =>
2934
def outDir: JFile
3035
def flags: Array[String]
@@ -121,7 +126,16 @@ trait ParallelTesting {
121126
/** Actual compilation run logic, the test behaviour is defined here */
122127
protected def compilationRunnable(target: Target): Runnable
123128

124-
val totalTargets = targets.length
129+
private val allTargets =
130+
if (!filter.isDefined) targets
131+
else targets.filter {
132+
case ConcurrentCompilationTarget(files, _, _) =>
133+
files.exists(file => filter.get.findFirstIn(file.getAbsolutePath).isDefined)
134+
case SeparateCompilationTarget(dir, _, _) =>
135+
filter.get.findFirstIn(dir.getAbsolutePath).isDefined
136+
}
137+
138+
val totalTargets = allTargets.length
125139

126140
private[this] var _errors = 0
127141
def errors: Int = synchronized { _errors }
@@ -271,31 +285,39 @@ trait ParallelTesting {
271285

272286
private[ParallelTesting] def execute(): this.type = {
273287
assert(_targetsCompiled == 0, "not allowed to re-use a `CompileRun`")
274-
val pool = threadLimit match {
275-
case Some(i) => JExecutors.newWorkStealingPool(i)
276-
case None => JExecutors.newWorkStealingPool()
277-
}
278288

279-
if (interactive && !suppressAllOutput) pool.submit(statusRunner)
289+
if (allTargets.nonEmpty) {
290+
val pool = threadLimit match {
291+
case Some(i) => JExecutors.newWorkStealingPool(i)
292+
case None => JExecutors.newWorkStealingPool()
293+
}
280294

281-
targets.foreach { target =>
282-
pool.submit(compilationRunnable(target))
283-
}
295+
if (interactive && !suppressAllOutput) pool.submit(statusRunner)
284296

285-
pool.shutdown()
286-
if (!pool.awaitTermination(10, TimeUnit.MINUTES))
287-
throw new TimeoutException("Compiling targets timed out")
288-
289-
if (didFail) {
290-
echo {
291-
"""|
292-
|================================================================================
293-
|Test Report
294-
|================================================================================
295-
|Failing tests:""".stripMargin
297+
allTargets.foreach { target =>
298+
pool.submit(compilationRunnable(target))
296299
}
297-
failedCompilationTargets.toArray.sorted.foreach(echo)
298-
failureInstructions.iterator.foreach(echo)
300+
301+
pool.shutdown()
302+
if (!pool.awaitTermination(10, TimeUnit.MINUTES))
303+
throw new TimeoutException("Compiling targets timed out")
304+
305+
if (didFail) {
306+
echo {
307+
"""|
308+
|================================================================================
309+
|Test Report
310+
|================================================================================
311+
|Failing tests:""".stripMargin
312+
}
313+
failedCompilationTargets.toArray.sorted.foreach(echo)
314+
failureInstructions.iterator.foreach(echo)
315+
}
316+
}
317+
else echo {
318+
regex
319+
.map(r => s"""No files matched regex "$r" in test""")
320+
.getOrElse("No tests available under target - erroneous test?")
299321
}
300322

301323
this

project/Build.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ object Build {
4545
// Spawns a repl with the correct classpath
4646
lazy val repl = inputKey[Unit]("run the REPL with correct classpath")
4747

48+
// Run tests with filter
49+
lazy val filterTest = inputKey[Unit]("runs integration test with the supplied filter")
50+
4851
// Used to compile files similar to ./bin/dotc script
4952
lazy val dotc =
5053
inputKey[Unit]("run the compiler using the correct classpath, or the user supplied classpath")
@@ -286,7 +289,6 @@ object Build {
286289
libraryDependencies += "org.scala-lang.modules" %% "scala-partest" % "1.0.11" % "test",
287290
testOptions in Test += Tests.Cleanup({ () => partestLockFile.delete }),
288291
// this option is needed so that partest doesn't run
289-
testOptions += Tests.Argument(TestFrameworks.JUnit, "--exclude-categories=dotty.tools.dotc.ParallelTesting"),
290292
partestDeps := Seq(
291293
scalaCompiler,
292294
"org.scala-lang" % "scala-reflect" % scalacVersion,
@@ -336,6 +338,14 @@ object Build {
336338
)
337339
}.evaluated,
338340

341+
filterTest := Def.inputTaskDyn {
342+
val args: Seq[String] = spaceDelimited("<arg>").parsed
343+
testOptions := Seq()
344+
(testOnly in Test).toTask(
345+
" dotty.tools.dotc.CompilationTests -- -Ddotty.partest.filter=" + args.head
346+
)
347+
}.evaluated,
348+
339349
// Override run to be able to run compiled classfiles
340350
dotr := {
341351
val args: Seq[String] = spaceDelimited("<arg>").parsed

0 commit comments

Comments
 (0)