test(06-01): create test infrastructure for Lab 05 Database & RDS

Test Scripts (7 files, 1000+ lines):
- 01-database-creation-test.sh: PostgreSQL creation and initialization
- 02-private-network-test.sh: Private network isolation (INF-02)
- 03-persistence-test.sh: Data persistence verification (INF-04)
- 04-security-test.sh: Security compliance (INF-01, INF-02, INF-03)
- 99-final-verification.sh: End-to-end student verification
- run-all-tests.sh: Test orchestration with fail-fast
- quick-test.sh: Quick validation (< 30s)

Tests verify:
- PostgreSQL in private network → RDS in VPC
- Named volume → EBS volume
- Resource limits → DB instance class
- All INF requirements (01-04)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Luca Sacchi Ricciardi
2026-04-03 17:39:58 +02:00
parent 2f56df4dc3
commit cfbdb1efc8
7 changed files with 1143 additions and 0 deletions

View File

@@ -0,0 +1,198 @@
#!/bin/bash
# Lab 05 - Database & RDS
# Test 03: Data Persistence (INF-04)
# Verifica che i dati persistano oltre il ciclo di vita del container
set -euo pipefail
# Colori per output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Contatori
pass_count=0
fail_count=0
skip_count=0
# Funzioni helper
inc_pass() { ((pass_count++)) || true; }
inc_fail() { ((fail_count++)) || true; }
inc_skip() { ((skip_count++)) || true; }
echo "=========================================="
echo "Lab 05 - Test 03: Data Persistence (INF-04)"
echo "=========================================="
echo ""
# Verifica che docker-compose.yml esista
echo -n "[TEST] Verifica docker-compose.yml esista... "
if [ -f "docker-compose.yml" ]; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${YELLOW}SKIP${NC} (docker-compose.yml non trovato)"
inc_skip
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 0
fi
# Verifica che il volume sia definito
echo -n "[TEST] Verifica volume 'db-data' definito... "
if grep -q "db-data:" docker-compose.yml; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (volume db-data non definito)"
inc_fail
echo "INF-04 richiede volume nominativo per persistenza dati"
fi
# Verifica che il volume sia montato correttamente
echo -n "[TEST] Verifica volume montato su /var/lib/postgresql/data... "
if grep -A 20 "database:" docker-compose.yml | grep -q "/var/lib/postgresql/data"; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (volume non montato correttamente)"
inc_fail
fi
# Verifica che il volume sia nominativo (non anonymous)
echo -n "[TEST] Verifica volume nominativo (non bind mount)... "
if grep -B 5 -A 5 "db-data:" docker-compose.yml | grep -q "driver: local"; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${YELLOW}WARN${NC} (volume potrebbe non essere nominativo)"
inc_skip
fi
# Se i container non sono in esecuzione, skip i test dinamici
echo ""
echo -n "[TEST] Verifica container database in esecuzione... "
if ! docker ps --format '{{{{Names}}}}' | grep -q "^lab05-db$"; then
echo -e "${YELLOW}SKIP${NC} (container non in esecuzione)"
inc_skip
echo -e "${YELLOW}Avviare i container con: docker-compose up -d${NC}"
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 0
fi
echo -e "${GREEN}PASS${NC}"
inc_pass
# Verifica che il volume esista
echo -n "[TEST] Verifica volume 'lab05_db-data' esista... "
if docker volume ls --format '{{{{.Name}}}}' | grep -q "^lab05_db-data$"; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (volume non creato)"
inc_fail
fi
# Test creazione dati
echo ""
echo "[TEST] Verifica creazione e persistenza dati..."
# Crea tabella di test
echo -n "[TEST] Creazione tabella di test... "
if docker exec lab05-db psql -U lab05_user -d lab05_db -c "CREATE TABLE IF NOT EXISTS persistence_test (id SERIAL PRIMARY KEY, data TEXT);" &>/dev/null; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (impossibile creare tabella)"
inc_fail
fi
# Inserisci dati di test
echo -n "[TEST] Inserimento dati di test... "
test_data="TEST_PERSISTENCE_$(date +%s)"
if docker exec lab05-db psql -U lab05_user -d lab05_db -c "INSERT INTO persistence_test (data) VALUES ('$test_data');" &>/dev/null; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (impossibile inserire dati)"
inc_fail
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 1
fi
# Verifica dati inseriti
echo -n "[TEST] Verifica dati inseriti... "
retrieved_data=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "SELECT data FROM persistence_test WHERE data = '$test_data';" 2>/dev/null | tr -d ' ')
if [ "$retrieved_data" = "$test_data" ]; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (dati non recuperati)"
inc_fail
fi
# Test riavvio container
echo ""
echo "[TEST] Test persistenza dopo riavvio container..."
echo -n "[TEST] Riavvio container database... "
if docker restart lab05-db &>/dev/null; then
echo -e "${GREEN}PASS${NC}"
inc_pass
# Attendi che il database sia pronto
sleep 5
else
echo -e "${RED}FAIL${NC} (impossibile riavviare)"
inc_fail
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 1
fi
# Attendi che il database sia pronto
echo -n "[TEST] Attesa database pronto... "
max_attempts=12
attempt=0
while [ $attempt -lt $max_attempts ]; do
if docker exec lab05-db pg_isready -U lab05_user &>/dev/null; then
echo -e "${GREEN}PASS${NC}"
inc_pass
break
fi
((attempt++)) || true
sleep 1
done
if [ $attempt -eq $max_attempts ]; then
echo -e "${RED}FAIL${NC} (database non pronto)"
inc_fail
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 1
fi
# Verifica dati dopo riavvio
echo -n "[TEST] Verifica dati dopo riavvio... "
retrieved_data=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "SELECT data FROM persistence_test WHERE data = '$test_data';" 2>/dev/null | tr -d ' ')
if [ "$retrieved_data" = "$test_data" ]; then
echo -e "${GREEN}PASS${NC} (dati persistiti correttamente)"
inc_pass
else
echo -e "${RED}FAIL${NC} (dati persi dopo riavvio)"
inc_fail
echo "INF-04 VIOLATION: i dati devono persistere oltre il riavvio"
fi
echo ""
echo "=========================================="
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
echo "=========================================="
if [ $fail_count -gt 0 ]; then
exit 1
fi
exit 0