Unverified Commit 44d0e52d authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] remove fallback discovery and observatory timeout (#68756)

The flutter run failures are cause by the application occasionally taking a long time to start up. This caused the ios fallback discovery to kick in, which will always fail if the application hasn't started. Solution: remove the iOS fallback discovery and wait up to 30 seconds.

This has not proven to reduce the flakes, but it does at least remove one error case and removes code that will no longer work without the mDNS fallback.
parent aedd90fd
......@@ -3,7 +3,6 @@
// found in the LICENSE file.
import 'dart:async';
import 'dart:math' as math;
import 'package:meta/meta.dart';
import 'package:process/process.dart';
......@@ -25,7 +24,6 @@ import '../macos/xcode.dart';
import '../project.dart';
import '../protocol_discovery.dart';
import '../vmservice.dart';
import 'fallback_discovery.dart';
import 'ios_deploy.dart';
import 'ios_workflow.dart';
import 'iproxy.dart';
......@@ -152,7 +150,6 @@ class IOSDevice extends Device {
@required IMobileDevice iMobileDevice,
@required IProxy iProxy,
@required Logger logger,
@required VmServiceConnector vmServiceConnectUri,
})
: _sdkVersion = sdkVersion,
_iosDeploy = iosDeploy,
......@@ -161,14 +158,13 @@ class IOSDevice extends Device {
_fileSystem = fileSystem,
_logger = logger,
_platform = platform,
_vmServiceConnectUri = vmServiceConnectUri,
super(
id,
category: Category.mobile,
platformType: PlatformType.ios,
ephemeral: true,
) {
if (!platform.isMacOS) {
if (!_platform.isMacOS) {
assert(false, 'Control of iOS devices or simulators only supported on Mac OS.');
return;
}
......@@ -181,7 +177,6 @@ class IOSDevice extends Device {
final Platform _platform;
final IMobileDevice _iMobileDevice;
final IProxy _iproxy;
final VmServiceConnector _vmServiceConnectUri;
/// May be 0 if version cannot be parsed.
int get majorSdkVersion {
......@@ -312,14 +307,11 @@ class IOSDevice extends Device {
Map<String, dynamic> platformArgs,
bool prebuiltApplication = false,
bool ipv6 = false,
@visibleForTesting Duration fallbackPollingDelay,
@visibleForTesting Duration fallbackThrottleTimeout,
String userIdentifier,
}) async {
String packageId;
if (!prebuiltApplication) {
// TODO(chinmaygarde): Use mainPath, route.
_logger.printTrace('Building ${package.name} for $id');
// Step 1: Build the precompiled/DBC application if necessary.
......@@ -353,32 +345,16 @@ class IOSDevice extends Device {
return LaunchResult.failed();
}
// Step 2.5: Generate a potential open port using the provided argument,
// or randomly with the package name as a seed. Intentionally choose
// ports within the ephemeral port range.
final int assumedObservatoryPort = debuggingOptions?.deviceVmServicePort
?? math.Random(packageId.hashCode).nextInt(16383) + 49152;
// Step 3: Attempt to install the application on the device.
final String dartVmFlags = computeDartVmFlags(debuggingOptions);
final List<String> launchArguments = <String>[
'--enable-dart-profiling',
// These arguments are required to support the fallback connection strategy
// described in fallback_discovery.dart.
'--enable-service-port-fallback',
'--disable-service-auth-codes',
'--observatory-port=$assumedObservatoryPort',
if (debuggingOptions.disablePortPublication) '--disable-observatory-publication',
if (debuggingOptions.startPaused) '--start-paused',
if (dartVmFlags.isNotEmpty) '--dart-flags="$dartVmFlags"',
if (debuggingOptions.useTestFonts) '--use-test-fonts',
// "--enable-checked-mode" and "--verify-entry-points" should always be
// passed when we launch debug build via "ios-deploy". However, we don't
// pass them if a certain environment variable is set to enable the
// "system_debug_ios" integration test in the CI, which simulates a
// home-screen launch.
if (debuggingOptions.debuggingEnabled &&
_platform.environment['FLUTTER_TOOLS_DEBUG_WITHOUT_CHECKED_MODE'] != 'true') ...<String>[
if (debuggingOptions.debuggingEnabled) ...<String>[
'--enable-checked-mode',
'--verify-entry-points',
],
......@@ -413,7 +389,6 @@ class IOSDevice extends Device {
launchArguments: launchArguments,
interfaceType: interfaceType,
);
if (deviceLogReader is IOSDeviceLogReader) {
deviceLogReader.debuggerStream = iosDeployDebugger;
}
......@@ -421,11 +396,10 @@ class IOSDevice extends Device {
observatoryDiscovery = ProtocolDiscovery.observatory(
deviceLogReader,
portForwarder: portForwarder,
throttleDuration: fallbackPollingDelay,
throttleTimeout: fallbackThrottleTimeout ?? const Duration(minutes: 5),
hostPort: debuggingOptions.hostVmServicePort,
devicePort: debuggingOptions.deviceVmServicePort,
ipv6: ipv6,
logger: _logger,
);
}
if (iosDeployDebugger == null) {
......@@ -451,22 +425,12 @@ class IOSDevice extends Device {
}
_logger.printTrace('Application launched on the device. Waiting for observatory port.');
final FallbackDiscovery fallbackDiscovery = FallbackDiscovery(
logger: _logger,
portForwarder: portForwarder,
protocolDiscovery: observatoryDiscovery,
flutterUsage: globals.flutterUsage,
pollingDelay: fallbackPollingDelay,
vmServiceConnectUri: _vmServiceConnectUri,
);
final Uri localUri = await fallbackDiscovery.discover(
assumedDevicePort: assumedObservatoryPort,
device: this,
usesIpv6: ipv6,
hostVmservicePort: debuggingOptions.hostVmServicePort,
packageId: packageId,
packageName: FlutterProject.current().manifest.appName,
);
Uri localUri;
try {
localUri = await observatoryDiscovery.uri.timeout(const Duration(seconds: 30));
} on TimeoutException {
await observatoryDiscovery.cancel();
}
if (localUri == null) {
iosDeployDebugger?.detach();
return LaunchResult.failed();
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:meta/meta.dart';
import 'package:vm_service/vm_service.dart';
import '../base/io.dart';
import '../base/logger.dart';
import '../device.dart';
import '../protocol_discovery.dart';
import '../reporting/reporting.dart';
typedef VmServiceConnector = Future<VmService> Function(String, {Log log});
/// A protocol for discovery of a vmservice on an attached iOS device with
/// multiple fallbacks.
///
/// First, it tries to discover a vmservice by assigning a
/// specific port and then attempt to connect. This may fail if the port is
/// not available. This port value should be either random, or otherwise
/// generated with application specific input. This reduces the chance of
/// accidentally connecting to another running flutter application.
///
/// If that does not work, attempt to scan logs from the attached debugger
/// and parse the connected port logged by the engine.
class FallbackDiscovery {
FallbackDiscovery({
@required DevicePortForwarder portForwarder,
@required Logger logger,
@required ProtocolDiscovery protocolDiscovery,
@required Usage flutterUsage,
@required VmServiceConnector vmServiceConnectUri,
Duration pollingDelay,
}) : _logger = logger,
_portForwarder = portForwarder,
_protocolDiscovery = protocolDiscovery,
_flutterUsage = flutterUsage,
_vmServiceConnectUri = vmServiceConnectUri,
_pollingDelay = pollingDelay ?? const Duration(seconds: 2);
static const String _kEventName = 'ios-handshake';
final DevicePortForwarder _portForwarder;
final Logger _logger;
final ProtocolDiscovery _protocolDiscovery;
final Usage _flutterUsage;
final VmServiceConnector _vmServiceConnectUri;
final Duration _pollingDelay;
/// Attempt to discover the observatory port.
Future<Uri> discover({
@required int assumedDevicePort,
@required String packageId,
@required Device device,
@required bool usesIpv6,
@required int hostVmservicePort,
@required String packageName,
}) async {
final Uri result = await _attemptServiceConnection(
assumedDevicePort: assumedDevicePort,
hostVmservicePort: hostVmservicePort,
packageName: packageName,
);
if (result != null) {
return result;
}
try {
final Uri result = await _protocolDiscovery.uri;
if (result != null) {
UsageEvent(
_kEventName,
'log-success',
flutterUsage: _flutterUsage,
).send();
return result;
}
} on ArgumentError {
// In the event of an invalid InternetAddress, this code attempts to catch
// an ArgumentError from protocol_discovery.dart
} on Exception catch (err) {
_logger.printTrace(err.toString());
}
_logger.printTrace('Failed to connect with log scanning');
UsageEvent(
_kEventName,
'log-failure',
flutterUsage: _flutterUsage,
).send();
return null;
}
// Attempt to connect to the VM service and find an isolate with a matching `packageName`.
// Returns `null` if no connection can be made.
Future<Uri> _attemptServiceConnection({
@required int assumedDevicePort,
@required int hostVmservicePort,
@required String packageName,
}) async {
int hostPort;
Uri assumedWsUri;
try {
hostPort = await _portForwarder.forward(
assumedDevicePort,
hostPort: hostVmservicePort,
);
assumedWsUri = Uri.parse('ws://localhost:$hostPort/ws');
} on Exception catch (err) {
_logger.printTrace(err.toString());
_logger.printTrace('Failed to connect directly, falling back to log scanning');
_sendFailureEvent(err, assumedDevicePort);
return null;
}
// Attempt to connect to the VM service 5 times.
int attempts = 0;
Exception firstException;
VmService vmService;
while (attempts < 5) {
try {
vmService = await _vmServiceConnectUri(
assumedWsUri.toString(),
);
final VM vm = await vmService.getVM();
for (final IsolateRef isolateRefs in vm.isolates) {
final Isolate isolateResponse = await vmService.getIsolate(
isolateRefs.id,
);
final LibraryRef library = isolateResponse.rootLib;
if (library != null &&
(library.uri.startsWith('package:$packageName') ||
library.uri.startsWith(RegExp(r'file:\/\/\/.*\/' + packageName)))) {
UsageEvent(
_kEventName,
'success',
flutterUsage: _flutterUsage,
).send();
// This vmService instance must be disposed of, otherwise DDS will
// fail to start.
vmService.dispose();
return Uri.parse('http://localhost:$hostPort');
}
}
} on Exception catch (err) {
// No action, we might have failed to connect.
firstException ??= err;
_logger.printTrace(err.toString());
} finally {
// This vmService instance must be disposed of, otherwise DDS will
// fail to start.
vmService?.dispose();
}
// No exponential backoff is used here to keep the amount of time the
// tool waits for a connection to be reasonable. If the vmservice cannot
// be connected to in this way, the mDNS discovery must be reached
// sooner rather than later.
await Future<void>.delayed(_pollingDelay);
attempts += 1;
}
_logger.printTrace('Failed to connect directly, falling back to log scanning');
_sendFailureEvent(firstException, assumedDevicePort);
return null;
}
void _sendFailureEvent(Exception err, int assumedDevicePort) {
String eventAction;
String eventLabel;
if (err == null) {
eventAction = 'failure-attempts-exhausted';
eventLabel = assumedDevicePort.toString();
} else if (err is HttpException) {
eventAction = 'failure-http';
eventLabel = '${err.message}, device port = $assumedDevicePort';
} else {
eventAction = 'failure-other';
eventLabel = '$err, device port = $assumedDevicePort';
}
UsageEvent(
_kEventName,
eventAction,
label: eventLabel,
flutterUsage: _flutterUsage,
).send();
}
}
......@@ -6,7 +6,6 @@ import 'dart:async';
import 'package:meta/meta.dart';
import 'package:process/process.dart';
import 'package:vm_service/vm_service_io.dart' as vm_service_io;
import '../artifacts.dart';
import '../base/common.dart';
......@@ -519,7 +518,6 @@ class XCDevice {
iosDeploy: _iosDeploy,
iMobileDevice: _iMobileDevice,
platform: globals.platform,
vmServiceConnectUri: vm_service_io.vmServiceConnectUri,
));
}
return devices;
......
......@@ -19,7 +19,6 @@ class ProtocolDiscovery {
this.serviceName, {
this.portForwarder,
this.throttleDuration,
this.throttleTimeout,
this.hostPort,
this.devicePort,
this.ipv6,
......@@ -37,7 +36,6 @@ class ProtocolDiscovery {
DeviceLogReader logReader, {
DevicePortForwarder portForwarder,
Duration throttleDuration,
Duration throttleTimeout,
@required int hostPort,
@required int devicePort,
@required bool ipv6,
......@@ -49,7 +47,6 @@ class ProtocolDiscovery {
kObservatoryService,
portForwarder: portForwarder,
throttleDuration: throttleDuration ?? const Duration(milliseconds: 200),
throttleTimeout: throttleTimeout,
hostPort: hostPort,
devicePort: devicePort,
ipv6: ipv6,
......@@ -68,11 +65,6 @@ class ProtocolDiscovery {
/// The time to wait before forwarding a new observatory URIs from [logReader].
final Duration throttleDuration;
/// The time between URIs are discovered before timing out when scraping the [logReader].
///
/// If null, log scanning will continue indefinitely.
final Duration throttleTimeout;
StreamSubscription<String> _deviceLogSubscription;
_BufferedStreamController<Uri> _uriStreamController;
......@@ -99,15 +91,10 @@ class ProtocolDiscovery {
/// Port forwarding is only attempted when this is invoked,
/// for each observatory URL in the stream.
Stream<Uri> get uris {
Stream<Uri> uriStream = _uriStreamController.stream
final Stream<Uri> uriStream = _uriStreamController.stream
.transform(_throttle<Uri>(
waitDuration: throttleDuration,
));
if (throttleTimeout != null) {
// Don't throw a TimeoutException. The URL wasn't found in time, just close the stream.
uriStream = uriStream.timeout(throttleTimeout,
onTimeout: (EventSink<Uri> sink) => sink.close());
}
return uriStream.asyncMap<Uri>(_forwardPort);
}
......
......@@ -37,7 +37,6 @@ void main() {
group('IOSDevice', () {
final List<Platform> unsupportedPlatforms = <Platform>[linuxPlatform, windowsPlatform];
Cache cache;
MockVmService mockVmService;
Logger logger;
IOSDeploy iosDeploy;
IMobileDevice iMobileDevice;
......@@ -46,7 +45,6 @@ void main() {
setUp(() {
final Artifacts artifacts = Artifacts.test();
cache = Cache.test();
mockVmService = MockVmService();
logger = BufferLogger.test();
iosDeploy = IOSDeploy(
artifacts: artifacts,
......@@ -76,7 +74,6 @@ void main() {
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
);
});
......@@ -93,7 +90,6 @@ void main() {
cpuArchitecture: DarwinArch.arm64,
sdkVersion: '1.0.0',
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
).majorSdkVersion, 1);
expect(IOSDevice(
'device-123',
......@@ -107,7 +103,6 @@ void main() {
cpuArchitecture: DarwinArch.arm64,
sdkVersion: '13.1.1',
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
).majorSdkVersion, 13);
expect(IOSDevice(
'device-123',
......@@ -121,7 +116,6 @@ void main() {
cpuArchitecture: DarwinArch.arm64,
sdkVersion: '10',
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
).majorSdkVersion, 10);
expect(IOSDevice(
'device-123',
......@@ -135,7 +129,6 @@ void main() {
cpuArchitecture: DarwinArch.arm64,
sdkVersion: '0',
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
).majorSdkVersion, 0);
expect(IOSDevice(
'device-123',
......@@ -149,7 +142,6 @@ void main() {
cpuArchitecture: DarwinArch.arm64,
sdkVersion: 'bogus',
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
).majorSdkVersion, 0);
});
......@@ -166,7 +158,6 @@ void main() {
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
);
expect(device.supportsRuntimeMode(BuildMode.debug), true);
......@@ -191,7 +182,6 @@ void main() {
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
);
},
throwsAssertionError,
......@@ -280,7 +270,6 @@ void main() {
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService,
);
logReader1 = createLogReader(device, appPackage1, mockProcess1);
logReader2 = createLogReader(device, appPackage2, mockProcess2);
......@@ -301,8 +290,6 @@ void main() {
group('polling', () {
MockXcdevice mockXcdevice;
Cache cache;
MockVmService mockVmService1;
MockVmService mockVmService2;
FakeProcessManager fakeProcessManager;
BufferLogger logger;
IOSDeploy iosDeploy;
......@@ -315,8 +302,6 @@ void main() {
mockXcdevice = MockXcdevice();
final Artifacts artifacts = Artifacts.test();
cache = Cache.test();
mockVmService1 = MockVmService();
mockVmService2 = MockVmService();
logger = BufferLogger.test();
mockIosWorkflow = MockIOSWorkflow();
fakeProcessManager = FakeProcessManager.any();
......@@ -346,7 +331,6 @@ void main() {
platform: macPlatform,
fileSystem: MemoryFileSystem.test(),
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService1,
);
device2 = IOSDevice(
......@@ -361,7 +345,6 @@ void main() {
platform: macPlatform,
fileSystem: MemoryFileSystem.test(),
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => mockVmService2,
);
});
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/ios/fallback_discovery.dart';
import 'package:flutter_tools/src/protocol_discovery.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
import 'package:mockito/mockito.dart';
import 'package:vm_service/vm_service.dart';
import '../../src/common.dart';
import '../../src/mocks.dart';
void main() {
BufferLogger logger;
FallbackDiscovery fallbackDiscovery;
MockPrototcolDiscovery mockPrototcolDiscovery;
MockPortForwarder mockPortForwarder;
MockVmService mockVmService;
setUp(() {
logger = BufferLogger(
terminal: AnsiTerminal(stdio: MockStdio(), platform: const LocalPlatform()),
outputPreferences: OutputPreferences.test(),
);
mockVmService = MockVmService();
mockPrototcolDiscovery = MockPrototcolDiscovery();
mockPortForwarder = MockPortForwarder();
fallbackDiscovery = FallbackDiscovery(
logger: logger,
portForwarder: mockPortForwarder,
protocolDiscovery: mockPrototcolDiscovery,
flutterUsage: Usage.test(),
vmServiceConnectUri: (String uri, {Log log}) async {
return mockVmService;
},
pollingDelay: Duration.zero,
);
when(mockPortForwarder.forward(23, hostPort: anyNamed('hostPort')))
.thenAnswer((Invocation invocation) async => 1);
});
testWithoutContext('Selects assumed port if VM service connection is successful', () async {
when(mockVmService.getVM()).thenAnswer((Invocation invocation) async {
return VM.parse(<String, Object>{})..isolates = <IsolateRef>[
IsolateRef.parse(<String, Object>{}),
];
});
when(mockVmService.getIsolate(any)).thenAnswer((Invocation invocation) async {
return Isolate.parse(<String, Object>{})
..rootLib = (LibraryRef(name: 'main', uri: 'package:hello/main.dart', id: '2'));
});
expect(await fallbackDiscovery.discover(
assumedDevicePort: 23,
device: null,
hostVmservicePort: 1,
packageId: null,
usesIpv6: false,
packageName: 'hello',
), Uri.parse('http://localhost:1'));
});
testWithoutContext('Selects assumed port when another isolate has no root library', () async {
when(mockVmService.getVM()).thenAnswer((Invocation invocation) async {
return VM.parse(<String, Object>{})..isolates = <IsolateRef>[
IsolateRef.parse(<String, Object>{})..id = '1',
IsolateRef.parse(<String, Object>{})..id = '2',
];
});
when(mockVmService.getIsolate('1')).thenAnswer((Invocation invocation) async {
return Isolate.parse(<String, Object>{})
..rootLib = null;
});
when(mockVmService.getIsolate('2')).thenAnswer((Invocation invocation) async {
return Isolate.parse(<String, Object>{})
..rootLib = (LibraryRef.parse(<String, Object>{})..uri = 'package:hello/main.dart');
});
expect(await fallbackDiscovery.discover(
assumedDevicePort: 23,
device: null,
hostVmservicePort: 1,
packageId: null,
usesIpv6: false,
packageName: 'hello',
), Uri.parse('http://localhost:1'));
});
testWithoutContext('Selects log scanning if VM service connecton fails due to Sentinel', () async {
when(mockVmService.getVM()).thenAnswer((Invocation invocation) async {
return VM.parse(<String, Object>{})..isolates = <IsolateRef>[
IsolateRef(
id: 'a',
name: 'isolate',
number: '1',
isSystemIsolate: false,
),
];
});
when(mockVmService.getIsolate(any))
.thenThrow(SentinelException.parse('Something', <String, dynamic>{}));
when(mockPrototcolDiscovery.uri).thenAnswer((Invocation invocation) async {
return Uri.parse('http://localhost:1234');
});
expect(await fallbackDiscovery.discover(
assumedDevicePort: 23,
device: null,
hostVmservicePort: 1,
packageId: 'hello',
usesIpv6: false,
packageName: 'hello',
), Uri.parse('http://localhost:1234'));
});
testWithoutContext('Selects log scanning if VM service connecton fails', () async {
when(mockVmService.getVM()).thenThrow(Exception());
when(mockPrototcolDiscovery.uri).thenAnswer((Invocation invocation) async {
return Uri.parse('http://localhost:1234');
});
expect(await fallbackDiscovery.discover(
assumedDevicePort: 23,
device: null,
hostVmservicePort: 1,
packageId: 'hello',
usesIpv6: false,
packageName: 'hello',
), Uri.parse('http://localhost:1234'));
});
testWithoutContext('Fails if both VM Service and log scanning fails', () async {
when(mockVmService.getVM()).thenThrow(Exception());
when(mockPrototcolDiscovery.uri).thenAnswer((Invocation invocation) async => null);
expect(await fallbackDiscovery.discover(
assumedDevicePort: 23,
device: null,
hostVmservicePort: 1,
packageId: 'hello',
usesIpv6: false,
packageName: 'hello',
), isNull);
});
}
class MockPrototcolDiscovery extends Mock implements ProtocolDiscovery {}
class MockPortForwarder extends Mock implements DevicePortForwarder {}
class MockVmService extends Mock implements VmService {}
......@@ -318,7 +318,6 @@ IOSDevice setUpIOSDevice({
),
iProxy: IProxy.test(logger: logger, processManager: processManager),
interfaceType: interfaceType,
vmServiceConnectUri: (String string, {Log log}) async => MockVmService(),
);
}
......
......@@ -88,7 +88,6 @@ IOSDevice setUpIOSDevice(FileSystem fileSystem) {
cpuArchitecture: DarwinArch.arm64,
iProxy: IProxy.test(logger: BufferLogger.test(), processManager: FakeProcessManager.any()),
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => MockVmService(),
);
}
......
......@@ -134,9 +134,7 @@ void main() {
'--args',
const <String>[
'--enable-dart-profiling',
'--enable-service-port-fallback',
'--disable-service-auth-codes',
'--observatory-port=53781',
].join(' ')
])
);
......@@ -179,7 +177,7 @@ void main() {
command: <String>[...kRunReleaseArgs, '-showBuildSettings'],
duration: Duration(minutes: 5), // this is longer than the timeout of 1 minute.
));
// The second call succeedes and is made after the first times out.
// The second call succeeds and is made after the first times out.
processManager.addCommand(
const FakeCommand(
command: <String>[...kRunReleaseArgs, '-showBuildSettings'],
......@@ -197,9 +195,7 @@ void main() {
'--args',
const <String>[
'--enable-dart-profiling',
'--enable-service-port-fallback',
'--disable-service-auth-codes',
'--observatory-port=53781',
].join(' ')
])
);
......@@ -272,9 +268,7 @@ void main() {
'--args',
const <String>[
'--enable-dart-profiling',
'--enable-service-port-fallback',
'--disable-service-auth-codes',
'--observatory-port=53781',
].join(' ')
])
);
......@@ -350,7 +344,6 @@ IOSDevice setUpIOSDevice({
),
cpuArchitecture: DarwinArch.arm64,
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => MockVmService(),
);
}
......
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