Files
web_scraping/tests/e2e_reset_chrome_profiles.sh
T
Egutierrez 467e27fc2f test(e2e): e2e_reset_chrome_profiles valida CRUD de perfiles + forcelist global
Gated por CHROME_E2E=1. Lanza chromium real sobre un user-data-dir temporal en
/tmp (nunca toca el perfil real). Verifica las 4 capacidades: CRUD de perfiles,
lanzamiento, modificación de extensiones, y forcelist global (perfil nuevo nace
con exactamente uBlock + web_proxy). Correr fuera del harness de Claude (que mata
procesos chromium de larga duración): CHROME_E2E=1 bash tests/e2e_reset_chrome_profiles.sh
2026-06-06 01:24:21 +02:00

110 lines
5.9 KiB
Bash

#!/usr/bin/env bash
# e2e_reset_chrome_profiles — Test end-to-end de las funciones de CRUD de perfiles de Chromium
# y de la managed policy (forcelist global). Lanza chromium REAL sobre un user-data-dir temporal
# en /tmp (NUNCA toca ~/.config/chromium-cdp). Gated por CHROME_E2E=1.
#
# Cubre las 4 capacidades pedidas:
# 1. CRUD de perfiles (create -> list -> list-extensions -> backup/restore -> delete)
# 2. Lanzamiento (create lanza chromium headless + la policy instala extensiones)
# 3. Modificación ext (apply_chromium_extension_policy --dry-run + clean_chrome_profile_extensions)
# 4. Extensiones admin (forcelist global: el perfil nuevo nace con uBlock + web_proxy y nada más)
#
# Uso: CHROME_E2E=1 bash projects/web_scraping/tests/e2e_reset_chrome_profiles.sh
# NB: sin `set -u` — el test sourcea funciones del registry que no garantizan ser
# unbound-variable-safe; con `set -u` un array vacío en una de ellas abortaría el test.
set -o pipefail
UBLOCK="ddkjiahejlhfcafbddmgiahcphecmpfh"
WEBPROXY="nanldmckabfghgdebblpfbdbhphhbnde"
BLOCKED=("eimadpbcbfnmbkopoojfekhnkhdbieeh" "doojmbjmlfjjnbmnoijecmcbfeoakpjm" "chphlpgkkbolifaimnlloiipkdnihall")
if [[ "${CHROME_E2E:-0}" != "1" ]]; then
echo "SKIP: e2e_reset_chrome_profiles (exporta CHROME_E2E=1 para ejecutar con chromium real)"
exit 0
fi
# Localizar la raíz del registry y las funciones.
ROOT="${FN_REGISTRY_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)}"
BROWSER="$ROOT/bash/functions/browser"
for f in backup_chrome_bookmarks restore_chrome_bookmarks delete_chrome_profile create_chrome_profile clean_chrome_profile_extensions apply_chromium_extension_policy; do
# shellcheck disable=SC1090
source "$BROWSER/$f.sh"
done
UDD="$(mktemp -d /tmp/reset_e2e_XXXXXX)"
PROFILE="E2E"
PASS=0; FAIL=0
ok() { echo "$1"; PASS=$((PASS+1)); }
bad() { echo "$1"; FAIL=$((FAIL+1)); }
cleanup() {
pkill -f -- "--user-data-dir=${UDD}" 2>/dev/null || true
rm -rf "$UDD"
}
trap cleanup EXIT
echo "=== e2e_reset_chrome_profiles (udd temporal: $UDD) ==="
# ── Capacidad 1+2+4: create lanza chromium real, la policy instala la whitelist ──
echo "[1] CREATE perfil + lanzamiento + forcelist global"
create_chrome_profile --user-data-dir "$UDD" --profile "$PROFILE" --name "E2E Test" --port 9351 --timeout-sec 30 >/dev/null 2>&1
if [[ -f "$UDD/$PROFILE/Preferences" ]]; then
ok "create_chrome_profile creó el perfil (Preferences existe) — chromium lanzó OK"
else
bad "create_chrome_profile NO creó Preferences (chromium no lanzó o timeout)"
fi
# Perfil visible (dir + Preferences). La función Go list_chrome_profiles tiene su propio
# unit test; aquí basta con confirmar la estructura en disco.
[[ -d "$UDD/$PROFILE" ]] && ok "perfil $PROFILE presente en disco" || bad "perfil no presente"
# Extensiones instaladas: las carpetas en Extensions/ reflejan la forcelist aplicada.
# (La auditoría detallada via list_chrome_profile_extensions_go_browser está en su unit test
# y en el e2e Go TestListChromeProfileExtensionsE2E.)
exts="$(ls "$UDD/$PROFILE/Extensions/" 2>/dev/null | grep -v '^Temp$' | tr '\n' ' ')"
echo " extensiones detectadas: ${exts:-<ninguna>}"
if echo "$exts" | grep -q "$UBLOCK" && echo "$exts" | grep -q "$WEBPROXY"; then
ok "forcelist global instaló uBlock + web_proxy en el perfil nuevo"
else
bad "forcelist global: faltan uBlock y/o web_proxy (¿policy ausente?)"
fi
extra_blocked=0
for b in "${BLOCKED[@]}"; do echo "$exts" | grep -q "$b" && extra_blocked=1; done
[[ $extra_blocked -eq 0 ]] && ok "ninguna extensión bloqueada presente (blocklist OK)" || bad "hay extensiones bloqueadas presentes"
# ── Capacidad 1: backup / restore de bookmarks ──
echo "[2] BACKUP / RESTORE bookmarks"
mkdir -p "$UDD/$PROFILE"
printf '{"checksum":"e2e","version":1,"roots":{"bookmark_bar":{"children":[{"name":"E2E-BM","type":"url","url":"https://e2e"}],"name":"Bar","type":"folder"},"other":{"children":[],"name":"Other","type":"folder"},"synced":{"children":[],"name":"M","type":"folder"}}}' > "$UDD/$PROFILE/Bookmarks"
md5a=$(md5sum "$UDD/$PROFILE/Bookmarks" | cut -d' ' -f1)
pkill -f -- "--user-data-dir=${UDD}" 2>/dev/null; sleep 1
bk="$(backup_chrome_bookmarks --user-data-dir "$UDD" --profile "$PROFILE" --backup-dir "$UDD/bm" 2>/dev/null)"
tsdir="$(printf '%s' "$bk" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d["backup_dir"]+"/"+d["ts"])' 2>/dev/null)"
rm -f "$UDD/$PROFILE/Bookmarks"
restore_chrome_bookmarks --user-data-dir "$UDD" --backup-dir "$tsdir" --profile "$PROFILE" >/dev/null 2>&1
md5b=$(md5sum "$UDD/$PROFILE/Bookmarks" 2>/dev/null | cut -d' ' -f1)
[[ "$md5a" == "$md5b" ]] && ok "restore byte-idéntico (checksum preservado)" || bad "restore difiere del original"
# ── Capacidad 3: modificación de extensiones ──
echo "[3] MODIFICACIÓN de extensiones"
apply_chromium_extension_policy --keep "$UBLOCK" --dry-run >/dev/null 2>&1 && ok "apply_chromium_extension_policy --dry-run OK (no tocó /etc)" || bad "apply_chromium_extension_policy --dry-run falló"
clean_chrome_profile_extensions --user-data-dir "$UDD" --profile-directory "$PROFILE" --keep "$UBLOCK" --dry-run >/dev/null 2>&1 && ok "clean_chrome_profile_extensions --dry-run OK" || bad "clean_chrome_profile_extensions --dry-run falló"
# ── Capacidad 1: delete + Local State limpio ──
echo "[4] DELETE perfil + Local State limpio"
delete_chrome_profile --user-data-dir "$UDD" --profile "$PROFILE" >/dev/null 2>&1
if [[ ! -d "$UDD/$PROFILE" ]]; then
ok "carpeta del perfil borrada"
else
bad "carpeta del perfil sigue existiendo"
fi
if [[ -f "$UDD/Local State" ]]; then
still=$(python3 -c "import json; d=json.load(open('$UDD/Local State')); print('$PROFILE' in d.get('profile',{}).get('info_cache',{}))" 2>/dev/null)
[[ "$still" == "False" ]] && ok "entrada eliminada de Local State.info_cache" || bad "entrada sigue en Local State"
fi
echo ""
echo "=== RESULTADO: $PASS pass, $FAIL fail ==="
[[ $FAIL -eq 0 ]] && echo "E2E_OK" || echo "E2E_FAIL"
exit $FAIL