From a050079ade089204eafd22d0cee1b053ee6f3116 Mon Sep 17 00:00:00 2001 From: viettranx Date: Thu, 16 Apr 2026 18:33:02 +0700 Subject: [PATCH] fix(test): resolve data race in TTS concurrent test mock Add stateless flag to mockTTSProvider to skip capturing opts during concurrent tests. Prevents race on capturedOpts field. --- internal/http/tts_test.go | 5 ++++- internal/http/tts_update_manager_test.go | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/internal/http/tts_test.go b/internal/http/tts_test.go index a0bb97b7..3660a916 100644 --- a/internal/http/tts_test.go +++ b/internal/http/tts_test.go @@ -25,12 +25,15 @@ type mockTTSProvider struct { result *audio.SynthResult err error block bool // if true, blocks until ctx is cancelled (timeout test) + stateless bool // if true, don't capture opts (for concurrent tests) } func (m *mockTTSProvider) Name() string { return m.name } func (m *mockTTSProvider) Synthesize(ctx context.Context, text string, opts audio.TTSOptions) (*audio.SynthResult, error) { - m.capturedOpts = opts + if !m.stateless { + m.capturedOpts = opts + } if m.block { <-ctx.Done() return nil, ctx.Err() diff --git a/internal/http/tts_update_manager_test.go b/internal/http/tts_update_manager_test.go index 97fe1073..d8d93694 100644 --- a/internal/http/tts_update_manager_test.go +++ b/internal/http/tts_update_manager_test.go @@ -66,9 +66,9 @@ func TestTTSHandler_UpdateManager_SwapsProvider(t *testing.T) { func TestTTSHandler_UpdateManager_ConcurrentSafe(t *testing.T) { setupTestToken(t, "") // dev mode - // Use stateless mock — each provider is separate instance + // Use stateless mock to avoid race on capturedOpts mgr := audio.NewManager(audio.ManagerConfig{Primary: "mock"}) - mgr.RegisterTTS(&mockTTSProvider{name: "mock"}) + mgr.RegisterTTS(&mockTTSProvider{name: "mock", stateless: true}) h := NewTTSHandler(mgr) mux := http.NewServeMux() @@ -96,7 +96,7 @@ func TestTTSHandler_UpdateManager_ConcurrentSafe(t *testing.T) { go func() { defer wg.Done() newMgr := audio.NewManager(audio.ManagerConfig{Primary: "mock-new"}) - newMgr.RegisterTTS(&mockTTSProvider{name: "mock-new"}) + newMgr.RegisterTTS(&mockTTSProvider{name: "mock-new", stateless: true}) h.UpdateManager(newMgr) }()