|
|
|
@ -1,4 +1,5 @@
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
|
|
|
|
|
|
@ -23,6 +24,8 @@ class _FakeMeshCoreConnector extends MeshCoreConnector {
|
|
|
|
String? fakeActiveUsbPort;
|
|
|
|
String? fakeActiveUsbPort;
|
|
|
|
String? fakeActiveUsbPortDisplayLabel;
|
|
|
|
String? fakeActiveUsbPortDisplayLabel;
|
|
|
|
bool fakeUsbTransportConnected = false;
|
|
|
|
bool fakeUsbTransportConnected = false;
|
|
|
|
|
|
|
|
Future<List<String>> Function()? listUsbPortsImpl;
|
|
|
|
|
|
|
|
Future<void> Function({required String portName})? connectUsbImpl;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
MeshCoreConnectionState get state => initialState;
|
|
|
|
MeshCoreConnectionState get state => initialState;
|
|
|
|
@ -38,13 +41,21 @@ class _FakeMeshCoreConnector extends MeshCoreConnector {
|
|
|
|
bool get isUsbTransportConnected => fakeUsbTransportConnected;
|
|
|
|
bool get isUsbTransportConnected => fakeUsbTransportConnected;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Future<List<String>> listUsbPorts() async => List<String>.from(_ports);
|
|
|
|
Future<List<String>> listUsbPorts() async {
|
|
|
|
|
|
|
|
if (listUsbPortsImpl != null) {
|
|
|
|
|
|
|
|
return listUsbPortsImpl!();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return List<String>.from(_ports);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Future<void> connectUsb({
|
|
|
|
Future<void> connectUsb({
|
|
|
|
required String portName,
|
|
|
|
required String portName,
|
|
|
|
int baudRate = 115200,
|
|
|
|
int baudRate = 115200,
|
|
|
|
}) async {
|
|
|
|
}) async {
|
|
|
|
|
|
|
|
if (connectUsbImpl != null) {
|
|
|
|
|
|
|
|
return connectUsbImpl!(portName: portName);
|
|
|
|
|
|
|
|
}
|
|
|
|
connectUsbCalls += 1;
|
|
|
|
connectUsbCalls += 1;
|
|
|
|
lastConnectPortName = portName;
|
|
|
|
lastConnectPortName = portName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -145,4 +156,50 @@ void main() {
|
|
|
|
expect(find.widgetWithText(FloatingActionButton, 'USB'), findsNothing);
|
|
|
|
expect(find.widgetWithText(FloatingActionButton, 'USB'), findsNothing);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
group('Error Handling', () {
|
|
|
|
|
|
|
|
testWidgets('shows error message when listing ports fails', (tester) async {
|
|
|
|
|
|
|
|
final connector = _FakeMeshCoreConnector();
|
|
|
|
|
|
|
|
connector.listUsbPortsImpl = () async {
|
|
|
|
|
|
|
|
throw PlatformException(
|
|
|
|
|
|
|
|
code: 'usb_permission_denied',
|
|
|
|
|
|
|
|
message: 'Permission denied',
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await tester.pumpWidget(
|
|
|
|
|
|
|
|
_buildTestApp(connector: connector, child: const UsbScreen()),
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(
|
|
|
|
|
|
|
|
find.text('USB permission was denied.'),
|
|
|
|
|
|
|
|
findsOneWidget,
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
testWidgets(
|
|
|
|
|
|
|
|
'connection failure completes without leaving loading state',
|
|
|
|
|
|
|
|
(tester) async {
|
|
|
|
|
|
|
|
final connector = _FakeMeshCoreConnector(
|
|
|
|
|
|
|
|
ports: <String>['COM1'],
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
var connectAttempted = false;
|
|
|
|
|
|
|
|
connector.connectUsbImpl = ({required String portName}) async {
|
|
|
|
|
|
|
|
connectAttempted = true;
|
|
|
|
|
|
|
|
throw PlatformException(code: 'usb_busy', message: 'Device is busy');
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await tester.pumpWidget(
|
|
|
|
|
|
|
|
_buildTestApp(connector: connector, child: const UsbScreen()),
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await tester.tap(find.widgetWithText(FilledButton, 'Connect'));
|
|
|
|
|
|
|
|
await tester.pumpAndSettle();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(connectAttempted, isTrue);
|
|
|
|
|
|
|
|
expect(find.byType(CircularProgressIndicator), findsNothing);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|