El banco POSIX de 57 casos lo pasa brush 56/57 y aun así no construye una receta autotools: mide lo que a uno se le ocurrió preguntar. Este pregunta si el candidato hace LO MISMO que el control sobre el material que hay. - compara (rc, stdout, árbol de ficheros producido); stderr es aviso, no divergencia — el texto de error diverge legítimamente - el árbol es la columna que faltaba: el caso 10 diverge SÓLO ahí, que es la clase de bug del libtool mal escapado (rc=0, stdout idéntico) - toda divergencia se confirma re-corriendo control y candidato: separa caso no determinista de shell inestable de divergencia real - fuentes: fixtures de regresión, generador de tortura de comillas, las 1130 fases del corpus y configure/libtool reales en sh -n Medido, 1273 casos en 5,5 s: brush 35 duras, bash 8, y CERO en los 1156 casos de parseo. El generador saca el #1394 entero sin conocerlo. Hallazgo nuevo: brush no ejecuta nunca el trap EXIT de un subshell — y eso golpea el frente del PRODUCTO, donde el veredicto del paso 3 decía que no había evidencia en contra.
922 B
922 B
Casos de regresión del banco diferencial
Un fichero .sh por caso. Los corre scripts/sh-banco-diferencial.py bajo cada shell en un
directorio limpio y compara rc + stdout + árbol de ficheros producido contra el control.
Reglas:
- Un caso por fichero, con un comentario arriba que diga QUÉ mide y DE DÓNDE salió (bug, receta, card). Un caso sin procedencia es un caso que nadie sabe por qué está.
- Nada de rutas absolutas ni red. El
cwdes descartable y elPATHtrae el userland de busybox más el shell bajo prueba;HOME,LC_ALL=C,TZ=UTCfijos. - Si el caso escribe ficheros, mejor — el árbol producido es lo que atrapa los bugs que no se
ven en stdout (el
libtoolmal escapado de brush salía con rc=0 y stdout idéntico). - El caso no declara resultado esperado: el esperado es lo que haga el control. Esto es un banco diferencial, no una suite de aserciones.