-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest-160.sh
executable file
·123 lines (97 loc) · 2.96 KB
/
test-160.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/sh
#
# Vérifier que les médecins prennent bien les patients en parallèle
# Deux tests en un :
# - le premier en lançant les médecins en premier
# - le premier en lançant les patients en premier
#
. ./ftest.sh
ATT=8 # nb de sièges dans la salle d'attente
MED=4 # nb de médecins
TVAX=200 # durée de vaccination : 200 ms, c'est du rapide
PAT=$ATT # nb de patients (pas plus que le nb de sièges)
# Lancer les médecins en parallèle
lancer_medecins ()
{
local i
# Lancer les médecins
PID_M=""
for i in $(seq $MED)
do
./medecin > $TMP.m$i 2>&1 &
PID_M="$PID_M $!"
done
# Attendre que les médecins aient démarré
msleep $MARGE
}
# Lancer les patients en parallèle
lancer_patients ()
{
local i
# Lancer les patients
PID_P=""
for i in $(seq $PAT)
do
./patient P$i > $TMP.p$i 2>&1 &
PID_P="$PID_P $!"
done
# Attendre que les patients aient démarré
msleep $MARGE
}
# Lancer le test complet, avec l'argument "medecins" ou "patients"
run ()
{
local premier="$1"
# Nettoyer pour éviter des suprises
./nettoyer > $TMP.n 2>&1 || fail "Erreur au nettoyage préalable"
# Ouvrir le vaccinodrome
./ouvrir $ATT $MED $TVAX > $TMP.o 2>&1 || fail "Erreur à l'ouverture"
if [ $premier = "medecins" ]
then
lancer_medecins
lancer_patients
else
lancer_patients
lancer_medecins
fi
# Tout le monde doit toujours être là
N=$(ps_teste_liste $PID_P $PID_M)
O=$((MED + PAT))
[ $N = $O ] || fail "Il manque du monde ($N/$O)"
# Calculer le temps théorique
OT=$(( (PAT + MED-1) / MED ))
msleep $((OT * TVAX))
# Tous les patients doivent être sortis
N=$(ps_teste_liste $PID_P)
[ $N = 0 ] || fail "Il reste des patients !"
# Vérifier qu'ils se sont bien terminés
for pid in $PID_P
do
wait $pid || fail "Patient $pid mal terminé"
done
# Les médecins devraient toujours être là
N=$(ps_teste_liste $PID_M)
[ $N = $MED ] || fail "Il manque des médecins"
# On ferme ! Quelle journée !
./fermer > $TMP.f 2>&1 &
PID_F=$!
# Laisser le temps de terminer
msleep $MARGE
# Vérifier la fermeture
for pid in $PID_M
do
ps_termine $pid "Médecin $pid ne devrait plus être là"
wait $pid || fail "Médecin $pid terminé en erreur"
done
ps_termine $PID_F "fermer aurait dû se terminer"
wait $PID_F || fail "Erreur à la fermeture"
# On laisse tout bien propre à la fin
./nettoyer > $TMP.n 2>&1 || fail "Erreur au nettoyage final"
}
# Premier test : lancer les médecins en premier
run medecins
# Deuxième test : lancer les patients en premier
run patients
logs_aux
echo "ok"
exit 0