Skip to content

Commit

Permalink
Ignore NoClassDefFoundError exception in test runner (#495)
Browse files Browse the repository at this point in the history
* Ignore NoClassDefFoundError exception in test runner
  • Loading branch information
lwronski committed Dec 15, 2021
1 parent 1567446 commit 2be5aae
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import coursier.util.Task
final case class InternalOptions(
keepDiagnostics: Boolean = false,
cache: Option[FileCache[Task]] = None,
localRepository: Option[String] = None
localRepository: Option[String] = None,
verbosity: Option[Int] = None
)

object InternalOptions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,8 @@ final case class SharedOptions(
),
internal = InternalOptions(
cache = Some(coursierCache),
localRepository = LocalRepo.localRepo(directories.directories.localRepoDir)
localRepository = LocalRepo.localRepo(directories.directories.localRepoDir),
verbosity = Some(logging.verbosity)
)
)
}
Expand Down
1 change: 1 addition & 0 deletions modules/cli/src/main/scala/scala/cli/commands/Test.scala
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ object Test extends ScalaCommand[TestOptions] {
case Platform.JVM =>
val extraArgs =
(if (requireTests) Seq("--require-tests") else Nil) ++
build.options.internal.verbosity.map(v => s"--verbosity=$v") ++
testFrameworkOpt.map(fw => s"--test-framework=$fw").toSeq ++
Seq("--") ++ args

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ object DynamicTestRunner {
val it: Iterator[Class[_]] =
try Iterator(loader.loadClass(name))
catch {
case _: ClassNotFoundException | _: UnsupportedClassVersionError =>
case _: ClassNotFoundException | _: UnsupportedClassVersionError | _: NoClassDefFoundError =>
Iterator.empty
}
it
Expand Down Expand Up @@ -150,32 +150,56 @@ object DynamicTestRunner {

def main(args: Array[String]): Unit = {

val (testFrameworkOpt, requireTests, args0) = {
val (testFrameworkOpt, requireTests, verbosity, args0) = {
@tailrec
def parse(
testFrameworkOpt: Option[String],
reverseTestArgs: List[String],
requireTests: Boolean,
verbosity: Int,
args: List[String]
): (Option[String], Boolean, List[String]) =
): (Option[String], Boolean, Int, List[String]) =
args match {
case Nil => (testFrameworkOpt, requireTests, reverseTestArgs.reverse)
case "--" :: t => (testFrameworkOpt, requireTests, reverseTestArgs.reverse ::: t)
case Nil => (testFrameworkOpt, requireTests, verbosity, reverseTestArgs.reverse)
case "--" :: t =>
(testFrameworkOpt, requireTests, verbosity, reverseTestArgs.reverse ::: t)
case h :: t if h.startsWith("--test-framework=") =>
parse(Some(h.stripPrefix("--test-framework=")), reverseTestArgs, requireTests, t)
case "--require-tests" :: t => parse(testFrameworkOpt, reverseTestArgs, true, t)
case h :: t => parse(testFrameworkOpt, h :: reverseTestArgs, requireTests, t)
parse(
Some(h.stripPrefix("--test-framework=")),
reverseTestArgs,
requireTests,
verbosity,
t
)
case h :: t if h.startsWith("--verbosity=") =>
parse(
testFrameworkOpt,
reverseTestArgs,
requireTests,
h.stripPrefix("--verbosity=").toInt,
t
)
case "--require-tests" :: t =>
parse(testFrameworkOpt, reverseTestArgs, true, verbosity, t)
case h :: t => parse(testFrameworkOpt, h :: reverseTestArgs, requireTests, verbosity, t)
}

parse(None, Nil, false, args.toList)
parse(None, Nil, false, 0, args.toList)
}

val classLoader = Thread.currentThread().getContextClassLoader
val classPath0 = TestRunner.classPath(classLoader)
val framework = testFrameworkOpt.map(loadFramework(classLoader, _))
.orElse(findFrameworkService(classLoader))
.orElse(findFramework(classPath0, classLoader, TestRunner.commonTestFrameworks))
.getOrElse(sys.error("No test framework found"))
.getOrElse {
if (verbosity >= 2)
sys.error("No test framework found")
else {
System.err.println("No test framework found")
sys.exit(1)
}
}
def classes = {
val keepJars = false // look into dependencies, much slower
listClasses(classPath0, keepJars).map(name => classLoader.loadClass(name))
Expand Down

0 comments on commit 2be5aae

Please sign in to comment.