2014-09-11 5 views
10

Ho un problema che non riesco proprio a spiegare ... È isolato nel progetto allo https://github.com/betehess/play-scalatest.specifiche/problema di interazione scalare nell'app Play

Quando eseguo test, SBT si blocca per un po 'e poi genera questa eccezione:

> test 
[error] Uncaught exception when running tests: java.net.ConnectException: Connection timed out 
Exception in thread "Thread-1" java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:196) 
    at java.net.SocketInputStream.read(SocketInputStream.java:122) 
    at java.net.SocketInputStream.read(SocketInputStream.java:210) 
    at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2293) 
    at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2473) 
    at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2543) 
    at java.io.ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2445) 
    at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1941) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990) 
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:500) 
    at java.lang.Throwable.readObject(Throwable.java:914) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at sbt.React.react(ForkTests.scala:117) 
    at sbt.ForkTests$$anonfun$mainTestTask$1$Acceptor$2$.run(ForkTests.scala:76) 
    at java.lang.Thread.run(Thread.java:745) 

Sembra SBT si blocca in una chiamata di blocco con l'ambiente biforcuta a https://github.com/sbt/sbt/blob/0.13.5/main/actions/src/main/scala/sbt/ForkTests.scala#L117.

Alcune osservazioni:

  • corro Ubuntu 13.10 e Java HotSpot (TM) 64-Bit "1.7.0_65"
  • nessuno dei miei colleghi in grado di riprodurre il problema sulle loro macchine ...
  • il problema si verifica solo quando ScalaTest è sul classpath, anche se non utilizzati qui
  • il problema va via se io non uso il PlayScala pluggin e aggiungi specs2 esplicitamente come dipendenza
  • il problema va via se mi trasferisco la dipendenza ScalaTest nella principale build.sbt
+0

Funziona per me, Slackware 14.1 + Oracle JDK 8 –

risposta

3

ho finalmente scoperto che cosa stava accadendo.

Si scopre che con le giuste impostazioni, sbt imposterà la JVM per eseguire i test e vorrà comunicare con esso. Il modo in cui questo viene fatto dipende dal framework di test. Nel caso di scalatest, la comunicazione tra i due processi sarà effettuata attraverso un server. scalatest comunica solo l'indirizzo e la porta del server che devono essere utilizzati da sbt. E questo sta accadendo there.

val array = Array(InetAddress.getLocalHost.getHostAddress, skeleton.port.toString) 

Ora, andare a leggere ciò che il javadoc dice per InetAddress#getLocalHost:

restituisce l'indirizzo dell'host locale. Ciò si ottiene recuperando il nome dell'host dal sistema, quindi risolvendo tale nome in un indirizzoInet .

Sono su Linux. Il mio host locale (che è mailocalhost) finisce con dopey. Ora, per qualche ragione (stavo scherzando con la mia rete a casa), il mio /etc/hosts stava assegnando un indirizzo fasullo a dopey. Quindi, invece di qualcosa come 127.0.0.1, scalatest proverebbe ad aprire un socket su questo server fittizio. E a causa di where this is happening, non si vede nulla di utile nello stacktrace.

La mia ipotesi è che l'intenzione era sempre di utilizzare 127.0.0.1 ...

+0

Per essere chiari la correzione reale è, http://stackoverflow.com/questions/33287424/strange-exception-in-sbt-test – mehmoodz

+0

In Windows, modificare C: \ Windows \ System32 \ drivers \ etc \ hosts come amministratore e aggiungere una riga: 127.0.0.1 * yourcomputername * – nemoo