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']
proc = subprocess.Popen(params, **options)
except Exception, e: # FIXME poner en el manejo de exceptiones estandar
try:
- print e.child_traceback
+ log.debug('ERROR! Trace del hijo: %s', e.child_traceback)
raise
except:
raise
# 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(),
- 'stdout', longname='La salida estándar')
- obs += diff(prueba, mail, proc.stderr.readlines(),
- file(os.path.join(caso_de_prueba.path, 'stderr')).readlines(),
- 'stderr', longname='La salida de error')
+ obs = ''
+ 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:
#TODO agregar error FALTA ARCHIVO
continue
obs += diff(prueba, mail,
file(os.path.join(intento.chrootPath, f)).readlines(),
- file(os.path.join(caso_de_prueba.pathSalidas, f)).readlines(), f)
+ file(os.path.join(caso_de_prueba.pathSalidas, f)).readlines(),
+ caso_de_prueba.nombre + '.' + f)
for f in prueba.archivosSalida - (caso_de_prueba.archivosSalida | caso_de_prueba.archivosEntrada):
#TODO agregar error SOBRA ARCHIVO
log.debug('El programa debía generar el archivo %s y no lo hizo.', f)
self['To'] = intento.mailRespuesta
self['Reply-To'] = conf.get('mail', 'admin')
self['Return-Path'] = conf.get('mail', 'admin')
- self['X-Mailer'] = 'sercom 0.3'
+ self['X-Mailer'] = 'sercom ' + sercom.VERSION
self['X-Priority'] = '5'
self.epilogue = 'Para ver correctamente este e-mail su cliente debe ' \
'soportar MIME.\n\n'
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 (%d %d.%d.%d %d%d%d)',
+ intento.inscripto.padron, intento.entrega.nroEjercicio,
+ intento.entrega.entrega, intento.numero, intento.entrega.curso.anio,
+ intento.entrega.curso.cuatrimestre, intento.entrega.curso.curso)
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)