tawasuyu

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…

TOML 1383Shell 129Rust 79Markdown 732473 Sutichaykuna

⎇ 593c6691772f651da43d5f0a9ce614f716a82f4f scripts/test-atuq-politica.py Python · 69 siq'ikuna · 3.3 KB Ñawpa willay Pi imata llamkarqan ch'uya

atuq v0.5: proxy por contenedor — el primer diferenciador del §6 que se paga entero c5ebbda93 · Sergio ·

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)