Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
107 lines
3.6 KiB
Dart
107 lines
3.6 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:qlyra/core/calls/audio_devices.dart';
|
|
import 'package:qlyra/core/calls/pulse_audio.dart';
|
|
import 'package:qlyra/core/config/call_no_mute.dart';
|
|
|
|
const _deviceId = 'mic-test-0';
|
|
|
|
const _sourcesJson = '''
|
|
[
|
|
{
|
|
"name": "alsa_input.test-device",
|
|
"description": "(null)",
|
|
"monitor_source": "",
|
|
"properties": {"device.description": "Тестовая звуковая карта"}
|
|
},
|
|
{
|
|
"name": "alsa_output.test-device.monitor",
|
|
"description": "(null)",
|
|
"monitor_source": "alsa_output.test-device",
|
|
"properties": {"device.description": "Тестовая звуковая карта"}
|
|
},
|
|
{
|
|
"name": "virtual_sink.monitor",
|
|
"description": "Monitor of Virtual Sink",
|
|
"monitor_source": "virtual_sink",
|
|
"properties": {}
|
|
},
|
|
{
|
|
"name": "qlyra_capture_4242",
|
|
"description": "qlyra_capture_4242",
|
|
"monitor_source": "",
|
|
"properties": {}
|
|
}
|
|
]
|
|
''';
|
|
|
|
void main() {
|
|
tearDown(() {
|
|
debugDefaultTargetPlatformOverride = null;
|
|
CallNoMute.enabled = false;
|
|
});
|
|
|
|
test('--no-mute включается только своим флагом', () {
|
|
CallNoMute.enabled = false;
|
|
CallNoMute.parse(const ['--debug-test']);
|
|
expect(CallNoMute.enabled, isFalse);
|
|
|
|
CallNoMute.parse(const ['--debug-test', '--no-mute']);
|
|
expect(CallNoMute.enabled, isTrue);
|
|
});
|
|
|
|
test('desktop выбирает вход через sourceId', () {
|
|
debugDefaultTargetPlatformOverride = TargetPlatform.linux;
|
|
expect(AudioDevices.switchesInsideEngine, isFalse);
|
|
expect(AudioDevices.micConstraints(_deviceId), <String, dynamic>{
|
|
'optional': [
|
|
{'sourceId': _deviceId},
|
|
],
|
|
});
|
|
});
|
|
|
|
test('мобильные платформы переключают вход внутри движка', () {
|
|
debugDefaultTargetPlatformOverride = TargetPlatform.android;
|
|
expect(AudioDevices.switchesInsideEngine, isTrue);
|
|
expect(AudioDevices.micConstraints(_deviceId), isTrue);
|
|
});
|
|
|
|
test('без выбранного устройства ограничений нет', () {
|
|
debugDefaultTargetPlatformOverride = TargetPlatform.linux;
|
|
expect(AudioDevices.micConstraints(null), isTrue);
|
|
expect(AudioDevices.micConstraints(''), isTrue);
|
|
});
|
|
|
|
test('захват монитора глушит шумодав и АРУ, но оставляет эхоподавление', () {
|
|
debugDefaultTargetPlatformOverride = TargetPlatform.linux;
|
|
final constraints =
|
|
AudioDevices.micConstraints(_deviceId, monitorCapture: true)
|
|
as Map<String, dynamic>;
|
|
expect(constraints['optional'], [
|
|
{'sourceId': _deviceId},
|
|
]);
|
|
expect(constraints['echoCancellation'], isTrue);
|
|
expect(constraints['noiseSuppression'], isFalse);
|
|
expect(constraints['autoGainControl'], isFalse);
|
|
expect(constraints['highpassFilter'], isFalse);
|
|
});
|
|
|
|
test('источники pulse разбираются вместе с мониторами', () {
|
|
final sources = PulseAudio.parseSources(_sourcesJson);
|
|
expect(sources.map((s) => s.name), [
|
|
'alsa_input.test-device',
|
|
'alsa_output.test-device.monitor',
|
|
'virtual_sink.monitor',
|
|
]);
|
|
expect(sources[0].isMonitor, isFalse);
|
|
expect(sources[0].label, 'Тестовая звуковая карта');
|
|
expect(sources[1].isMonitor, isTrue);
|
|
expect(sources[1].label, 'Monitor of Тестовая звуковая карта');
|
|
expect(sources[2].label, 'Monitor of Virtual Sink');
|
|
});
|
|
|
|
test('битый вывод pactl не роняет разбор', () {
|
|
expect(PulseAudio.parseSources('не json'), isEmpty);
|
|
});
|
|
}
|