Initial commit
This commit is contained in:
114
test_clean_shutdown.py
Executable file
114
test_clean_shutdown.py
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user