sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
⎇ 7c794568a963b18b68d747959e6bbd07cf2ebff7
scripts/test-atuq-politica.py
Ñawpa willay
Pi imata llamkarqan
ch'uya
atuq v0.5: proxy por contenedor — el primer diferenciador del §6 que se paga entero
1#!/usr/bin/env python3
2"""Ejercita los guardianes de `recipes/atuq/tools/rebrand.py` con políticas ROTAS a propósito.
3
4 python3 scripts/test-atuq-politica.py # sale 0 si todos los guardianes hacen su trabajo
5
6POR QUÉ EXISTE. `atuq` instala sus extensiones por POLÍTICA (`ExtensionSettings` en
7`distribution/policies.json`), no por sideloading —Firefox lo retiró—, así que el XPI y la política
8tienen que coincidir en id y en RUTA ABSOLUTA. Cuando no coinciden, el fallo es silencioso: el
9complemento sencillamente no aparece, o llega un `Download failed` que no nombra la causa. Los
10guardianes que cruzan las dos cosas viven en `rebrand.py`; esto comprueba QUE FALLEN.
11
12Un guardián que nunca falló no se sabe si sirve. Cada caso de abajo es una forma conocida de
13desincronizarlas, y el control con la política intacta está primero para que un guardián que muera
14SIEMPRE —que es igual de inútil— también se note.
15
16No construye nada ni toca el store: arma un appdir de mentira en un temporal y llama a las dos
17funciones directamente.
18"""
19import json, os, pathlib, shutil, sys, tempfile
20
21REPO = str(pathlib.Path(__file__).resolve().parent.parent)
22os.chdir(REPO)
23FUENTE = open("recipes/atuq/tools/rebrand.py").read().replace("\nmain()\n", "\n")
24
25def correr(mutar):
26 raiz = tempfile.mkdtemp()
27 app = os.path.join(raiz, "usr", "lib", "atuq")
28 os.makedirs(os.path.join(app, "distribution"))
29 pol = json.load(open("recipes/atuq/distribution/policies.json"))
30 mutar(pol)
31 json.dump(pol, open(os.path.join(app, "distribution", "policies.json"), "w"))
32 ns = {"__name__": "rb"}
33 sys.argv = ["rebrand.py", app, os.path.join(REPO, "recipes/atuq"), raiz]
34 exec(compile(FUENTE, "rebrand.py", "exec"), ns)
35 try:
36 ns["verificar_politica"](ns["empaquetar_extensiones"]())
37 except SystemExit:
38 return "MURIÓ"
39 finally:
40 shutil.rmtree(raiz, ignore_errors=True)
41 return "pasó"
42
43# Cada caso: qué se rompe, cómo, y qué tiene que pasar.
44CASOS = [
45 ("intacta (control: tiene que PASAR)", lambda p: None, "pasó"),
46 ("id empaquetado que la política no declara",
47 lambda p: p["policies"]["ExtensionSettings"].pop("proxy@atuq.tawasuyu"), "MURIÓ"),
48 ("install_url apuntando a otro sitio",
49 lambda p: p["policies"]["ExtensionSettings"]["proxy@atuq.tawasuyu"].__setitem__(
50 "install_url", "file:///usr/lib/atuq/otro.xpi"), "MURIÓ"),
51 ("política que declara un XPI que no existe",
52 lambda p: p["policies"]["ExtensionSettings"].__setitem__(
53 "nadie@atuq.tawasuyu", {"install_url": "file:///x.xpi"}), "MURIÓ"),
54 ("proxy para un contenedor que la política no crea",
55 lambda p: p["policies"]["3rdparty"]["Extensions"]["proxy@atuq.tawasuyu"]["proxies"]
56 .__setitem__("Fantasma", {"type": "direct"}), "MURIÓ"),
57 ("3rdparty para una extensión que no es de atuq",
58 lambda p: p["policies"]["3rdparty"]["Extensions"].__setitem__(
59 "ajena@example.com", {"proxies": {}}), "MURIÓ"),
60]
61
62fallos = 0
63for nombre, mutar, esperado in CASOS:
64 obtenido = correr(mutar)
65 ok = obtenido == esperado
66 fallos += not ok
67 print(f" [{'ok' if ok else 'FALLA'}] {nombre}: esperaba {esperado}, dio {obtenido}")
68print("guardianes:", "todos correctos" if not fallos else f"{fallos} MAL")
69sys.exit(1 if fallos else 0)