websocket_service_runtime_test.dart 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'dart:math' as math;
  4. import 'dart:typed_data';
  5. import 'package:flutter_test/flutter_test.dart';
  6. import 'package:asr_client/models/websocket_message.dart';
  7. import 'package:asr_client/services/websocket_service.dart';
  8. String _generateSineWaveBase64() {
  9. const sampleRate = 16000;
  10. const durationMs = 500;
  11. const frequency = 440.0;
  12. const amplitude = 1000.0;
  13. final sampleCount = (sampleRate * durationMs / 1000).round();
  14. final buffer = Int16List(sampleCount);
  15. for (var i = 0; i < sampleCount; i++) {
  16. final value =
  17. amplitude * math.sin(2 * math.pi * frequency * i / sampleRate);
  18. buffer[i] = value.toInt().clamp(-32768, 32767);
  19. }
  20. return base64Encode(buffer.buffer.asUint8List());
  21. }
  22. void main() {
  23. group('WebSocketService runtime verification', () {
  24. test('connects to ASR server and receives transcript', () async {
  25. final service = WebSocketServiceImpl();
  26. addTearDown(service.dispose);
  27. try {
  28. final socket = await Socket.connect(
  29. 'localhost',
  30. 8765,
  31. ).timeout(const Duration(seconds: 2));
  32. await socket.close();
  33. } on Exception {
  34. markTestSkipped('ASR server is not running on localhost:8765');
  35. }
  36. await service.connect('ws://127.0.0.1:8765');
  37. final connected = await service.messageStream
  38. .firstWhere((msg) => msg is ConnectedMessage)
  39. .timeout(const Duration(seconds: 10));
  40. expect(connected, isA<ConnectedMessage>());
  41. // Feed a few audio chunks so the server has data to transcribe.
  42. final audioData = _generateSineWaveBase64();
  43. for (var i = 0; i < 6; i++) {
  44. service.send(AudioMessage(data: audioData));
  45. await Future.delayed(const Duration(milliseconds: 300));
  46. }
  47. service.send(const TranscribeMessage());
  48. final transcript = await service.messageStream
  49. .firstWhere((msg) => msg is TranscriptMessage || msg is ErrorMessage)
  50. .timeout(const Duration(seconds: 30));
  51. expect(transcript, isNotNull);
  52. }, tags: ['runtime']);
  53. });
  54. }