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