Skip to content

Commit f258f5f

Browse files
committed
test: add FunASR backend smoke coverage
Signed-off-by: LauraGPT <LauraGPT@users.noreply.github.com>
1 parent 8105d38 commit f258f5f

1 file changed

Lines changed: 135 additions & 0 deletions

File tree

backend/python/funasr/test.py

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import importlib
2+
import os
3+
import sys
4+
import types
5+
import unittest
6+
7+
8+
class _Reply:
9+
def __init__(self, message=b""):
10+
self.message = message
11+
12+
13+
class _Result:
14+
def __init__(self, message="", success=False):
15+
self.message = message
16+
self.success = success
17+
18+
19+
class _TranscriptSegment:
20+
def __init__(self, id=0, start=0, end=0, text=""):
21+
self.id = id
22+
self.start = start
23+
self.end = end
24+
self.text = text
25+
26+
27+
class _TranscriptResult:
28+
def __init__(self, segments=None, text=""):
29+
self.segments = segments or []
30+
self.text = text
31+
32+
33+
class _FakeBackendServicer:
34+
pass
35+
36+
37+
class _FakeTorch:
38+
cuda = types.SimpleNamespace(is_available=lambda: False)
39+
backends = types.SimpleNamespace(mps=types.SimpleNamespace(is_available=lambda: False))
40+
41+
42+
class _FakeAutoModel:
43+
instances = []
44+
45+
def __init__(self, **kwargs):
46+
self.kwargs = kwargs
47+
self.generate_calls = []
48+
_FakeAutoModel.instances.append(self)
49+
50+
def generate(self, **kwargs):
51+
self.generate_calls.append(kwargs)
52+
return [{"text": "hello"}, {"text": " world"}]
53+
54+
55+
def _install_stubs():
56+
sys.modules["backend_pb2"] = types.SimpleNamespace(
57+
Reply=_Reply,
58+
Result=_Result,
59+
TranscriptSegment=_TranscriptSegment,
60+
TranscriptResult=_TranscriptResult,
61+
)
62+
sys.modules["backend_pb2_grpc"] = types.SimpleNamespace(
63+
BackendServicer=_FakeBackendServicer,
64+
add_BackendServicer_to_server=lambda *args, **kwargs: None,
65+
)
66+
sys.modules["grpc"] = types.SimpleNamespace(
67+
RpcMethodHandler=object,
68+
ServerInterceptor=object,
69+
StatusCode=types.SimpleNamespace(UNAUTHENTICATED="UNAUTHENTICATED"),
70+
aio=types.SimpleNamespace(ServerInterceptor=object),
71+
server=lambda *args, **kwargs: None,
72+
)
73+
sys.modules["torch"] = _FakeTorch
74+
sys.modules["funasr"] = types.SimpleNamespace(AutoModel=_FakeAutoModel)
75+
76+
77+
def _load_backend():
78+
_install_stubs()
79+
sys.modules.pop("backend", None)
80+
_FakeAutoModel.instances.clear()
81+
return importlib.import_module("backend")
82+
83+
84+
class TestFunASRBackend(unittest.TestCase):
85+
def test_health_returns_ok(self):
86+
backend = _load_backend()
87+
servicer = backend.BackendServicer()
88+
89+
reply = servicer.Health(types.SimpleNamespace(), None)
90+
91+
self.assertEqual(reply.message, b"OK")
92+
93+
def test_load_model_uses_default_sensevoice_model_on_cpu(self):
94+
backend = _load_backend()
95+
servicer = backend.BackendServicer()
96+
97+
result = servicer.LoadModel(types.SimpleNamespace(Model="", CUDA=False), None)
98+
99+
self.assertTrue(result.success, result.message)
100+
self.assertEqual(result.message, "Model loaded successfully")
101+
self.assertEqual(_FakeAutoModel.instances[0].kwargs["model"], "iic/SenseVoiceSmall")
102+
self.assertEqual(_FakeAutoModel.instances[0].kwargs["vad_model"], "fsmn-vad")
103+
self.assertEqual(_FakeAutoModel.instances[0].kwargs["device"], "cpu")
104+
self.assertTrue(_FakeAutoModel.instances[0].kwargs["disable_update"])
105+
106+
def test_audio_transcription_passes_language_and_builds_segments(self):
107+
backend = _load_backend()
108+
servicer = backend.BackendServicer()
109+
servicer.model = _FakeAutoModel()
110+
audio_path = os.path.abspath(__file__)
111+
request = types.SimpleNamespace(dst=audio_path, language=" zh ")
112+
113+
result = servicer.AudioTranscription(request, None)
114+
115+
self.assertEqual(result.text, "hello world")
116+
self.assertEqual([segment.text for segment in result.segments], ["hello", " world"])
117+
self.assertEqual(servicer.model.generate_calls, [{"input": audio_path, "language": "zh"}])
118+
119+
def test_audio_transcription_missing_file_returns_empty_result(self):
120+
backend = _load_backend()
121+
servicer = backend.BackendServicer()
122+
servicer.model = _FakeAutoModel()
123+
124+
result = servicer.AudioTranscription(
125+
types.SimpleNamespace(dst="/tmp/localai-funasr-missing.wav", language=""),
126+
None,
127+
)
128+
129+
self.assertEqual(result.text, "")
130+
self.assertEqual(result.segments, [])
131+
self.assertEqual(servicer.model.generate_calls, [])
132+
133+
134+
if __name__ == "__main__":
135+
unittest.main()

0 commit comments

Comments
 (0)