Files
thePlug/TESTING.md
T

413 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
- 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 `mongodb` 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 <TOKEN>" http://127.0.0.1:3671/proxy/services
```
Controlla i log proxy dalla UI o via API:
```bash
curl -H "Authorization: Bearer <TOKEN>" 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
- 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.