Initial commit

This commit is contained in:
Dom
2026-03-05 00:20:25 +01:00
commit dcd4de9945
1954 changed files with 669380 additions and 0 deletions

114
test_clean_shutdown.py Executable file
View 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)