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:
1 parent
b56c8abfae
commit
5979d45710
2 files changed
+357
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user