115 lines
3.4 KiB
Python
Executable File
115 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
Test de l'arrêt propre de l'application.
|
||
Vérifie qu'aucun processus zombie ne reste après l'arrêt.
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import time
|
||
import subprocess
|
||
import signal
|
||
|
||
def check_python_processes():
|
||
"""Vérifie les processus Python actifs."""
|
||
try:
|
||
result = subprocess.run(
|
||
['ps', 'aux'],
|
||
capture_output=True,
|
||
text=True
|
||
)
|
||
|
||
python_procs = []
|
||
for line in result.stdout.split('\n'):
|
||
if 'python' in line.lower() and ('geniusia' in line or 'main.py' in line):
|
||
python_procs.append(line)
|
||
|
||
return python_procs
|
||
except Exception as e:
|
||
print(f"❌ Erreur: {e}")
|
||
return []
|
||
|
||
def test_clean_shutdown():
|
||
"""Test de l'arrêt propre."""
|
||
print("🧪 TEST DE L'ARRÊT PROPRE")
|
||
print("=" * 60)
|
||
|
||
# Vérifier qu'aucun processus n'est actif avant
|
||
print("\n1️⃣ Vérification initiale...")
|
||
procs_before = check_python_processes()
|
||
if procs_before:
|
||
print(f"⚠️ {len(procs_before)} processus Python actifs:")
|
||
for proc in procs_before:
|
||
print(f" {proc}")
|
||
print("\n⚠️ Nettoyage des processus existants...")
|
||
subprocess.run(['pkill', '-f', 'python.*geniusia'], check=False)
|
||
time.sleep(2)
|
||
else:
|
||
print("✅ Aucun processus actif")
|
||
|
||
# Lancer l'application en mode headless
|
||
print("\n2️⃣ Lancement de l'application (mode shadow, 5 secondes)...")
|
||
proc = subprocess.Popen(
|
||
['python3', 'geniusia2/main.py', '--mode', 'shadow', '--headless'],
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
text=True
|
||
)
|
||
|
||
print(f" PID: {proc.pid}")
|
||
|
||
# Attendre 5 secondes
|
||
print(" Attente de 5 secondes...")
|
||
time.sleep(5)
|
||
|
||
# Envoyer SIGINT (Ctrl+C)
|
||
print("\n3️⃣ Envoi de SIGINT (Ctrl+C)...")
|
||
start_time = time.time()
|
||
proc.send_signal(signal.SIGINT)
|
||
|
||
# Attendre que le processus se termine (max 10 secondes)
|
||
try:
|
||
proc.wait(timeout=10)
|
||
elapsed = time.time() - start_time
|
||
print(f"✅ Processus terminé en {elapsed:.1f}s")
|
||
except subprocess.TimeoutExpired:
|
||
print(f"❌ Timeout après 10 secondes")
|
||
proc.kill()
|
||
elapsed = 10.0
|
||
|
||
# Attendre un peu pour que les threads se terminent
|
||
time.sleep(2)
|
||
|
||
# Vérifier qu'aucun processus zombie ne reste
|
||
print("\n4️⃣ Vérification des processus zombies...")
|
||
procs_after = check_python_processes()
|
||
|
||
if procs_after:
|
||
print(f"❌ {len(procs_after)} processus zombies détectés:")
|
||
for proc in procs_after:
|
||
print(f" {proc}")
|
||
print("\n⚠️ Nettoyage forcé...")
|
||
subprocess.run(['pkill', '-9', '-f', 'python.*geniusia'], check=False)
|
||
return False
|
||
else:
|
||
print("✅ Aucun processus zombie")
|
||
|
||
# Résumé
|
||
print("\n" + "=" * 60)
|
||
if elapsed <= 5.0 and not procs_after:
|
||
print("✅ TEST RÉUSSI!")
|
||
print(f" - Arrêt en {elapsed:.1f}s (< 5s)")
|
||
print(f" - Aucun processus zombie")
|
||
return True
|
||
else:
|
||
print("❌ TEST ÉCHOUÉ!")
|
||
if elapsed > 5.0:
|
||
print(f" - Arrêt trop lent: {elapsed:.1f}s (> 5s)")
|
||
if procs_after:
|
||
print(f" - Processus zombies: {len(procs_after)}")
|
||
return False
|
||
|
||
if __name__ == "__main__":
|
||
success = test_clean_shutdown()
|
||
sys.exit(0 if success else 1)
|