Création d'un script de test automatique pour le test n°2 + Amélioration du readme.md d'explication

This commit is contained in:
Yanis HAMOUDI 2025-03-01 21:21:24 +01:00
parent 43dc5102aa
commit c7d0b78e03
2 changed files with 195 additions and 10 deletions
tests/C/test-02-already-exist

@ -1,13 +1,88 @@
# Test 2 : Compilation où le résultat existe déjà
# Test 02 - Compilation avec exécutable existant
## Description
Ce test vérifie que si l'exécutable `main` est déjà présent et que `main.c`
n'a pas été modifié, alors `Bake` ne tente pas de recompiler.
Ce test vérifie le comportement de `bake` comparé à `make` lorsque l'exécutable cible existe déjà et qu'aucune modification n'a été apportée au code source.
## Fichiers utilisés
- `main.c` : Fichier source inchangé.
- `Bakefile` : Contient les règles de compilation.
- `main` : Exécutable déjà généré.
## Sommaire
- [Structure du test](#structure-du-test)
- [Contenu des fichiers de règles](#contenu-des-fichiers-de-règles)
- [Objectif du test](#objectif-du-test)
- [Comment exécuter le test](#comment-exécuter-le-test)
- [Test automatique](#test-automatique)
- [Test manuel](#test-manuel)
- [Résultats attendus](#résultats-attendus)
## Résultat attendu
Aucun message indiquant la compilation ne doit apparaître.
## Structure du test
```
test-02-existing-executable/
├── README.md # Ce fichier
├── bake/
│ ├── Bakefile # Fichier de règles pour bake
│ ├── bakefile.jar # Exécutable de bake (JAR)
│ ├── main # Exécutable déjà compilé
│ └── main.c # Fichier source C
├── make/
│ ├── Makefile # Fichier de règles pour make
│ ├── main # Exécutable déjà compilé
│ └── main.c # Fichier source C
└── run_test02.sh # Programme de test automatique
```
## Contenu des fichiers de règles
Les fichiers `Makefile` et `Bakefile` contiennent les mêmes règles :
```makefile
main: main.c
gcc -o main main.c
```
## Objectif du test
Ce test vérifie que `bake` se comporte comme `make` dans le scénario où l'exécutable existe déjà :
1. Vérifier que les deux outils détectent correctement que la cible `main` existe déjà
2. Vérifier que les deux outils analysent les dépendances pour déterminer si la reconstruction est nécessaire
3. Vérifier que les deux outils évitent de reconstruire l'exécutable quand aucune modification n'a été apportée au code source
4. Comparer les messages de sortie des deux outils
## Comment exécuter le test
### Test automatique
1. Rendez le script de test exécutable :
```
chmod +x run_test02.sh
```
2. Lancez le script de test :
```
./run_test02.sh
```
3. Consultez les résultats affichés dans le terminal et dans le fichier de log généré dans le répertoire `logs/`.
### Test manuel
1. Pour Make :
```
cd make
make
```
2. Pour Bake :
```
cd bake
java -cp bakefile.jar fr.monlouyan.bakefile.Main
```
3. Comparez les deux résultats.
## Résultats attendus
- Les deux outils devraient détecter que la cible `main` existe déjà
- Les deux outils devraient vérifier les dates de modification des fichiers source et de l'exécutable
- Les deux outils devraient déterminer qu'aucune reconstruction n'est nécessaire (les fichiers source n'ayant pas été modifiés)
- Les messages de sortie devraient être similaires, indiquant qu'aucune action n'a été effectuée
- Les datestamps des exécutables ne devraient pas être modifiés
Ce test vérifie la fonctionnalité essentielle d'un système de build qui consiste à ne pas reconstruire des cibles qui sont déjà à jour, optimisant ainsi le temps de compilation.

@ -0,0 +1,110 @@
#!/bin/bash
# Script de test pour comparer bake et make dans le test n°2 - Compilation quand l'exécutable existe déjà
# Création du répertoire de logs s'il n'existe pas
mkdir -p logs
# Fichier de log avec timestamp pour éviter les écrasements
LOG_FILE="logs/test02_$(date +%Y%m%d_%H%M%S).log"
echo "=================================" | tee -a "$LOG_FILE"
echo "Test 02 - Compilation quand l'exécutable existe déjà" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"
# Préparation du test - S'assurer que les exécutables existent dans les deux répertoires
echo "Préparation du test..." | tee -a "$LOG_FILE"
# Pour make
cd make
if [ ! -f "main" ]; then
echo "Création de l'exécutable dans le répertoire make..." | tee -a "../$LOG_FILE"
make 2>&1 | tee -a "../$LOG_FILE"
else
echo "L'exécutable existe déjà dans le répertoire make" | tee -a "../$LOG_FILE"
fi
# Enregistrer la date de modification de l'exécutable make
MAKE_EXEC_TIME=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
echo "Date de modification initiale (make): $(date -r $MAKE_EXEC_TIME)" | tee -a "../$LOG_FILE"
cd ..
# Pour bake
cd bake
if [ ! -f "main" ]; then
echo "Création de l'exécutable dans le répertoire bake..." | tee -a "../$LOG_FILE"
java -cp bakefile.jar fr.monlouyan.bakefile.Main 2>&1 | tee -a "../$LOG_FILE"
else
echo "L'exécutable existe déjà dans le répertoire bake" | tee -a "../$LOG_FILE"
fi
# Enregistrer la date de modification de l'exécutable bake
BAKE_EXEC_TIME=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
echo "Date de modification initiale (bake): $(date -r $BAKE_EXEC_TIME)" | tee -a "../$LOG_FILE"
cd ..
echo "" | tee -a "$LOG_FILE"
# Test avec make
echo "=================================" | tee -a "$LOG_FILE"
echo "Exécution de MAKE quand l'exécutable existe déjà:" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
cd make
echo "$ make" | tee -a "../$LOG_FILE"
make 2>&1 | tee -a "../$LOG_FILE"
MAKE_EXIT_CODE=$?
echo "" | tee -a "../$LOG_FILE"
echo "Code de sortie: $MAKE_EXIT_CODE" | tee -a "../$LOG_FILE"
# Vérifier si l'exécutable a été reconstruit ou non
NEW_MAKE_EXEC_TIME=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
if [ "$NEW_MAKE_EXEC_TIME" -eq "$MAKE_EXEC_TIME" ]; then
echo "✅ make: L'exécutable n'a PAS été reconstruit (comportement correct)" | tee -a "../$LOG_FILE"
else
echo "❌ make: L'exécutable a été reconstruit alors qu'il n'a pas changé" | tee -a "../$LOG_FILE"
echo "Nouvelle date de modification: $(date -r $NEW_MAKE_EXEC_TIME)" | tee -a "../$LOG_FILE"
fi
cd ..
echo "" | tee -a "$LOG_FILE"
# Test avec bake
echo "=================================" | tee -a "$LOG_FILE"
echo "Exécution de BAKE quand l'exécutable existe déjà:" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
cd bake
echo "$ java -cp bakefile.jar fr.monlouyan.bakefile.Main" | tee -a "../$LOG_FILE"
java -cp bakefile.jar fr.monlouyan.bakefile.Main 2>&1 | tee -a "../$LOG_FILE"
BAKE_EXIT_CODE=$?
echo "" | tee -a "../$LOG_FILE"
echo "Code de sortie: $BAKE_EXIT_CODE" | tee -a "../$LOG_FILE"
# Vérifier si l'exécutable a été reconstruit ou non
NEW_BAKE_EXEC_TIME=$(stat -c %Y "main" 2>/dev/null || stat -f %m "main")
if [ "$NEW_BAKE_EXEC_TIME" -eq "$BAKE_EXEC_TIME" ]; then
echo "✅ bake: L'exécutable n'a PAS été reconstruit (comportement correct)" | tee -a "../$LOG_FILE"
else
echo "❌ bake: L'exécutable a été reconstruit alors qu'il n'a pas changé" | tee -a "../$LOG_FILE"
echo "Nouvelle date de modification: $(date -r $NEW_BAKE_EXEC_TIME)" | tee -a "../$LOG_FILE"
fi
cd ..
# Résumé des résultats
echo "" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
echo "RÉSUMÉ:" | tee -a "$LOG_FILE"
echo "=================================" | tee -a "$LOG_FILE"
if [ "$NEW_MAKE_EXEC_TIME" -eq "$MAKE_EXEC_TIME" ] && [ "$NEW_BAKE_EXEC_TIME" -eq "$BAKE_EXEC_TIME" ]; then
echo "✅ Les deux outils ont correctement évité de reconstruire l'exécutable inchangé" | tee -a "$LOG_FILE"
elif [ "$NEW_MAKE_EXEC_TIME" -ne "$MAKE_EXEC_TIME" ] && [ "$NEW_BAKE_EXEC_TIME" -ne "$BAKE_EXEC_TIME" ]; then
echo "❌ Les deux outils ont reconstruit l'exécutable alors que rien n'a changé" | tee -a "$LOG_FILE"
else
echo "⚠️ Comportement différent entre make et bake:" | tee -a "$LOG_FILE"
echo " - make: $([ "$NEW_MAKE_EXEC_TIME" -eq "$MAKE_EXEC_TIME" ] && echo '✅ Correct (pas de reconstruction)' || echo '❌ Incorrect (a reconstruit)')" | tee -a "$LOG_FILE"
echo " - bake: $([ "$NEW_BAKE_EXEC_TIME" -eq "$BAKE_EXEC_TIME" ] && echo '✅ Correct (pas de reconstruction)' || echo '❌ Incorrect (a reconstruit)')" | tee -a "$LOG_FILE"
fi
echo "" | tee -a "$LOG_FILE"
echo "Test terminé. Résultats enregistrés dans: $LOG_FILE" | tee -a "$LOG_FILE"