Skip to content

Commit 115280c

Browse files
committed
make it run junit too
1 parent 30aebd3 commit 115280c

File tree

7 files changed

+78
-14
lines changed

7 files changed

+78
-14
lines changed

WORKSPACE

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ scala_maven_import_external(
6262
],
6363
)
6464

65+
scala_maven_import_external(
66+
name = "com_novocode_junit_interface",
67+
artifact = "com.novocode:junit-interface:0.11",
68+
artifact_sha256 = "29e923226a0d10e9142bbd81073ef52f601277001fcf9014389bf0af3dc33dc3",
69+
licenses = ["notice"], # Apache 2.0
70+
server_urls = [
71+
"https://repo1.maven.org/maven2/",
72+
"https://mirror.bazel.build/repo1.maven.org/maven2",
73+
],
74+
)
75+
6576
# test adding a scala jar:
6677
jvm_maven_import_external(
6778
name = "com_twitter__scalding_date",

scala/private/phases/phase_discover_tests.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def phase_discover_tests(ctx, p):
1515
args.add(output)
1616
args.add_all(p.compile.full_jars)
1717
args.add("--")
18-
args.add_all(p.collect_jars.compile_jars)
18+
args.add_all(p.collect_jars.transitive_runtime_jars)
1919

2020
ctx.actions.run(
2121
mnemonic = "DiscoverTests",

src/scala/io/bazel/rules_scala/discover_tests_runner/DiscoverTestsRunner.scala

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import io.bazel.rules_scala.discover_tests_worker.DiscoveredTests.Result
44
import io.bazel.rules_scala.discover_tests_worker.DiscoveredTests.FrameworkDiscovery
55
import io.bazel.rules_scala.discover_tests_worker.DiscoveredTests.SubclassDiscovery
66

7+
import sbt.testing.AnnotatedFingerprint
78
import sbt.testing.Event
89
import sbt.testing.EventHandler
10+
import sbt.testing.Fingerprint
911
import sbt.testing.Framework
1012
import sbt.testing.Logger
1113
import sbt.testing.Runner
@@ -38,24 +40,39 @@ object DiscoverTestsRunner {
3840
val framework: Framework = Class.forName(frameworkDiscovery.getFramework).newInstance.asInstanceOf[Framework]
3941
val runner: Runner = framework.runner(args, Array.empty, Thread.currentThread.getContextClassLoader)
4042

41-
val subclassFingerprintMap: Map[(String, Boolean, Boolean), SubclassFingerprint] = framework.fingerprints.collect {
42-
case fingerprint: SubclassFingerprint => (fingerprint.superclassName, fingerprint.isModule, fingerprint.requireNoArgConstructor) -> fingerprint
43-
}.toMap
43+
val subclassFingerprintMap: Map[(String, Boolean, Boolean), SubclassFingerprint] =
44+
framework.fingerprints.collect {
45+
case fingerprint: SubclassFingerprint =>
46+
(fingerprint.superclassName, fingerprint.isModule, fingerprint.requireNoArgConstructor) -> fingerprint
47+
}.toMap
4448

45-
frameworkDiscovery.getSubclassDiscoveriesList
46-
.asScala
49+
val annotatedFingerprintMap: Map[(String, Boolean), AnnotatedFingerprint] =
50+
framework.fingerprints.collect {
51+
case fingerprint: AnnotatedFingerprint =>
52+
(fingerprint.annotationName, fingerprint.isModule) -> fingerprint
53+
}.toMap
54+
55+
frameworkDiscovery.getSubclassDiscoveriesList.asScala
4756
.foreach { subclassDiscovery =>
48-
val fingerprint: SubclassFingerprint = subclassFingerprintMap.get((subclassDiscovery.getSuperclassName, subclassDiscovery.getIsModule, subclassDiscovery.getRequireNoArgConstructor))
57+
val fingerprint = subclassFingerprintMap.get((subclassDiscovery.getSuperclassName, subclassDiscovery.getIsModule, subclassDiscovery.getRequireNoArgConstructor))
4958
.getOrElse(sys.error(s"Unable to resolve fingerprint instance for $subclassDiscovery"))
5059

5160
handleTests(runner, fingerprint, subclassDiscovery.getTestsList.asScala.toList)
5261
}
5362

63+
frameworkDiscovery.getAnnotatedDiscoveriesList.asScala
64+
.foreach { annotatedDiscovery =>
65+
val fingerprint = annotatedFingerprintMap.get((annotatedDiscovery.getAnnotationName, annotatedDiscovery.getIsModule))
66+
.getOrElse(sys.error(s"Unable to resolve fingerprint instance for $annotatedDiscovery"))
67+
68+
handleTests(runner, fingerprint, annotatedDiscovery.getTestsList.asScala.toList)
69+
}
70+
5471
println(runner.done())
5572
println(s"< run of ${frameworkDiscovery.getFramework} complete")
5673
}
5774

58-
def handleTests(runner: Runner, fingerprint: SubclassFingerprint, tests: List[String]): Unit = {
75+
def handleTests(runner: Runner, fingerprint: Fingerprint, tests: List[String]): Unit = {
5976
val eventHandler: EventHandler = new EventHandler {
6077
def handle(event: Event): Unit = {
6178
//println(s"- $event")

src/scala/io/bazel/rules_scala/discover_tests_worker/DiscoverTestsWorker.scala

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ object DiscoverTestsWorker extends Worker.Interface {
4242
.ignoreParentClassLoaders
4343
.enableClassInfo
4444
.enableMethodInfo
45+
.enableAnnotationInfo
4546
.scan
4647

4748
val result: Result = frameworkScanResult
@@ -58,9 +59,11 @@ object DiscoverTestsWorker extends Worker.Interface {
5859
else
5960
_.getSubclasses(fingerprint.superclassName)
6061

61-
val candidates = getCandidates(testScanResult).exclude(getCandidates(frameworkScanResult))
62-
.asScala
63-
.filter(_.isStandardClass)
62+
val candidates: Iterable[ClassInfo] =
63+
getCandidates(testScanResult)
64+
.exclude(getCandidates(frameworkScanResult))
65+
.asScala
66+
.filter(_.isStandardClass)
6467

6568
val tests: Iterable[String] =
6669
if (fingerprint.isModule)
@@ -81,17 +84,34 @@ object DiscoverTestsWorker extends Worker.Interface {
8184
.addAllTests(tests.asJava)
8285
.build)
8386
case fingerprint: AnnotatedFingerprint =>
87+
88+
val candidates: Iterable[ClassInfo] =
89+
testScanResult.getClassesWithAnnotation(fingerprint.annotationName)
90+
.union(testScanResult.getClassesWithMethodAnnotation(fingerprint.annotationName))
91+
.asScala
92+
93+
val tests: Iterable[String] =
94+
if (fingerprint.isModule)
95+
candidates
96+
.map(_.getName)
97+
.filter(_.endsWith("$")).map(_.dropRight(1))
98+
else
99+
candidates
100+
.map(_.getName)
101+
.filterNot(_.endsWith("$"))
102+
84103
b.addAnnotatedDiscoveries(
85104
AnnotatedDiscovery.newBuilder
105+
.setAnnotationName(fingerprint.annotationName)
106+
.setIsModule(fingerprint.isModule)
107+
.addAllTests(tests.asJava)
86108
.build)
87109
}).build)
88110
}.build
89111

90112
testScanResult.close()
91113
frameworkScanResult.close()
92114

93-
//println(result)
94-
95115
val os = new FileOutputStream(outputFile)
96116
result.writeTo(os)
97117
os.close()

src/scala/io/bazel/rules_scala/discover_tests_worker/discovered_tests.proto

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,7 @@ message SubclassDiscovery {
2222
}
2323

2424
message AnnotatedDiscovery {
25-
string empty = 1;
25+
string annotationName = 1;
26+
bool isModule = 2;
27+
repeated string tests = 3;
2628
}

test/v2/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,15 @@ scala_test(
2424
deps = [
2525
":library",
2626
"@org_scalacheck_scalacheck//:org_scalacheck_scalacheck",
27+
"@io_bazel_rules_scala_junit_junit//:io_bazel_rules_scala_junit_junit",
2728
"//external:io_bazel_rules_scala/dependency/scalatest/scalatest",
2829
],
2930
runtime_deps = [
31+
"@com_novocode_junit_interface//:com_novocode_junit_interface",
3032
# this would normally get exported by scalatest if it was set up as a proper dep
3133
# instead of just a jar
3234
"//external:io_bazel_rules_scala/dependency/scala/scala_xml",
35+
# same, but for junit
36+
"@io_bazel_rules_scala_org_hamcrest_hamcrest_core//:io_bazel_rules_scala_org_hamcrest_hamcrest_core",
3337
]
3438
)

test/v2/test.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import org.scalatest.FunSuite
55
import org.scalacheck.Properties
66
import org.scalacheck.Prop._
77

8+
import org.junit.Test
9+
import org.junit.Assert.assertEquals
10+
811
final class TestSuiteClass extends FunSuite {
912
test("method1") {
1013
assert(Library.method1 == "hello")
@@ -28,3 +31,10 @@ final class TestPropertiesClass extends Properties("TestPropertiesClass") {
2831
object TestPropertiesObject extends Properties("TestPropertiesObject") {
2932
property("2") = 2 ?= 2
3033
}
34+
35+
final class JUnitTest {
36+
@Test
37+
def testFoo(): Unit = {
38+
assertEquals("Test should pass", true, true)
39+
}
40+
}

0 commit comments

Comments
 (0)