# Testing Guide Questa guida descrive come preparare e testare `thePlug` in tre scenari: 1. laptop con backend sulla macchina host 2. laptop con stack tutto Dockerizzato 3. vulnbox reale con backend fuori Docker L’obiettivo non è solo far partire UI e API, ma verificare il comportamento reale del proxy: remap della porta del servizio, avvio di `mitmdump`, healthcheck e ripristino su `Stop`. ## Concetti Chiave ### Cosa fa `Save` `Save` salva solo la configurazione del proxy nel backend. Non tocca: - porte del servizio reale - processi `mitmdump` - Docker Compose ### Cosa fa `Start` In `reverse` mode, se il proxy è associato a un servizio Docker Compose e `mode_spec` non è impostato: 1. il backend sposta la porta pubblica del servizio reale su una porta libera 2. salva quella nuova porta come upstream live 3. avvia `mitmdump` sulla porta originale Quindi, se vuoi che il proxy prenda davvero il posto del servizio originale, `proxy_port` deve coincidere con la porta pubblica del servizio. ### Come vengono scoperti i servizi Il backend cerca i servizi Docker Compose sotto una root di scansione: - di default: `HOME` - override: `SERVICE_SCAN_ROOT` La scansione è volutamente shallow: - il backend guarda solo le cartelle immediate sotto la root - non scende ricorsivamente in profondità Questa scelta riflette il layout atteso sulla macchina reale. Esempio valido: ```text /home/user/service-a/docker-compose.yml /home/user/service-b/docker-compose.yml ``` Esempio non visto se la root è `/home/user`: ```text /home/user/projects/lab/service-a/docker-compose.yml ``` In quel caso devi cambiare `SERVICE_SCAN_ROOT`. ## Prerequisiti Su tutte le macchine: - `docker` - `docker compose` - `uv` - `python 3.14` - `node 22` Il backend installerà anche: - `mitmproxy` - `basedpyright` Porte usate tipicamente: - `3671` backend - `5173` frontend - `27017` mongodb - `6379` redis - una o più porte proxy/test ## Scenario 1: Laptop con Backend sulla Macchina Host Questo è il setup migliore per testare davvero il comportamento del proxy. ### Quando usarlo Usa questo scenario se vuoi verificare: - discovery servizi - remap porta Docker Compose - takeover reale della porta pubblica - start/stop/restart di `mitmdump` - esempi script e editor ### Preparazione Dalla root del progetto: ```bash cd /home/gabdevele/CTF/thePlug ./setup.sh deps export SERVICE_SCAN_ROOT="$PWD" ./setup.sh playground ``` Questo fa due cose: - avvia solo `mongodb` e `redis` in Docker - avvia un piccolo upstream locale in `playground/` Il playground espone: ```text http://127.0.0.1:9081 ``` ### Avvio applicazione In un terminale: ```bash cd /home/gabdevele/CTF/thePlug npm run dev:backend ``` In un secondo terminale: ```bash cd /home/gabdevele/CTF/thePlug npm run dev:frontend ``` ### Login Le credenziali sono in: - [backend/.env](/home/gabdevele/CTF/thePlug/backend/.env) Apri: ```text http://localhost:5173 ``` ### Test End-to-End Consigliato 1. Crea un nuovo proxy. 2. Seleziona il servizio `echo` rilevato dal backend. 3. Lascia `mode=reverse`. 4. Verifica che `proxy_port=9081`. 5. Salva. 6. Premi `Start`. 7. Esegui: ```bash curl -i http://127.0.0.1:9081/ ``` ### Cosa devi vedere Prima di `Start`: - `9081` risponde direttamente il servizio playground Dopo `Start`: - `mitmdump` è in ascolto su `9081` - il servizio reale è stato spostato su una porta upstream temporanea - la UI mostra il live upstream cambiato - i log del proxy iniziano a popolarsi Dopo `Stop`: - la porta pubblica originaria torna al servizio reale - `service.upstream_port` torna `null` ### Verifiche Utili Controlla i servizi rilevati: ```bash curl -H "Authorization: Bearer " http://127.0.0.1:3671/proxy/services ``` Controlla i log proxy dalla UI o via API: ```bash curl -H "Authorization: Bearer " http://127.0.0.1:3671/proxy/9081/logs ``` ### Cleanup ```bash npm run playground:down docker compose --env-file backend/.env -f docker-compose.yml down ``` ## Scenario 2: Laptop con Stack Tutto Dockerizzato Questo scenario è adatto soprattutto a smoke test applicativi. ### Quando usarlo Usalo per verificare: - login/logout - CRUD proxy - examples - options - persistenza Mongo/Redis - build frontend e wiring API ### Avvio ```bash cd /home/gabdevele/CTF/thePlug ./setup.sh ``` Apri: - frontend: `http://localhost:5173` - backend: `http://localhost:3671` ### Cosa testare qui Puoi testare bene: - creazione proxy - update/delete - validazione codice - examples custom - health endpoint - editor e autocomplete ### Limite importante Questo non è il setup migliore per validare il takeover reale delle porte di un servizio locale, perché il backend è dentro Docker e non replica la topologia host-native del deployment reale. Quindi: - bene per smoke test UI/API - non abbastanza per validare il flusso finale di orchestration Per il test realistico del proxy usa lo Scenario 1. ### Spegnimento ```bash docker compose --env-file backend/.env -f docker-compose.yml down ``` ## Scenario 3: Vulnbox Reale con Backend fuori Docker Questo è il modello più vicino al deployment reale. ### Layout atteso dei servizi Caso ideale sotto `HOME`: ```text /home/user/service-a/docker-compose.yml /home/user/service-b/docker-compose.yml /home/user/service-c/docker-compose.yml ``` Se il layout è diverso, imposta `SERVICE_SCAN_ROOT`. ### Preparazione backend ```bash cd /path/to/thePlug cp backend/.env.example backend/.env ./setup.sh deps ``` Se i servizi non sono sotto `HOME`: ```bash export SERVICE_SCAN_ROOT="/path/che/contiene/le/cartelle-servizio" ``` ### Avvio backend ```bash cd /path/to/thePlug npm run dev:backend ``` ### Avvio frontend In sviluppo: ```bash cd /path/to/thePlug npm run dev:frontend ``` Oppure build statico: ```bash cd /path/to/thePlug/frontend VITE_API_BASE_URL=http://IP_O_HOST:3671 npm run build ``` ### Test operativo reale 1. Apri la UI. 2. Seleziona un servizio reale scoperto dal backend. 3. Se vuoi takeover vero della porta pubblica: `proxy_port` deve essere uguale alla porta pubblica del servizio. 4. Salva. 5. Premi `Start`. 6. Verifica da terminale o con la tua applicazione client che il traffico passi ancora sulla porta originale. ### Cosa aspettarsi Su `Start`: - il servizio reale viene spostato su una porta temporanea - `mitmdump` si lega alla porta originaria - il traffico continua a entrare dalla porta originale - la UI mostra il nuovo live upstream Su `Stop`: - la porta originaria torna al servizio reale - il proxy viene fermato ## Failure Modes Comuni ### Il backend non trova nessun servizio Controlla: - valore di `SERVICE_SCAN_ROOT` - che i compose siano nelle cartelle immediate sotto quella root - che i file si chiamino uno tra: - `compose.yml` - `compose.yaml` - `docker-compose.yml` - `docker-compose.yaml` ### Il proxy parte ma non prende il posto del servizio Controlla: - `mode=reverse` - `mode_spec` vuoto - `proxy_port` uguale alla porta del servizio - servizio selezionato dalla UI correttamente ### `Start` fallisce Controlla: - `mitmdump` disponibile nel backend host - conflitti di porta - errori di sintassi nello script - log del proxy ### Il frontend mostra session expired Vuol dire che il token JWT è scaduto o non è più valido. Fai login di nuovo. ## Comandi Utili Test backend: ```bash cd backend uv run ruff check . uv run pytest ``` Build frontend: ```bash cd frontend npm run build ``` Avvio playground: ```bash ./setup.sh playground ``` Solo dipendenze backend per test host: ```bash ./setup.sh deps ``` ## Raccomandazione Finale Per lavorare in modo efficiente: - usa `./setup.sh` per smoke test rapidi - usa `backend host + frontend dev + playground` per il test vero del proxy - usa `backend host` sulla vulnbox reale per validare il comportamento finale Se devi testare davvero il remap porta, considera valido solo un setup con backend fuori Docker.