#!/usr/bin/env python3 """Ejercita los guardianes de `recipes/atuq/tools/rebrand.py` con políticas ROTAS a propósito. python3 scripts/test-atuq-politica.py # sale 0 si todos los guardianes hacen su trabajo POR QUÉ EXISTE. `atuq` instala sus extensiones por POLÍTICA (`ExtensionSettings` en `distribution/policies.json`), no por sideloading —Firefox lo retiró—, así que el XPI y la política tienen que coincidir en id y en RUTA ABSOLUTA. Cuando no coinciden, el fallo es silencioso: el complemento sencillamente no aparece, o llega un `Download failed` que no nombra la causa. Los guardianes que cruzan las dos cosas viven en `rebrand.py`; esto comprueba QUE FALLEN. Un guardián que nunca falló no se sabe si sirve. Cada caso de abajo es una forma conocida de desincronizarlas, y el control con la política intacta está primero para que un guardián que muera SIEMPRE —que es igual de inútil— también se note. No construye nada ni toca el store: arma un appdir de mentira en un temporal y llama a las dos funciones directamente. """ import json, os, pathlib, shutil, sys, tempfile REPO = str(pathlib.Path(__file__).resolve().parent.parent) os.chdir(REPO) FUENTE = open("recipes/atuq/tools/rebrand.py").read().replace("\nmain()\n", "\n") def correr(mutar): raiz = tempfile.mkdtemp() app = os.path.join(raiz, "usr", "lib", "atuq") os.makedirs(os.path.join(app, "distribution")) pol = json.load(open("recipes/atuq/distribution/policies.json")) mutar(pol) json.dump(pol, open(os.path.join(app, "distribution", "policies.json"), "w")) ns = {"__name__": "rb"} sys.argv = ["rebrand.py", app, os.path.join(REPO, "recipes/atuq"), raiz] exec(compile(FUENTE, "rebrand.py", "exec"), ns) try: ns["verificar_politica"](ns["empaquetar_extensiones"]()) except SystemExit: return "MURIÓ" finally: shutil.rmtree(raiz, ignore_errors=True) return "pasó" # Cada caso: qué se rompe, cómo, y qué tiene que pasar. CASOS = [ ("intacta (control: tiene que PASAR)", lambda p: None, "pasó"), ("id empaquetado que la política no declara", lambda p: p["policies"]["ExtensionSettings"].pop("proxy@atuq.tawasuyu"), "MURIÓ"), ("install_url apuntando a otro sitio", lambda p: p["policies"]["ExtensionSettings"]["proxy@atuq.tawasuyu"].__setitem__( "install_url", "file:///usr/lib/atuq/otro.xpi"), "MURIÓ"), ("política que declara un XPI que no existe", lambda p: p["policies"]["ExtensionSettings"].__setitem__( "nadie@atuq.tawasuyu", {"install_url": "file:///x.xpi"}), "MURIÓ"), ("proxy para un contenedor que la política no crea", lambda p: p["policies"]["3rdparty"]["Extensions"]["proxy@atuq.tawasuyu"]["proxies"] .__setitem__("Fantasma", {"type": "direct"}), "MURIÓ"), ("3rdparty para una extensión que no es de atuq", lambda p: p["policies"]["3rdparty"]["Extensions"].__setitem__( "ajena@example.com", {"proxies": {}}), "MURIÓ"), ] fallos = 0 for nombre, mutar, esperado in CASOS: obtenido = correr(mutar) ok = obtenido == esperado fallos += not ok print(f" [{'ok' if ok else 'FALLA'}] {nombre}: esperaba {esperado}, dio {obtenido}") print("guardianes:", "todos correctos" if not fallos else f"{fallos} MAL") sys.exit(1 if fallos else 0)