diff --git a/tests/e2e_reset_chrome_profiles.sh b/tests/e2e_reset_chrome_profiles.sh new file mode 100644 index 0000000..6a2233e --- /dev/null +++ b/tests/e2e_reset_chrome_profiles.sh @@ -0,0 +1,109 @@ +#!/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:-}" +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