2015-10-01 00:56:53 +02:00
#!/usr/bin/env perl
2015-07-15 13:42:40 +02:00
use strict ;
use warnings ;
use English ;
use File::Basename ;
use File::Spec::Functions qw( splitpath rel2abs ) ; #($volume, $rep, $fic) = splitpath($path); $absolute_path = rel2abs($relative_path)
2015-09-29 02:05:59 +02:00
use Module::Load::Conditional qw( check_install ) ; #pour verifier existence d une librairie
2015-07-15 13:42:40 +02:00
my $ NOM_PROG = basename $ PROGRAM_NAME ;
#pattern d un reel pour les regex (desormais redondant avec $RE{num}{real} de Regexp::Common)
my $ format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?' ;
##########################################################################
##########################################################################
##########################################################################
#
# RECUPERATION ET VERIFICATION DES ARGUMENTS ET OPTIONS DU SCRIPT
#
##########################################################################
##########################################################################
##########################################################################
#indicateur de l option -h ou -help => affichage aide
my $ is_opt_help = 0 ;
foreach my $ arg ( @ ARGV ) {
if ( $ arg =~ /-h/i or $ arg =~ /-help/i ) {
$ is_opt_help = 1 ;
last ;
}
}
#--------------------------------------------------------------------------
# affichage de l aide si option -h ou -help ou si il n y a pas assez d arguments
#--------------------------------------------------------------------------
if ( $ is_opt_help or $# ARGV < 0 ) {
afficher_ligne_tirets ( 'print' ) ;
print "Script $NOM_PROG \n" ;
afficher_ligne_tirets ( 'print' ) ;
print " Description :\n" ;
print " Lancement de la batterie de verification Herezh\n" ;
print " Par defaut, ce script lance tous les tests disponibles dans l arborescence.\n" ;
print " Un certain nombre d options sont proposees pour modifier le fonctionnement.\n" ;
print "\n" ;
print " Pour les tests rapides : le rapport sera contenu dans Rapport/rapport_Test_R.txt\n" ;
print " Pour les tests longs : le rapport sera contenu dans Rapport/rapport_Test_L.txt\n" ;
print " En cas d option -rpt : le rapport sera contenu dans Rapport/rapport_test_debugECHEC.txt\n" ;
print "\n" ;
print " Usage : $NOM_PROG [-R] [-L] [-rpt fic_rapport] exeHZ\n" ;
print "\n" ;
print " Argument obligatoire :\n" ;
print " exeHZ : nom de l executable Herezh\n" ;
print "\n" ;
print " Options :\n" ;
print " -R : ne lancer que les tests rapides (Test_R)\n" ;
print "\n" ;
print " -L : ne lancer que les tests longs (Test_L)\n" ;
print "\n" ;
print " -rpt fic_rapport : seuls les tests presents dans le fichier de rapport\n" ;
print " fic_rapport et ayant un indicateur ECHEC seront lances\n" ;
print "\n" ;
print " Remarque :\n" ;
print " contrairement aux commandes linux classiques, les options de ce script\n" ;
print " peuvent etre placees n importe ou. Par exemple, les commandes suivantes\n" ;
print " fonctionnent de maniere equivalente :\n" ;
print " > $NOM_PROG -R HZppfast_Vn-1\n" ;
print " > $NOM_PROG HZppfast_Vn-1 -R\n" ;
afficher_ligne_tirets ( 'print' ) ;
print "\n" ;
exit ;
}
#--------------------------------------------------------------------------
# recuperation des arguments et options
#--------------------------------------------------------------------------
my $ exeHZ ; #argument obligatoire : nom de l executable Herezh
my $ is_opt_R = 0 ; #indicateur de l option -R (0 par defaut; si egal 1 => lancement des tests rapides Test_R uniquement)
my $ is_opt_L = 0 ; #indicateur de l option -L (0 par defaut; si egal 1 => lancement des tests longs Test_L uniquement)
2015-10-01 00:56:53 +02:00
my $ is_opt_rpt = 0 ; #indicateur de l option -rpt (0 par defaut; si egal 1 => lancement uniquement des tests ayant un status ECHEC dans un rapport precedent)
my $ opt_rpt_fic_rapport ; #option -rpt : nom du fichier de rapport a exploiter (non defini par defaut)
2015-07-15 13:42:40 +02:00
#On vide le contenu de @ARGV en conservant les arguments obligatoires dans @args et traiter les options au cas par cas
my $ opt ;
my @ args ;
while ( $# ARGV != - 1 ) {
$ opt = shift ( @ ARGV ) ;
#option -R
if ( $ opt eq '-R' ) {
$ is_opt_R = 1 ;
}
#option -L
elsif ( $ opt eq '-L' ) {
$ is_opt_L = 1 ;
}
#option -rpt
elsif ( $ opt eq '-rpt' ) {
2015-10-01 00:56:53 +02:00
$ is_opt_rpt = 1 ;
2015-07-15 13:42:40 +02:00
( $# ARGV != - 1 ) or die "\nErreur (prog:$NOM_PROG, opt:-rpt) : l option -rpt necessite de specifier un nom de fichier rapport...\n\n" ;
2015-10-01 00:56:53 +02:00
$ opt_rpt_fic_rapport = shift ( @ ARGV ) ;
2015-07-15 13:42:40 +02:00
#verif de l existence du fichier rapport
2015-10-01 00:56:53 +02:00
( - e $ opt_rpt_fic_rapport ) or die "\nErreur (prog:$NOM_PROG, opt:-rpt) : fichier rapport $opt_rpt_fic_rapport introuvable...\n\n" ;
2015-07-15 13:42:40 +02:00
}
#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#note aux developpeurs : AJOUTER ICI LE TRAITEMENT D UNE NOUVELLE OPTION
#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#cas d une option inconnue (on l ignore)
elsif ( $ opt =~ /^-/ ) {
warn "Attention (prog:$NOM_PROG) : l option $opt est inconnue (et ignoree)...\n" ;
warn "(taper entree pour continuer...)\n" ;
2015-07-15 16:57:41 +02:00
<STDIN> ; #attend jusqu a ce que la touche entree soit tapee
2015-07-15 13:42:40 +02:00
}
2015-07-15 16:57:41 +02:00
2015-07-15 13:42:40 +02:00
#sinon on enregistre l argument dans @args
else {
push ( @ args , $ opt ) ;
}
} #while($#ARGV != -1)
#a ce stade, les arguments restants sont dans @args
( $# args >= 0 ) or die "\nErreur (prog:$NOM_PROG) : arguments manquants ($NOM_PROG -h pour afficher l aide)...\n\n" ;
#premier argument obligatoire : nom de l executable Herezh
$ exeHZ = shift ( @ args ) ;
#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2015-07-15 16:57:41 +02:00
#note aux developpeurs : AJOUTER ICI DE NOUVELLES AFFECTATIONS DE VARIABLE EN FONCTION DES ARGUMENTS @args
2015-07-15 13:42:40 +02:00
#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#--------------------------------------------------------------------------
# verification des arguments et options
#--------------------------------------------------------------------------
#validite de l executable Herezh
( verif_commande ( $ exeHZ ) ne '0' ) or die "\nErreur (prog:$NOM_PROG) : commande Herezh $exeHZ introuvable ou non executable...\n\n" ;
#option -R et -L mutuellement exclusives (si les 2 ont ete utilisees => erreur)
if ( $ is_opt_R and $ is_opt_L ) {
die "\nErreur (prog:$NOM_PROG, opt:-R/-L) : interdiction d utiliser les options -R et -L en meme temps...\n\n" ;
}
2015-10-01 00:56:53 +02:00
#si option -rpt : verif de la validite du fichier rapport $opt_rpt_fic_rapport
if ( $ is_opt_rpt ) {
2015-07-15 13:42:40 +02:00
#validite (par une heuristique : est valide si on y trouve la chaine "RAPPORT DE TEST", sensible a la casse)
my $ fichier_valide = 0 ;
2015-10-01 00:56:53 +02:00
open ( FIC , "<$opt_rpt_fic_rapport" ) ;
2015-07-15 13:42:40 +02:00
while ( <FIC> ) { next if ( not /RAPPORT DE TEST/ ) ; $ fichier_valide = 1 ; last ; }
close ( FIC ) ;
2015-10-01 00:56:53 +02:00
$ fichier_valide or die "\nErreur (prog:$NOM_PROG, opt:-rpt) : fichier $opt_rpt_fic_rapport existe mais n est pas un fichier de rapport genere par le script $NOM_PROG...\n\n" ;
2015-07-15 13:42:40 +02:00
}
#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#note aux developpeurs : AJOUTER ICI DE NOUVELLES VERIF EN LIEN AVEC UNE NOUVELLE OPTION OU UN NOUVEL ARGUMENT
#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
##########################################################################
##########################################################################
##########################################################################
#
# LANCEMENT DES TESTS
2015-10-01 00:56:53 +02:00
# actuellement 3 options a gerer :
# -R : lancement uniquement des tests rapides
# -L : lancement uniquement des tests longs
# -rpt : lancement uniquement des tests ayant echoue du rapport $opt_rpt_fic_rapport
2015-07-15 13:42:40 +02:00
#
##########################################################################
##########################################################################
##########################################################################
#verification prealable de la presence du repertoire Rapport
# > si existe deja mais est un fichier => arret avec message d erreur
if ( - f "./Rapport" ) {
2015-10-01 00:56:53 +02:00
die "\nErreur (prog:$NOM_PROG) : impossible de creer le repertoire Rapport car il existe deja un fichier de nom Rapport...\n\n" ;
2015-07-15 13:42:40 +02:00
}
# > si absent => on le cree
mkdir "./Rapport" if ( not - e "./Rapport" ) ;
2015-10-01 00:56:53 +02:00
2015-07-15 13:42:40 +02:00
#--------------------------------------------------------------------------
2015-10-01 00:56:53 +02:00
# option -rpt => lancement uniquement des tests ayant echoue du rapport $opt_rpt_fic_rapport (et sortie du programme)
2015-07-15 13:42:40 +02:00
#--------------------------------------------------------------------------
my @ LISTE_TESTS_ECHEC ;
2015-10-01 00:56:53 +02:00
if ( defined $ opt_rpt_fic_rapport ) {
open ( FIC , "<$opt_rpt_fic_rapport" ) ;
2015-07-15 13:42:40 +02:00
my $ is_test_ECHEC ;
my $ nom_repertoire_test ;
while ( <FIC> ) {
#si c est une ligne finissant par .CVisu[no], alors cette ligne contient un nom de repertoire de test
if ( /^\s*(.+).CVisu\d+/ ) {
$ nom_repertoire_test = $ 1 ; #on actualise le nom de repertoire de test courant
$ is_test_ECHEC = 0 ; #on reset l indicateur d echec
#petite retouche cosmetique => suppression d eventuels / en fin de nom de repertoire
$ nom_repertoire_test =~ s/\/+$// ;
}
#si le mot ECHEC est trouve => on enregistre le repertoire (sauf si ca a deja ete fait precedemment)
elsif ( /ECHEC/ ) {
push ( @ LISTE_TESTS_ECHEC , $ nom_repertoire_test ) ;
2015-10-01 00:56:53 +02:00
#si le dernier element et l avant dernier element de la liste @LISTE_TESTS_ECHEC sont identiques, on supprime (pop) le
# dernier element pour eviter d enregistrer plusieurs fois un meme repertoire
2015-07-15 13:42:40 +02:00
pop ( @ LISTE_TESTS_ECHEC ) if ( $# LISTE_TESTS_ECHEC >= 1 and $ LISTE_TESTS_ECHEC [ - 1 ] eq $ LISTE_TESTS_ECHEC [ - 2 ] ) ;
}
}
close ( FIC ) ;
##print "$_\n" for @LISTE_TESTS_ECHEC; exit;
#si il n y a aucun test ECHEC dans @LISTE_TESTS_ECHEC => tant mieux! on affiche la bonne nouvelle et on exit
if ( $# LISTE_TESTS_ECHEC == - 1 ) {
print "\n" ;
2015-10-01 00:56:53 +02:00
print "Aucun test ECHEC n a ete trouve dans le fichier $opt_rpt_fic_rapport ...\n\n" ;
2015-07-15 13:42:40 +02:00
print " - arret -\n" ;
exit ;
}
#sinon => lancement des tests
else {
#renommage d un eventuel rapport precedent en _OLD (et la liste des tests associee)
system ( "mv -f Rapport/rapport_test_debugECHEC.txt Rapport/rapport_test_debugECHEC_OLD.txt" ) ;
system ( "mv -f Rapport/Liste_Tests_debugECHEC.txt Rapport/Liste_Tests_debugECHEC.txt" ) ;
#creation du rapport temporaire
system ( "./Perl/genere_rapport.pl Rapport/rapport_test.txt $exeHZ" ) ;
#liste des tests
foreach my $ rep_test ( @ LISTE_TESTS_ECHEC ) {
system ( "echo $rep_test >> Rapport/Liste_Tests_debugECHEC.txt" ) ;
}
2015-10-01 00:56:53 +02:00
#lancement des tests (dont le resultat s ecrit dans le rapport temporaire Rapport/rapport_test.txt)
2015-07-15 13:42:40 +02:00
foreach my $ rep_test ( @ LISTE_TESTS_ECHEC ) {
system ( "./Perl/test.pl $rep_test $exeHZ" ) ;
}
#creation du fichier rapport final
system ( "mv -f Rapport/rapport_test.txt Rapport/rapport_test_debugECHEC.txt" ) ;
#affichage du rapport
system ( "nedit Rapport/rapport_test_debugECHEC.txt &" ) ;
}
2015-10-01 00:56:53 +02:00
} #fin option -rpt
2015-07-15 13:42:40 +02:00
#--------------------
2015-10-01 00:56:53 +02:00
#lancement des tests rapides (sauf en cas d option -L ou -rpt)
2015-07-15 13:42:40 +02:00
#--------------------
2015-10-01 00:56:53 +02:00
unless ( $ is_opt_L or $ is_opt_rpt ) {
2015-07-15 13:42:40 +02:00
#recherche des tests Test_R dans l arborescence (utilisation de find et suppression de chaque retour a la ligne avec chomp)
my @ LISTE_TESTS_R = map { chomp ; $ _ } qx( find . -name "Test_R*" -type d ) ;
#si il n y a aucun test dans @LISTE_TESTS_R => on le signale
if ( $# LISTE_TESTS_R == - 1 ) {
print "\n" ;
print "Aucun test rapide Test_R n a ete trouve...\n\n" ;
}
#sinon => lancement des tests
else {
#renommage d un eventuel rapport precedent en _OLD (et la liste des tests associee)
system ( "mv -f Rapport/rapport_test_R.txt Rapport/rapport_test_R_OLD.txt" ) ;
system ( "mv -f Rapport/Liste_Tests_R.txt Rapport/Liste_Tests_R.txt" ) ;
#creation du rapport temporaire
system ( "./Perl/genere_rapport.pl Rapport/rapport_test.txt $exeHZ" ) ;
#liste des tests
foreach my $ rep_test ( @ LISTE_TESTS_R ) {
system ( "echo $rep_test >> Rapport/Liste_Tests_R.txt" ) ;
}
2015-10-01 00:56:53 +02:00
#lancement des tests (dont le resultat s ecrit dans le rapport temporaire Rapport/rapport_test.txt)
2015-07-15 13:42:40 +02:00
foreach my $ rep_test ( @ LISTE_TESTS_R ) {
system ( "./Perl/test.pl $rep_test $exeHZ" ) ;
}
#creation du fichier rapport final
system ( "mv -f Rapport/rapport_test.txt Rapport/rapport_test_R.txt" ) ;
#affichage du rapport
system ( "nedit Rapport/rapport_test_R.txt &" ) ;
}
}
2015-10-01 00:56:53 +02:00
2015-07-15 13:42:40 +02:00
#--------------------
2015-10-01 00:56:53 +02:00
#lancement des tests longs (sauf en cas d option -R ou -rpt)
2015-07-15 13:42:40 +02:00
#--------------------
2015-10-01 00:56:53 +02:00
unless ( $ is_opt_R or $ is_opt_rpt ) {
2015-07-15 13:42:40 +02:00
#recherche des tests Test_L dans l arborescence (utilisation de find et suppression de chaque retour a la ligne avec chomp)
my @ LISTE_TESTS_L = map { chomp ; $ _ } qx( find . -name "Test_L*" -type d ) ;
#si il n y a aucun test dans @LISTE_TESTS_L => on le signale
if ( $# LISTE_TESTS_L == - 1 ) {
print "\n" ;
print "Aucun test long Test_L n a ete trouve...\n\n" ;
}
#sinon => lancement des tests
else {
#renommage d un eventuel rapport precedent en _OLD (et la liste des tests associee)
system ( "mv -f Rapport/rapport_test_L.txt Rapport/rapport_test_L_OLD.txt" ) ;
system ( "mv -f Rapport/Liste_Tests_L.txt Rapport/Liste_Tests_L.txt" ) ;
#creation du rapport temporaire
system ( "./Perl/genere_rapport.pl Rapport/rapport_test.txt $exeHZ" ) ;
#liste des tests
foreach my $ rep_test ( @ LISTE_TESTS_L ) {
system ( "echo $rep_test >> Rapport/Liste_Tests_L.txt" ) ;
}
2015-10-01 00:56:53 +02:00
#lancement des tests (dont le resultat s ecrit dans le rapport temporaire Rapport/rapport_test.txt)
2015-07-15 13:42:40 +02:00
foreach my $ rep_test ( @ LISTE_TESTS_L ) {
system ( "./Perl/test.pl $rep_test $exeHZ" ) ;
}
#creation du fichier rapport final
system ( "mv -f Rapport/rapport_test.txt Rapport/rapport_test_L.txt" ) ;
#affichage du rapport
system ( "nedit Rapport/rapport_test_L.txt &" ) ;
}
}
##########################################################################
##########################################################################
##########################################################################
#
# SUBROUTINES
#
##########################################################################
##########################################################################
##########################################################################
2015-10-01 00:56:53 +02:00
#####################################################################################################
#subroutine permettant de terminer proprement le script en cas de ctrl-z
#####################################################################################################
sub fin_script {
}
2015-07-15 13:42:40 +02:00
#####################################################################################################
#subroutine permettant d ecrire une ligne de tirets de la largeur du terminal
#####################################################################################################
#
# en entree :
# - print ou warn (suivant que l on souhaite afficher avec print (donc vers STDOUT) ou warn (donc vers STDERR)
#
sub afficher_ligne_tirets {
2015-10-01 00:56:53 +02:00
my $ funct_disp = shift ;
( $ funct_disp eq 'print' ) or ( $ funct_disp eq 'warn' ) or die "\nErreur (sub:afficher_ligne_tirets) : l argument d entree doit etre \"print\" ou \"warn\" (argument recu : $funct_disp)...\n\n" ;
#utilisation de Term::ReadKey pour connaitre la largeur du terminal en nombre de caracteres
# (seulement si la librairie existe. si non, la ligne de tirets aura une largeur de 78)
2015-09-29 02:05:59 +02:00
my $ nb_char_largeur_terminal = 78 ;
if ( check_install ( module = > 'Term::ReadKey' ) ) {
require Term::ReadKey ; Term::ReadKey - > import ( qw( GetTerminalSize ) ) ;
$ nb_char_largeur_terminal = ( GetTerminalSize ( ) ) [ 0 ] ; #largeur du terminal en nombre de caracteres (via package Term::ReadKey)
}
2015-07-15 13:42:40 +02:00
my $ ligne_tirets = '' ;
$ ligne_tirets . = '-' for ( 1 .. $ nb_char_largeur_terminal ) ;
print "$ligne_tirets\n" if ( $ funct_disp eq 'print' ) ;
warn "$ligne_tirets\n" if ( $ funct_disp eq 'warn' ) ;
} #sub afficher_ligne_tirets
#####################################################################################################
#subroutine qui recherche l existence d une commande et renvoie le premier path trouve (renvoie 0 si commande introuvable)
#####################################################################################################
# en entree :
# - nom de la commande
#
# en sortie :
2015-10-01 00:56:53 +02:00
# - chemin absolu de la commande (0 si commande introuvable)
2015-07-15 13:42:40 +02:00
#
sub verif_commande {
my $ cmd = shift ; #nom de la commande
#cas d un chemin absolu ou relatif (si la commande commence par . ou /. Par exemple : ./HZpp ../HZppfast ou /Users/dupont/bin/HZppfast)
if ( $ cmd =~ /^\./ or $ cmd =~ /^\// ) {
#on passe la commande en chemin absolu
$ cmd = rel2abs ( $ cmd ) ;
return $ cmd ;
}
#sinon on regarde dans la variable environnement $PATH
foreach my $ path ( split ( /\s*:\s*/ , $ ENV { PATH } ) ) {
if ( - x "$path/$cmd" ) {
#on s assure que c est un chemin absolu
$ cmd = rel2abs ( "$path/$cmd" ) ;
return $ cmd ;
}
}
#on regarde a nouveau si la commande est en chemin absolu ou relatif
# (cas d une commande qui ne commence pas par . ou / et qui n est pas dans les PATH. Par exemple : rep/HZpp)
if ( - x $ cmd ) {
#on passe la commande en chemin absolu
$ cmd = rel2abs ( $ cmd ) ;
return $ cmd ;
}
#cas ou la commande est introuvable
return 0 ;
} #sub verif_commande