From 81a60d5fd4ade71ef7db37566a52348f8989b157 Mon Sep 17 00:00:00 2001 From: Mathias Date: Fri, 2 Oct 2026 16:41:38 +0200 Subject: [PATCH] test: a per-engine deadline so a wedged primary reaches the fallback (red; adversarial review F4) Co-Authored-By: Claude Sonnet 5.5 --- cmd/tapir/uploads_timeout_test.go | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 cmd/tapir/uploads_timeout_test.go diff --git a/cmd/tapir/uploads_timeout_test.go b/cmd/tapir/uploads_timeout_test.go new file mode 100644 index 0000000..f25d896 --- /dev/null +++ b/cmd/tapir/uploads_timeout_test.go @@ -0,0 +1,45 @@ +package main + +import ( + "context" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// The wiring of the per-engine deadline: a gateway whose primary model never answers +// must still reach the fallback model inside the job's own deadline (adversarial review +// F4). The fake gateway answers per model from the multipart `model` field. + +func TestBuildTranscriber_AWedgedPrimaryReachesTheFallbackBeforeTheJobDeadline(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _ = r.ParseMultipartForm(1 << 20) + if r.FormValue("model") == "iguana/kb-whisper" { + <-r.Context().Done() // wedged: never answers + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"text":"hej","duration":1,"segments":[{"start":0,"end":1,"text":"hej"}]}`)) + })) + defer srv.Close() + cfg := uploadCfg(t, true) + cfg.GatewayURL = srv.URL + cfg.TranscribeModel = "iguana/kb-whisper" + cfg.TranscribeFallbackModel = "berget/kb-whisper" + cfg.TranscribeEngineTimeout = 150 * time.Millisecond + wav := filepath.Join(t.TempDir(), "a.wav") + require.NoError(t, os.WriteFile(wav, []byte("RIFF....WAVEfmt "), 0o600)) + job, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + + got, err := buildTranscriber(cfg).Transcribe(job, wav) + + require.NoError(t, err, "the wedged primary used the whole job and the fallback never ran") + assert.Equal(t, "berget/kb-whisper", got.Endpoint) +}