From 7e2e1987f4cca89226774a33eb0e9d4bcd36f965 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 8 Jan 2017 09:39:34 +0200 Subject: [PATCH 01/38] adding junit scala test running --- WORKSPACE | 3 + junit/BUILD | 0 junit/junit.bzl | 14 ++++ scala/scala.bzl | 70 +++++++++++++++++++ .../io/bazel/rulesscala/test_discovery/BUILD | 8 +++ .../test_discovery/DiscoveredTestSuite.scala | 25 +++++++ test/BUILD | 8 ++- .../scala/scala/test/junit/JunitTest.scala | 16 +++++ 8 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 junit/BUILD create mode 100644 junit/junit.bzl create mode 100644 src/java/io/bazel/rulesscala/test_discovery/BUILD create mode 100644 src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala create mode 100644 test/src/main/scala/scala/test/junit/JunitTest.scala diff --git a/WORKSPACE b/WORKSPACE index 75e3b59cb..a727d2187 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -12,6 +12,9 @@ tut_repositories() load("//jmh:jmh.bzl", "jmh_repositories") jmh_repositories() +load("//junit:junit.bzl", "junit_repositories") +junit_repositories() + # test adding a scala jar: maven_jar( name = "com_twitter__scalding_date", diff --git a/junit/BUILD b/junit/BUILD new file mode 100644 index 000000000..e69de29bb diff --git a/junit/junit.bzl b/junit/junit.bzl new file mode 100644 index 000000000..c41c4e9cf --- /dev/null +++ b/junit/junit.bzl @@ -0,0 +1,14 @@ +def junit_repositories(): + native.maven_jar( + name = "io_bazel_rules_scala_junit_junit", + artifact = "junit:junit:4.12", + sha1 = "2973d150c0dc1fefe998f834810d68f278ea58ec", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/junit/junit', actual = '@io_bazel_rules_scala_junit_junit//jar') + + native.maven_jar( + name = "io_bazel_rules_scala_org_hamcrest_hamcrest_core", + artifact = "org.hamcrest:hamcrest-core:1.3", + sha1 = "42a25dc3219429f0e5d060061f71acb49bf010a0", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/hamcrest/hamcrest_core', actual = '@io_bazel_rules_scala_org_hamcrest_hamcrest_core//jar') diff --git a/scala/scala.bzl b/scala/scala.bzl index 9b09c9c6e..2c246444c 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -298,6 +298,23 @@ def _write_launcher(ctx, jars): content=content) +def _write_junit_test_launcher(ctx, jars, test_suite): + #TODO- allow jvm flags for the junit process + content = """#!/bin/bash +{java} -cp {cp} -ea {classesFlag} org.junit.runner.JUnitCore {test_suite_class} +""" + content = content.format( + java=ctx.file._java.short_path, + #Possible problem- don't know if I need to manually add the discovered_classes file + # to the classpath and if so is this the path I need to add + cp=":".join([j.short_path for j in jars]) + ":" + test_suite.discovered_classes.short_path, + test_suite_class=test_suite.suite_class, + classesFlag = test_suite.classesFlag + ) + ctx.file_action( + output=ctx.outputs.executable, + content=content) + def _write_test_launcher(ctx, jars): if len(ctx.attr.suites) != 0: print( @@ -494,6 +511,43 @@ def _scala_test_impl(ctx): _write_test_launcher(ctx, rjars) return _scala_binary_common(ctx, cjars, rjars) +def _discover_classes(ctx, suffix, archive): + discovered_classes = ctx.new_file(ctx.label.name + "_discovered_classes.txt") + ctx.action( + inputs=[archive], + outputs=[discovered_classes], + progress_message="Discovering classes with suffix of %s" % suffix, + command="unzip -l {archive} | grep {suffix}.class".format(archive=archive, suffix=suffix)) + return discovered_classes + +def _gen_test_suite_based_on_prefix(ctx, archive): + #TODO enable custom patterns + #TODO evolve from suffix to pattern and add "Test*","*IT","*E2E" by default + discovered_classes = _discover_classes(ctx, "Test", archive) + return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, discovered_classes = discovered_classes) + +def _scala_junit_test_impl(ctx): +#TODO write a test that needs a compile time dependency and a runtime dependency +# jars = _collect_jars(ctx.attr.deps) +# (cjars, rjars) = (jars.compiletime, jars.runtime) +# deps = ctx.attr.deps + deps = [ctx.attr._suite] + jars = _collect_jars(deps) + (cjars, rjars) = (jars.compiletime, jars.runtime) + cjars += [ctx.file._junit,ctx.file._hamcrest] + rjars += [ + ctx.outputs.jar, + ctx.file._scalalib, + ctx.file._junit, + ctx.file._hamcrest, + ] + rjars += _collect_jars(ctx.attr.runtime_deps).runtime + test_suite = _gen_test_suite_based_on_prefix(ctx, ctx.outputs.jar) + _write_junit_test_launcher(ctx, rjars, test_suite) + #Possible problem- test_suite.discovered_classes file is not accesible to the binary + # should it be added to the runfiles? how? + return _scala_binary_common(ctx, cjars, rjars) + _implicit_deps = { "_ijar": attr.label(executable=True, cfg="host", default=Label("@bazel_tools//tools/jdk:ijar"), single_file=True, allow_files=True), "_scalac": attr.label(executable=True, cfg="host", default=Label("//src/java/io/bazel/rulesscala/scalac"), allow_files=True), @@ -728,4 +782,20 @@ def scala_library_suite(name, ts.append(n) scala_library(name = name, deps = ts, exports = exports + ts, visibility = visibility) +scala_junit_test = rule( + implementation=_scala_junit_test_impl, + attrs={ +#TODO see if we can parameterize the runner +# "main_class": attr.string(default="org.junit.runner.JUnitCore"), + "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True, allow_files=True), + "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True, allow_files=True), + "_suite": attr.label(default=Label("//src/java/io/bazel/rulesscala/test_discovery:test_discovery")), + } + _implicit_deps + _common_attrs, + outputs={ + "jar": "%{name}.jar", + "deploy_jar": "%{name}_deploy.jar", + "manifest": "%{name}_MANIFEST.MF", + }, + test=True, +) diff --git a/src/java/io/bazel/rulesscala/test_discovery/BUILD b/src/java/io/bazel/rulesscala/test_discovery/BUILD new file mode 100644 index 000000000..91a5fa760 --- /dev/null +++ b/src/java/io/bazel/rulesscala/test_discovery/BUILD @@ -0,0 +1,8 @@ +load("//scala:scala.bzl", "scala_library") + + +scala_library(name = "test_discovery", + srcs = ["DiscoveredTestSuite.scala"], + deps = ["//external:io_bazel_rules_scala/dependency/junit/junit"], + visibility = ["//visibility:public"], + ) \ No newline at end of file diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala new file mode 100644 index 000000000..7c871a0f8 --- /dev/null +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -0,0 +1,25 @@ +package io.bazel.rulesscala.test_discovery + +import org.junit.runner.RunWith +import org.junit.runner.Runner +import org.junit.runners.Suite +import org.junit.runners.model.RunnerBuilder + +@RunWith(classOf[TextFileSuite]) +class DiscoveredTestSuite + +class TextFileSuite(testClass: Class[Any], builder: RunnerBuilder) + extends Suite(builder, testClass, TextFileSuite.discoveredClasses) + +object TextFileSuite { + + private val discoveredClasses = readDiscoveredClasses(classesRegistry) + + private def readDiscoveredClasses(classesRegistry: String): Array[Class[_]] = + scala.io.Source.fromFile(classesRegistry).getLines.toArray.map(Class.forName) + + + private def classesRegistry: String = + System.getProperty("bazel.discovered.classes.file.path") + +} \ No newline at end of file diff --git a/test/BUILD b/test/BUILD index 85aa28287..052a03b86 100644 --- a/test/BUILD +++ b/test/BUILD @@ -8,7 +8,8 @@ load("//scala:scala.bzl", "scala_export_to_java", "scala_repl", "scala_test_suite", - "scala_library_suite") + "scala_library_suite", + "scala_junit_test") # The examples below show how to combine Scala and Java rules. # ScalaBinary is the Scala equivalent of JavaBinary. @@ -216,3 +217,8 @@ scala_binary( srcs = ["src/main/scala/scala/test/only_java/Alpha.java"], main_class = "scala.test.Alpha", ) + +scala_junit_test( + name = "JunitTest", + srcs = ["src/main/scala/scala/test/junit/JunitTest.scala"], +) \ No newline at end of file diff --git a/test/src/main/scala/scala/test/junit/JunitTest.scala b/test/src/main/scala/scala/test/junit/JunitTest.scala new file mode 100644 index 000000000..5b527b4df --- /dev/null +++ b/test/src/main/scala/scala/test/junit/JunitTest.scala @@ -0,0 +1,16 @@ +package scala.test.junit + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert._ + +@RunWith(classOf[JUnit4]) +class JunitTest { + + @Test + def junitTest: Unit = { + assertEquals(1, 1); + } + +} \ No newline at end of file From 34620c876f290920b9ed23a554f53669d4995abb Mon Sep 17 00:00:00 2001 From: ittaiz Date: Mon, 6 Mar 2017 18:17:20 +0200 Subject: [PATCH 02/38] discovered_classes output actually redirected to file run files currently manually built DiscoveredTestSuite correctly parses the zip entries JunitTest removes the @RunWith since it's not mandatory --- scala/scala.bzl | 12 +++++++++-- .../test_discovery/DiscoveredTestSuite.scala | 20 +++++++++++++++++-- .../scala/scala/test/junit/JunitTest.scala | 1 - 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 2c246444c..4043e5290 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -517,7 +517,7 @@ def _discover_classes(ctx, suffix, archive): inputs=[archive], outputs=[discovered_classes], progress_message="Discovering classes with suffix of %s" % suffix, - command="unzip -l {archive} | grep {suffix}.class".format(archive=archive, suffix=suffix)) + command="unzip -l {archive} | grep {suffix}.class > {out}".format(archive=archive.path, suffix=suffix,out=discovered_classes.path)) return discovered_classes def _gen_test_suite_based_on_prefix(ctx, archive): @@ -546,7 +546,15 @@ def _scala_junit_test_impl(ctx): _write_junit_test_launcher(ctx, rjars, test_suite) #Possible problem- test_suite.discovered_classes file is not accesible to the binary # should it be added to the runfiles? how? - return _scala_binary_common(ctx, cjars, rjars) + runfiles = ctx.runfiles( + files = list(rjars) + [ctx.outputs.executable] + [ctx.file._java] + ctx.files._jdk + [test_suite.discovered_classes], + collect_data = True) + + out = _scala_binary_common(ctx, cjars, rjars) + return struct( + files = out.files, + scala = out.scala, + runfiles = runfiles) _implicit_deps = { "_ijar": attr.label(executable=True, cfg="host", default=Label("@bazel_tools//tools/jdk:ijar"), single_file=True, allow_files=True), diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala index 7c871a0f8..95a914ae0 100644 --- a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -16,8 +16,24 @@ object TextFileSuite { private val discoveredClasses = readDiscoveredClasses(classesRegistry) private def readDiscoveredClasses(classesRegistry: String): Array[Class[_]] = - scala.io.Source.fromFile(classesRegistry).getLines.toArray.map(Class.forName) - + classEntries(classesRegistry) + .map(filterTimeStampAndWhitespace) + .map(dropFileSuffix) + .map(fileToClassFormat) + .map(Class.forName) + + private def filterTimeStampAndWhitespace(classEntry: String): String = + classEntry.split("\\s+").last + + private def dropFileSuffix(classEntry: String): String = + classEntry.split("\\.").head + + //name is too imperative. Not sure how to change to declarative + private def fileToClassFormat(classEntry: String): String = + classEntry.replace('/', '.') + + private def classEntries(classesRegistry: String): Array[String] = + scala.io.Source.fromFile(classesRegistry).getLines.toArray private def classesRegistry: String = System.getProperty("bazel.discovered.classes.file.path") diff --git a/test/src/main/scala/scala/test/junit/JunitTest.scala b/test/src/main/scala/scala/test/junit/JunitTest.scala index 5b527b4df..b618276b4 100644 --- a/test/src/main/scala/scala/test/junit/JunitTest.scala +++ b/test/src/main/scala/scala/test/junit/JunitTest.scala @@ -5,7 +5,6 @@ import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.junit.Assert._ -@RunWith(classOf[JUnit4]) class JunitTest { @Test From 41c0a4887e96b0c0311c58e51d7673249140789c Mon Sep 17 00:00:00 2001 From: ittaiz Date: Mon, 6 Mar 2017 18:26:31 +0200 Subject: [PATCH 03/38] added discovered_classes to rjars and so removed cp hack and reusing shared runfiles --- scala/scala.bzl | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 4043e5290..66aa56162 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -307,7 +307,7 @@ def _write_junit_test_launcher(ctx, jars, test_suite): java=ctx.file._java.short_path, #Possible problem- don't know if I need to manually add the discovered_classes file # to the classpath and if so is this the path I need to add - cp=":".join([j.short_path for j in jars]) + ":" + test_suite.discovered_classes.short_path, + cp=":".join([j.short_path for j in jars]), test_suite_class=test_suite.suite_class, classesFlag = test_suite.classesFlag ) @@ -543,18 +543,11 @@ def _scala_junit_test_impl(ctx): ] rjars += _collect_jars(ctx.attr.runtime_deps).runtime test_suite = _gen_test_suite_based_on_prefix(ctx, ctx.outputs.jar) + rjars += list([test_suite.discovered_classes]) _write_junit_test_launcher(ctx, rjars, test_suite) - #Possible problem- test_suite.discovered_classes file is not accesible to the binary - # should it be added to the runfiles? how? - runfiles = ctx.runfiles( - files = list(rjars) + [ctx.outputs.executable] + [ctx.file._java] + ctx.files._jdk + [test_suite.discovered_classes], - collect_data = True) - out = _scala_binary_common(ctx, cjars, rjars) - return struct( - files = out.files, - scala = out.scala, - runfiles = runfiles) + + return _scala_binary_common(ctx, cjars, rjars) _implicit_deps = { "_ijar": attr.label(executable=True, cfg="host", default=Label("@bazel_tools//tools/jdk:ijar"), single_file=True, allow_files=True), From 60caa693cfadb9b061662a01aa4cc767edce10e9 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 09:30:06 +0200 Subject: [PATCH 04/38] explicitly adding the discovered_classes file to the runfiles --- scala/scala.bzl | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 66aa56162..8a98807f8 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -543,11 +543,18 @@ def _scala_junit_test_impl(ctx): ] rjars += _collect_jars(ctx.attr.runtime_deps).runtime test_suite = _gen_test_suite_based_on_prefix(ctx, ctx.outputs.jar) - rjars += list([test_suite.discovered_classes]) _write_junit_test_launcher(ctx, rjars, test_suite) + common_binary = _scala_binary_common(ctx, cjars, rjars) + discovered_classes_runfiles = ctx.runfiles( + files = [test_suite.discovered_classes]) + + #TODO is there a way to easily merge both structs + return struct( + files = common_binary.files, + scala = common_binary.scala, + runfiles= common_binary.runfiles.merge(discovered_classes_runfiles)) - return _scala_binary_common(ctx, cjars, rjars) _implicit_deps = { "_ijar": attr.label(executable=True, cfg="host", default=Label("@bazel_tools//tools/jdk:ijar"), single_file=True, allow_files=True), From 410018ddb244d0dc3a441a52537f9d9f55081702 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 09:31:14 +0200 Subject: [PATCH 05/38] removed stale comment --- scala/scala.bzl | 2 -- 1 file changed, 2 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 8a98807f8..66e6e26fa 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -305,8 +305,6 @@ def _write_junit_test_launcher(ctx, jars, test_suite): """ content = content.format( java=ctx.file._java.short_path, - #Possible problem- don't know if I need to manually add the discovered_classes file - # to the classpath and if so is this the path I need to add cp=":".join([j.short_path for j in jars]), test_suite_class=test_suite.suite_class, classesFlag = test_suite.classesFlag From 287921f63cfb2bfa9a075ab980d1cebf71712f08 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 11:27:11 +0200 Subject: [PATCH 06/38] changed target name so it's clear target name is not bound to class name --- test/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/BUILD b/test/BUILD index 052a03b86..cb05d0db9 100644 --- a/test/BUILD +++ b/test/BUILD @@ -219,6 +219,6 @@ scala_binary( ) scala_junit_test( - name = "JunitTest", + name = "TestTargetWithJunit", srcs = ["src/main/scala/scala/test/junit/JunitTest.scala"], ) \ No newline at end of file From 6fd76c900cb33724104855d8ead00b20a7bc02e7 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 11:35:41 +0200 Subject: [PATCH 07/38] explained a todo better, removed allow_files since it's included in single_file) --- scala/scala.bzl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 66e6e26fa..57b88b052 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -548,6 +548,8 @@ def _scala_junit_test_impl(ctx): files = [test_suite.discovered_classes]) #TODO is there a way to easily merge both structs + #I'd like a scala case class copy: + #common_binary.copy(runfiles= common_binary.runfiles.merge(discovered_classes_runfiles)) return struct( files = common_binary.files, scala = common_binary.scala, @@ -793,8 +795,8 @@ scala_junit_test = rule( attrs={ #TODO see if we can parameterize the runner # "main_class": attr.string(default="org.junit.runner.JUnitCore"), - "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True, allow_files=True), - "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True, allow_files=True), + "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True), + "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True), "_suite": attr.label(default=Label("//src/java/io/bazel/rulesscala/test_discovery:test_discovery")), } + _implicit_deps + _common_attrs, outputs={ From 87dbf015172532e15709dd3c133ac6457d1c0e5a Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 11:39:55 +0200 Subject: [PATCH 08/38] split whitespace and metadata filtering --- .../test_discovery/DiscoveredTestSuite.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala index 95a914ae0..379e0a08a 100644 --- a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -16,14 +16,18 @@ object TextFileSuite { private val discoveredClasses = readDiscoveredClasses(classesRegistry) private def readDiscoveredClasses(classesRegistry: String): Array[Class[_]] = - classEntries(classesRegistry) - .map(filterTimeStampAndWhitespace) + entries(classesRegistry) + .map(filterWhitespace) + .map(filterMetadata) .map(dropFileSuffix) .map(fileToClassFormat) .map(Class.forName) - private def filterTimeStampAndWhitespace(classEntry: String): String = - classEntry.split("\\s+").last + private def filterMetadata(zipEntryParts: Array[String]): String = + zipEntryParts.last + + private def filterWhitespace(zipEntry: String): Array[String] = + zipEntry.split("\\s+") private def dropFileSuffix(classEntry: String): String = classEntry.split("\\.").head @@ -32,7 +36,7 @@ object TextFileSuite { private def fileToClassFormat(classEntry: String): String = classEntry.replace('/', '.') - private def classEntries(classesRegistry: String): Array[String] = + private def entries(classesRegistry: String): Array[String] = scala.io.Source.fromFile(classesRegistry).getLines.toArray private def classesRegistry: String = From ea10b40e80917b0715a940aa788a76706abacbe6 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 11:41:58 +0200 Subject: [PATCH 09/38] added comment about the usage of grep in skylark --- scala/scala.bzl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scala/scala.bzl b/scala/scala.bzl index 57b88b052..907692601 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -515,6 +515,9 @@ def _discover_classes(ctx, suffix, archive): inputs=[archive], outputs=[discovered_classes], progress_message="Discovering classes with suffix of %s" % suffix, + #TODO consider with Damien/Ulf/Oscar the implications of switching from grep to scala code + #Pro-> logic will be cohesive (currently the scala code assumes stuff from the grep) + #Con-> IIRC Ulf warned me about performance implications of these traversals command="unzip -l {archive} | grep {suffix}.class > {out}".format(archive=archive.path, suffix=suffix,out=discovered_classes.path)) return discovered_classes From 9effdb91c02e7bb406d94b52056475cb2e4dea82 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 7 Mar 2017 16:41:01 +0200 Subject: [PATCH 10/38] added support for runtime deps and compile time deps --- scala/scala.bzl | 14 +++++-------- test/BUILD | 20 ++++++++++++++++++ .../scala/test/junit/JunitWithDeps.scala | 21 +++++++++++++++++++ .../test/junit/support/JUnitRuntimeDep.scala | 2 ++ 4 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 test/src/main/scala/scala/test/junit/JunitWithDeps.scala create mode 100644 test/src/main/scala/scala/test/junit/support/JUnitRuntimeDep.scala diff --git a/scala/scala.bzl b/scala/scala.bzl index 907692601..65c11909d 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -529,19 +529,15 @@ def _gen_test_suite_based_on_prefix(ctx, archive): def _scala_junit_test_impl(ctx): #TODO write a test that needs a compile time dependency and a runtime dependency -# jars = _collect_jars(ctx.attr.deps) -# (cjars, rjars) = (jars.compiletime, jars.runtime) -# deps = ctx.attr.deps - deps = [ctx.attr._suite] + deps = ctx.attr.deps + [ctx.attr._suite] jars = _collect_jars(deps) (cjars, rjars) = (jars.compiletime, jars.runtime) - cjars += [ctx.file._junit,ctx.file._hamcrest] + junit_deps = [ctx.file._junit,ctx.file._hamcrest] + cjars += junit_deps rjars += [ ctx.outputs.jar, - ctx.file._scalalib, - ctx.file._junit, - ctx.file._hamcrest, - ] + ctx.file._scalalib + ] + junit_deps rjars += _collect_jars(ctx.attr.runtime_deps).runtime test_suite = _gen_test_suite_based_on_prefix(ctx, ctx.outputs.jar) _write_junit_test_launcher(ctx, rjars, test_suite) diff --git a/test/BUILD b/test/BUILD index cb05d0db9..31285dbd1 100644 --- a/test/BUILD +++ b/test/BUILD @@ -221,4 +221,24 @@ scala_binary( scala_junit_test( name = "TestTargetWithJunit", srcs = ["src/main/scala/scala/test/junit/JunitTest.scala"], +) + +#JVM args +#multiple suffix +#custom suffix +#pattern +#-XX:HeapDumpPath=/some/custom/path +#custom runner? +#specs2 +#handle case where a target has no test classes + +scala_library( + name = "JUnitRuntimeDep", + srcs = ["src/main/scala/scala/test/junit/support/JUnitRuntimeDep.scala"], +) +scala_junit_test( + name = "JunitTestWithDeps", + srcs = ["src/main/scala/scala/test/junit/JunitWithDeps.scala"], + deps = [":HelloLib"], + runtime_deps = [":JUnitRuntimeDep"] ) \ No newline at end of file diff --git a/test/src/main/scala/scala/test/junit/JunitWithDeps.scala b/test/src/main/scala/scala/test/junit/JunitWithDeps.scala new file mode 100644 index 000000000..a4e0a9eaf --- /dev/null +++ b/test/src/main/scala/scala/test/junit/JunitWithDeps.scala @@ -0,0 +1,21 @@ +package scala.test.junit + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert._ +import scala.test.HelloLib + +class JunitWithDepsTest { + + @Test + def hasCompileTimeDependencies: Unit = { + HelloLib.printMessage("yo") + } + + @Test + def hasRuntimeDependencies: Unit = { + Class.forName("scala.test.junit.support.JUnitRuntimeDep") + } + +} \ No newline at end of file diff --git a/test/src/main/scala/scala/test/junit/support/JUnitRuntimeDep.scala b/test/src/main/scala/scala/test/junit/support/JUnitRuntimeDep.scala new file mode 100644 index 000000000..7d6c324d3 --- /dev/null +++ b/test/src/main/scala/scala/test/junit/support/JUnitRuntimeDep.scala @@ -0,0 +1,2 @@ +package scala.test.junit.support +class JUnitRuntimeDep \ No newline at end of file From f9f084c2690964b6e6ca71329d0f438b55816dd4 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Wed, 8 Mar 2017 08:07:45 +0200 Subject: [PATCH 11/38] added support for jvm_flags and multiple custom suffixes --- scala/scala.bzl | 19 +++++------ test/BUILD | 26 ++++++++------- ...unitTest.scala => JunitCustomSuffix.scala} | 8 ++--- .../test/junit/JunitMultipleSuffixes.scala | 25 +++++++++++++++ .../scala/scala/test/junit/JunitTests.scala | 32 +++++++++++++++++++ .../scala/test/junit/JunitWithDeps.scala | 21 ------------ test_run.sh | 12 ++++++- 7 files changed, 96 insertions(+), 47 deletions(-) rename test/src/main/scala/scala/test/junit/{JunitTest.scala => JunitCustomSuffix.scala} (66%) create mode 100644 test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala create mode 100644 test/src/main/scala/scala/test/junit/JunitTests.scala delete mode 100644 test/src/main/scala/scala/test/junit/JunitWithDeps.scala diff --git a/scala/scala.bzl b/scala/scala.bzl index 65c11909d..299bc8fab 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -299,15 +299,16 @@ def _write_launcher(ctx, jars): def _write_junit_test_launcher(ctx, jars, test_suite): - #TODO- allow jvm flags for the junit process content = """#!/bin/bash -{java} -cp {cp} -ea {classesFlag} org.junit.runner.JUnitCore {test_suite_class} +{java} -cp {cp} -ea {classesFlag} {jvm_flags} org.junit.runner.JUnitCore {test_suite_class} """ content = content.format( java=ctx.file._java.short_path, cp=":".join([j.short_path for j in jars]), test_suite_class=test_suite.suite_class, - classesFlag = test_suite.classesFlag + classesFlag = test_suite.classesFlag, + #allows setting xmx for example for tests which use a lot of memory + jvm_flags = " ".join(ctx.attr.jvm_flags) ) ctx.file_action( output=ctx.outputs.executable, @@ -509,26 +510,25 @@ def _scala_test_impl(ctx): _write_test_launcher(ctx, rjars) return _scala_binary_common(ctx, cjars, rjars) -def _discover_classes(ctx, suffix, archive): +def _discover_classes(ctx, suffixes, archive): discovered_classes = ctx.new_file(ctx.label.name + "_discovered_classes.txt") ctx.action( inputs=[archive], outputs=[discovered_classes], - progress_message="Discovering classes with suffix of %s" % suffix, + progress_message="Discovering classes with suffixes of %s" % suffixes, #TODO consider with Damien/Ulf/Oscar the implications of switching from grep to scala code #Pro-> logic will be cohesive (currently the scala code assumes stuff from the grep) #Con-> IIRC Ulf warned me about performance implications of these traversals - command="unzip -l {archive} | grep {suffix}.class > {out}".format(archive=archive.path, suffix=suffix,out=discovered_classes.path)) + command="unzip -l {archive} | grep -e {combined_suffixes}.class > {out}".format(archive=archive.path,combined_suffixes=" -e ".join(suffixes),out=discovered_classes.path)) return discovered_classes def _gen_test_suite_based_on_prefix(ctx, archive): #TODO enable custom patterns - #TODO evolve from suffix to pattern and add "Test*","*IT","*E2E" by default - discovered_classes = _discover_classes(ctx, "Test", archive) + #TODO evolve from suffixes to pattern and add "Test*","*IT","*E2E" by default + discovered_classes = _discover_classes(ctx, ctx.attr.suffixes, archive) return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, discovered_classes = discovered_classes) def _scala_junit_test_impl(ctx): -#TODO write a test that needs a compile time dependency and a runtime dependency deps = ctx.attr.deps + [ctx.attr._suite] jars = _collect_jars(deps) (cjars, rjars) = (jars.compiletime, jars.runtime) @@ -794,6 +794,7 @@ scala_junit_test = rule( attrs={ #TODO see if we can parameterize the runner # "main_class": attr.string(default="org.junit.runner.JUnitCore"), + "suffixes": attr.string_list(default=["Test"]), "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True), "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True), "_suite": attr.label(default=Label("//src/java/io/bazel/rulesscala/test_discovery:test_discovery")), diff --git a/test/BUILD b/test/BUILD index 31285dbd1..886ba60d6 100644 --- a/test/BUILD +++ b/test/BUILD @@ -218,16 +218,7 @@ scala_binary( main_class = "scala.test.Alpha", ) -scala_junit_test( - name = "TestTargetWithJunit", - srcs = ["src/main/scala/scala/test/junit/JunitTest.scala"], -) - -#JVM args -#multiple suffix -#custom suffix #pattern -#-XX:HeapDumpPath=/some/custom/path #custom runner? #specs2 #handle case where a target has no test classes @@ -238,7 +229,18 @@ scala_library( ) scala_junit_test( name = "JunitTestWithDeps", - srcs = ["src/main/scala/scala/test/junit/JunitWithDeps.scala"], + srcs = glob(["src/main/scala/scala/test/junit/JunitTests.scala"]), deps = [":HelloLib"], - runtime_deps = [":JUnitRuntimeDep"] -) \ No newline at end of file + runtime_deps = [":JUnitRuntimeDep"], + jvm_flags = ["-XX:HeapDumpPath=/some/custom/path"], +) +scala_junit_test( + name = "JunitCustomSuffix", + srcs = glob(["src/main/scala/scala/test/junit/JunitCustomSuffix.scala"]), + suffixes = ["E2E"] +) +scala_junit_test( + name = "JunitMultipleSuffixes", + srcs = glob(["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala"]), + suffixes = ["E2E","IT"] +) diff --git a/test/src/main/scala/scala/test/junit/JunitTest.scala b/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala similarity index 66% rename from test/src/main/scala/scala/test/junit/JunitTest.scala rename to test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala index b618276b4..f56ec82b9 100644 --- a/test/src/main/scala/scala/test/junit/JunitTest.scala +++ b/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala @@ -5,11 +5,11 @@ import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.junit.Assert._ -class JunitTest { +class JunitCustomSuffixE2E { @Test - def junitTest: Unit = { - assertEquals(1, 1); + def someTest: Unit = { + assertEquals(1, 1) } -} \ No newline at end of file +} diff --git a/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala b/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala new file mode 100644 index 000000000..e56926692 --- /dev/null +++ b/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala @@ -0,0 +1,25 @@ +package scala.test.junit + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert._ + +class JunitSuffixE2E { + + @Test + def someTest: Unit = { + println("Running E2E") + assertEquals(1, 1) + } + +} +class JunitSuffixIT { + + @Test + def someTest: Unit = { + println("Running IT") + assertEquals(1, 1) + } + +} diff --git a/test/src/main/scala/scala/test/junit/JunitTests.scala b/test/src/main/scala/scala/test/junit/JunitTests.scala new file mode 100644 index 000000000..70fe0f0ff --- /dev/null +++ b/test/src/main/scala/scala/test/junit/JunitTests.scala @@ -0,0 +1,32 @@ +package scala.test.junit + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.hamcrest.CoreMatchers._ +import org.hamcrest.MatcherAssert._ +import scala.test.HelloLib +import java.lang.management.ManagementFactory +import java.lang.management.RuntimeMXBean + +class JunitWithDepsTest { + + @Test + def hasCompileTimeDependencies: Unit = { + HelloLib.printMessage("yo") + } + + @Test + def hasRuntimeDependencies: Unit = { + Class.forName("scala.test.junit.support.JUnitRuntimeDep") + } + + @Test + def supportsCustomJVMArgs: Unit = { + assertThat(ManagementFactory.getRuntimeMXBean().getInputArguments(), + hasItem("-XX:HeapDumpPath=/some/custom/path")) + } + +} + +class ClassCoveringRegressionFromTakingAllClassesInArchive \ No newline at end of file diff --git a/test/src/main/scala/scala/test/junit/JunitWithDeps.scala b/test/src/main/scala/scala/test/junit/JunitWithDeps.scala deleted file mode 100644 index a4e0a9eaf..000000000 --- a/test/src/main/scala/scala/test/junit/JunitWithDeps.scala +++ /dev/null @@ -1,21 +0,0 @@ -package scala.test.junit - -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 -import org.junit.Assert._ -import scala.test.HelloLib - -class JunitWithDepsTest { - - @Test - def hasCompileTimeDependencies: Unit = { - HelloLib.printMessage("yo") - } - - @Test - def hasRuntimeDependencies: Unit = { - Class.forName("scala.test.junit.support.JUnitRuntimeDep") - } - -} \ No newline at end of file diff --git a/test_run.sh b/test_run.sh index 544066197..2cdaa32cc 100755 --- a/test_run.sh +++ b/test_run.sh @@ -112,6 +112,16 @@ xmllint_test() { find -L ./bazel-testlogs -iname "*.xml" | xargs -n1 xmllint > /dev/null } +multiple_junit_suffixes() { + bazel test //test:JunitMultipleSuffixes + matches=$(grep -c -e 'Running E2E' -e 'Running IT' ./bazel-testlogs/test/JunitMultipleSuffixes/test.log) + if [ $matches -eq 2 ]; then + return 0 + else + return 1 + fi +} + run_test bazel build test/... run_test bazel test test/... run_test bazel run test/src/main/scala/scala/test/twitter_scrooge:justscrooges @@ -129,4 +139,4 @@ run_test test_scala_library_suite run_test test_repl run_test bazel run test:JavaOnlySources run_test test_benchmark_jmh - +run_test multiple_junit_suffixes From 3158e76d859ffd6af9902ab3f5d71d6d63791921 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Wed, 8 Mar 2017 09:59:02 +0200 Subject: [PATCH 12/38] support patterns and not only suffixes --- scala/scala.bzl | 21 +++++++++++-------- test/BUILD | 17 +++++++++++---- .../scala/test/junit/JunitCustomPattern.scala | 15 +++++++++++++ 3 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 test/src/main/scala/scala/test/junit/JunitCustomPattern.scala diff --git a/scala/scala.bzl b/scala/scala.bzl index 299bc8fab..2738a1ab0 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -510,22 +510,27 @@ def _scala_test_impl(ctx): _write_test_launcher(ctx, rjars) return _scala_binary_common(ctx, cjars, rjars) -def _discover_classes(ctx, suffixes, archive): +def _prep_grep_pattern_from(patterns): + combined_pattern = "" + for pattern in patterns: + combined_pattern += " -e {}\.class".format(pattern) + return combined_pattern + +def _discover_classes(ctx, patterns, archive): discovered_classes = ctx.new_file(ctx.label.name + "_discovered_classes.txt") ctx.action( inputs=[archive], outputs=[discovered_classes], - progress_message="Discovering classes with suffixes of %s" % suffixes, + progress_message="Discovering classes with patterns of %s" % patterns, #TODO consider with Damien/Ulf/Oscar the implications of switching from grep to scala code #Pro-> logic will be cohesive (currently the scala code assumes stuff from the grep) #Con-> IIRC Ulf warned me about performance implications of these traversals - command="unzip -l {archive} | grep -e {combined_suffixes}.class > {out}".format(archive=archive.path,combined_suffixes=" -e ".join(suffixes),out=discovered_classes.path)) + command="unzip -l {archive} | grep {combined_patterns} > {out}".format(archive=archive.path, combined_patterns=_prep_grep_pattern_from(patterns), out=discovered_classes.path)) return discovered_classes def _gen_test_suite_based_on_prefix(ctx, archive): - #TODO enable custom patterns - #TODO evolve from suffixes to pattern and add "Test*","*IT","*E2E" by default - discovered_classes = _discover_classes(ctx, ctx.attr.suffixes, archive) +#add "Test*","*IT","*E2E" by default + discovered_classes = _discover_classes(ctx, ctx.attr.patterns, archive) return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, discovered_classes = discovered_classes) def _scala_junit_test_impl(ctx): @@ -792,9 +797,7 @@ def scala_library_suite(name, scala_junit_test = rule( implementation=_scala_junit_test_impl, attrs={ -#TODO see if we can parameterize the runner -# "main_class": attr.string(default="org.junit.runner.JUnitCore"), - "suffixes": attr.string_list(default=["Test"]), + "patterns": attr.string_list(default=["Test"]), "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True), "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True), "_suite": attr.label(default=Label("//src/java/io/bazel/rulesscala/test_discovery:test_discovery")), diff --git a/test/BUILD b/test/BUILD index 886ba60d6..c1fae1c0a 100644 --- a/test/BUILD +++ b/test/BUILD @@ -218,10 +218,10 @@ scala_binary( main_class = "scala.test.Alpha", ) -#pattern -#custom runner? #specs2 +#default macros for Test, E2E, IT? #handle case where a target has no test classes +#remove duplicated code scala_library( name = "JUnitRuntimeDep", @@ -230,6 +230,7 @@ scala_library( scala_junit_test( name = "JunitTestWithDeps", srcs = glob(["src/main/scala/scala/test/junit/JunitTests.scala"]), + size = "small", deps = [":HelloLib"], runtime_deps = [":JUnitRuntimeDep"], jvm_flags = ["-XX:HeapDumpPath=/some/custom/path"], @@ -237,10 +238,18 @@ scala_junit_test( scala_junit_test( name = "JunitCustomSuffix", srcs = glob(["src/main/scala/scala/test/junit/JunitCustomSuffix.scala"]), - suffixes = ["E2E"] + size = "small", + patterns = ["E2E"] ) scala_junit_test( name = "JunitMultipleSuffixes", srcs = glob(["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala"]), - suffixes = ["E2E","IT"] + size = "small", + patterns = ["E2E","IT"] +) +scala_junit_test( + name = "JunitCustomPattern", + srcs = glob(["src/main/scala/scala/test/junit/JunitCustomPattern.scala"]), + size = "small", + patterns = ["Test.*"] ) diff --git a/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala b/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala new file mode 100644 index 000000000..7669bfb4c --- /dev/null +++ b/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala @@ -0,0 +1,15 @@ +package scala.test.junit + +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Assert._ + +class TestJunitCustomPattern { + + @Test + def someTest: Unit = { + assertEquals(1, 1) + } + +} From 0033f219363461df82c1b18c2b955b84ed15de87 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Wed, 8 Mar 2017 22:15:37 +0200 Subject: [PATCH 13/38] added specs2 junit support --- WORKSPACE | 4 +- scala/scala.bzl | 30 ++++++++++++ specs2/BUILD | 0 specs2/specs2.bzl | 49 +++++++++++++++++++ specs2/specs2_junit.bzl | 16 ++++++ test/BUILD | 23 ++++++--- .../scala/test/junit/specs2/Specs2Tests.scala | 14 ++++++ 7 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 specs2/BUILD create mode 100644 specs2/specs2.bzl create mode 100644 specs2/specs2_junit.bzl create mode 100644 test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala diff --git a/WORKSPACE b/WORKSPACE index a727d2187..833b8e577 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -12,8 +12,8 @@ tut_repositories() load("//jmh:jmh.bzl", "jmh_repositories") jmh_repositories() -load("//junit:junit.bzl", "junit_repositories") -junit_repositories() +load("//specs2:specs2_junit.bzl","specs2_junit_repositories") +specs2_junit_repositories() # test adding a scala jar: maven_jar( diff --git a/scala/scala.bzl b/scala/scala.bzl index 2738a1ab0..f9a1ee92c 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -14,6 +14,7 @@ """Rules for supporting the Scala language.""" +load("//specs2:specs2_junit.bzl", "specs2_junit_dependencies") _jar_filetype = FileType([".jar"]) _java_filetype = FileType([".java"]) _scala_filetype = FileType([".scala"]) @@ -689,6 +690,30 @@ exports_files([ "lib/scala-xml_2.11-1.0.4.jar", "lib/scalap-2.11.8.jar", ]) + +filegroup( + name = "scala-xml", + srcs = ["lib/scala-xml_2.11-1.0.4.jar"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "scala-parser-combinators", + srcs = ["lib/scala-parser-combinators_2.11-1.0.4.jar"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "scala-library", + srcs = ["lib/scala-library.jar"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "scala-reflect", + srcs = ["lib/scala-reflect.jar"], + visibility = ["//visibility:public"], +) """ def scala_repositories(): @@ -810,3 +835,8 @@ scala_junit_test = rule( test=True, ) +def scala_specs2_junit_test(name, **kwargs): + scala_junit_test( + name = name, + deps = specs2_junit_dependencies() + kwargs.pop("deps",[]), + **kwargs) \ No newline at end of file diff --git a/specs2/BUILD b/specs2/BUILD new file mode 100644 index 000000000..e69de29bb diff --git a/specs2/specs2.bzl b/specs2/specs2.bzl new file mode 100644 index 000000000..3eed0a250 --- /dev/null +++ b/specs2/specs2.bzl @@ -0,0 +1,49 @@ +def specs2_repositories(): + + native.maven_jar( + name = "io_bazel_rules_scala_org_specs2_specs2_core", + artifact = "org.specs2:specs2-core_2.11:3.8.8", + sha1 = "495bed00c73483f4f5f43945fde63c615d03e637", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_core', actual = '@io_bazel_rules_scala_org_specs2_specs2_core//jar') + + native.maven_jar( + name = "io_bazel_rules_scala_org_specs2_specs2_common", + artifact = "org.specs2:specs2-common_2.11:3.8.8", + sha1 = "15bc009eaae3a574796c0f558d8696b57ae903c3", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_common', actual = '@io_bazel_rules_scala_org_specs2_specs2_common//jar') + + native.maven_jar( + name = "io_bazel_rules_scala_org_specs2_specs2_matcher", + artifact = "org.specs2:specs2-matcher_2.11:3.8.8", + sha1 = "d2e967737abef7421e47b8994a8c92784e624d62", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_matcher', actual = '@io_bazel_rules_scala_org_specs2_specs2_matcher//jar') + + native.maven_jar( + name = "io_bazel_rules_scala_org_scalaz_scalaz_effect", + artifact = "org.scalaz:scalaz-effect_2.11:7.2.7", + sha1 = "824bbb83da12224b3537c354c51eb3da72c435b5", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/scalaz/scalaz_effect', actual = '@io_bazel_rules_scala_org_scalaz_scalaz_effect//jar') + + native.maven_jar( + name = "io_bazel_rules_scala_org_scalaz_scalaz_core", + artifact = "org.scalaz:scalaz-core_2.11:7.2.7", + sha1 = "ebf85118d0bf4ce18acebf1d8475ee7deb7f19f1", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/scalaz/scalaz_core', actual = '@io_bazel_rules_scala_org_scalaz_scalaz_core//jar') + +def specs2_dependencies(): + return [ + "//external:io_bazel_rules_scala/dependency/specs2/specs2_core", + "//external:io_bazel_rules_scala/dependency/specs2/specs2_common", + "//external:io_bazel_rules_scala/dependency/specs2/specs2_matcher", + "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_effect", + "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_core", + "@scala//:scala-xml", + "@scala//:scala-parser-combinators", + "@scala//:scala-library", + "@scala//:scala-reflect", + ] diff --git a/specs2/specs2_junit.bzl b/specs2/specs2_junit.bzl new file mode 100644 index 000000000..49d2dd5b3 --- /dev/null +++ b/specs2/specs2_junit.bzl @@ -0,0 +1,16 @@ +load("//specs2:specs2.bzl", "specs2_repositories", "specs2_dependencies") +load("//junit:junit.bzl", "junit_repositories") + +def specs2_junit_repositories(): + specs2_repositories() + junit_repositories() + # Aditional dependencies for specs2 junit runner + native.maven_jar( + name = "io_bazel_rules_scala_org_specs2_specs2_junit_2_11", + artifact = "org.specs2:specs2-junit_2.11:3.8.8", + sha1 = "1dc9e43970557c308ee313842d84094bc6c1c1b5", + ) + native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_junit', actual = '@io_bazel_rules_scala_org_specs2_specs2_junit_2_11//jar') + +def specs2_junit_dependencies(): + return specs2_dependencies() + ["//external:io_bazel_rules_scala/dependency/specs2/specs2_junit"] diff --git a/test/BUILD b/test/BUILD index c1fae1c0a..488b345a9 100644 --- a/test/BUILD +++ b/test/BUILD @@ -9,7 +9,8 @@ load("//scala:scala.bzl", "scala_repl", "scala_test_suite", "scala_library_suite", - "scala_junit_test") + "scala_junit_test", + "scala_specs2_junit_test") # The examples below show how to combine Scala and Java rules. # ScalaBinary is the Scala equivalent of JavaBinary. @@ -218,10 +219,6 @@ scala_binary( main_class = "scala.test.Alpha", ) -#specs2 -#default macros for Test, E2E, IT? -#handle case where a target has no test classes -#remove duplicated code scala_library( name = "JUnitRuntimeDep", @@ -231,7 +228,7 @@ scala_junit_test( name = "JunitTestWithDeps", srcs = glob(["src/main/scala/scala/test/junit/JunitTests.scala"]), size = "small", - deps = [":HelloLib"], + deps = [":OtherJavaLib"], runtime_deps = [":JUnitRuntimeDep"], jvm_flags = ["-XX:HeapDumpPath=/some/custom/path"], ) @@ -253,3 +250,17 @@ scala_junit_test( size = "small", patterns = ["Test.*"] ) + +scala_specs2_junit_test( + name = "Specs2Tests", + srcs = glob(["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"]), + deps = [":OtherJavaLib"], + size = "small", +) + +#handle case where a target has no test classes +#remove duplicated code +#default macros for Test, E2E, IT? +#specs2 version variable (solve conflict of versions) +#consider using more consice string interpolation + diff --git a/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala b/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala new file mode 100644 index 000000000..12da906b1 --- /dev/null +++ b/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala @@ -0,0 +1,14 @@ +package scala.test.junit.specs2 + +import org.specs2.mutable.SpecWithJUnit + +class JunitSpecs2Test extends SpecWithJUnit { + + "specs2 tests" should { + "run smoothly in bazel" >> { + success + } + } + + +} From d0e70893fbb175e46b02b36b85b79f5e7c252c76 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Thu, 9 Mar 2017 08:44:01 +0200 Subject: [PATCH 14/38] extracted specs2 version to method --- specs2/specs2.bzl | 8 +++++--- specs2/specs2_junit.bzl | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/specs2/specs2.bzl b/specs2/specs2.bzl index 3eed0a250..2ece46b73 100644 --- a/specs2/specs2.bzl +++ b/specs2/specs2.bzl @@ -1,22 +1,24 @@ +def specs2_version(): + return "3.8.8" def specs2_repositories(): native.maven_jar( name = "io_bazel_rules_scala_org_specs2_specs2_core", - artifact = "org.specs2:specs2-core_2.11:3.8.8", + artifact = "org.specs2:specs2-core_2.11:" + specs2_version(), sha1 = "495bed00c73483f4f5f43945fde63c615d03e637", ) native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_core', actual = '@io_bazel_rules_scala_org_specs2_specs2_core//jar') native.maven_jar( name = "io_bazel_rules_scala_org_specs2_specs2_common", - artifact = "org.specs2:specs2-common_2.11:3.8.8", + artifact = "org.specs2:specs2-common_2.11:" + specs2_version(), sha1 = "15bc009eaae3a574796c0f558d8696b57ae903c3", ) native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_common', actual = '@io_bazel_rules_scala_org_specs2_specs2_common//jar') native.maven_jar( name = "io_bazel_rules_scala_org_specs2_specs2_matcher", - artifact = "org.specs2:specs2-matcher_2.11:3.8.8", + artifact = "org.specs2:specs2-matcher_2.11:" + specs2_version(), sha1 = "d2e967737abef7421e47b8994a8c92784e624d62", ) native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_matcher', actual = '@io_bazel_rules_scala_org_specs2_specs2_matcher//jar') diff --git a/specs2/specs2_junit.bzl b/specs2/specs2_junit.bzl index 49d2dd5b3..4e545b9f6 100644 --- a/specs2/specs2_junit.bzl +++ b/specs2/specs2_junit.bzl @@ -1,4 +1,4 @@ -load("//specs2:specs2.bzl", "specs2_repositories", "specs2_dependencies") +load("//specs2:specs2.bzl", "specs2_repositories", "specs2_dependencies", "specs2_version") load("//junit:junit.bzl", "junit_repositories") def specs2_junit_repositories(): @@ -7,7 +7,7 @@ def specs2_junit_repositories(): # Aditional dependencies for specs2 junit runner native.maven_jar( name = "io_bazel_rules_scala_org_specs2_specs2_junit_2_11", - artifact = "org.specs2:specs2-junit_2.11:3.8.8", + artifact = "org.specs2:specs2-junit_2.11:" + specs2_version(), sha1 = "1dc9e43970557c308ee313842d84094bc6c1c1b5", ) native.bind(name = 'io_bazel_rules_scala/dependency/specs2/specs2_junit', actual = '@io_bazel_rules_scala_org_specs2_specs2_junit_2_11//jar') From 5c57a838d6c743cbce31d5d48a74b6197742bc7b Mon Sep 17 00:00:00 2001 From: ittaiz Date: Thu, 9 Mar 2017 08:54:45 +0200 Subject: [PATCH 15/38] removed comments --- test/BUILD | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/test/BUILD b/test/BUILD index 488b345a9..3d850e242 100644 --- a/test/BUILD +++ b/test/BUILD @@ -256,11 +256,4 @@ scala_specs2_junit_test( srcs = glob(["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"]), deps = [":OtherJavaLib"], size = "small", -) - -#handle case where a target has no test classes -#remove duplicated code -#default macros for Test, E2E, IT? -#specs2 version variable (solve conflict of versions) -#consider using more consice string interpolation - +) \ No newline at end of file From 5161db192e0f5b7601babddc75026afa88ecd998 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Thu, 9 Mar 2017 09:01:37 +0200 Subject: [PATCH 16/38] removed another comment --- scala/scala.bzl | 1 - 1 file changed, 1 deletion(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index f9a1ee92c..94c014d05 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -530,7 +530,6 @@ def _discover_classes(ctx, patterns, archive): return discovered_classes def _gen_test_suite_based_on_prefix(ctx, archive): -#add "Test*","*IT","*E2E" by default discovered_classes = _discover_classes(ctx, ctx.attr.patterns, archive) return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, discovered_classes = discovered_classes) From 99a639c9bd62b80cd575500bd5b3cbcec985a4b1 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Thu, 9 Mar 2017 13:27:33 +0200 Subject: [PATCH 17/38] moved to depend on an isolated dependency --- test/BUILD | 8 ++++++-- test/src/main/scala/scala/test/junit/JunitTests.scala | 4 ++-- .../main/scala/scala/test/junit/specs2/Specs2Tests.scala | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/test/BUILD b/test/BUILD index 3d850e242..df40e2b26 100644 --- a/test/BUILD +++ b/test/BUILD @@ -220,6 +220,10 @@ scala_binary( ) +scala_library( + name = "JUnitCompileTimeDep", + srcs = ["src/main/scala/scala/test/junit/support/JUnitCompileTimeDep.scala"], +) scala_library( name = "JUnitRuntimeDep", srcs = ["src/main/scala/scala/test/junit/support/JUnitRuntimeDep.scala"], @@ -228,7 +232,7 @@ scala_junit_test( name = "JunitTestWithDeps", srcs = glob(["src/main/scala/scala/test/junit/JunitTests.scala"]), size = "small", - deps = [":OtherJavaLib"], + deps = [":JUnitCompileTimeDep"], runtime_deps = [":JUnitRuntimeDep"], jvm_flags = ["-XX:HeapDumpPath=/some/custom/path"], ) @@ -254,6 +258,6 @@ scala_junit_test( scala_specs2_junit_test( name = "Specs2Tests", srcs = glob(["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"]), - deps = [":OtherJavaLib"], + deps = [":JUnitCompileTimeDep"], size = "small", ) \ No newline at end of file diff --git a/test/src/main/scala/scala/test/junit/JunitTests.scala b/test/src/main/scala/scala/test/junit/JunitTests.scala index 70fe0f0ff..723a8fdd5 100644 --- a/test/src/main/scala/scala/test/junit/JunitTests.scala +++ b/test/src/main/scala/scala/test/junit/JunitTests.scala @@ -5,7 +5,7 @@ import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.hamcrest.CoreMatchers._ import org.hamcrest.MatcherAssert._ -import scala.test.HelloLib +import scala.test.junit.support.JUnitCompileTimeDep import java.lang.management.ManagementFactory import java.lang.management.RuntimeMXBean @@ -13,7 +13,7 @@ class JunitWithDepsTest { @Test def hasCompileTimeDependencies: Unit = { - HelloLib.printMessage("yo") + JUnitCompileTimeDep.hello } @Test diff --git a/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala b/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala index 12da906b1..09377fd67 100644 --- a/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala +++ b/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala @@ -1,11 +1,13 @@ package scala.test.junit.specs2 import org.specs2.mutable.SpecWithJUnit +import scala.test.junit.support.JUnitCompileTimeDep class JunitSpecs2Test extends SpecWithJUnit { "specs2 tests" should { "run smoothly in bazel" >> { + JUnitCompileTimeDep.hello success } } From eb7095f69c9ab759b7487c67d21cd5d8ae4739e5 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Thu, 9 Mar 2017 13:28:27 +0200 Subject: [PATCH 18/38] apparently -a doesn't add untracked --- .../scala/scala/test/junit/support/JUnitCompileTimeDep.scala | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 test/src/main/scala/scala/test/junit/support/JUnitCompileTimeDep.scala diff --git a/test/src/main/scala/scala/test/junit/support/JUnitCompileTimeDep.scala b/test/src/main/scala/scala/test/junit/support/JUnitCompileTimeDep.scala new file mode 100644 index 000000000..86cfef1b7 --- /dev/null +++ b/test/src/main/scala/scala/test/junit/support/JUnitCompileTimeDep.scala @@ -0,0 +1,4 @@ +package scala.test.junit.support +object JUnitCompileTimeDep { + val hello = "hello" +} \ No newline at end of file From 30fef56b8e35088fd76b1e01d72fd5ed455a5636 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 14 Mar 2017 13:24:29 +0200 Subject: [PATCH 19/38] moved from unzip to jar and reformatted DiscoveredTestSuite --- scala/scala.bzl | 2 +- .../test_discovery/DiscoveredTestSuite.scala | 33 +++++++------------ 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 94c014d05..73b5b6908 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -526,7 +526,7 @@ def _discover_classes(ctx, patterns, archive): #TODO consider with Damien/Ulf/Oscar the implications of switching from grep to scala code #Pro-> logic will be cohesive (currently the scala code assumes stuff from the grep) #Con-> IIRC Ulf warned me about performance implications of these traversals - command="unzip -l {archive} | grep {combined_patterns} > {out}".format(archive=archive.path, combined_patterns=_prep_grep_pattern_from(patterns), out=discovered_classes.path)) + command="jar -tf {archive} | grep {combined_patterns} > {out}".format(archive=archive.path, combined_patterns=_prep_grep_pattern_from(patterns), out=discovered_classes.path)) return discovered_classes def _gen_test_suite_based_on_prefix(ctx, archive): diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala index 379e0a08a..b476a8cdb 100644 --- a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -1,45 +1,36 @@ package io.bazel.rulesscala.test_discovery import org.junit.runner.RunWith -import org.junit.runner.Runner import org.junit.runners.Suite import org.junit.runners.model.RunnerBuilder @RunWith(classOf[TextFileSuite]) class DiscoveredTestSuite -class TextFileSuite(testClass: Class[Any], builder: RunnerBuilder) - extends Suite(builder, testClass, TextFileSuite.discoveredClasses) +class TextFileSuite(testClass: Class[Any], builder: RunnerBuilder) + extends Suite(builder, testClass, TextFileSuite.discoveredClasses) object TextFileSuite { private val discoveredClasses = readDiscoveredClasses(classesRegistry) private def readDiscoveredClasses(classesRegistry: String): Array[Class[_]] = - entries(classesRegistry) - .map(filterWhitespace) - .map(filterMetadata) - .map(dropFileSuffix) - .map(fileToClassFormat) - .map(Class.forName) + entries(classesRegistry) + .map(dropFileSuffix) + .map(fileToClassFormat) + .map(Class.forName) - private def filterMetadata(zipEntryParts: Array[String]): String = - zipEntryParts.last - - private def filterWhitespace(zipEntry: String): Array[String] = - zipEntry.split("\\s+") - - private def dropFileSuffix(classEntry: String): String = - classEntry.split("\\.").head + private def dropFileSuffix(classEntry: String): String = + classEntry.split("\\.").head //name is too imperative. Not sure how to change to declarative - private def fileToClassFormat(classEntry: String): String = - classEntry.replace('/', '.') + private def fileToClassFormat(classEntry: String): String = + classEntry.replace('/', '.') private def entries(classesRegistry: String): Array[String] = - scala.io.Source.fromFile(classesRegistry).getLines.toArray + scala.io.Source.fromFile(classesRegistry).getLines.toArray private def classesRegistry: String = - System.getProperty("bazel.discovered.classes.file.path") + System.getProperty("bazel.discovered.classes.file.path") } \ No newline at end of file From 64a6404f71115a5b74bffd0aea207668f33bafa7 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 14 Mar 2017 14:19:46 +0200 Subject: [PATCH 20/38] added test to show junit failures are supported --- test_expect_failure/scala_junit_test/BUILD | 7 +++++++ .../scala_junit_test/JunitFailureTest.scala | 11 +++++++++++ test_run.sh | 13 +++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 test_expect_failure/scala_junit_test/BUILD create mode 100644 test_expect_failure/scala_junit_test/JunitFailureTest.scala diff --git a/test_expect_failure/scala_junit_test/BUILD b/test_expect_failure/scala_junit_test/BUILD new file mode 100644 index 000000000..6bc800e61 --- /dev/null +++ b/test_expect_failure/scala_junit_test/BUILD @@ -0,0 +1,7 @@ +load("//scala:scala.bzl", "scala_junit_test") + +scala_junit_test( + name = "failing_test", + srcs = glob(["*.scala"]), + size = "small", +) diff --git a/test_expect_failure/scala_junit_test/JunitFailureTest.scala b/test_expect_failure/scala_junit_test/JunitFailureTest.scala new file mode 100644 index 000000000..a68d62d0d --- /dev/null +++ b/test_expect_failure/scala_junit_test/JunitFailureTest.scala @@ -0,0 +1,11 @@ + +import org.junit.Test + +class JunitFailureTest { + + @Test + def failing: Unit = { + throw new RuntimeException("this test knows how to fail") + } + +} diff --git a/test_run.sh b/test_run.sh index 2cdaa32cc..073178be5 100755 --- a/test_run.sh +++ b/test_run.sh @@ -71,6 +71,18 @@ test_scala_library_suite() { exit 0 } +test_scala_junit_test_can_fail() { + set +e + + bazel test test_expect_failure/scala_junit_test:failing_test + if [ $? -eq 0 ]; then + echo "'bazel build test_expect_failure/scala_junit_test:failing_test' should have failed." + exit 1 + fi + set -e + exit 0 +} + test_repl() { echo "import scala.test._; HelloLib.printMessage(\"foo\")" | bazel-bin/test/HelloLibRepl | grep "foo java" && echo "import scala.test._; TestUtil.foo" | bazel-bin/test/HelloLibTestRepl | grep "bar" && @@ -140,3 +152,4 @@ run_test test_repl run_test bazel run test:JavaOnlySources run_test test_benchmark_jmh run_test multiple_junit_suffixes +run_test test_scala_junit_test_can_fail From 97583a1914cb86a6bccec759278c50ae0ed805d3 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 21 Mar 2017 11:34:29 +0200 Subject: [PATCH 21/38] added a test to show xml files are generated --- test_run.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test_run.sh b/test_run.sh index 073178be5..13e82b0f7 100755 --- a/test_run.sh +++ b/test_run.sh @@ -134,6 +134,11 @@ multiple_junit_suffixes() { fi } +junit_generates_xml_logs() { + bazel test //test:JunitTestWithDeps + test -e ./bazel-testlogs/test/JunitTestWithDeps/test.xml +} + run_test bazel build test/... run_test bazel test test/... run_test bazel run test/src/main/scala/scala/test/twitter_scrooge:justscrooges @@ -153,3 +158,4 @@ run_test bazel run test:JavaOnlySources run_test test_benchmark_jmh run_test multiple_junit_suffixes run_test test_scala_junit_test_can_fail +run_test junit_generates_xml_logs From 558640d60a3e68e85a54ce7d30ab77821c95a70a Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 21 Mar 2017 12:05:18 +0200 Subject: [PATCH 22/38] moved from filegroup in scala.bzl to src/scala ones --- scala/scala.bzl | 23 ----------------------- specs2/specs2.bzl | 8 ++++---- src/scala/BUILD | 11 +++++++++++ 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 73b5b6908..00bd423cd 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -690,29 +690,6 @@ exports_files([ "lib/scalap-2.11.8.jar", ]) -filegroup( - name = "scala-xml", - srcs = ["lib/scala-xml_2.11-1.0.4.jar"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "scala-parser-combinators", - srcs = ["lib/scala-parser-combinators_2.11-1.0.4.jar"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "scala-library", - srcs = ["lib/scala-library.jar"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "scala-reflect", - srcs = ["lib/scala-reflect.jar"], - visibility = ["//visibility:public"], -) """ def scala_repositories(): diff --git a/specs2/specs2.bzl b/specs2/specs2.bzl index 2ece46b73..0f466de80 100644 --- a/specs2/specs2.bzl +++ b/specs2/specs2.bzl @@ -44,8 +44,8 @@ def specs2_dependencies(): "//external:io_bazel_rules_scala/dependency/specs2/specs2_matcher", "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_effect", "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_core", - "@scala//:scala-xml", - "@scala//:scala-parser-combinators", - "@scala//:scala-library", - "@scala//:scala-reflect", + "//src/scala:scala_xml", + "//src/scala:parser_combinators", + "//src/scala:scala_library", + "//src/scala:scala_reflect", ] diff --git a/src/scala/BUILD b/src/scala/BUILD index dd358530b..1cfc78a1b 100644 --- a/src/scala/BUILD +++ b/src/scala/BUILD @@ -16,3 +16,14 @@ java_import( visibility = ["//visibility:public"], ) +java_import( + name = "scala_library", + jars = ["@scala//:lib/scala-library.jar"], + visibility = ["//visibility:public"], +) + +java_import( + name = "scala_reflect", + jars = ["@scala//:lib/scala-reflect.jar"], + visibility = ["//visibility:public"], +) From d52045a28729a9bd9ac98619d206a47986958cbd Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 21 Mar 2017 12:07:51 +0200 Subject: [PATCH 23/38] removed scalac warning --- test/src/main/scala/scala/test/junit/JunitTests.scala | 2 +- test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/main/scala/scala/test/junit/JunitTests.scala b/test/src/main/scala/scala/test/junit/JunitTests.scala index 723a8fdd5..2647fe2ab 100644 --- a/test/src/main/scala/scala/test/junit/JunitTests.scala +++ b/test/src/main/scala/scala/test/junit/JunitTests.scala @@ -13,7 +13,7 @@ class JunitWithDepsTest { @Test def hasCompileTimeDependencies: Unit = { - JUnitCompileTimeDep.hello + println(JUnitCompileTimeDep.hello) } @Test diff --git a/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala b/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala index 09377fd67..ad4c8f1c8 100644 --- a/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala +++ b/test/src/main/scala/scala/test/junit/specs2/Specs2Tests.scala @@ -7,7 +7,7 @@ class JunitSpecs2Test extends SpecWithJUnit { "specs2 tests" should { "run smoothly in bazel" >> { - JUnitCompileTimeDep.hello + println(JUnitCompileTimeDep.hello) success } } From c22890770ca01f73e05e61dc3fb61fe49c392258 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 21 Mar 2017 16:33:50 +0200 Subject: [PATCH 24/38] added comment to clarify design --- .../test_discovery/DiscoveredTestSuite.scala | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala index b476a8cdb..e0f091623 100644 --- a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -3,7 +3,25 @@ package io.bazel.rulesscala.test_discovery import org.junit.runner.RunWith import org.junit.runners.Suite import org.junit.runners.model.RunnerBuilder - +/* + The test running and discovery mechanism works in the following manner: + - Bazel rule executes a JVM application to run tests (currently `JUnitCore`) and asks it to run + the `DiscoveredTestSuite` suite. + - When JUnit tries to run it, it uses the `TextFileSuite` runner + to know what tests exist in the suite. + - We know which tests to run by examining the entries of the target's archive. + - The entries of the archive are filtered with grep in the bazel rule using the defined patterns. + - The matching entries are written to a file + - It's path is passed in a system property ("bazel.discovered.classes.file.path"). + - We iterate over the entries and format them into classes. + - At this point we tell JUnit (via the `RunnerBuilder`) what are the discovered test classes. + - W.R.T. discovery semantics this is very similar to how maven surefire/failsafe plugins work. + + Additional references: + - http://junit.org/junit4/javadoc/4.12/org/junit/runner/RunWith.html + - http://junit.org/junit4/javadoc/4.12/org/junit/runners/model/RunnerBuilder.html + - http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html +*/ @RunWith(classOf[TextFileSuite]) class DiscoveredTestSuite From 0f6cd99c1e38eab9513a1641d8e48138b416a52f Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 21 Mar 2017 16:56:57 +0200 Subject: [PATCH 25/38] moved to using bazel jar --- scala/scala.bzl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 00bd423cd..e699f90b7 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -520,13 +520,15 @@ def _prep_grep_pattern_from(patterns): def _discover_classes(ctx, patterns, archive): discovered_classes = ctx.new_file(ctx.label.name + "_discovered_classes.txt") ctx.action( - inputs=[archive], + #We need _jdk to even run _jar. Depending on _jar is not enough with sandbox + inputs= [archive] + ctx.files._jar + ctx.files._jdk, outputs=[discovered_classes], progress_message="Discovering classes with patterns of %s" % patterns, #TODO consider with Damien/Ulf/Oscar the implications of switching from grep to scala code #Pro-> logic will be cohesive (currently the scala code assumes stuff from the grep) #Con-> IIRC Ulf warned me about performance implications of these traversals - command="jar -tf {archive} | grep {combined_patterns} > {out}".format(archive=archive.path, combined_patterns=_prep_grep_pattern_from(patterns), out=discovered_classes.path)) + command="{jar} -tf {archive} | grep {combined_patterns} > {out}".format(archive=archive.path, combined_patterns=_prep_grep_pattern_from(patterns), out=discovered_classes.path, + jar=ctx.file._jar.path)) return discovered_classes def _gen_test_suite_based_on_prefix(ctx, archive): @@ -797,12 +799,13 @@ def scala_library_suite(name, scala_junit_test = rule( implementation=_scala_junit_test_impl, - attrs={ + attrs= _implicit_deps + _common_attrs + { "patterns": attr.string_list(default=["Test"]), "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True), "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True), "_suite": attr.label(default=Label("//src/java/io/bazel/rulesscala/test_discovery:test_discovery")), - } + _implicit_deps + _common_attrs, + "_jar": attr.label(executable=True, cfg="host", default=Label("@bazel_tools//tools/jdk:jar"), single_file=True, allow_files=True), + }, outputs={ "jar": "%{name}.jar", "deploy_jar": "%{name}_deploy.jar", From 9dd6e56218b9acfefec7f414c398d9ea3054a0c4 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Wed, 22 Mar 2017 13:25:33 +0200 Subject: [PATCH 26/38] Trigger From 3524c4ed2926c61c73e4d0cb2fac7f2e617c1f7e Mon Sep 17 00:00:00 2001 From: ittaiz Date: Fri, 24 Mar 2017 21:09:32 +0300 Subject: [PATCH 27/38] fixed formatting comments --- scala/scala.bzl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index e699f90b7..bd75d3c7e 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -500,8 +500,7 @@ def _scala_test_impl(ctx): jars = _collect_jars(deps) (cjars, rjars) = (jars.compiletime, jars.runtime) cjars += [ctx.file._scalareflect, ctx.file._scalatest, ctx.file._scalaxml] - rjars += [ - ctx.outputs.jar, + rjars += [ctx.outputs.jar, ctx.file._scalalib, ctx.file._scalareflect, ctx.file._scalatest, @@ -533,7 +532,9 @@ def _discover_classes(ctx, patterns, archive): def _gen_test_suite_based_on_prefix(ctx, archive): discovered_classes = _discover_classes(ctx, ctx.attr.patterns, archive) - return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, discovered_classes = discovered_classes) + return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", + classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, + discovered_classes = discovered_classes) def _scala_junit_test_impl(ctx): deps = ctx.attr.deps + [ctx.attr._suite] @@ -541,8 +542,7 @@ def _scala_junit_test_impl(ctx): (cjars, rjars) = (jars.compiletime, jars.runtime) junit_deps = [ctx.file._junit,ctx.file._hamcrest] cjars += junit_deps - rjars += [ - ctx.outputs.jar, + rjars += [ctx.outputs.jar, ctx.file._scalalib ] + junit_deps rjars += _collect_jars(ctx.attr.runtime_deps).runtime From 5572178ec2d318b3fe7237ec04e67ed05118a655 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Fri, 24 Mar 2017 21:42:22 +0300 Subject: [PATCH 28/38] Revert "moved from filegroup in scala.bzl to src/scala ones" This reverts commit 558640d60a3e68e85a54ce7d30ab77821c95a70a. --- scala/scala.bzl | 23 +++++++++++++++++++++++ specs2/specs2.bzl | 8 ++++---- src/scala/BUILD | 11 ----------- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index bd75d3c7e..8ab95c5fb 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -692,6 +692,29 @@ exports_files([ "lib/scalap-2.11.8.jar", ]) +filegroup( + name = "scala-xml", + srcs = ["lib/scala-xml_2.11-1.0.4.jar"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "scala-parser-combinators", + srcs = ["lib/scala-parser-combinators_2.11-1.0.4.jar"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "scala-library", + srcs = ["lib/scala-library.jar"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "scala-reflect", + srcs = ["lib/scala-reflect.jar"], + visibility = ["//visibility:public"], +) """ def scala_repositories(): diff --git a/specs2/specs2.bzl b/specs2/specs2.bzl index 0f466de80..2ece46b73 100644 --- a/specs2/specs2.bzl +++ b/specs2/specs2.bzl @@ -44,8 +44,8 @@ def specs2_dependencies(): "//external:io_bazel_rules_scala/dependency/specs2/specs2_matcher", "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_effect", "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_core", - "//src/scala:scala_xml", - "//src/scala:parser_combinators", - "//src/scala:scala_library", - "//src/scala:scala_reflect", + "@scala//:scala-xml", + "@scala//:scala-parser-combinators", + "@scala//:scala-library", + "@scala//:scala-reflect", ] diff --git a/src/scala/BUILD b/src/scala/BUILD index 1cfc78a1b..dd358530b 100644 --- a/src/scala/BUILD +++ b/src/scala/BUILD @@ -16,14 +16,3 @@ java_import( visibility = ["//visibility:public"], ) -java_import( - name = "scala_library", - jars = ["@scala//:lib/scala-library.jar"], - visibility = ["//visibility:public"], -) - -java_import( - name = "scala_reflect", - jars = ["@scala//:lib/scala-reflect.jar"], - visibility = ["//visibility:public"], -) From 66f5eb3d27bc52d8044818221fd7012060cc100c Mon Sep 17 00:00:00 2001 From: ittaiz Date: Fri, 24 Mar 2017 21:51:23 +0300 Subject: [PATCH 29/38] moved from explicitly depending on @scala to using bind --- scala/scala.bzl | 8 ++++++++ specs2/specs2.bzl | 9 ++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index 8ab95c5fb..388b32d1d 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -750,6 +750,14 @@ def scala_repositories(): server = "scalac_deps_maven_server", ) + native.bind(name = 'io_bazel_rules_scala/dependency/scala/scala_xml', actual = '@scala//:scala-xml') + + native.bind(name = 'io_bazel_rules_scala/dependency/scala/parser_combinators', actual = '@scala//:scala-parser-combinators') + + native.bind(name = 'io_bazel_rules_scala/dependency/scala/scala_library', actual = '@scala//:scala-library') + + native.bind(name = 'io_bazel_rules_scala/dependency/scala/scala_reflect', actual = '@scala//:scala-reflect') + def scala_export_to_java(name, exports, runtime_deps): jars = [] for target in exports: diff --git a/specs2/specs2.bzl b/specs2/specs2.bzl index 2ece46b73..bcdb5b89e 100644 --- a/specs2/specs2.bzl +++ b/specs2/specs2.bzl @@ -44,8 +44,7 @@ def specs2_dependencies(): "//external:io_bazel_rules_scala/dependency/specs2/specs2_matcher", "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_effect", "//external:io_bazel_rules_scala/dependency/scalaz/scalaz_core", - "@scala//:scala-xml", - "@scala//:scala-parser-combinators", - "@scala//:scala-library", - "@scala//:scala-reflect", - ] + "//external:io_bazel_rules_scala/dependency/scala/scala_xml", + "//external:io_bazel_rules_scala/dependency/scala/parser_combinators", + "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "//external:io_bazel_rules_scala/dependency/scala/scala_reflect"] From b8faa3796753e17da547e6fb41489d023e660b1f Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 12:00:15 +0300 Subject: [PATCH 30/38] moved from patterns to prefixes/suffixes moved from using jar/grep to JarInputStream in JVM added print debugging of discovered classes changed e2e tests which check multi files to use print debugging --- scala/scala.bzl | 55 +++------ .../test_discovery/DiscoveredTestSuite.scala | 105 +++++++++++++++--- test/BUILD | 18 ++- .../test/junit/JunitMultipleSuffixes.scala | 2 - .../main/scala/scala/test/junit/scala.scala | 12 ++ test_expect_failure/scala_junit_test/BUILD | 1 + test_run.sh | 16 ++- 7 files changed, 144 insertions(+), 65 deletions(-) create mode 100644 test/src/main/scala/scala/test/junit/scala.scala diff --git a/scala/scala.bzl b/scala/scala.bzl index 388b32d1d..3797f468a 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -301,13 +301,16 @@ def _write_launcher(ctx, jars): def _write_junit_test_launcher(ctx, jars, test_suite): content = """#!/bin/bash -{java} -cp {cp} -ea {classesFlag} {jvm_flags} org.junit.runner.JUnitCore {test_suite_class} +{java} -cp {cp} -ea {archiveFlag} {prefixesFlag} {suffixesFlag} {printFlag} {jvm_flags} org.junit.runner.JUnitCore {test_suite_class} """ content = content.format( java=ctx.file._java.short_path, cp=":".join([j.short_path for j in jars]), test_suite_class=test_suite.suite_class, - classesFlag = test_suite.classesFlag, + archiveFlag = test_suite.archiveFlag, + prefixesFlag = test_suite.prefixesFlag, + suffixesFlag = test_suite.suffixesFlag, + printFlag = test_suite.printFlag, #allows setting xmx for example for tests which use a lot of memory jvm_flags = " ".join(ctx.attr.jvm_flags) ) @@ -510,31 +513,12 @@ def _scala_test_impl(ctx): _write_test_launcher(ctx, rjars) return _scala_binary_common(ctx, cjars, rjars) -def _prep_grep_pattern_from(patterns): - combined_pattern = "" - for pattern in patterns: - combined_pattern += " -e {}\.class".format(pattern) - return combined_pattern - -def _discover_classes(ctx, patterns, archive): - discovered_classes = ctx.new_file(ctx.label.name + "_discovered_classes.txt") - ctx.action( - #We need _jdk to even run _jar. Depending on _jar is not enough with sandbox - inputs= [archive] + ctx.files._jar + ctx.files._jdk, - outputs=[discovered_classes], - progress_message="Discovering classes with patterns of %s" % patterns, - #TODO consider with Damien/Ulf/Oscar the implications of switching from grep to scala code - #Pro-> logic will be cohesive (currently the scala code assumes stuff from the grep) - #Con-> IIRC Ulf warned me about performance implications of these traversals - command="{jar} -tf {archive} | grep {combined_patterns} > {out}".format(archive=archive.path, combined_patterns=_prep_grep_pattern_from(patterns), out=discovered_classes.path, - jar=ctx.file._jar.path)) - return discovered_classes - -def _gen_test_suite_based_on_prefix(ctx, archive): - discovered_classes = _discover_classes(ctx, ctx.attr.patterns, archive) +def _gen_test_suite_flags_based_on_prefixes_and_suffixes(ctx, archive): return struct(suite_class = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite", - classesFlag = "-Dbazel.discovered.classes.file.path=%s" % discovered_classes.short_path, - discovered_classes = discovered_classes) + archiveFlag = "-Dbazel.discover.classes.archive.file.path=%s" % archive.short_path, + prefixesFlag = "-Dbazel.discover.classes.prefixes=%s" % ",".join(ctx.attr.prefixes), + suffixesFlag = "-Dbazel.discover.classes.suffixes=%s" % ",".join(ctx.attr.suffixes), + printFlag = "-Dbazel.discover.classes.print.discovered=%s" % ctx.attr.print_discovered_classes) def _scala_junit_test_impl(ctx): deps = ctx.attr.deps + [ctx.attr._suite] @@ -546,20 +530,10 @@ def _scala_junit_test_impl(ctx): ctx.file._scalalib ] + junit_deps rjars += _collect_jars(ctx.attr.runtime_deps).runtime - test_suite = _gen_test_suite_based_on_prefix(ctx, ctx.outputs.jar) + test_suite = _gen_test_suite_flags_based_on_prefixes_and_suffixes(ctx, ctx.outputs.jar) _write_junit_test_launcher(ctx, rjars, test_suite) - common_binary = _scala_binary_common(ctx, cjars, rjars) - discovered_classes_runfiles = ctx.runfiles( - files = [test_suite.discovered_classes]) - - #TODO is there a way to easily merge both structs - #I'd like a scala case class copy: - #common_binary.copy(runfiles= common_binary.runfiles.merge(discovered_classes_runfiles)) - return struct( - files = common_binary.files, - scala = common_binary.scala, - runfiles= common_binary.runfiles.merge(discovered_classes_runfiles)) + return _scala_binary_common(ctx, cjars, rjars) _implicit_deps = { @@ -831,11 +805,12 @@ def scala_library_suite(name, scala_junit_test = rule( implementation=_scala_junit_test_impl, attrs= _implicit_deps + _common_attrs + { - "patterns": attr.string_list(default=["Test"]), + "prefixes": attr.string_list(default=[]), + "suffixes": attr.string_list(default=[]), + "print_discovered_classes": attr.bool(default=False, mandatory=False), "_junit": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/junit/junit"), single_file=True), "_hamcrest": attr.label(default=Label("//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core"), single_file=True), "_suite": attr.label(default=Label("//src/java/io/bazel/rulesscala/test_discovery:test_discovery")), - "_jar": attr.label(executable=True, cfg="host", default=Label("@bazel_tools//tools/jdk:jar"), single_file=True, allow_files=True), }, outputs={ "jar": "%{name}.jar", diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala index e0f091623..ad98b96c6 100644 --- a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -3,52 +3,121 @@ package io.bazel.rulesscala.test_discovery import org.junit.runner.RunWith import org.junit.runners.Suite import org.junit.runners.model.RunnerBuilder +import java.io.File +import java.io.FileInputStream +import java.util.jar.JarInputStream +import java.util.jar.JarEntry /* The test running and discovery mechanism works in the following manner: - Bazel rule executes a JVM application to run tests (currently `JUnitCore`) and asks it to run the `DiscoveredTestSuite` suite. - - When JUnit tries to run it, it uses the `TextFileSuite` runner + - When JUnit tries to run it, it uses the `PrefixSuffixTestDiscoveringSuite` runner to know what tests exist in the suite. - We know which tests to run by examining the entries of the target's archive. - - The entries of the archive are filtered with grep in the bazel rule using the defined patterns. - - The matching entries are written to a file - - It's path is passed in a system property ("bazel.discovered.classes.file.path"). - - We iterate over the entries and format them into classes. + - The archive's path is passed in a system property ("bazel.discover.classes.archive.file.path"). + - The entries of the archive are filtered to keep only classes + - Of those we filter again and keep only those which match either of the prefixes/suffixes supplied. + - Prefixes are supplied as a comma separated list. System property ("bazel.discover.classes.prefixes") + - Suffixes are supplied as a comma separated list. System property ("bazel.discover.classes.prefixes") + - We iterate over the remaining entries and format them into classes. - At this point we tell JUnit (via the `RunnerBuilder`) what are the discovered test classes. - - W.R.T. discovery semantics this is very similar to how maven surefire/failsafe plugins work. + - W.R.T. discovery semantics this is similar to how maven surefire/failsafe plugins work. + - For debugging purposes one can ask to print the list of discovered classes. + - This is done via an `print_discovered_classes` attribute. + - The attribute is sent via "bazel.discover.classes.print.discovered" Additional references: - http://junit.org/junit4/javadoc/4.12/org/junit/runner/RunWith.html - http://junit.org/junit4/javadoc/4.12/org/junit/runners/model/RunnerBuilder.html - http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html */ -@RunWith(classOf[TextFileSuite]) +@RunWith(classOf[PrefixSuffixTestDiscoveringSuite]) class DiscoveredTestSuite -class TextFileSuite(testClass: Class[Any], builder: RunnerBuilder) - extends Suite(builder, testClass, TextFileSuite.discoveredClasses) +class PrefixSuffixTestDiscoveringSuite(testClass: Class[Any], builder: RunnerBuilder) + extends Suite(builder, testClass, PrefixSuffixTestDiscoveringSuite.discoverClasses()) -object TextFileSuite { +object PrefixSuffixTestDiscoveringSuite { - private val discoveredClasses = readDiscoveredClasses(classesRegistry) + private def discoverClasses(): Array[Class[_]] = { - private def readDiscoveredClasses(classesRegistry: String): Array[Class[_]] = - entries(classesRegistry) + val archive = archiveInputStream() + val classes = discoverClasses(archive, prefixes, suffixesWithClassSuffix) + archive.close() + if (printDiscoveredClasses) { + println("Discovered classes:") + classes.foreach(c => println(c.getName)) + } + classes + } + + private def discoverClasses(archive: JarInputStream, + prefixes: Set[String], + suffixes: Set[String]): Array[Class[_]] = + matchingEntries(archive, prefixes, suffixes) .map(dropFileSuffix) .map(fileToClassFormat) .map(Class.forName) + .toArray + + private def matchingEntries(archive: JarInputStream, + prefixes: Set[String], + suffixes: Set[String]) = + entries(archive) + .filter(isClass) + .filter(entry => endsWith(suffixes)(entry) || startsWith(prefixes)(entry)) + + private def startsWith(prefixes: Set[String])(entry: String): Boolean = { + val entryName = entryFileName(entry) + prefixes.exists(entryName.startsWith) + } + + private def endsWith(suffixes: Set[String])(entry: String): Boolean = { + val entryName = entryFileName(entry) + suffixes.exists(entryName.endsWith) + } + + private def entryFileName(entry: String): String = + new File(entry).getName private def dropFileSuffix(classEntry: String): String = classEntry.split("\\.").head - //name is too imperative. Not sure how to change to declarative private def fileToClassFormat(classEntry: String): String = classEntry.replace('/', '.') - private def entries(classesRegistry: String): Array[String] = - scala.io.Source.fromFile(classesRegistry).getLines.toArray + private def isClass(entry: String): Boolean = + entry.endsWith(".class") + + private def entries(jarInputStream: JarInputStream) = + Stream.continually(Option(jarInputStream.getNextJarEntry)) + .takeWhile(_.isDefined) + .flatten + .map(_.getName) + .toList + + private def archiveInputStream() = + new JarInputStream(new FileInputStream(archivePath)) + + private def archivePath: String = + System.getProperty("bazel.discover.classes.archive.file.path") + + private def suffixesWithClassSuffix: Set[String] = + suffixes.map(_ + ".class") + + private def suffixes: Set[String] = + parseProperty(System.getProperty("bazel.discover.classes.suffixes")) + + private def prefixes: Set[String] = + parseProperty(System.getProperty("bazel.discover.classes.prefixes")) + + private def parseProperty(potentiallyEmpty: String): Set[String] = + potentiallyEmpty.trim match { + case emptyStr if emptyStr.isEmpty => Set[String]() + case nonEmptyStr => nonEmptyStr.split(",").toSet + } - private def classesRegistry: String = - System.getProperty("bazel.discovered.classes.file.path") + private def printDiscoveredClasses: Boolean = + System.getProperty("bazel.discover.classes.print.discovered").toBoolean } \ No newline at end of file diff --git a/test/BUILD b/test/BUILD index df40e2b26..8bb15824a 100644 --- a/test/BUILD +++ b/test/BUILD @@ -231,6 +231,7 @@ scala_library( scala_junit_test( name = "JunitTestWithDeps", srcs = glob(["src/main/scala/scala/test/junit/JunitTests.scala"]), + suffixes = ["Test"], size = "small", deps = [":JUnitCompileTimeDep"], runtime_deps = [":JUnitRuntimeDep"], @@ -240,19 +241,29 @@ scala_junit_test( name = "JunitCustomSuffix", srcs = glob(["src/main/scala/scala/test/junit/JunitCustomSuffix.scala"]), size = "small", - patterns = ["E2E"] + suffixes = ["E2E"] ) scala_junit_test( name = "JunitMultipleSuffixes", srcs = glob(["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala"]), size = "small", - patterns = ["E2E","IT"] + suffixes = ["E2E","IT"], + print_discovered_classes = True ) scala_junit_test( name = "JunitCustomPattern", srcs = glob(["src/main/scala/scala/test/junit/JunitCustomPattern.scala"]), size = "small", - patterns = ["Test.*"] + prefixes = ["Test"] +) +scala_junit_test( + name = "JunitPrefixesAndSuffixes", + srcs = ["src/main/scala/scala/test/junit/JunitCustomSuffix.scala", + "src/main/scala/scala/test/junit/JunitCustomPattern.scala"], + size = "small", + suffixes = ["E2E"], + prefixes = ["Test"], + print_discovered_classes = True ) scala_specs2_junit_test( @@ -260,4 +271,5 @@ scala_specs2_junit_test( srcs = glob(["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"]), deps = [":JUnitCompileTimeDep"], size = "small", + suffixes = ["Test"], ) \ No newline at end of file diff --git a/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala b/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala index e56926692..969aaf0d5 100644 --- a/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala +++ b/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala @@ -9,7 +9,6 @@ class JunitSuffixE2E { @Test def someTest: Unit = { - println("Running E2E") assertEquals(1, 1) } @@ -18,7 +17,6 @@ class JunitSuffixIT { @Test def someTest: Unit = { - println("Running IT") assertEquals(1, 1) } diff --git a/test/src/main/scala/scala/test/junit/scala.scala b/test/src/main/scala/scala/test/junit/scala.scala new file mode 100644 index 000000000..1b4117b9f --- /dev/null +++ b/test/src/main/scala/scala/test/junit/scala.scala @@ -0,0 +1,12 @@ +package scala.test.junit + +import org.junit.Test +//Used to verify a folder doesn't match in test discovery. +//See JunitMatchesOnlyFilesEvenIfFolderMatchesPattern target +class scala { + + @Test + def atLeastOneTestIsNeeded: Unit = { + } + +} \ No newline at end of file diff --git a/test_expect_failure/scala_junit_test/BUILD b/test_expect_failure/scala_junit_test/BUILD index 6bc800e61..33b78f78c 100644 --- a/test_expect_failure/scala_junit_test/BUILD +++ b/test_expect_failure/scala_junit_test/BUILD @@ -3,5 +3,6 @@ load("//scala:scala.bzl", "scala_junit_test") scala_junit_test( name = "failing_test", srcs = glob(["*.scala"]), + suffixes = ["Test"], size = "small", ) diff --git a/test_run.sh b/test_run.sh index 13e82b0f7..1e6caaba4 100755 --- a/test_run.sh +++ b/test_run.sh @@ -126,8 +126,19 @@ xmllint_test() { multiple_junit_suffixes() { bazel test //test:JunitMultipleSuffixes - matches=$(grep -c -e 'Running E2E' -e 'Running IT' ./bazel-testlogs/test/JunitMultipleSuffixes/test.log) - if [ $matches -eq 2 ]; then + + matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.JunitSuffixIT' -e 'scala.test.junit.JunitSuffixE2E' ./bazel-testlogs/test/JunitMultipleSuffixes/test.log) + if [ $matches -eq 3 ]; then + return 0 + else + return 1 + fi +} + +multiple_junit_patterns() { + bazel test //test:JunitPrefixesAndSuffixes + matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.TestJunitCustomPattern' -e 'scala.test.junit.JunitCustomSuffixE2E' ./bazel-testlogs/test/JunitPrefixesAndSuffixes/test.log) + if [ $matches -eq 3 ]; then return 0 else return 1 @@ -159,3 +170,4 @@ run_test test_benchmark_jmh run_test multiple_junit_suffixes run_test test_scala_junit_test_can_fail run_test junit_generates_xml_logs +run_test multiple_junit_patterns From 4cc722db88614a934ea7e7ceee36f5bc871dccce Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 12:07:05 +0300 Subject: [PATCH 31/38] removed unneeded globs --- test/BUILD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/BUILD b/test/BUILD index 8bb15824a..db429e965 100644 --- a/test/BUILD +++ b/test/BUILD @@ -230,7 +230,7 @@ scala_library( ) scala_junit_test( name = "JunitTestWithDeps", - srcs = glob(["src/main/scala/scala/test/junit/JunitTests.scala"]), + srcs = ["src/main/scala/scala/test/junit/JunitTests.scala"], suffixes = ["Test"], size = "small", deps = [":JUnitCompileTimeDep"], @@ -239,20 +239,20 @@ scala_junit_test( ) scala_junit_test( name = "JunitCustomSuffix", - srcs = glob(["src/main/scala/scala/test/junit/JunitCustomSuffix.scala"]), + srcs = ["src/main/scala/scala/test/junit/JunitCustomSuffix.scala"], size = "small", suffixes = ["E2E"] ) scala_junit_test( name = "JunitMultipleSuffixes", - srcs = glob(["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala"]), + srcs = ["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala"], size = "small", suffixes = ["E2E","IT"], print_discovered_classes = True ) scala_junit_test( name = "JunitCustomPattern", - srcs = glob(["src/main/scala/scala/test/junit/JunitCustomPattern.scala"]), + srcs = ["src/main/scala/scala/test/junit/JunitCustomPattern.scala"], size = "small", prefixes = ["Test"] ) @@ -268,7 +268,7 @@ scala_junit_test( scala_specs2_junit_test( name = "Specs2Tests", - srcs = glob(["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"]), + srcs = ["src/main/scala/scala/test/junit/specs2/Specs2Tests.scala"], deps = [":JUnitCompileTimeDep"], size = "small", suffixes = ["Test"], From 853679a88c77f8a1e9b5bfede66dfa79f43d4837 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 12:13:34 +0300 Subject: [PATCH 32/38] removed unused imports --- test/src/main/scala/scala/test/junit/JunitCustomPattern.scala | 2 -- test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala | 2 -- .../src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala | 2 -- test/src/main/scala/scala/test/junit/JunitTests.scala | 2 -- 4 files changed, 8 deletions(-) diff --git a/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala b/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala index 7669bfb4c..c1e2f0a93 100644 --- a/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala +++ b/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala @@ -1,8 +1,6 @@ package scala.test.junit import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 import org.junit.Assert._ class TestJunitCustomPattern { diff --git a/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala b/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala index f56ec82b9..bc9b98802 100644 --- a/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala +++ b/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala @@ -1,8 +1,6 @@ package scala.test.junit import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 import org.junit.Assert._ class JunitCustomSuffixE2E { diff --git a/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala b/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala index 969aaf0d5..0acd787b7 100644 --- a/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala +++ b/test/src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala @@ -1,8 +1,6 @@ package scala.test.junit import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 import org.junit.Assert._ class JunitSuffixE2E { diff --git a/test/src/main/scala/scala/test/junit/JunitTests.scala b/test/src/main/scala/scala/test/junit/JunitTests.scala index 2647fe2ab..473773128 100644 --- a/test/src/main/scala/scala/test/junit/JunitTests.scala +++ b/test/src/main/scala/scala/test/junit/JunitTests.scala @@ -1,8 +1,6 @@ package scala.test.junit import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 import org.hamcrest.CoreMatchers._ import org.hamcrest.MatcherAssert._ import scala.test.junit.support.JUnitCompileTimeDep From bb23f0584236ba7251259f903131096767b74e45 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 12:23:42 +0300 Subject: [PATCH 33/38] renamed CustomPattern to CustomPrefix --- test/BUILD | 6 +++--- .../{JunitCustomPattern.scala => JunitCustomPrefix.scala} | 2 +- test_run.sh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename test/src/main/scala/scala/test/junit/{JunitCustomPattern.scala => JunitCustomPrefix.scala} (81%) diff --git a/test/BUILD b/test/BUILD index db429e965..bf3d98c41 100644 --- a/test/BUILD +++ b/test/BUILD @@ -251,15 +251,15 @@ scala_junit_test( print_discovered_classes = True ) scala_junit_test( - name = "JunitCustomPattern", - srcs = ["src/main/scala/scala/test/junit/JunitCustomPattern.scala"], + name = "JunitCustomPrefix", + srcs = ["src/main/scala/scala/test/junit/JunitCustomPrefix.scala"], size = "small", prefixes = ["Test"] ) scala_junit_test( name = "JunitPrefixesAndSuffixes", srcs = ["src/main/scala/scala/test/junit/JunitCustomSuffix.scala", - "src/main/scala/scala/test/junit/JunitCustomPattern.scala"], + "src/main/scala/scala/test/junit/JunitCustomPrefix.scala"], size = "small", suffixes = ["E2E"], prefixes = ["Test"], diff --git a/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala b/test/src/main/scala/scala/test/junit/JunitCustomPrefix.scala similarity index 81% rename from test/src/main/scala/scala/test/junit/JunitCustomPattern.scala rename to test/src/main/scala/scala/test/junit/JunitCustomPrefix.scala index c1e2f0a93..74c9f7dc2 100644 --- a/test/src/main/scala/scala/test/junit/JunitCustomPattern.scala +++ b/test/src/main/scala/scala/test/junit/JunitCustomPrefix.scala @@ -3,7 +3,7 @@ package scala.test.junit import org.junit.Test import org.junit.Assert._ -class TestJunitCustomPattern { +class TestJunitCustomPrefix { @Test def someTest: Unit = { diff --git a/test_run.sh b/test_run.sh index 1e6caaba4..fddd79efe 100755 --- a/test_run.sh +++ b/test_run.sh @@ -137,7 +137,7 @@ multiple_junit_suffixes() { multiple_junit_patterns() { bazel test //test:JunitPrefixesAndSuffixes - matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.TestJunitCustomPattern' -e 'scala.test.junit.JunitCustomSuffixE2E' ./bazel-testlogs/test/JunitPrefixesAndSuffixes/test.log) + matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.TestJunitCustomPrefix' -e 'scala.test.junit.JunitCustomSuffixE2E' ./bazel-testlogs/test/JunitPrefixesAndSuffixes/test.log) if [ $matches -eq 3 ]; then return 0 else From 0325608a339f1918a1df27c41c1c6957648ac306 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 12:43:02 +0300 Subject: [PATCH 34/38] mandating at least one of prefixes/suffixes attributes be set --- scala/scala.bzl | 2 ++ test_expect_failure/scala_junit_test/BUILD | 7 ++++++- .../scala_junit_test/JunitTest.scala | 10 ++++++++++ test_run.sh | 13 +++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test_expect_failure/scala_junit_test/JunitTest.scala diff --git a/scala/scala.bzl b/scala/scala.bzl index 3797f468a..d507c3416 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -521,6 +521,8 @@ def _gen_test_suite_flags_based_on_prefixes_and_suffixes(ctx, archive): printFlag = "-Dbazel.discover.classes.print.discovered=%s" % ctx.attr.print_discovered_classes) def _scala_junit_test_impl(ctx): + if (not(ctx.attr.prefixes) and not(ctx.attr.suffixes)): + fail("Setting at least one of the attributes ('prefixes','suffixes') is required") deps = ctx.attr.deps + [ctx.attr._suite] jars = _collect_jars(deps) (cjars, rjars) = (jars.compiletime, jars.runtime) diff --git a/test_expect_failure/scala_junit_test/BUILD b/test_expect_failure/scala_junit_test/BUILD index 33b78f78c..bda4a232b 100644 --- a/test_expect_failure/scala_junit_test/BUILD +++ b/test_expect_failure/scala_junit_test/BUILD @@ -2,7 +2,12 @@ load("//scala:scala.bzl", "scala_junit_test") scala_junit_test( name = "failing_test", - srcs = glob(["*.scala"]), + srcs = ["JunitFailureTest.scala"], suffixes = ["Test"], size = "small", ) +scala_junit_test( + name = "no_prefix_or_suffix", + srcs = ["JunitTest.scala"], + size = "small", +) \ No newline at end of file diff --git a/test_expect_failure/scala_junit_test/JunitTest.scala b/test_expect_failure/scala_junit_test/JunitTest.scala new file mode 100644 index 000000000..8a95055b3 --- /dev/null +++ b/test_expect_failure/scala_junit_test/JunitTest.scala @@ -0,0 +1,10 @@ + +import org.junit.Test + +class JunitTest { + + @Test + def running: Unit = { + } + +} diff --git a/test_run.sh b/test_run.sh index fddd79efe..d2bed1f62 100755 --- a/test_run.sh +++ b/test_run.sh @@ -150,6 +150,18 @@ junit_generates_xml_logs() { test -e ./bazel-testlogs/test/JunitTestWithDeps/test.xml } +test_junit_test_must_have_prefix_or_suffix() { + set +e + + bazel test test_expect_failure/scala_junit_test:no_prefix_or_suffix + if [ $? -eq 0 ]; then + echo "'bazel build test_expect_failure/scala_junit_test:no_prefix_or_suffix' should have failed." + exit 1 + fi + set -e + exit 0 +} + run_test bazel build test/... run_test bazel test test/... run_test bazel run test/src/main/scala/scala/test/twitter_scrooge:justscrooges @@ -171,3 +183,4 @@ run_test multiple_junit_suffixes run_test test_scala_junit_test_can_fail run_test junit_generates_xml_logs run_test multiple_junit_patterns +run_test test_junit_test_must_have_prefix_or_suffix From fe209205958a49ca08df8167c01f10c315d6c815 Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 12:51:09 +0300 Subject: [PATCH 35/38] erroring when no tests are discovered --- .../test_discovery/DiscoveredTestSuite.scala | 5 +++++ test_expect_failure/scala_junit_test/BUILD | 6 ++++++ test_run.sh | 13 +++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala index ad98b96c6..372583566 100644 --- a/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala +++ b/src/java/io/bazel/rulesscala/test_discovery/DiscoveredTestSuite.scala @@ -48,6 +48,11 @@ object PrefixSuffixTestDiscoveringSuite { println("Discovered classes:") classes.foreach(c => println(c.getName)) } + if (classes.isEmpty) + throw new IllegalStateException("Was not able to discover any classes " + + s"for archive=$archivePath, " + + s"prefixes=$prefixes, " + + s"suffixes=$suffixes") classes } diff --git a/test_expect_failure/scala_junit_test/BUILD b/test_expect_failure/scala_junit_test/BUILD index bda4a232b..32bef98b4 100644 --- a/test_expect_failure/scala_junit_test/BUILD +++ b/test_expect_failure/scala_junit_test/BUILD @@ -10,4 +10,10 @@ scala_junit_test( name = "no_prefix_or_suffix", srcs = ["JunitTest.scala"], size = "small", +) +scala_junit_test( + name = "no_tests_found", + srcs = ["JunitTest.scala"], + suffixes = ["DoesNotMatch"], + size = "small", ) \ No newline at end of file diff --git a/test_run.sh b/test_run.sh index d2bed1f62..534bf3288 100755 --- a/test_run.sh +++ b/test_run.sh @@ -162,6 +162,18 @@ test_junit_test_must_have_prefix_or_suffix() { exit 0 } +test_junit_test_errors_when_no_tests_found() { + set +e + + bazel test test_expect_failure/scala_junit_test:no_tests_found + if [ $? -eq 0 ]; then + echo "'bazel build test_expect_failure/scala_junit_test:no_tests_found' should have failed." + exit 1 + fi + set -e + exit 0 +} + run_test bazel build test/... run_test bazel test test/... run_test bazel run test/src/main/scala/scala/test/twitter_scrooge:justscrooges @@ -184,3 +196,4 @@ run_test test_scala_junit_test_can_fail run_test junit_generates_xml_logs run_test multiple_junit_patterns run_test test_junit_test_must_have_prefix_or_suffix +run_test test_junit_test_errors_when_no_tests_found From 22ccd22b7f5f1665bd39663b974555c8537a40ed Mon Sep 17 00:00:00 2001 From: ittaiz Date: Sun, 26 Mar 2017 14:49:20 +0300 Subject: [PATCH 36/38] multiple prefixes test, dropped single suffix and single prefix tests since they are covered by the test --- test/BUILD | 17 ++++++----------- .../scala/test/junit/JunitCustomSuffix.scala | 13 ------------- ...Prefix.scala => JunitMultiplePrefixes.scala} | 8 ++++++++ test_run.sh | 14 +++++++++++++- 4 files changed, 27 insertions(+), 25 deletions(-) delete mode 100644 test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala rename test/src/main/scala/scala/test/junit/{JunitCustomPrefix.scala => JunitMultiplePrefixes.scala} (64%) diff --git a/test/BUILD b/test/BUILD index bf3d98c41..d48c7ece4 100644 --- a/test/BUILD +++ b/test/BUILD @@ -237,12 +237,6 @@ scala_junit_test( runtime_deps = [":JUnitRuntimeDep"], jvm_flags = ["-XX:HeapDumpPath=/some/custom/path"], ) -scala_junit_test( - name = "JunitCustomSuffix", - srcs = ["src/main/scala/scala/test/junit/JunitCustomSuffix.scala"], - size = "small", - suffixes = ["E2E"] -) scala_junit_test( name = "JunitMultipleSuffixes", srcs = ["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala"], @@ -251,15 +245,16 @@ scala_junit_test( print_discovered_classes = True ) scala_junit_test( - name = "JunitCustomPrefix", - srcs = ["src/main/scala/scala/test/junit/JunitCustomPrefix.scala"], + name = "JunitMultiplePrefixes", + srcs = ["src/main/scala/scala/test/junit/JunitMultiplePrefixes.scala"], size = "small", - prefixes = ["Test"] + prefixes = ["Test","OtherCustomPrefix"], + print_discovered_classes = True ) scala_junit_test( name = "JunitPrefixesAndSuffixes", - srcs = ["src/main/scala/scala/test/junit/JunitCustomSuffix.scala", - "src/main/scala/scala/test/junit/JunitCustomPrefix.scala"], + srcs = ["src/main/scala/scala/test/junit/JunitMultipleSuffixes.scala", + "src/main/scala/scala/test/junit/JunitMultiplePrefixes.scala"], size = "small", suffixes = ["E2E"], prefixes = ["Test"], diff --git a/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala b/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala deleted file mode 100644 index bc9b98802..000000000 --- a/test/src/main/scala/scala/test/junit/JunitCustomSuffix.scala +++ /dev/null @@ -1,13 +0,0 @@ -package scala.test.junit - -import org.junit.Test -import org.junit.Assert._ - -class JunitCustomSuffixE2E { - - @Test - def someTest: Unit = { - assertEquals(1, 1) - } - -} diff --git a/test/src/main/scala/scala/test/junit/JunitCustomPrefix.scala b/test/src/main/scala/scala/test/junit/JunitMultiplePrefixes.scala similarity index 64% rename from test/src/main/scala/scala/test/junit/JunitCustomPrefix.scala rename to test/src/main/scala/scala/test/junit/JunitMultiplePrefixes.scala index 74c9f7dc2..d4ee5a847 100644 --- a/test/src/main/scala/scala/test/junit/JunitCustomPrefix.scala +++ b/test/src/main/scala/scala/test/junit/JunitMultiplePrefixes.scala @@ -11,3 +11,11 @@ class TestJunitCustomPrefix { } } +class OtherCustomPrefixJunit { + + @Test + def someTest: Unit = { + assertEquals(1, 1) + } + +} \ No newline at end of file diff --git a/test_run.sh b/test_run.sh index 534bf3288..4f2d5659b 100755 --- a/test_run.sh +++ b/test_run.sh @@ -135,9 +135,20 @@ multiple_junit_suffixes() { fi } +multiple_junit_prefixes() { + bazel test //test:JunitMultiplePrefixes + + matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.TestJunitCustomPrefix' -e 'scala.test.junit.OtherCustomPrefixJunit' ./bazel-testlogs/test/JunitMultiplePrefixes/test.log) + if [ $matches -eq 3 ]; then + return 0 + else + return 1 + fi +} + multiple_junit_patterns() { bazel test //test:JunitPrefixesAndSuffixes - matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.TestJunitCustomPrefix' -e 'scala.test.junit.JunitCustomSuffixE2E' ./bazel-testlogs/test/JunitPrefixesAndSuffixes/test.log) + matches=$(grep -c -e 'Discovered classes' -e 'scala.test.junit.TestJunitCustomPrefix' -e 'scala.test.junit.JunitSuffixE2E' ./bazel-testlogs/test/JunitPrefixesAndSuffixes/test.log) if [ $matches -eq 3 ]; then return 0 else @@ -192,6 +203,7 @@ run_test test_repl run_test bazel run test:JavaOnlySources run_test test_benchmark_jmh run_test multiple_junit_suffixes +run_test multiple_junit_prefixes run_test test_scala_junit_test_can_fail run_test junit_generates_xml_logs run_test multiple_junit_patterns From 845fb2fed6953eb80c0787b9b316e2d87615399b Mon Sep 17 00:00:00 2001 From: Ittai Zeidman Date: Mon, 27 Mar 2017 23:19:27 +0300 Subject: [PATCH 37/38] Fixed typo --- scala/scala.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index ed675ba5d..d2fca9df0 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -574,7 +574,7 @@ def _scala_junit_test_impl(ctx): ] + junit_deps rjars += _collect_jars(ctx.attr.runtime_deps).runtime test_suite = _gen_test_suite_flags_based_on_prefixes_and_suffixes(ctx, ctx.outputs.jar) - launcherJvmFlags = ["-ea", test_suit.archiveFlag, test_suite.prefixesFlag, test_suite.suffixesFlag, test_suite.printFlag] + launcherJvmFlags = ["-ea", test_suite.archiveFlag, test_suite.prefixesFlag, test_suite.suffixesFlag, test_suite.printFlag] _write_launcher( ctx = ctx, rjars = jars, @@ -873,4 +873,4 @@ def scala_specs2_junit_test(name, **kwargs): scala_junit_test( name = name, deps = specs2_junit_dependencies() + kwargs.pop("deps",[]), - **kwargs) \ No newline at end of file + **kwargs) From 39824a7ed4da3c3888774ad2f57149d74c605b3e Mon Sep 17 00:00:00 2001 From: ittaiz Date: Tue, 28 Mar 2017 06:40:22 +0300 Subject: [PATCH 38/38] another typo from the script --- scala/scala.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scala/scala.bzl b/scala/scala.bzl index d2fca9df0..6507abdc1 100644 --- a/scala/scala.bzl +++ b/scala/scala.bzl @@ -577,7 +577,7 @@ def _scala_junit_test_impl(ctx): launcherJvmFlags = ["-ea", test_suite.archiveFlag, test_suite.prefixesFlag, test_suite.suffixesFlag, test_suite.printFlag] _write_launcher( ctx = ctx, - rjars = jars, + rjars = rjars, main_class = "org.junit.runner.JUnitCore", jvm_flags = launcherJvmFlags + ctx.attr.jvm_flags, args = test_suite.suite_class,