X-Git-Url: https://git.llucax.com/z.facultad/75.52/sercom.git/blobdiff_plain/56b48df0e8dedb8021b217cafb2a56ce583edab2..2b48a56672d7f8ea8eb4ba49a4abe926ae11ddf0:/sercom/tester.py?ds=sidebyside diff --git a/sercom/tester.py b/sercom/tester.py index fdcc593..51c861e 100644 --- a/sercom/tester.py +++ b/sercom/tester.py @@ -1,7 +1,7 @@ # vim: set et sw=4 sts=4 encoding=utf-8 foldmethod=marker: -from sercom.model import Entrega, CasoDePrueba -from sercom.model import TareaFuente, TareaPrueba, ComandoFuente, ComandoPrueba +from sercom.model import Entrega, CasoDePrueba, Tarea, TareaFuente, TareaPrueba +from sercom.model import ComandoFuente, ComandoPrueba from difflib import unified_diff, HtmlDiff from zipfile import ZipFile, BadZipfile from cStringIO import StringIO @@ -208,8 +208,7 @@ class Tester(object): #{{{ self.ejecutar_tareas_prueba(entrega) self.clean_chroot(entrega) except ExecutionFailure, e: - entrega.exito = False - log.info(_(u'Entrega incorrecta: %s'), entrega) + pass except Exception, e: if isinstance(e, SystemExit): raise entrega.observaciones += error_interno @@ -217,11 +216,14 @@ class Tester(object): #{{{ except: entrega.observaciones += error_interno log.exception(_('Hubo una excepcion inesperada desconocida')) # FIXME encoding - else: - entrega.exito = True - log.debug(_(u'Entrega correcta: %s'), entrega) finally: entrega.fin = datetime.now() + if entrega.exito is None: + entrega.exito = True + if entrega.exito: + log.info(_(u'Entrega correcta: %s'), entrega) + else: + log.info(_(u'Entrega incorrecta: %s'), entrega) #}}} def setup_chroot(self, entrega): #{{{ y clean_chroot() @@ -274,45 +276,27 @@ def ejecutar_caso_de_prueba(self, path, entrega): #{{{ for tarea in tareas: tarea.ejecutar(path, prueba) except ExecutionFailure, e: - prueba.exito = False - if self.rechazar_si_falla: - entrega.exito = False - if self.terminar_si_falla: - raise ExecutionFailure(e.comando, e.tarea, self) - else: - prueba.exito = True + pass finally: prueba.fin = datetime.now() + if prueba.exito is None: + prueba.exito = True + if not prueba.exito and self.rechazar_si_falla: + entrega.exito = False + if not prueba.exito and self.terminar_si_falla: + raise ExecutionFailure(prueba) CasoDePrueba.ejecutar = ejecutar_caso_de_prueba #}}} -def ejecutar_tarea_fuente(self, path, entrega): #{{{ - log.debug(_(u'TareaFuente.ejecutar(path=%s, entrega=%s)'), path, - entrega.shortrepr()) - try: - for cmd in self.comandos: - cmd.ejecutar(path, entrega) - except ExecutionFailure, e: - if self.rechazar_si_falla: - entrega.exito = False - if self.terminar_si_falla: - raise ExecutionFailure(e.comando, self) -TareaFuente.ejecutar = ejecutar_tarea_fuente +def ejecutar_tarea(self, path, ejecucion): #{{{ + log.debug(_(u'Tarea.ejecutar(path=%s, ejecucion=%s)'), path, + ejecucion.shortrepr()) + for cmd in self.comandos: + cmd.ejecutar(path, ejecucion) +Tarea.ejecutar = ejecutar_tarea #}}} -def ejecutar_tarea_prueba(self, path, prueba): #{{{ - log.debug(_(u'TareaPrueba.ejecutar(path=%s, prueba=%s)'), path, - prueba.shortrepr()) - try: - for cmd in self.comandos: - cmd.ejecutar(path, prueba) - except ExecutionFailure, e: - if self.rechazar_si_falla: - prueba.exito = False - if self.terminar_si_falla: - raise ExecutionFailure(e.comando, self) -TareaPrueba.ejecutar = ejecutar_tarea_prueba -#}}} +# TODO generalizar ejecutar_comando_xxxx!!! def ejecutar_comando_fuente(self, path, entrega): #{{{ log.debug(_(u'ComandoFuente.ejecutar(path=%s, entrega=%s)'), path, @@ -354,12 +338,13 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ comando_ejecutado.id), 'w') else: options['preexec_fn'].close_stderr = True - log.debug(_(u'Ejecutando como root: %s'), self.comando) + comando = self.comando # FIXME Acá tiene que diferenciarse de ComandoPrueba + log.debug(_(u'Ejecutando como root: %s'), comando) os.seteuid(0) # Dios! (para chroot) os.setegid(0) try: try: - proc = sp.Popen(self.comando, **options) + proc = sp.Popen(comando, **options) finally: os.setegid(user_info.gid) # Mortal de nuevo os.seteuid(user_info.uid) @@ -371,8 +356,9 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ raise proc.wait() #TODO un sleep grande nos caga todo, ver sercom viejo comando_ejecutado.fin = datetime.now() # TODO debería rodear solo la ejecución del comando - if self.retorno != self.RET_ANY: - if self.retorno == self.RET_FAIL: + retorno = self.retorno + if retorno != self.RET_ANY: + if retorno == self.RET_FAIL: if proc.returncode == 0: if self.rechazar_si_falla: entrega.exito = False @@ -384,24 +370,23 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ log.debug(_(u'Se esperaba que el programa termine ' u'con un error (código de retorno distinto de 0) pero ' u'terminó bien (código de retorno 0).\n')) - elif self.retorno != proc.returncode: + elif retorno != proc.returncode: if self.rechazar_si_falla: entrega.exito = False comando_ejecutado.exito = False if proc.returncode < 0: comando_ejecutado.observaciones += _(u'Se esperaba terminar ' u'con un código de retorno %s pero se obtuvo una señal %s ' - u'(%s).\n') % (self.retorno, -proc.returncode, - -proc.returncode) # TODO poner con texto + u'(%s).\n') % (retorno, -proc.returncode, -proc.returncode) # TODO poner con texto log.debug(_(u'Se esperaba terminar con un código ' u'de retorno %s pero se obtuvo una señal %s (%s).\n'), - self.retorno, -proc.returncode, -proc.returncode) + retorno, -proc.returncode, -proc.returncode) else: comando_ejecutado.observaciones += _(u'Se esperaba terminar ' u'con un código de retorno %s pero se obtuvo %s.\n') \ - % (self.retorno, proc.returncode) + % (retorno, proc.returncode) log.debug(_(u'Se esperaba terminar con un código de retorno ' - u'%s pero se obtuvo %s.\n'), self.retorno, proc.returncode) + u'%s pero se obtuvo %s.\n'), retorno, proc.returncode) if comando_ejecutado.exito is None: log.debug(_(u'Código de retorno OK')) if a_guardar: @@ -536,6 +521,7 @@ def ejecutar_comando_prueba(self, path, prueba): #{{{ else: options['preexec_fn'].close_stdin = True a_guardar = set(self.archivos_a_guardar) + a_guardar |= set(prueba.caso_de_prueba.archivos_a_guardar) # FIXME Esto es propio de ComandoPrueba if self.archivos_a_comparar: zip_a_comparar = ZipFile(StringIO(self.archivos_a_comparar), 'r') a_comparar = set(zip_a_comparar.namelist()) @@ -558,12 +544,13 @@ def ejecutar_comando_prueba(self, path, prueba): #{{{ comando_ejecutado.id), 'w') else: options['preexec_fn'].close_stderr = True - log.debug(_(u'Ejecutando como root: %s'), self.comando) + comando = self.comando + ' ' + prueba.caso_de_prueba.comando # FIXME Esto es propio de ComandoPrueba + log.debug(_(u'Ejecutando como root: %s'), comando) os.seteuid(0) # Dios! (para chroot) os.setegid(0) try: try: - proc = sp.Popen(self.comando, **options) + proc = sp.Popen(comando, **options) finally: os.setegid(user_info.gid) # Mortal de nuevo os.seteuid(user_info.uid) @@ -575,8 +562,11 @@ def ejecutar_comando_prueba(self, path, prueba): #{{{ raise proc.wait() #TODO un sleep grande nos caga todo, ver sercom viejo comando_ejecutado.fin_tareas = datetime.now() # TODO debería rodear solo la ejecución del comando - if self.retorno != self.RET_ANY: - if self.retorno == self.RET_FAIL: + retorno = self.retorno + if retorno == self.RET_PRUEBA: # FIXME Esto es propio de ComandoPrueba + retorno = prueba.caso_de_prueba.retorno # FIXME Esto es propio de ComandoPrueba + if retorno != self.RET_ANY: + if retorno == self.RET_FAIL: if proc.returncode == 0: if self.rechazar_si_falla: prueba.exito = False @@ -588,24 +578,23 @@ def ejecutar_comando_prueba(self, path, prueba): #{{{ log.debug(_(u'Se esperaba que el programa termine ' u'con un error (código de retorno distinto de 0) pero ' u'terminó bien (código de retorno 0).\n')) - elif self.retorno != proc.returncode: + elif retorno != proc.returncode: if self.rechazar_si_falla: prueba.exito = False comando_ejecutado.exito = False if proc.returncode < 0: comando_ejecutado.observaciones += _(u'Se esperaba terminar ' u'con un código de retorno %s pero se obtuvo una señal %s ' - u'(%s).\n') % (self.retorno, -proc.returncode, - -proc.returncode) # TODO poner con texto + u'(%s).\n') % (retorno, -proc.returncode, -proc.returncode) # TODO poner con texto log.debug(_(u'Se esperaba terminar con un código ' u'de retorno %s pero se obtuvo una señal %s (%s).\n'), - self.retorno, -proc.returncode, -proc.returncode) + retorno, -proc.returncode, -proc.returncode) else: comando_ejecutado.observaciones += _(u'Se esperaba terminar ' u'con un código de retorno %s pero se obtuvo %s.\n') \ - % (self.retorno, proc.returncode) + % (retorno, proc.returncode) log.debug(_(u'Se esperaba terminar con un código de retorno ' - u'%s pero se obtuvo %s.\n'), self.retorno, proc.returncode) + u'%s pero se obtuvo %s.\n'), retorno, proc.returncode) if comando_ejecutado.exito is None: log.debug(_(u'Código de retorno OK')) if a_guardar: