467e27fc2f
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
110 lines
5.9 KiB
Bash
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
|