#!/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