bluetooth connectivity layer added
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:dmc_app/transport/bluetooth/bluetooth_device_info.dart';
|
||||
import 'package:dmc_app/transport/bluetooth/bluetooth_device_selector.dart';
|
||||
|
||||
void main() {
|
||||
const remembered = BluetoothDeviceInfo(address: '11:11:11:11:11:11', name: 'Alt-Geraet');
|
||||
const mLrs = BluetoothDeviceInfo(address: '22:22:22:22:22:22', name: 'mLRS-a1b2');
|
||||
const other = BluetoothDeviceInfo(address: '33:33:33:33:33:33', name: 'Kopfhoerer');
|
||||
|
||||
test('gemerkte MAC-Adresse hat Vorrang vor mLRS-Praefix (Doku 3.2a)', () {
|
||||
final result = selectBluetoothDevice(
|
||||
bondedDevices: [other, mLrs, remembered],
|
||||
rememberedAddress: remembered.address,
|
||||
);
|
||||
|
||||
expect(result, isA<BluetoothDeviceResolved>());
|
||||
expect((result as BluetoothDeviceResolved).device, remembered);
|
||||
});
|
||||
|
||||
test(
|
||||
'ohne (noch gueltige) gemerkte Adresse gewinnt das erste Geraet mit '
|
||||
'mLRS-Praefix (Doku 3.2b)', () {
|
||||
final result = selectBluetoothDevice(
|
||||
bondedDevices: [other, mLrs],
|
||||
rememberedAddress: null,
|
||||
);
|
||||
|
||||
expect(result, isA<BluetoothDeviceResolved>());
|
||||
expect((result as BluetoothDeviceResolved).device, mLrs);
|
||||
});
|
||||
|
||||
test(
|
||||
'gemerkte Adresse ist nicht mehr gekoppelt -> faellt auf mLRS-Praefix '
|
||||
'zurueck statt zu scheitern', () {
|
||||
final result = selectBluetoothDevice(
|
||||
bondedDevices: [other, mLrs],
|
||||
rememberedAddress: '99:99:99:99:99:99',
|
||||
);
|
||||
|
||||
expect(result, isA<BluetoothDeviceResolved>());
|
||||
expect((result as BluetoothDeviceResolved).device, mLrs);
|
||||
});
|
||||
|
||||
test(
|
||||
'weder gemerkte Adresse noch mLRS-Praefix -> Auswahlliste noetig '
|
||||
'(Doku 3.2c)', () {
|
||||
final result = selectBluetoothDevice(
|
||||
bondedDevices: [other],
|
||||
rememberedAddress: null,
|
||||
);
|
||||
|
||||
expect(result, isA<BluetoothDeviceSelectionRequired>());
|
||||
expect(
|
||||
(result as BluetoothDeviceSelectionRequired).candidates,
|
||||
[other],
|
||||
);
|
||||
});
|
||||
|
||||
test('keine gekoppelten Geraete -> Auswahlliste ist leer, kein Fehler', () {
|
||||
final result = selectBluetoothDevice(
|
||||
bondedDevices: const [],
|
||||
rememberedAddress: null,
|
||||
);
|
||||
|
||||
expect(result, isA<BluetoothDeviceSelectionRequired>());
|
||||
expect((result as BluetoothDeviceSelectionRequired).candidates, isEmpty);
|
||||
});
|
||||
|
||||
test('Praefix-Pruefung ist case-sensitiv wie in der Doku spezifiziert', () {
|
||||
const lowerCase = BluetoothDeviceInfo(
|
||||
address: '44:44:44:44:44:44',
|
||||
name: 'mlrs-nicht-erkannt',
|
||||
);
|
||||
|
||||
final result = selectBluetoothDevice(
|
||||
bondedDevices: [lowerCase],
|
||||
rememberedAddress: null,
|
||||
);
|
||||
|
||||
expect(result, isA<BluetoothDeviceSelectionRequired>());
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:dmc_app/transport/link_transport.dart';
|
||||
import 'package:dmc_app/transport/loopback/loopback_transport.dart';
|
||||
|
||||
void main() {
|
||||
test('connect() durchlaeuft connecting -> connected', () async {
|
||||
final transport = LoopbackTransport();
|
||||
final states = <LinkState>[];
|
||||
transport.state.listen(states.add);
|
||||
|
||||
await transport.connect();
|
||||
await Future<void>.delayed(Duration.zero);
|
||||
|
||||
expect(states, [LinkState.connecting, LinkState.connected]);
|
||||
transport.dispose();
|
||||
});
|
||||
|
||||
test('feed() eingespeiste Bytes kommen ueber incoming an', () async {
|
||||
final transport = LoopbackTransport();
|
||||
await transport.connect();
|
||||
|
||||
final received = <Uint8List>[];
|
||||
transport.incoming.listen(received.add);
|
||||
|
||||
transport.feed(Uint8List.fromList([1, 2, 3]));
|
||||
await Future<void>.delayed(Duration.zero);
|
||||
|
||||
expect(received, [
|
||||
Uint8List.fromList([1, 2, 3]),
|
||||
]);
|
||||
transport.dispose();
|
||||
});
|
||||
|
||||
test('send() sammelt gesendete Bytes in sentData', () async {
|
||||
final transport = LoopbackTransport();
|
||||
await transport.connect();
|
||||
|
||||
await transport.send(Uint8List.fromList([9, 9]));
|
||||
|
||||
expect(transport.sentData, [
|
||||
Uint8List.fromList([9, 9]),
|
||||
]);
|
||||
transport.dispose();
|
||||
});
|
||||
|
||||
test('simulateError() meldet Grund/Nachricht und LinkState.error', () async {
|
||||
final transport = LoopbackTransport();
|
||||
await transport.connect();
|
||||
|
||||
transport.simulateError(LinkErrorReason.connectionFailed, 'Testfehler');
|
||||
|
||||
expect(transport.lastErrorReason, LinkErrorReason.connectionFailed);
|
||||
expect(transport.lastErrorMessage, 'Testfehler');
|
||||
expect(transport.currentState, LinkState.error);
|
||||
transport.dispose();
|
||||
});
|
||||
|
||||
test('disconnect() setzt LinkState.disconnected', () async {
|
||||
final transport = LoopbackTransport();
|
||||
await transport.connect();
|
||||
|
||||
await transport.disconnect();
|
||||
|
||||
expect(transport.currentState, LinkState.disconnected);
|
||||
transport.dispose();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user