# Debug - Benchmark Réseau (erreur jq)

Date : 13 décembre 2025
Version : 1.2.4 (debug)

## 🐛 Problème à Déboguer

### Symptômes
Erreur persistante dans le benchmark réseau :
```
✓ Benchmark Réseau en cours (vers 10.0.0.50)...
jq: invalid JSON text passed to --argjson
Use jq --help for help with command-line options,
or see the jq manpage, or online docs  at https://jqlang.github.io/jq
```

### Contexte
- Le benchmark mémoire fonctionne maintenant correctement (8667.08 MiB/s)
- Les scores CPU et Disque sont élevés mais acceptés (validation à 10000)
- L'erreur jq se produit lors de la construction du JSON réseau

### Hypothèses
1. Une des valeurs `upload_mbps`, `download_mbps`, `ping_ms` ou `net_score` est invalide
2. La valeur peut contenir des caractères non numériques
3. La valeur peut être vide `""` au lieu de `"0"` ou `"null"`
4. `safe_bc()` peut retourner une valeur non numérique dans certains cas

---

## 🔍 Debug Ajouté

### Code Debug (lignes 785-820)

```bash
# Extraction upload
local upload_bps=$(echo "$upload_result" | jq '.end.sum_sent.bits_per_second // 0')
echo "  [DEBUG] upload_bps extrait de iperf3='$upload_bps'" >&2
upload_mbps=$(safe_bc "scale=2; $upload_bps / 1000000")
echo "  [DEBUG] upload_mbps après conversion='$upload_mbps'" >&2

# Extraction download
local download_bps=$(echo "$download_result" | jq '.end.sum_received.bits_per_second // 0')
echo "  [DEBUG] download_bps extrait de iperf3='$download_bps'" >&2
download_mbps=$(safe_bc "scale=2; $download_bps / 1000000")
echo "  [DEBUG] download_mbps après conversion='$download_mbps'" >&2

# Extraction ping
local ping_output=$(ping -c 5 "$target" 2>/dev/null | grep 'avg' || echo "")
echo "  [DEBUG] ping_output='$ping_output'" >&2
if [[ -n "$ping_output" ]]; then
    ping_ms=$(echo "$ping_output" | awk -F'/' '{print $5}')
    echo "  [DEBUG] ping_ms extrait='$ping_ms'" >&2
fi

# Calcul score
local net_score=$(safe_bc "scale=2; ($upload_mbps + $download_mbps) / 20")

# Validation avant jq
[[ -z "$ping_ms" || "$ping_ms" == "null" ]] && ping_ms="0"

# DEBUG: Afficher les valeurs avant jq
echo "  [DEBUG] upload_mbps='$upload_mbps' download_mbps='$download_mbps' ping_ms='$ping_ms' net_score='$net_score'" >&2

# Appel jq avec capture d'erreur
net_bench=$(jq -n \
    --argjson upload "$upload_mbps" \
    --argjson download "$download_mbps" \
    --argjson ping "$ping_ms" \
    --argjson score "$net_score" \
    '{upload_mbps: $upload, download_mbps: $download, ping_ms: $ping, score: $score}' 2>&1)

local jq_exit_code=$?
if [[ $jq_exit_code -ne 0 ]]; then
    log_error "Erreur jq lors de la construction du JSON réseau"
    echo "  [DEBUG] Sortie jq: $net_bench" >&2
    echo "  [DEBUG] Valeurs: upload='$upload_mbps' download='$download_mbps' ping='$ping_ms' score='$net_score'" >&2
    net_bench="null"
fi
```

### Fichiers Modifiés

| Fichier | Lignes | Type | Description |
|---------|--------|------|-------------|
| `scripts/bench.sh` | 785-787 | Debug | Upload bps extraction et conversion |
| `scripts/bench.sh` | 793-795 | Debug | Download bps extraction et conversion |
| `scripts/bench.sh` | 800-803 | Debug | Ping extraction |
| `scripts/bench.sh` | 807 | Debug | Valeurs finales avant jq |
| `scripts/bench.sh` | 814-822 | Debug | Capture erreur jq et affichage détaillé |

---

## 🧪 Test avec Debug

### Commande
```bash
sudo bash scripts/bench.sh 2>&1 | tee /tmp/bench_debug.log
```

### Sortie Attendue

Si tout fonctionne correctement :
```
✓ Benchmark Réseau en cours (vers 10.0.0.50)...
  [DEBUG] upload_bps extrait de iperf3='945230000'
  [DEBUG] upload_mbps après conversion='945.23'
  [DEBUG] download_bps extrait de iperf3='943120000'
  [DEBUG] download_mbps après conversion='943.12'
  [DEBUG] ping_output='rtt min/avg/max/mdev = 0.280/0.342/0.450/0.062 ms'
  [DEBUG] ping_ms extrait='0.342'
  [DEBUG] upload_mbps='945.23' download_mbps='943.12' ping_ms='0.342' net_score='94.41'
✓ Réseau: ↑945.23Mbps ↓943.12Mbps (ping: 0.342ms, score: 94.41)
```

Si erreur :
```
✓ Benchmark Réseau en cours (vers 10.0.0.50)...
  [DEBUG] upload_bps extrait de iperf3='945230000'
  [DEBUG] upload_mbps après conversion='945.23'
  [DEBUG] download_bps extrait de iperf3='[VALEUR_PROBLEMATIQUE]'
  [DEBUG] download_mbps après conversion='[VALEUR_PROBLEMATIQUE]'
  [DEBUG] ping_output='...'
  [DEBUG] ping_ms extrait='...'
  [DEBUG] upload_mbps='945.23' download_mbps='[VALEUR_PROBLEMATIQUE]' ping_ms='...' net_score='...'
  ✗ Erreur jq lors de la construction du JSON réseau
  [DEBUG] Sortie jq: jq: invalid JSON text passed to --argjson
  [DEBUG] Valeurs: upload='945.23' download='[VALEUR_PROBLEMATIQUE]' ping='...' score='...'
```

---

## 📊 Cas à Tester

### Cas 1 : iperf3 retourne null
Si iperf3 retourne un JSON sans les champs attendus :
```json
{
  "end": {}
}
```
Alors `jq '.end.sum_sent.bits_per_second // 0'` devrait retourner `0`.

**Vérification** : `upload_bps` devrait être `0`

### Cas 2 : iperf3 retourne une chaîne
Si pour une raison quelconque, jq retourne `"null"` (string) au lieu de `null` :
```bash
upload_bps="null"  # String, pas JSON null
```
Alors `safe_bc "scale=2; null / 1000000"` peut échouer ou retourner une valeur bizarre.

**Vérification** : `upload_mbps` devrait être `0` grâce à safe_bc

### Cas 3 : safe_bc retourne une valeur vide
Si `safe_bc` échoue silencieusement et retourne `""` :
```bash
upload_mbps=""
```
Alors `--argjson upload ""` causera l'erreur jq.

**Vérification** : Le debug montrera `upload_mbps=''`

### Cas 4 : Ping retourne une valeur avec espace ou caractère spécial
Si le ping contient des caractères non numériques :
```bash
ping_ms="0.342 " # Espace en fin
ping_ms=" 0.342" # Espace en début
ping_ms="0,342"  # Virgule au lieu de point
```
Alors jq rejettera la valeur.

**Vérification** : Le debug montrera les espaces ou caractères

---

## 🔧 Corrections Potentielles

### Fix 1 : Valider toutes les valeurs numériques avant jq

```bash
# Valider upload_mbps
[[ -z "$upload_mbps" || ! "$upload_mbps" =~ ^[0-9.]+$ ]] && upload_mbps="0"

# Valider download_mbps
[[ -z "$download_mbps" || ! "$download_mbps" =~ ^[0-9.]+$ ]] && download_mbps="0"

# Valider ping_ms
[[ -z "$ping_ms" || ! "$ping_ms" =~ ^[0-9.]+$ ]] && ping_ms="0"

# Valider net_score
[[ -z "$net_score" || ! "$net_score" =~ ^[0-9.]+$ ]] && net_score="0"
```

### Fix 2 : Améliorer safe_bc pour toujours retourner un nombre

```bash
safe_bc() {
    local expr="$1"
    local out
    out=$(echo "$expr" | bc 2>/dev/null) || out="0"
    # Si out est vide ou non numérique, forcer à 0
    [[ -z "$out" || ! "$out" =~ ^-?[0-9.]+$ ]] && out="0"
    echo "$out"
}
```

### Fix 3 : Nettoyer ping_ms des espaces

```bash
# Nettoyer les espaces dans ping_ms
ping_ms=$(echo "$ping_ms" | tr -d ' \t\n\r')
```

---

## ✅ Prochaines Étapes

1. **Exécuter le benchmark avec debug** :
   ```bash
   sudo bash scripts/bench.sh 2>&1 | tee /tmp/bench_debug.log
   ```

2. **Analyser la sortie debug** :
   - Identifier quelle valeur cause l'erreur
   - Noter la valeur exacte (y compris espaces invisibles)

3. **Appliquer le fix approprié** :
   - Si c'est une valeur vide : validation avant jq
   - Si c'est une valeur non numérique : améliorer safe_bc
   - Si c'est un espace/caractère : nettoyage avec `tr`

4. **Retester** :
   - Vérifier que l'erreur jq a disparu
   - Vérifier que les valeurs réseau sont correctes
   - Désactiver le debug une fois corrigé

---

## 📝 Notes

- Le debug est affiché sur stderr (`>&2`) pour ne pas polluer stdout
- Le code de sortie de jq est capturé avec `$?`
- Si jq échoue, `net_bench` est mis à `"null"` pour éviter de planter le script
- Tous les messages debug commencent par `[DEBUG]` pour faciliter le grep

---

**Status** : ⏳ Debug ajouté, en attente de test
**Prochaine action** : Exécuter le benchmark et analyser la sortie debug

---

## 🔗 Fichiers Liés

- [HOTFIX_NETWORK_BENCH.md](HOTFIX_NETWORK_BENCH.md) - Fix safe_bc précédent
- [HOTFIX_BENCH_IMPROVEMENTS.md](HOTFIX_BENCH_IMPROVEMENTS.md) - Fixes mémoire et ping
- [bench.sh](scripts/bench.sh) - Script de benchmark client
