diff --git a/third_party/dependency_analyzer/src/test/BUILD b/third_party/dependency_analyzer/src/test/BUILD index 2953466f0..000b77b5c 100644 --- a/third_party/dependency_analyzer/src/test/BUILD +++ b/third_party/dependency_analyzer/src/test/BUILD @@ -1,3 +1,3 @@ -load(":analyzer_test.bzl", "analyzer_tests") +load(":analyzer_test.bzl", "tests") -analyzer_tests() +tests() diff --git a/third_party/dependency_analyzer/src/test/analyzer_test.bzl b/third_party/dependency_analyzer/src/test/analyzer_test.bzl index 7bef01e99..2676ea7c5 100644 --- a/third_party/dependency_analyzer/src/test/analyzer_test.bzl +++ b/third_party/dependency_analyzer/src/test/analyzer_test.bzl @@ -1,101 +1,9 @@ -load("//scala:scala.bzl", "scala_test") +load(":analyzer_test_scala_2.bzl", "analyzer_tests_scala_2") +load(":analyzer_test_scala_3.bzl", "analyzer_tests_scala_3") load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION") -def analyzer_tests(): +def tests(): if SCALA_MAJOR_VERSION.startswith("2"): - common_jvm_flags = [ - "-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)", - "-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)", - "-Dscala.reflect.location=$(rootpath @io_bazel_rules_scala_scala_reflect)", - ] - - scala_test( - name = "ast_used_jar_finder_test", - size = "small", - srcs = [ - "io/bazel/rulesscala/dependencyanalyzer/AstUsedJarFinderTest.scala", - ], - jvm_flags = common_jvm_flags, - deps = [ - "//src/java/io/bazel/rulesscala/io_utils", - "//third_party/dependency_analyzer/src/main:dependency_analyzer", - "//third_party/dependency_analyzer/src/main:scala_version", - "//third_party/utils/src/test:test_util", - "@io_bazel_rules_scala_scala_compiler", - "@io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala_scala_reflect", - ], - ) - - scala_test( - name = "scala_version_test", - size = "small", - srcs = [ - "io/bazel/rulesscala/dependencyanalyzer/ScalaVersionTest.scala", - ], - deps = [ - "//third_party/dependency_analyzer/src/main:scala_version", - "@io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala_scala_reflect", - ], - ) - - scala_test( - name = "scalac_dependency_test", - size = "small", - srcs = [ - "io/bazel/rulesscala/dependencyanalyzer/ScalacDependencyTest.scala", - ], - jvm_flags = common_jvm_flags, - unused_dependency_checker_mode = "off", - deps = [ - "//src/java/io/bazel/rulesscala/io_utils", - "//third_party/dependency_analyzer/src/main:dependency_analyzer", - "//third_party/utils/src/test:test_util", - "@io_bazel_rules_scala_scala_compiler", - "@io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala_scala_reflect", - ], - ) - - scala_test( - name = "strict_deps_test", - size = "small", - srcs = [ - "io/bazel/rulesscala/dependencyanalyzer/StrictDepsTest.scala", - ], - jvm_flags = common_jvm_flags + [ - "-Dguava.jar.location=$(rootpath @com_google_guava_guava_21_0_with_file//jar)", - "-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)", - ], - unused_dependency_checker_mode = "off", - deps = [ - "//third_party/dependency_analyzer/src/main:dependency_analyzer", - "//third_party/utils/src/test:test_util", - "@com_google_guava_guava_21_0_with_file//jar", - "@io_bazel_rules_scala_scala_compiler", - "@io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala_scala_reflect", - "@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file", - ], - ) - - scala_test( - name = "unused_dependency_checker_test", - size = "small", - srcs = [ - "io/bazel/rulesscala/dependencyanalyzer/UnusedDependencyCheckerTest.scala", - ], - jvm_flags = common_jvm_flags + [ - "-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)", - ], - unused_dependency_checker_mode = "off", - deps = [ - "//third_party/dependency_analyzer/src/main:dependency_analyzer", - "//third_party/utils/src/test:test_util", - "@io_bazel_rules_scala_scala_compiler", - "@io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala_scala_reflect", - "@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file", - ], - ) + analyzer_tests_scala_2() + else: + analyzer_tests_scala_3() diff --git a/third_party/dependency_analyzer/src/test/analyzer_test_scala_2.bzl b/third_party/dependency_analyzer/src/test/analyzer_test_scala_2.bzl new file mode 100644 index 000000000..d599b0119 --- /dev/null +++ b/third_party/dependency_analyzer/src/test/analyzer_test_scala_2.bzl @@ -0,0 +1,99 @@ +load("//scala:scala.bzl", "scala_test") + +def analyzer_tests_scala_2(): + common_jvm_flags = [ + "-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)", + "-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)", + "-Dscala.reflect.location=$(rootpath @io_bazel_rules_scala_scala_reflect)", + ] + + scala_test( + name = "ast_used_jar_finder_test", + size = "small", + srcs = [ + "io/bazel/rulesscala/dependencyanalyzer/AstUsedJarFinderTest.scala", + ], + jvm_flags = common_jvm_flags, + deps = [ + "//src/java/io/bazel/rulesscala/io_utils", + "//third_party/dependency_analyzer/src/main:dependency_analyzer", + "//third_party/dependency_analyzer/src/main:scala_version", + "//third_party/utils/src/test:test_util", + "@io_bazel_rules_scala_scala_compiler", + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + ], + ) + + scala_test( + name = "scala_version_test", + size = "small", + srcs = [ + "io/bazel/rulesscala/dependencyanalyzer/ScalaVersionTest.scala", + ], + deps = [ + "//third_party/dependency_analyzer/src/main:scala_version", + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + ], + ) + + scala_test( + name = "scalac_dependency_test", + size = "small", + srcs = [ + "io/bazel/rulesscala/dependencyanalyzer/ScalacDependencyTest.scala", + ], + jvm_flags = common_jvm_flags, + unused_dependency_checker_mode = "off", + deps = [ + "//src/java/io/bazel/rulesscala/io_utils", + "//third_party/dependency_analyzer/src/main:dependency_analyzer", + "//third_party/utils/src/test:test_util", + "@io_bazel_rules_scala_scala_compiler", + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + ], + ) + + scala_test( + name = "strict_deps_test", + size = "small", + srcs = [ + "io/bazel/rulesscala/dependencyanalyzer/StrictDepsTest.scala", + ], + jvm_flags = common_jvm_flags + [ + "-Dguava.jar.location=$(rootpath @com_google_guava_guava_21_0_with_file//jar)", + "-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)", + ], + unused_dependency_checker_mode = "off", + deps = [ + "//third_party/dependency_analyzer/src/main:dependency_analyzer", + "//third_party/utils/src/test:test_util", + "@com_google_guava_guava_21_0_with_file//jar", + "@io_bazel_rules_scala_scala_compiler", + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file", + ], + ) + + scala_test( + name = "unused_dependency_checker_test", + size = "small", + srcs = [ + "io/bazel/rulesscala/dependencyanalyzer/UnusedDependencyCheckerTest.scala", + ], + jvm_flags = common_jvm_flags + [ + "-Dapache.commons.jar.location=$(location @org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file)", + ], + unused_dependency_checker_mode = "off", + deps = [ + "//third_party/dependency_analyzer/src/main:dependency_analyzer", + "//third_party/utils/src/test:test_util", + "@io_bazel_rules_scala_scala_compiler", + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_reflect", + "@org_apache_commons_commons_lang_3_5_without_file//:linkable_org_apache_commons_commons_lang_3_5_without_file", + ], + ) diff --git a/third_party/dependency_analyzer/src/test/analyzer_test_scala_3.bzl b/third_party/dependency_analyzer/src/test/analyzer_test_scala_3.bzl new file mode 100644 index 000000000..d25938271 --- /dev/null +++ b/third_party/dependency_analyzer/src/test/analyzer_test_scala_3.bzl @@ -0,0 +1,27 @@ +load("@io_bazel_rules_scala//scala:scala.bzl", "scala_test") + +def analyzer_tests_scala_3(): + common_jvm_flags = [ + "-Dplugin.jar.location=$(execpath //third_party/dependency_analyzer/src/main:dependency_analyzer)", + "-Dscala.library.location=$(rootpath @io_bazel_rules_scala_scala_library)", + # Scala 2 standard library is required for compilation. + # Without it compilation fails with error: + # class dotty.tools.dotc.core.Symbols$NoSymbol$ cannot be cast to class dotty.tools.dotc.core.Symbols$ClassSymbol + "-Dscala.library2.location=$(rootpath @io_bazel_rules_scala_scala_library_2)", + ] + + scala_test( + name = "test_that_tests_run", + size = "small", + jvm_flags = common_jvm_flags, + srcs = [ + "io/bazel/rulesscala/dependencyanalyzer3/CompileTest.scala", + ], + deps = [ + "//scala/private/toolchain_deps:scala_compile_classpath", + "//third_party/dependency_analyzer/src/main:dependency_analyzer", + "//third_party/utils/src/test:test_util", + "@io_bazel_rules_scala_scala_library", + "@io_bazel_rules_scala_scala_library_2", + ], + ) diff --git a/third_party/dependency_analyzer/src/test/io/bazel/rulesscala/dependencyanalyzer3/CompileTest.scala b/third_party/dependency_analyzer/src/test/io/bazel/rulesscala/dependencyanalyzer3/CompileTest.scala new file mode 100644 index 000000000..157ea1437 --- /dev/null +++ b/third_party/dependency_analyzer/src/test/io/bazel/rulesscala/dependencyanalyzer3/CompileTest.scala @@ -0,0 +1,24 @@ +package io.bazel.rulesscala.dependencyanalyzer + +import org.scalatest.funsuite.AnyFunSuite +import io.bazel.rulesscala.utils.Scala3CompilerUtils + +class CompileTest extends AnyFunSuite { + + test("Util compiles valid code") { + val scalaCode = "class Foo { }" + val messages = Scala3CompilerUtils.runCompiler(scalaCode) + + assert(messages.isEmpty, "No messages must be reported when valid code is compiled") + } + + test("Util returns errors on invalid code") { + val scalaCode = "!@#" + val messages = Scala3CompilerUtils.runCompiler(scalaCode) + + assert( + messages.exists(_.message.contains("Illegal start of toplevel definition")), + "Error must be reported when valid code is compiled" + ) + } +} \ No newline at end of file diff --git a/third_party/utils/src/test/BUILD b/third_party/utils/src/test/BUILD index ae5a9e635..39f558e99 100644 --- a/third_party/utils/src/test/BUILD +++ b/third_party/utils/src/test/BUILD @@ -1,13 +1,16 @@ load("//scala:scala.bzl", "scala_library") +load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION") licenses(["notice"]) # 3-clause BSD scala_library( name = "test_util", - srcs = [ + srcs = ([ "io/bazel/rulesscala/utils/JavaCompileUtil.scala", "io/bazel/rulesscala/utils/TestUtil.scala", - ], + ] if SCALA_MAJOR_VERSION.startswith("2") else [ + "io/bazel/rulesscala/utils/Scala3CompilerUtils.scala", + ]), visibility = ["//visibility:public"], deps = [ "//scala/private/toolchain_deps:scala_compile_classpath", diff --git a/third_party/utils/src/test/io/bazel/rulesscala/utils/Scala3CompilerUtils.scala b/third_party/utils/src/test/io/bazel/rulesscala/utils/Scala3CompilerUtils.scala new file mode 100644 index 000000000..953e45872 --- /dev/null +++ b/third_party/utils/src/test/io/bazel/rulesscala/utils/Scala3CompilerUtils.scala @@ -0,0 +1,44 @@ +package io.bazel.rulesscala.utils + +import dotty.tools.dotc.Compiler +import dotty.tools.dotc.core.Contexts._ +import dotty.tools.dotc.reporting.{Diagnostic, StoreReporter} +import dotty.tools.dotc.util.SourceFile + +import java.nio.file.Paths + +object Scala3CompilerUtils { + def runCompiler( + code: String, + extraClasspath: List[String] = List.empty, + ): List[Diagnostic] = { + val reporter = new TestReporter() + + implicit val context: FreshContext = (new ContextBase).initialCtx.fresh.setReporter(reporter) + + val fullClassPath = context.settings.classpath.value :: extraClasspath ::: builtinClasspaths.filterNot(_.isEmpty) + + context.setSetting(context.settings.classpath, fullClassPath.mkString(":")) + + val compiler = new Compiler() + val run = compiler.newRun + run.compileSources(SourceFile.virtual("scala_compiler_util_run_code.scala", code, maybeIncomplete = false) :: Nil) + + reporter.storedInfos + } + + private lazy val builtinClasspaths: List[String] = + pathOf("scala.library.location") :: pathOf("scala.library2.location") :: Nil + + private def pathOf(jvmFlag: String) = { + val jar = System.getProperty(jvmFlag) + val libPath = Paths.get(baseDir, jar).toAbsolutePath + libPath.toString + } + + private lazy val baseDir = System.getProperty("user.dir") +} + +class TestReporter extends StoreReporter(null) { + def storedInfos: List[Diagnostic] = if (infos != null) infos.toList else List() +}