Unverified Commit 89ef88c6 authored by Ben Konyi's avatar Ben Konyi Committed by GitHub

Ensure attaching to an application with an existing DDS instance is not...

Ensure attaching to an application with an existing DDS instance is not treated as a fatal error (#70847)
parent e9abf5a9
...@@ -8,7 +8,7 @@ environment: ...@@ -8,7 +8,7 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
camera: 0.5.8+11 camera: 0.5.8+17
characters: 1.1.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" characters: 1.1.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
collection: 1.15.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" collection: 1.15.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
...@@ -19,4 +19,4 @@ dependencies: ...@@ -19,4 +19,4 @@ dependencies:
flutter: flutter:
uses-material-design: true uses-material-design: true
# PUBSPEC CHECKSUM: aa03 # PUBSPEC CHECKSUM: 8f09
...@@ -20,7 +20,7 @@ dependencies: ...@@ -20,7 +20,7 @@ dependencies:
analyzer: 0.40.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" analyzer: 0.40.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
browser_launcher: 0.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" browser_launcher: 0.1.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
built_collection: 4.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" built_collection: 4.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
built_value: 7.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" built_value: 7.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
...@@ -97,4 +97,4 @@ dev_dependencies: ...@@ -97,4 +97,4 @@ dev_dependencies:
node_preamble: 1.4.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" node_preamble: 1.4.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
# PUBSPEC CHECKSUM: bb6f # PUBSPEC CHECKSUM: 7770
...@@ -19,7 +19,8 @@ class DartDevelopmentService { ...@@ -19,7 +19,8 @@ class DartDevelopmentService {
final Logger logger; final Logger logger;
dds.DartDevelopmentService _ddsInstance; dds.DartDevelopmentService _ddsInstance;
Uri get uri => _ddsInstance.uri; Uri get uri => _ddsInstance?.uri ?? _existingDdsUri;
Uri _existingDdsUri;
Future<void> get done => _completer.future; Future<void> get done => _completer.future;
final Completer<void> _completer = Completer<void>(); final Completer<void> _completer = Completer<void>();
...@@ -57,6 +58,11 @@ class DartDevelopmentService { ...@@ -57,6 +58,11 @@ class DartDevelopmentService {
logger.printTrace('DDS is listening at ${_ddsInstance.uri}.'); logger.printTrace('DDS is listening at ${_ddsInstance.uri}.');
} on dds.DartDevelopmentServiceException catch (e) { } on dds.DartDevelopmentServiceException catch (e) {
logger.printTrace('Warning: Failed to start DDS: ${e.message}'); logger.printTrace('Warning: Failed to start DDS: ${e.message}');
if (e.errorCode == dds.DartDevelopmentServiceException.existingDdsInstanceError) {
_existingDdsUri = Uri.parse(
e.message.split(' ').firstWhere((String e) => e.startsWith('http'))
);
}
if (!_completer.isCompleted) { if (!_completer.isCompleted) {
_completer.complete(); _completer.complete();
} }
......
...@@ -318,7 +318,14 @@ known, it can be explicitly provided to attach via the command-line, e.g. ...@@ -318,7 +318,14 @@ known, it can be explicitly provided to attach via the command-line, e.g.
try { try {
app = await daemon.appDomain.launch( app = await daemon.appDomain.launch(
runner, runner,
runner.attach, ({Completer<DebugConnectionInfo> connectionInfoCompleter,
Completer<void> appStartedCompleter}) {
return runner.attach(
connectionInfoCompleter: connectionInfoCompleter,
appStartedCompleter: appStartedCompleter,
allowExistingDdsInstance: true,
);
},
device, device,
null, null,
true, true,
...@@ -354,6 +361,7 @@ known, it can be explicitly provided to attach via the command-line, e.g. ...@@ -354,6 +361,7 @@ known, it can be explicitly provided to attach via the command-line, e.g.
})); }));
result = await runner.attach( result = await runner.attach(
appStartedCompleter: onAppStart, appStartedCompleter: onAppStart,
allowExistingDdsInstance: true,
); );
if (result != 0) { if (result != 0) {
throwToolExit(null, exitCode: result); throwToolExit(null, exitCode: result);
......
...@@ -748,6 +748,7 @@ class _ResidentWebRunner extends ResidentWebRunner { ...@@ -748,6 +748,7 @@ class _ResidentWebRunner extends ResidentWebRunner {
Future<int> attach({ Future<int> attach({
Completer<DebugConnectionInfo> connectionInfoCompleter, Completer<DebugConnectionInfo> connectionInfoCompleter,
Completer<void> appStartedCompleter, Completer<void> appStartedCompleter,
bool allowExistingDdsInstance = false,
}) async { }) async {
if (_chromiumLauncher != null) { if (_chromiumLauncher != null) {
final Chromium chrome = await _chromiumLauncher.connectedInstance; final Chromium chrome = await _chromiumLauncher.connectedInstance;
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'dart:async'; import 'dart:async';
import 'package:dds/dds.dart' as dds;
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
...@@ -221,6 +222,7 @@ class FlutterDevice { ...@@ -221,6 +222,7 @@ class FlutterDevice {
int ddsPort, int ddsPort,
bool disableServiceAuthCodes = false, bool disableServiceAuthCodes = false,
bool disableDds = false, bool disableDds = false,
bool allowExistingDdsInstance = false,
bool ipv6 = false, bool ipv6 = false,
}) { }) {
final Completer<void> completer = Completer<void>(); final Completer<void> completer = Completer<void>();
...@@ -231,8 +233,15 @@ class FlutterDevice { ...@@ -231,8 +233,15 @@ class FlutterDevice {
// FYI, this message is used as a sentinel in tests. // FYI, this message is used as a sentinel in tests.
globals.printTrace('Connecting to service protocol: $observatoryUri'); globals.printTrace('Connecting to service protocol: $observatoryUri');
isWaitingForVm = true; isWaitingForVm = true;
bool existingDds = false;
vm_service.VmService service; vm_service.VmService service;
if (!disableDds) { if (!disableDds) {
void handleError(Exception e) {
globals.printTrace('Fail to connect to service protocol: $observatoryUri: $e');
if (!completer.isCompleted) {
completer.completeError('failed to connect to $observatoryUri');
}
}
// This first try block is meant to catch errors that occur during DDS startup // 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, // (e.g., failure to bind to a port, failure to connect to the VM service,
// attaching to a VM service with existing clients, etc.). // attaching to a VM service with existing clients, etc.).
...@@ -243,11 +252,16 @@ class FlutterDevice { ...@@ -243,11 +252,16 @@ class FlutterDevice {
ipv6, ipv6,
disableServiceAuthCodes, disableServiceAuthCodes,
); );
} on Exception catch (e) { } on dds.DartDevelopmentServiceException catch (e) {
globals.printTrace('Fail to connect to service protocol: $observatoryUri: $e'); if (!allowExistingDdsInstance ||
if (!completer.isCompleted && !_isListeningForObservatoryUri) { (e.errorCode != dds.DartDevelopmentServiceException.existingDdsInstanceError)) {
completer.completeError('failed to connect to $observatoryUri'); handleError(e);
return;
} else {
existingDds = true;
} }
} on Exception catch (e) {
handleError(e);
return; return;
} }
} }
...@@ -267,7 +281,8 @@ class FlutterDevice { ...@@ -267,7 +281,8 @@ class FlutterDevice {
printStructuredErrorLogMethod: printStructuredErrorLogMethod, printStructuredErrorLogMethod: printStructuredErrorLogMethod,
device: device, device: device,
), ),
device.dds.done.whenComplete(() => throw Exception('DDS shut down too early')), if (!existingDds)
device.dds.done.whenComplete(() => throw Exception('DDS shut down too early')),
] ]
) as vm_service.VmService; ) as vm_service.VmService;
} on Exception catch (exception) { } on Exception catch (exception) {
...@@ -849,6 +864,7 @@ abstract class ResidentRunner { ...@@ -849,6 +864,7 @@ abstract class ResidentRunner {
Future<int> attach({ Future<int> attach({
Completer<DebugConnectionInfo> connectionInfoCompleter, Completer<DebugConnectionInfo> connectionInfoCompleter,
Completer<void> appStartedCompleter, Completer<void> appStartedCompleter,
bool allowExistingDdsInstance = false,
}); });
bool get supportsRestart => false; bool get supportsRestart => false;
...@@ -1201,6 +1217,7 @@ abstract class ResidentRunner { ...@@ -1201,6 +1217,7 @@ abstract class ResidentRunner {
Restart restart, Restart restart,
CompileExpression compileExpression, CompileExpression compileExpression,
GetSkSLMethod getSkSLMethod, GetSkSLMethod getSkSLMethod,
bool allowExistingDdsInstance,
}) async { }) async {
if (!debuggingOptions.debuggingEnabled) { if (!debuggingOptions.debuggingEnabled) {
throw 'The service protocol is not enabled.'; throw 'The service protocol is not enabled.';
...@@ -1214,6 +1231,7 @@ abstract class ResidentRunner { ...@@ -1214,6 +1231,7 @@ abstract class ResidentRunner {
compileExpression: compileExpression, compileExpression: compileExpression,
disableDds: debuggingOptions.disableDds, disableDds: debuggingOptions.disableDds,
ddsPort: debuggingOptions.ddsPort, ddsPort: debuggingOptions.ddsPort,
allowExistingDdsInstance: allowExistingDdsInstance,
hostVmServicePort: debuggingOptions.hostVmServicePort, hostVmServicePort: debuggingOptions.hostVmServicePort,
getSkSLMethod: getSkSLMethod, getSkSLMethod: getSkSLMethod,
printStructuredErrorLogMethod: printStructuredErrorLog, printStructuredErrorLogMethod: printStructuredErrorLog,
......
...@@ -128,11 +128,13 @@ class ColdRunner extends ResidentRunner { ...@@ -128,11 +128,13 @@ class ColdRunner extends ResidentRunner {
Future<int> attach({ Future<int> attach({
Completer<DebugConnectionInfo> connectionInfoCompleter, Completer<DebugConnectionInfo> connectionInfoCompleter,
Completer<void> appStartedCompleter, Completer<void> appStartedCompleter,
bool allowExistingDdsInstance = false,
}) async { }) async {
_didAttach = true; _didAttach = true;
try { try {
await connectToServiceProtocol( await connectToServiceProtocol(
getSkSLMethod: writeSkSL, getSkSLMethod: writeSkSL,
allowExistingDdsInstance: allowExistingDdsInstance,
); );
} on Exception catch (error) { } on Exception catch (error) {
globals.printError('Error connecting to the service protocol: $error'); globals.printError('Error connecting to the service protocol: $error');
......
...@@ -171,6 +171,7 @@ class HotRunner extends ResidentRunner { ...@@ -171,6 +171,7 @@ class HotRunner extends ResidentRunner {
Future<int> attach({ Future<int> attach({
Completer<DebugConnectionInfo> connectionInfoCompleter, Completer<DebugConnectionInfo> connectionInfoCompleter,
Completer<void> appStartedCompleter, Completer<void> appStartedCompleter,
bool allowExistingDdsInstance = false,
}) async { }) async {
_didAttach = true; _didAttach = true;
try { try {
...@@ -179,6 +180,7 @@ class HotRunner extends ResidentRunner { ...@@ -179,6 +180,7 @@ class HotRunner extends ResidentRunner {
restart: _restartService, restart: _restartService,
compileExpression: _compileExpressionService, compileExpression: _compileExpressionService,
getSkSLMethod: writeSkSL, getSkSLMethod: writeSkSL,
allowExistingDdsInstance: allowExistingDdsInstance,
); );
// Catches all exceptions, non-Exception objects are rethrown. // Catches all exceptions, non-Exception objects are rethrown.
} catch (error) { // ignore: avoid_catches_without_on_clauses } catch (error) { // ignore: avoid_catches_without_on_clauses
......
...@@ -62,7 +62,7 @@ dependencies: ...@@ -62,7 +62,7 @@ dependencies:
_fe_analyzer_shared: 12.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" _fe_analyzer_shared: 12.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
analyzer: 0.40.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" analyzer: 0.40.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
browser_launcher: 0.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" browser_launcher: 0.1.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
built_collection: 4.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" built_collection: 4.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
built_value: 7.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" built_value: 7.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
...@@ -111,4 +111,4 @@ dartdoc: ...@@ -111,4 +111,4 @@ dartdoc:
# Exclude this package from the hosted API docs. # Exclude this package from the hosted API docs.
nodoc: true nodoc: true
# PUBSPEC CHECKSUM: 2f49 # PUBSPEC CHECKSUM: 8b4a
...@@ -179,7 +179,7 @@ void main() { ...@@ -179,7 +179,7 @@ void main() {
const String outputDill = '/tmp/output.dill'; const String outputDill = '/tmp/output.dill';
final MockHotRunner mockHotRunner = MockHotRunner(); final MockHotRunner mockHotRunner = MockHotRunner();
when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'))) when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'), allowExistingDdsInstance: true))
.thenAnswer((_) async => 0); .thenAnswer((_) async => 0);
when(mockHotRunner.exited).thenReturn(false); when(mockHotRunner.exited).thenReturn(false);
when(mockHotRunner.isWaitingForObservatory).thenReturn(false); when(mockHotRunner.isWaitingForObservatory).thenReturn(false);
...@@ -311,7 +311,7 @@ void main() { ...@@ -311,7 +311,7 @@ void main() {
.thenReturn(<ForwardedPort>[ForwardedPort(hostPort, devicePort)]); .thenReturn(<ForwardedPort>[ForwardedPort(hostPort, devicePort)]);
when(portForwarder.unforward(any)) when(portForwarder.unforward(any))
.thenAnswer((_) async {}); .thenAnswer((_) async {});
when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'))) when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'), allowExistingDdsInstance: true))
.thenAnswer((_) async => 0); .thenAnswer((_) async => 0);
when(mockHotRunnerFactory.build( when(mockHotRunnerFactory.build(
any, any,
...@@ -395,7 +395,7 @@ void main() { ...@@ -395,7 +395,7 @@ void main() {
.thenReturn(<ForwardedPort>[ForwardedPort(hostPort, devicePort)]); .thenReturn(<ForwardedPort>[ForwardedPort(hostPort, devicePort)]);
when(portForwarder.unforward(any)) when(portForwarder.unforward(any))
.thenAnswer((_) async {}); .thenAnswer((_) async {});
when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'))) when(mockHotRunner.attach(appStartedCompleter: anyNamed('appStartedCompleter'), allowExistingDdsInstance: true))
.thenAnswer((_) async => 0); .thenAnswer((_) async => 0);
when(mockHotRunnerFactory.build( when(mockHotRunnerFactory.build(
any, any,
......
...@@ -129,6 +129,7 @@ class TestFlutterDevice extends FlutterDevice { ...@@ -129,6 +129,7 @@ class TestFlutterDevice extends FlutterDevice {
int hostVmServicePort, int hostVmServicePort,
int ddsPort, int ddsPort,
bool ipv6 = false, bool ipv6 = false,
bool allowExistingDdsInstance = false,
}) async { }) async {
throw exception; throw exception;
} }
......
...@@ -598,6 +598,7 @@ class TestFlutterDevice extends FlutterDevice { ...@@ -598,6 +598,7 @@ class TestFlutterDevice extends FlutterDevice {
bool ipv6 = false, bool ipv6 = false,
int hostVmServicePort, int hostVmServicePort,
int ddsPort, int ddsPort,
bool allowExistingDdsInstance = false,
}) async { }) async {
throw exception; throw exception;
} }
......
...@@ -10,6 +10,7 @@ import 'package:flutter_tools/src/features.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter_tools/src/features.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import 'package:dds/dds.dart' as dds;
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:file_testing/file_testing.dart'; import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/artifacts.dart';
...@@ -2673,6 +2674,36 @@ void main() { ...@@ -2673,6 +2674,36 @@ void main() {
}) async => mockVMService, }) async => mockVMService,
})); }));
testUsingContext('FlutterDevice handles existing DDS instance', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
final MockDevice mockDevice = MockDevice();
final MockDartDevelopmentService mockDds = MockDartDevelopmentService();
final MockDeviceLogReader mockLogReader = MockDeviceLogReader();
final Completer<void> noopCompleter = Completer<void>();
when(mockDevice.getLogReader(app: anyNamed('app'))).thenReturn(mockLogReader);
when(mockDevice.dds).thenReturn(mockDds);
when(mockDds.startDartDevelopmentService(any, any, any, any)).thenThrow(FakeDartDevelopmentServiceException());
when(mockDds.done).thenAnswer((_) => noopCompleter.future);
final TestFlutterDevice flutterDevice = TestFlutterDevice(
mockDevice,
observatoryUris: Stream<Uri>.value(testUri),
);
await flutterDevice.connect(allowExistingDdsInstance: true);
verify(mockLogReader.connectedVMService = mockVMService);
}, 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', () { testUsingContext('nextPlatform moves through expected platforms', () {
expect(nextPlatform('android', TestFeatureFlags()), 'iOS'); expect(nextPlatform('android', TestFeatureFlags()), 'iOS');
expect(nextPlatform('iOS', TestFeatureFlags()), 'fuchsia'); expect(nextPlatform('iOS', TestFeatureFlags()), 'fuchsia');
...@@ -2694,6 +2725,14 @@ class MockUsage extends Mock implements Usage {} ...@@ -2694,6 +2725,14 @@ class MockUsage extends Mock implements Usage {}
class MockProcessManager extends Mock implements ProcessManager {} class MockProcessManager extends Mock implements ProcessManager {}
class MockResidentCompiler extends Mock implements ResidentCompiler {} class MockResidentCompiler extends Mock implements ResidentCompiler {}
class FakeDartDevelopmentServiceException implements dds.DartDevelopmentServiceException {
@override
final int errorCode = dds.DartDevelopmentServiceException.existingDdsInstanceError;
@override
final String message = 'A DDS instance is already connected at http://localhost:8181';
}
class TestFlutterDevice extends FlutterDevice { class TestFlutterDevice extends FlutterDevice {
TestFlutterDevice(Device device, { Stream<Uri> observatoryUris }) TestFlutterDevice(Device device, { Stream<Uri> observatoryUris })
: super(device, buildInfo: BuildInfo.debug) { : super(device, buildInfo: BuildInfo.debug) {
...@@ -2737,6 +2776,7 @@ class FakeFlutterDevice extends FlutterDevice { ...@@ -2737,6 +2776,7 @@ class FakeFlutterDevice extends FlutterDevice {
int hostVmServicePort, int hostVmServicePort,
int ddsPort, int ddsPort,
PrintStructuredErrorLogMethod printStructuredErrorLogMethod, PrintStructuredErrorLogMethod printStructuredErrorLogMethod,
bool allowExistingDdsInstance = false,
}) async { } }) async { }
......
...@@ -353,5 +353,6 @@ class TestRunner extends Mock implements ResidentRunner { ...@@ -353,5 +353,6 @@ class TestRunner extends Mock implements ResidentRunner {
Future<int> attach({ Future<int> attach({
Completer<DebugConnectionInfo> connectionInfoCompleter, Completer<DebugConnectionInfo> connectionInfoCompleter,
Completer<void> appStartedCompleter, Completer<void> appStartedCompleter,
bool allowExistingDdsInstance = false,
}) async => null; }) async => null;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment