2010-01-14 22 views
6

¿Cómo simular los errores de socket? (a veces el servidor o el cliente se desconecta debido a algún error de socket y es imposible de reproducir.) Estaba buscando una herramienta para hacer esto, pero no puedo encontrar uno. ¿Alguien sabe de una herramienta o tiene un ejemplo de código sobre cómo hacer esto? (C# o C/C++)simular errores de socket

+2

Desconecte el cable de red? – Eclipse

Respuesta

6

Agregue una capa de envoltura a las API que está utilizando para acceder a los sockets y haga que fallen rand()% 100> x por ciento de las veces.

+0

bien, no estoy seguro de cómo hacer eso ... la parte de falla ... – ra170

+0

@ ra170 en su función de contenedor, en lugar de llamar a la función real, haga que devuelva el código de error que significa "error" para esa API alguna parte del time –

1

Tuve exactamente el mismo problema este verano.

Tuve una clase personalizada Socket y quería probar qué pasaría si read o write lanzaran una excepción. Tenía muchas ganas de imitar la burla de Java marcos, y lo hice así:

que heredaron la clase Socket en una clase FakeSocket, y ha creado algo llamado SocketExpectation. Luego, en las pruebas unitarias, creé tomas falsas, establecí las expectativas y luego pasé ese enchufe falso al código que quería probar.

El FakeSocket tenían estos métodos (despojadas de detalles innecesarios):

uint32_t write(buffer, length); // calls check 
uint32_t read(buffer, length); // calls check 
bool matches(); 
void expect(expectation); 
uint32_t check(CallType, buffer, length) const; 

Son todos bastante sencillo. check comprueba los argumentos en contra de la expectativa actual y si todo está de acuerdo con el plan, procede a realizar el requisito SocketExpectation.

El SocketExpectation tiene este esquema (también despojado):

typedef enum { write, read } CallType; 

SocketExpectation(CallType type); 
SocketExpectation &with_arguments(void *a1, uint32_t a2); // expects these args 
SocketExpectation &will_return(uint32_t value); 
SocketExpectation &will_throw(const char * e); // test error handling 
bool matches(); 

que añade más métodos como los he necesitado. Me gustaría crear como este, a continuación, pasar la toma falsa para el método correspondiente:

fake_socket = FakeSocket(); 
fake_socket.expect(SocketExpectation(write).with_arguments(....).will_return(...)); 
fake_socket.expect(SocketExpectation(read).with_arguments(...).will_throw("something")); 
+0

leer y escribir no puede lanzar excepciones –

+0

Es una clase de socket personalizada, que arroja excepciones si algo inesperado le sucedió a la conexión. – laura

0

mi código de toma de pruebas de unidad son probablemente mejor descrito como pruebas de integración mientras manejo del código que se está probando para conectarse a un 'simulacro' compañero remoto. Como el par remoto está bajo el control de la prueba (es simplemente un cliente o servidor simple), puedo hacer que la prueba haga que el par remoto interrumpa la conexión de varias maneras y luego asegúrese de que el código bajo prueba reaccione como se espera. Se necesita un poco de trabajo para configurarlo, pero una vez que tienes todas las piezas en su lugar, es bastante trivial probar la mayoría de las situaciones.

Así que, supongo, mi sugerencia es que en lugar de intentar simular las situaciones que estás enfrentando, debes comprenderlas y luego generarlas de manera confiable.