test: Prozessgrenzen-Tests für Rate-Limit und Ruhezeiten

Kurzes Fenster (1 s): fünf Ansagen → genau eine spielt sofort, low
verfällt beim Eintritt (202 + CLI 'discarded: rate_limit'), normal parkt
(sichtbar in queue_ids/next_slot) und spielt frühestens zum Slot
(Timing-am-Fake gemessen). High-Burst an/aus; now bricht durch Rate-Limit
UND Ruhezeit; Ruhezeit-Fenster künstlich um die lokale Jetztzeit gelegt
→ discard (auch high) und toast (Protokoll-Zeile, kein Provider-Kontakt);
/status- und talk-status-Felder im Default. Harness-Basis: TALK_RATE_LIMIT=0s
— die Task-04-Semantik-Tests erwarten dichtes Durchspielen, Gesetz-Tests
überschreiben bewusst.
This commit is contained in:
m3ta-chiron committed 2026-10-18 17:40:51 +02:00
1 parent b56c8abfae
commit 5979d45710
2 files changed
+357

No files matched your search

+26
View File
@@ -188,6 +188,25 @@ func (f *fakeProvider) waitArrived(t *testing.T, n int) {
t.Fatalf("nur %d von %d Ankünften am Fake innerhalb 5 s", len(f.snapshot()), n)
}
// arrivedCount zählt die angekommten Synthese-Requests (auch abgebrochene)
// — Beobachtungspunkt für „genau N spielen, der Rest parkt/verfällt".
func (f *fakeProvider) arrivedCount() int {
f.mu.Lock()
defer f.mu.Unlock()
return len(f.arrived)
}
// assertNoFurtherArrivals prüft, dass innerhalb der Frist kein weiterer
// Synthese-Request ankommt (geparkte/verworfene Ansagen bleiben stumm).
func (f *fakeProvider) assertNoFurtherArrivals(t *testing.T, wait time.Duration) {
t.Helper()
n := f.arrivedCount()
time.Sleep(wait)
if got := f.arrivedCount(); got != n {
t.Fatalf("%d zusätzliche Ankünfte (want keine) — Treffer: %+v", got-n, f.snapshot())
}
}
// waitHits pollt, bis n Requests abgeschlossen wurden (Abbrüche zählen).
func (f *fakeProvider) waitHits(t *testing.T, n int) []fakeHit {
t.Helper()
@@ -296,6 +315,12 @@ func (d *daemonProc) stop(t *testing.T) {
// damit unter <root>/talk), audio.sink=null und der Fake-Provider als
// ElevenLabs-Endpunkt. port=1 heißt „garantiert toter Daemon" (Verbindung
// wird sofort abgelehnt).
//
// TALK_RATE_LIMIT=0s ist der Basis-Default der Prozessgrenzen-Tests: Die
// Task-04-Semantik-Tests (Serialisierung, Priorität, …) enqueueen dicht
// hintereinander und erwarten sofortiges Durchspielen — das Gesetz
// (Default 30 s) würde sie parken. Die Gesetz-Tests in ratelimit_test.go
// überschreiben den Wert bewusst per extra.
func daemonEnv(root string, port int, fakeURL string, extra map[string]string) []string {
env := make([]string, 0, 32)
for _, kv := range os.Environ() {
@@ -312,6 +337,7 @@ func daemonEnv(root string, port int, fakeURL string, extra map[string]string) [
"TALK_ELEVENLABS_ENDPOINT": fakeURL,
"TALK_EDGE_ENDPOINT": "ws://127.0.0.1:1/", // Kette soll nie auf echte Fremd-Endpunkte fallen
"TALK_PORT": strconv.Itoa(port),
"TALK_RATE_LIMIT": "0s", // Gesetz aus, bis ein Test es anstellt (siehe oben)
}
for k, v := range extra {
set[k] = v