Validacion
Validacion
Validacion
md 2023-10-09
$ ./asosystest.py -h
asosystest.py: Version: v0.23.1
usage: asosystest.py [-h] [options]
options:
-h, --help show this help message and exit
-i TEST_FILE, --in-test-file TEST_FILE
JSON file containing list of tests.
-t TESTIDS, --testids TESTIDS
List of ranges of test IDs.
-d, --debug Enable debug mode.
-s, --setup Execute setup commands only.
1/7
Validacion.md 2023-10-09
{
"setup": {
"desc": "Archivo de configuración para validación de 'tarea'",
"timeout": 1,
"cmds": ["touch f1"],
"binaries": ["tarea"]
},
"tests":
[
{
"cmt": "Test existencia f1",
"cmd": "ls f1",
"out": [
"f1\n"
],
"rc": 0
},
{
"cmt": "Test salida 'tarea'",
"cmd": "./tarea # Argumentos",
"out": [
"Hello, ASO!\n"
],
"rc": 0
}
]
}
timeout: Límite de tiempo en segundos para cada prueba. Si la prueba no ha terminado pasado este
tiempo, se interrumpe considerándose fallida.
cmds: Comandos a ejecutar antes del inicio de las pruebas.
binaries: Binarios necesarios para llevar a cabo las pruebas.
cmt: Comentario(s).
cmd: Línea de órdenes objeto de la prueba. Si se especifican varias líneas, éstas se ejecutan
secuencialmente.
out: Salida esperada en stdout y/o stderr.
rc: Código de retorno esperado.
timeout (opcional): Límite de tiempo en segundos para esta prueba.
Para ejecutar las pruebas de la sección tests, la utilidad asosystest crea un directorio temporal durante
el procesamiento de la sección setup. De este modo, cualquier archivo creado durante la ejecución de las
pruebas, se elimina cuando finaliza asosystest.
2/7
Validacion.md 2023-10-09
$ ./asosystest.py -i tarea.json
asosystest.py: Version: v0.23.1
asosystest.py: Created temporary directory: '/tmp/tmpba4mt1i9'.
asosystest.py: Successfully copied binaries: '['tarea']'.
asosystest.py: Successful os.chdir('/tmp/tmpba4mt1i9').
asosystest.py: Successfully executed setup commands '['touch f1']'.
asosystest.py: Archivo de configuración para validación de 'tarea'.T01:
Result : OK!
asosystest.py: Archivo de configuración para validación de 'tarea'.T02:
Result : OK!
asosystest.py: Successful tests: [1, 2]
$ ./asosystest.py -i tarea.json
asosystest.py: Version: v0.23.1
asosystest.py: Created temporary directory: '/tmp/tmpa469mivk'.
asosystest.py: Successfully copied binaries: '['tarea']'.
asosystest.py: Successful os.chdir('/tmp/tmpa469mivk').
asosystest.py: Successfully executed setup commands '['touch f1']'.
asosystest.py: Archivo de configuración para validación de 'tarea'.T01:
Result : OK!
asosystest.py: Archivo de configuración para validación de 'tarea'.T02:
Result : ERROR!
asosystest.py: Successful tests: [1]
asosystest.py: Failed tests: [2]
3/7
Validacion.md 2023-10-09
$ ./asosystest.py -i tarea.json -t 2 -d
asosystest.py: Version: v0.23.1
asosystest.py: Created temporary directory: '/tmp/tmpvxnn7env'.
asosystest.py: Successfully copied binaries: '['tarea']'.
asosystest.py: Successful os.chdir('/tmp/tmpvxnn7env').
asosystest.py: Successfully executed setup commands '['touch f1']'.
Cómo podemos ver, la salida de asosystest nos indica con --> cuál es el primer carácter en el que la
salida esperada y la salida producida discrepan. En este caso, vemos que en lugar de un \n, que era lo
esperado, se ha recibido un !!\n.
4/7
Validacion.md 2023-10-09
La utilidad asosystest también verifica que el código de retorno es correcto. Por ejemplo, si sustituimos
exit(EXIT_SUCCESS) por exit(EXIT_FAILURE) en tarea.c:
$ ./asosystest.py -i tarea.json -t 2 -d
asosystest.py: Version: v0.23.1
asosystest.py: Created temporary directory: '/tmp/tmpivuwgukx'.
asosystest.py: Successfully copied binaries: '['tarea']'.
asosystest.py: Successful os.chdir('/tmp/tmpivuwgukx').
asosystest.py: Successfully executed setup commands '['touch f1']'.
5/7
Validacion.md 2023-10-09
La biblioteca libasosysintercept.so.0.1
El archivo asosysintercept.c contiene el código fuente de la biblioteca compartida
libasosysintercept.so.0.1. Esta biblioteca permite capturar llamadas al sistema y funciones de
biblioteca para alterar su comportamiento:
Inyectando errores, por ejemplo, haciendo que una llamada a write() devuelva -1 y actualice el
valor de errno.
Forzando la realización de lecturas o escrituras parciales cuando se llama a read() y write(),
respectivamente.
Deshabilitando ciertas funciones de biblioteca o llamadas al sistema como, por ejemplo, strcat.
Nota: La lista completa de funciones de biblioteca y llamadas al sistema deshabilitadas se puede encontrar
en la sección NOOP del archivo fuente asosysintercept.c.
$ make libasosysintercept.so.0.1
cc -ggdb3 -Wall -Werror -Wno-unused -std=c11 -c -o asosysintercept.o
asosysintercept.c
cc --shared -fPIC -Wl,--no-as-needed -ldl asosysintercept.o -o
libasosysintercept.so.0.1
Cómo se puede comprobar, la compilación de la bibilioteca require opciones distintas a las usadas para
compilar los ejemplos, minigrep.c o watchdir.c. Por tanto, la compilación de asosysintercept.c
fallará con la configuración de compilación de .vscode/launch.json de la copia de Visual Studio Code
disponible en el Aula Virtual:
Iniciando la compilación...
/usr/bin/gcc -ggdb3 -Wall -Werror -Wno-unused -std=c11
/path/to/asosysintercept.c -o /path/to/asosysintercept
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-
gnu/Scrt1.o: en la función `_start':
(.text+0x1b): referencia a `main' sin definir
collect2: error: ld returned 1 exit status
6/7
Validacion.md 2023-10-09
Requerimientos
Las utilidades asosystest.py, genera_bytes.py y genera_lineas.py descritas en el presente
documento requieren Python >= 3.10. Nótese que en los laboratorios, Ubuntu 22.04 LTS incluye Python
3.10.12.
7/7