Created
October 29, 2012 10:15
-
-
Save ijuma/3972753 to your computer and use it in GitHub Desktop.
SBT hang with forked tests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Exception in thread "Thread-18" Exception in thread "main" java.io.EOFException | |
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571) | |
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) | |
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:52) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.run(ForkTests.scala:84) | |
at java.lang.Thread.run(Thread.java:722) | |
java.util.NoSuchElementException: head of empty list | |
at scala.collection.immutable.Nil$.head(List.scala:328) | |
at scala.collection.immutable.Nil$.head(List.scala:325) |
That stack trace is interesting for another reason. It looks like we're hit by the tailrec bug. react
is annotated with tailrec
:
https://github.com/harrah/xsbt/blob/0.12.1/main/actions/ForkTests.scala#L52
but the trace above shows it isn't optimized into a loop.
@vigdorchik I don't see why it is ok for sbt to avoid responsibility for handling exceptions from the test framework, especially if the error message that the user sees is the one in this gist, which gives no indication what the problem is. Are you saying that the new code provides a better error message?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The later exception looks like it is coming from ScalaTestRunner.run, no? Sbt doesn't provide guards against frameworks throwing exceptions.