miércoles, octubre 04, 2006

 

HttpUnit se cuelga...o eso parece.

Pues ya está bien de tanta fiesta jolgorrio, un poco de seriedad y cultura geek.

Muchos conocereis la suite HttpUnit. Se trata de una pequeña maravilla que permite implementar unidades de test al estilo JUnit, pero donde los módulos a testear son páginas web (servlets, páginas jsp, php, cgi's, lo que sea...). HttpUnit nos permite simular el acceso a un portal web, hacer "click" en los links, consultar las cookies, ejecutar código Java Script, etc.

Pues bien, en la ejecución de un test comprobé que el test se quedaba colgado. Para consultar en qué punto se congelaba la ejecución del test, en vez de hacer una sesión de debug o de plagar el código de líneas de logueado (soy demasiado vago para hacer eso...) utilicé otra pequeña maravilla, el JConsole.

Este lindo programilla nos permite conectarnos a una JVM y comprobar el estado de la memoria, los threads, el tiempo de ejecución y muchas otras cosas interesantes. Para que el JConsole se pueda conectar a una JVM ésta deberá arrancarse (java 5.0) con la propiedad

-Dcom.sun.management.jmxremote

(en el NetBeans podemos especificar esta propiedad en las propiedades del proyecto: Run->VM Options).

El JConsole, al arrancar, nos muestra una pequeña ventanita donde lista los PIDs de las aplicaciones java que permiten el "Remote Management". Una vez conectado a una JVM concreta nos mostrará información sobre la misma.

La que nos interesa en este punto es la relativa a los distintos hilos de la aplicación en cuestión. En la parte inferior de la pestaña Threads veremos una lista con todos los hilos vivos. En mi caso, dado que la ejecución del test no es multi-hilo el thread que me interesa es el llamado main (primer hilo de toda aplicación java). Seleccionando dicho hilo podré ver la stack trace del mismo y ver en qué punto de la ejecución se encuentra.

En mi caso el resultado fue el siguiente:





Refrescando la stack trace del hilo main (simplemente pulsando las flechas abajo y arriba, para deseleccionar y volver a seleccionarlo) comprobé que el hilo estaba bloqueado en el método java.net.SocketInputStream.socketRead0(), es decir, en una operación de lectura sobre un socket.

Mmmm, esto tenía toda la pinta de ser un problema con la configuración de los timeouts de los sockets. Busqué en el código de HttpUnit (ya sabeis, a falta de una buena documentación bueno es el código, jeje) y vi que en ningún sitio (salvo en un par de tests, no en la librería en sí) se invocaba el método setSoTimeout(), que establece el timeout de lectura de un socket dado.

Leyendo por ahí comprobé que el timeout por defecto es, infinito!. Ahí la razón del "cuelgue". La simple solución, dado que estoy utilizando una librería y, a pesar de ser de código abierto, no quiero pasar el engorro de modificar el código fuente y recompilar (por vagancia, una vez más, y porque de esa forma estaría creando un "fork" nuevo, incompatible con posibles actualizaciones de la librería...), pasa por establecer las siguientes propiedades:

sun.net.client.defaultConnectTimeout (timeout en ms. usado en el establecimiento de la conexión)
sun.net.client.defaultReadTimeout (timeout en ms. usado en las operaciones de lectura de una conexión ya establecida)

Para ello podemos invocar la JVM con los parámetros
-Dsun.net.client.defaultConnectTimeout=20000
-Dsun.net.client.defaultReadTimeout=20000

o, como finalmente hice, hacerlo programáticamente:

System.setProperty("sun.net.client.defaultConnectTimeout", "20000");
System.setProperty("sun.net.client.defaultReadTimeout", "20000");

A partir de ese momento, el test no se colgó más pero..., claro, excepción java.net.SocketTimeoutException al canto cada vez que hay un timeout! (como no podía ser de otro modo). Sin embargo, dicha excepción puede ser capturada y controlada, de forma que la ejecución del test de larga duración no se quede colgada.

Hasta otra.




Referencias:

JConsole:
- Using JConsole
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
- Using JConsole to Monitor Applications
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

HttpUnit:
- HttpUnit Home
http://httpunit.sourceforge.net
- Black Box Web Testing with HttpUnit
http://www.onjava.com/pub/a/onjava/2003/05/07/blackboxwebtest.html

Java Socket Timeouts:
- Java Networking Properties
http://java.sun.com/j2se/1.5.0/docs/guide/net/properties.html
- Handling Network Timeouts in Java
http://www.javacoffeebreak.com/articles/network_timeouts

Comments:
Madre mía, esto para mí es swajili..hay que ver que raro habláis los programadores...jeje, seguro q se trata de algo muy interesante ;S
Mariasun.
 
Publicar un comentario en la entrada



<< Home

This page is powered by Blogger. Isn't yours?