Files
Loki/internal/loki/facade_bgjobs_test.go
T
Claude 7288db632e Lot 43 : jobs d'arrière-plan du mode Code tenus par la façade
bash_bg et bash_tail des tours de la façade ne passent plus par /tool/exec
du Go : src/tools/jobs.rs porte code_jobs.go. Refus avant lancement
(commande vide ou dangereuse, optimisation en cours), journal
.loki/jobs/<id>.log dans le dossier de la discussion, processus qui survit
au tour, shell sans le jeton interne ; relecture bornée (40 lignes par
défaut, 200 au plus), état et durée, arrêt relu aussitôt comme le Go.
paths::go_mkdir_all reproduit os.MkdirAll, erreur comprise.

Les jobs d'une discussion supprimée s'arrêtent avec elle. L'optimiseur du
Go compte ceux de la façade (POST /internal/facade/v1/bgjobs) avant de
mesurer ; façade injoignable : les siens seulement.

Parité : journal de 24 étapes tiré du Go (parity_jobs_test.go →
tests/parity_jobs/jobs.json), rejoué par tests/jobs.rs ; un tour de la
façade qui lance un job (tests/lot6.rs) ; TestFacadeJobsArrierePlan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
2026-10-16 05:42:32 +00:00

36 lines
834 B
Go

package loki
import (
"strings"
"testing"
)
// Lot 43 : les jobs d'arrière-plan des tours de la façade comptent pour
// l'optimiseur du Go ; façade en panne, seuls les siens.
func TestFacadeJobsArrierePlan(t *testing.T) {
testHome(t)
jobsMu.Lock()
saved := jobs
jobs = map[string]*bgJob{"job1": {ID: "job1"}}
jobsMu.Unlock()
t.Cleanup(func() {
jobsMu.Lock()
jobs = saved
jobsMu.Unlock()
})
f := demarrerFacade(t)
f.internalStatus = 200
f.internalBody = `{"running":2}`
if n := bgJobsRunning(); n != 3 {
t.Fatalf("jobs : %d, attendu 3 (1 ici, 2 à la façade)", n)
}
vu := f.recu()
if len(vu) != 1 || !strings.HasPrefix(vu[0], "POST /internal/facade/v1/bgjobs jeton ") {
t.Fatalf("appel : %v", vu)
}
f.internalStatus = 500
if n := bgJobsRunning(); n != 1 {
t.Fatalf("façade en panne : %d", n)
}
}