From 735f6eec2caf0c123d6328cf2a9e6f1be21ee274 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 28 Oct 2020 15:09:46 -0700 Subject: [PATCH] [flutter_tools] support ws scheme in use-existing-app (#69244) --- .../lib/src/drive/drive_service.dart | 12 ++++++-- .../drive/drive_service_test.dart | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/drive/drive_service.dart b/packages/flutter_tools/lib/src/drive/drive_service.dart index 884966cc71d..f8e64c53aad 100644 --- a/packages/flutter_tools/lib/src/drive/drive_service.dart +++ b/packages/flutter_tools/lib/src/drive/drive_service.dart @@ -191,11 +191,17 @@ class FlutterDriverService extends DriverService { DebuggingOptions debuggingOptions, bool ipv6, ) async { - _vmServiceUri = vmServiceUri.toString(); + Uri uri; + if (vmServiceUri.scheme == 'ws') { + uri = vmServiceUri.replace(scheme: 'http', path: vmServiceUri.path.replaceFirst('ws/', '')); + } else { + uri = vmServiceUri; + } + _vmServiceUri = uri.toString(); _device = device; try { await device.dds.startDartDevelopmentService( - vmServiceUri, + uri, debuggingOptions.ddsPort, ipv6, debuggingOptions.disableServiceAuthCodes, @@ -206,7 +212,7 @@ class FlutterDriverService extends DriverService { // application, DDS will already be running remotely and this call will fail. // This can be ignored to continue to use the existing remote DDS instance. } - _vmService = await _vmServiceConnector(Uri.parse(_vmServiceUri), device: _device); + _vmService = await _vmServiceConnector(uri, device: _device); final DeviceLogReader logReader = await device.getLogReader(app: _applicationPackage); logReader.logLines.listen(_logger.printStatus); diff --git a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart index 20e6c8dba3d..a21602e94f6 100644 --- a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart +++ b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart @@ -280,6 +280,31 @@ void main() { await driverService.stop(); }); + testWithoutContext('Can connect to existing application using ws URI', () async { + final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost(requests: [ + getVM, + getVM, + const FakeVmServiceRequest( + method: 'ext.flutter.exit', + args: { + 'isolateId': '1', + } + ) + ]); + final FakeProcessManager processManager = FakeProcessManager.list([]); + final DriverService driverService = setUpDriverService(processManager: processManager, vmService: fakeVmServiceHost.vmService); + final FakeDevice device = FakeDevice(LaunchResult.failed()); + + await driverService.reuseApplication( + Uri.parse('ws://127.0.0.1:63426/1UasC_ihpXY=/ws/'), + device, + DebuggingOptions.enabled(BuildInfo.debug), + false, + ); + await driverService.stop(); + }); + + testWithoutContext('Does not call flutterExit on device types that do not support it', () async { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost(requests: [ getVM, @@ -321,6 +346,9 @@ FlutterDriverService setUpDriverService({ Object compression, Device device, }) async { + if (httpUri.scheme != 'http') { + fail('Expected an HTTP scheme, found $httpUri'); + } return vmService; } );