Check VM service URI is valid before attempting to start DDS (Re-upload #73998) (#74280)
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 5b9bad2..82d7489 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -242,6 +242,20 @@ completer.completeError('failed to connect to $observatoryUri', st); } } + // First check if the VM service is actually listening on observatoryUri as + // this may not be the case when scraping logcat for URIs. If this URI is + // from an old application instance, we shouldn't try and start DDS. + try { + service = await connectToVmService(observatoryUri); + service.dispose(); + } on Exception catch (exception) { + globals.printTrace('Fail to connect to service protocol: $observatoryUri: $exception'); + if (!completer.isCompleted && !_isListeningForObservatoryUri) { + completer.completeError('failed to connect to $observatoryUri'); + } + return; + } + // This first try block is meant to catch errors that occur during DDS startup // (e.g., failure to bind to a port, failure to connect to the VM service, // attaching to a VM service with existing clients, etc.).
diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart index 3166445..7289073 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -2889,6 +2889,16 @@ if (!caught) { fail('Expected a StateError to be thrown.'); } + }, overrides: <Type, Generator>{ + VMServiceConnector: () => (Uri httpUri, { + ReloadSources reloadSources, + Restart restart, + CompileExpression compileExpression, + GetSkSLMethod getSkSLMethod, + PrintStructuredErrorLogMethod printStructuredErrorLogMethod, + io.CompressionOptions compression, + Device device, + }) async => mockVMService, })); testUsingContext('nextPlatform moves through expected platforms', () {