[flutter_tools] Fix parsing of existing DDS URIs from exceptions (#119506)
* [flutter_tools] Fix parsing of existing DDS URIs from exceptions Fixes #118609. * Fix formatting Co-authored-by: Christopher Fujino <fujino@google.com> * Fix formatting Co-authored-by: Christopher Fujino <fujino@google.com> --------- Co-authored-by: Christopher Fujino <fujino@google.com>
This commit is contained in:
parent
df0ab40ece
commit
67d07a6de4
@ -71,9 +71,21 @@ class DartDevelopmentService {
|
|||||||
logger.printTrace('Warning: Failed to start DDS: ${e.message}');
|
logger.printTrace('Warning: Failed to start DDS: ${e.message}');
|
||||||
if (e.errorCode == dds.DartDevelopmentServiceException.existingDdsInstanceError) {
|
if (e.errorCode == dds.DartDevelopmentServiceException.existingDdsInstanceError) {
|
||||||
try {
|
try {
|
||||||
_existingDdsUri = Uri.parse(
|
// First try to use the new field to avoid parsing from the message.
|
||||||
e.message.split(' ').firstWhere((String e) => e.startsWith('http'))
|
_existingDdsUri = e is dds.ExistingDartDevelopmentServiceException ? e.ddsUri : null;
|
||||||
);
|
|
||||||
|
// Otherwise, fall back to parsing from the exception (old DDS).
|
||||||
|
// This is not completely reliable which is why the new field above
|
||||||
|
// was added.
|
||||||
|
if (_existingDdsUri == null) {
|
||||||
|
String parsedUrl = e.message.split(' ').firstWhere((String e) => e.startsWith('http'));
|
||||||
|
// Trim trailing full stops from the message.
|
||||||
|
// https://github.com/flutter/flutter/issues/118609.
|
||||||
|
if (parsedUrl.endsWith('.')) {
|
||||||
|
parsedUrl = parsedUrl.substring(0, parsedUrl.length - 1);
|
||||||
|
}
|
||||||
|
_existingDdsUri ??= Uri.parse(parsedUrl);
|
||||||
|
}
|
||||||
} on StateError {
|
} on StateError {
|
||||||
if (e.message.contains('Existing VM service clients prevent DDS from taking control.')) {
|
if (e.message.contains('Existing VM service clients prevent DDS from taking control.')) {
|
||||||
throwToolExit('${e.message}. Please rebuild your application with a newer version of Flutter.');
|
throwToolExit('${e.message}. Please rebuild your application with a newer version of Flutter.');
|
||||||
|
@ -2158,6 +2158,73 @@ flutter:
|
|||||||
}) async => FakeVmServiceHost(requests: <VmServiceExpectation>[]).vmService,
|
}) async => FakeVmServiceHost(requests: <VmServiceExpectation>[]).vmService,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
testUsingContext('Uses existing DDS URI from exception field', () => testbed.run(() async {
|
||||||
|
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
|
||||||
|
final FakeDevice device = FakeDevice()
|
||||||
|
..dds = DartDevelopmentService();
|
||||||
|
ddsLauncherCallback = (Uri uri, {bool enableAuthCodes = true, bool ipv6 = false, Uri? serviceUri, List<String> cachedUserTags = const <String>[], dds.UriConverter? uriConverter}) {
|
||||||
|
throw dds.DartDevelopmentServiceException.existingDdsInstance(
|
||||||
|
'Existing DDS at http://localhost/existingDdsInMessage.',
|
||||||
|
ddsUri: Uri.parse('http://localhost/existingDdsInField'),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
final TestFlutterDevice flutterDevice = TestFlutterDevice(
|
||||||
|
device,
|
||||||
|
observatoryUris: Stream<Uri>.value(testUri),
|
||||||
|
);
|
||||||
|
final Completer<void> done = Completer<void>();
|
||||||
|
await runZonedGuarded(
|
||||||
|
() => flutterDevice.connect(allowExistingDdsInstance: true).then((_) => done.complete()),
|
||||||
|
(_, __) => done.complete(),
|
||||||
|
);
|
||||||
|
await done.future;
|
||||||
|
expect(device.dds.uri, Uri.parse('http://localhost/existingDdsInField'));
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
VMServiceConnector: () => (Uri httpUri, {
|
||||||
|
ReloadSources? reloadSources,
|
||||||
|
Restart? restart,
|
||||||
|
CompileExpression? compileExpression,
|
||||||
|
GetSkSLMethod? getSkSLMethod,
|
||||||
|
PrintStructuredErrorLogMethod? printStructuredErrorLogMethod,
|
||||||
|
io.CompressionOptions? compression,
|
||||||
|
Device? device,
|
||||||
|
required Logger logger,
|
||||||
|
}) async => FakeVmServiceHost(requests: <VmServiceExpectation>[]).vmService,
|
||||||
|
}));
|
||||||
|
|
||||||
|
testUsingContext('Falls back to existing DDS URI from exception message', () => testbed.run(() async {
|
||||||
|
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
|
||||||
|
final FakeDevice device = FakeDevice()
|
||||||
|
..dds = DartDevelopmentService();
|
||||||
|
ddsLauncherCallback = (Uri uri, {bool enableAuthCodes = true, bool ipv6 = false, Uri? serviceUri, List<String> cachedUserTags = const <String>[], dds.UriConverter? uriConverter}) {
|
||||||
|
throw dds.DartDevelopmentServiceException.existingDdsInstance(
|
||||||
|
'Existing DDS at http://localhost/existingDdsInMessage.',
|
||||||
|
);
|
||||||
|
};
|
||||||
|
final TestFlutterDevice flutterDevice = TestFlutterDevice(
|
||||||
|
device,
|
||||||
|
observatoryUris: Stream<Uri>.value(testUri),
|
||||||
|
);
|
||||||
|
final Completer<void>done = Completer<void>();
|
||||||
|
await runZonedGuarded(
|
||||||
|
() => flutterDevice.connect(allowExistingDdsInstance: true).then((_) => done.complete()),
|
||||||
|
(_, __) => done.complete(),
|
||||||
|
);
|
||||||
|
await done.future;
|
||||||
|
expect(device.dds.uri, Uri.parse('http://localhost/existingDdsInMessage'));
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
VMServiceConnector: () => (Uri httpUri, {
|
||||||
|
ReloadSources? reloadSources,
|
||||||
|
Restart? restart,
|
||||||
|
CompileExpression? compileExpression,
|
||||||
|
GetSkSLMethod? getSkSLMethod,
|
||||||
|
PrintStructuredErrorLogMethod? printStructuredErrorLogMethod,
|
||||||
|
io.CompressionOptions? compression,
|
||||||
|
Device? device,
|
||||||
|
required Logger logger,
|
||||||
|
}) async => FakeVmServiceHost(requests: <VmServiceExpectation>[]).vmService,
|
||||||
|
}));
|
||||||
|
|
||||||
testUsingContext('Host VM service ipv6 defaults', () => testbed.run(() async {
|
testUsingContext('Host VM service ipv6 defaults', () => testbed.run(() async {
|
||||||
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
|
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
|
||||||
final FakeDevice device = FakeDevice()
|
final FakeDevice device = FakeDevice()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user