msg += 'ERROR (código de retorno: %d)' % make.returncode
mail.body += msg
if stderr:
- msg += '''Salida:
+ msg += '''
+Salida:
------------------------------------------------------------------------
%s
------------------------------------------------------------------------
diff = HtmlDiff().make_file(orig, new, fromdesc=name+'.'+origname, todesc=name+'.'+newname, context=True, numlines=3)
mail.attachText(diff, name + '.diff.html', 'html')
return nota
+ def usa_stdin():
+ return os.path.exists(os.path.join(caso_de_prueba.path, 'stdin'))
+ def usa_stdout():
+ return os.path.exists(os.path.join(caso_de_prueba.path, 'stdout'))
+ def usa_stderr():
+ return os.path.exists(os.path.join(caso_de_prueba.path, 'stderr'))
+
# Cosas útiles
global log, conn, conf, uid, gid
# Para manejo de SIGCHLD
'close_fds': True,
'preexec_fn': secure_process(intento.chrootPath, uid, gid, tiempo_cpu),
}
- if os.path.exists(os.path.join(caso_de_prueba.path, 'stdin')):
+ if usa_stdin():
options['stdin'] = file(os.path.join(caso_de_prueba.path, 'stdin'), 'r')
- if os.path.exists(os.path.join(caso_de_prueba.path, 'stdout')):
+ if usa_stdout():
options['stdout'] = subprocess.PIPE
- if os.path.exists(os.path.join(caso_de_prueba.path, 'stderr')):
+ if usa_stderr():
options['stderr'] = subprocess.PIPE
# Ejecuto programa
params = ['/tp']
# Salió con una señal?
if proc.returncode < 0:
sig = -proc.returncode
- log.debug('El programa salió con la señal %d', sig)
+ sigs = {}
+ for s in [s for s in dir(signal) if s.startswith('SIG') and s.isalpha()]:
+ sigs[getattr(signal, s)] = s
+ log.debug('El programa salió con la señal %s', sigs[sig])
prueba.pasada = False
#TODO otras señales conocidas
if sig == signal.SIGXCPU:
prueba.observaciones = 'Excedió el límite de tiempo de CPU ' \
'(%d seg)' % tiempo_cpu
else:
- prueba.observaciones = 'Salió con la señal %d' % sig
+ prueba.observaciones = 'Salió con la señal %s' % sigs[sig]
mail.agregarResultado(prueba)
return prueba
# Si tenemos que verificar el código de retorno
return prueba
# Verifico salidas estándar/de error
prueba.pasada = True # Asumo que está bien, ya habrá tiempo para cambiarlo
- obs = diff(prueba, mail, proc.stdout.readlines(),
- file(os.path.join(caso_de_prueba.path, 'stdout')).readlines(),
- caso_de_prueba.nombre + '.stdout', longname='La salida estándar')
- obs += diff(prueba, mail, proc.stderr.readlines(),
- file(os.path.join(caso_de_prueba.path, 'stderr')).readlines(),
+ if usa_stdout():
+ obs = diff(prueba, mail, proc.stdout.readlines(),
+ file(os.path.join(caso_de_prueba.path, 'stdout')).readlines(),
+ caso_de_prueba.nombre + '.stdout', longname='La salida estándar')
+ if usa_stderr():
+ obs += diff(prueba, mail, proc.stderr.readlines(),
+ file(os.path.join(caso_de_prueba.path, 'stderr')).readlines(),
caso_de_prueba.nombre + '.stderr', longname='La salida de error')
for f in caso_de_prueba.archivosSalida:
if f not in prueba.archivosSalida:
log.debug('No hay intento para probar')
time.sleep(intervalo)
continue
- log.info('Nuevo intento a probar (%s)', intento)
+ log.info('Nuevo intento a probar (alumno=%d, curso=%d, entrega=%d.%d, ' \
+ 'intento=%d)', intento.inscripto.padron, intento.entrega.curso.curso,
+ intento.entrega.nroEjercicio, intento.entrega.entrega, intento.numero)
mail = MailIntento(intento)
# Compila
compilar(intento, mail)
if not intento.compila:
+ log.info('Intento no compila')
mail.send('NO COMPILA')
continue
# Ejecución de casos de prueba
preparar(intento)
# Pruebo y agrego prueba a la lista
prueba = probar(intento, caso_de_prueba, mail)
- resultado = resultado and prueba.pasada
if not prueba.casoDePrueba.privado and not prueba.pasada:
+ log.info('Prueba %s no pasada' % prueba.casoDePrueba.nombre)
resultado = False
# Limpio chroot
limpiar(intento)