Unverified Commit c4bfa4c7 authored by Jenn Magder's avatar Jenn Magder Committed by GitHub

Inject iproxy into context (#61762)

parent 78a97544
......@@ -19,6 +19,7 @@ import 'base/os.dart';
import 'base/process.dart';
import 'base/time.dart';
import 'base/user_messages.dart';
import 'build_info.dart';
import 'build_system/build_system.dart';
import 'cache.dart';
import 'compile.dart';
......@@ -33,6 +34,7 @@ import 'fuchsia/fuchsia_sdk.dart' show FuchsiaSdk, FuchsiaArtifacts;
import 'fuchsia/fuchsia_workflow.dart' show FuchsiaWorkflow, fuchsiaWorkflow;
import 'globals.dart' as globals;
import 'ios/ios_workflow.dart';
import 'ios/iproxy.dart';
import 'ios/simulators.dart';
import 'ios/xcodeproj.dart';
import 'macos/cocoapods.dart';
......@@ -254,6 +256,15 @@ Future<T> runInContext<T>(
cache: globals.cache,
platform: globals.platform,
xcode: globals.xcode,
iproxy: IProxy(
iproxyPath: globals.artifacts.getArtifactPath(
Artifact.iproxy,
platform: TargetPlatform.ios,
),
logger: globals.logger,
processManager: globals.processManager,
dyLdLibEntry: globals.cache.dyLdLibEntry,
),
),
XcodeProjectInterpreter: () => XcodeProjectInterpreter(
logger: globals.logger,
......
......@@ -10,13 +10,11 @@ import 'package:process/process.dart';
import 'package:vm_service/vm_service.dart' as vm_service;
import '../application_package.dart';
import '../artifacts.dart';
import '../base/file_system.dart';
import '../base/io.dart';
import '../base/logger.dart';
import '../base/os.dart';
import '../base/platform.dart';
import '../base/process.dart';
import '../base/utils.dart';
import '../build_info.dart';
import '../convert.dart';
......@@ -29,6 +27,7 @@ import '../protocol_discovery.dart';
import 'fallback_discovery.dart';
import 'ios_deploy.dart';
import 'ios_workflow.dart';
import 'iproxy.dart';
import 'mac.dart';
class IOSDevices extends PollingDeviceDiscovery {
......@@ -149,15 +148,16 @@ class IOSDevice extends Device {
@required this.interfaceType,
@required String sdkVersion,
@required Platform platform,
@required Artifacts artifacts,
@required IOSDeploy iosDeploy,
@required IMobileDevice iMobileDevice,
@required IProxy iProxy,
@required Logger logger,
@required VmServiceConnector vmServiceConnectUri,
})
: _sdkVersion = sdkVersion,
_iosDeploy = iosDeploy,
_iMobileDevice = iMobileDevice,
_iproxy = iProxy,
_fileSystem = fileSystem,
_logger = logger,
_platform = platform,
......@@ -172,20 +172,15 @@ class IOSDevice extends Device {
assert(false, 'Control of iOS devices or simulators only supported on Mac OS.');
return;
}
_iproxyPath = artifacts.getArtifactPath(
Artifact.iproxy,
platform: TargetPlatform.ios,
);
}
String _iproxyPath;
final String _sdkVersion;
final IOSDeploy _iosDeploy;
final FileSystem _fileSystem;
final Logger _logger;
final Platform _platform;
final IMobileDevice _iMobileDevice;
final IProxy _iproxy;
final VmServiceConnector _vmServiceConnectUri;
/// May be 0 if version cannot be parsed.
......@@ -492,11 +487,9 @@ class IOSDevice extends Device {
@override
DevicePortForwarder get portForwarder => _portForwarder ??= IOSDevicePortForwarder(
processManager: globals.processManager,
logger: _logger,
dyLdLibEntry: globals.cache.dyLdLibEntry,
iproxy: _iproxy,
id: id,
iproxyPath: _iproxyPath,
operatingSystemUtils: globals.os,
);
......@@ -763,17 +756,13 @@ class IOSDevicePortForwarder extends DevicePortForwarder {
/// Create a new [IOSDevicePortForwarder].
IOSDevicePortForwarder({
@required ProcessManager processManager,
@required Logger logger,
@required MapEntry<String, String> dyLdLibEntry,
@required String id,
@required String iproxyPath,
@required IProxy iproxy,
@required OperatingSystemUtils operatingSystemUtils,
}) : _logger = logger,
_dyLdLibEntry = dyLdLibEntry,
_id = id,
_iproxyPath = iproxyPath,
_processUtils = ProcessUtils(processManager: processManager, logger: logger),
_iproxy = iproxy,
_operatingSystemUtils = operatingSystemUtils;
/// Create a [IOSDevicePortForwarder] for testing.
......@@ -781,7 +770,7 @@ class IOSDevicePortForwarder extends DevicePortForwarder {
/// This specifies the path to iproxy as 'iproxy` and the dyLdLibEntry as
/// 'DYLD_LIBRARY_PATH: /path/to/libs'.
///
/// The device id may be provided, but otherwise defaultts to '1234'.
/// The device id may be provided, but otherwise defaults to '1234'.
factory IOSDevicePortForwarder.test({
@required ProcessManager processManager,
@required Logger logger,
......@@ -789,22 +778,19 @@ class IOSDevicePortForwarder extends DevicePortForwarder {
OperatingSystemUtils operatingSystemUtils,
}) {
return IOSDevicePortForwarder(
processManager: processManager,
logger: logger,
iproxyPath: 'iproxy',
id: id ?? '1234',
dyLdLibEntry: const MapEntry<String, String>(
'DYLD_LIBRARY_PATH', '/path/to/libs',
iproxy: IProxy.test(
logger: logger,
processManager: processManager,
),
id: id ?? '1234',
operatingSystemUtils: operatingSystemUtils,
);
}
final ProcessUtils _processUtils;
final Logger _logger;
final MapEntry<String, String> _dyLdLibEntry;
final String _id;
final String _iproxyPath;
final IProxy _iproxy;
final OperatingSystemUtils _operatingSystemUtils;
@override
......@@ -831,18 +817,7 @@ class IOSDevicePortForwarder extends DevicePortForwarder {
bool connected = false;
while (!connected) {
_logger.printTrace('Attempting to forward device port $devicePort to host port $hostPort');
// Usage: iproxy LOCAL_TCP_PORT DEVICE_TCP_PORT UDID
process = await _processUtils.start(
<String>[
_iproxyPath,
'$hostPort:$devicePort',
'--udid',
_id,
],
environment: Map<String, String>.fromEntries(
<MapEntry<String, String>>[_dyLdLibEntry],
),
);
process = await _iproxy.forward(devicePort, hostPort, _id);
// TODO(ianh): This is a flakey race condition, https://github.com/libimobiledevice/libimobiledevice/issues/674
connected = !await process.stdout.isEmpty.timeout(_kiProxyPortForwardTimeout, onTimeout: () => false);
if (!connected) {
......
// 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 'dart:async';
import 'package:meta/meta.dart';
import 'package:process/process.dart';
import '../base/io.dart';
import '../base/logger.dart';
import '../base/process.dart';
/// Wraps iproxy command line tool port forwarding.
///
/// See https://github.com/libimobiledevice/libusbmuxd.
class IProxy {
IProxy({
@required String iproxyPath,
@required Logger logger,
@required ProcessManager processManager,
@required MapEntry<String, String> dyLdLibEntry,
}) : _dyLdLibEntry = dyLdLibEntry,
_processUtils = ProcessUtils(processManager: processManager, logger: logger),
_iproxyPath = iproxyPath;
/// Create a [IProxy] for testing.
///
/// This specifies the path to iproxy as 'iproxy` and the dyLdLibEntry as
/// 'DYLD_LIBRARY_PATH: /path/to/libs'.
factory IProxy.test({
@required Logger logger,
@required ProcessManager processManager,
}) {
return IProxy(
iproxyPath: 'iproxy',
logger: logger,
processManager: processManager,
dyLdLibEntry: const MapEntry<String, String>(
'DYLD_LIBRARY_PATH', '/path/to/libs',
),
);
}
final String _iproxyPath;
final ProcessUtils _processUtils;
final MapEntry<String, String> _dyLdLibEntry;
Future<Process> forward(int devicePort, int hostPort, String deviceId) {
// Usage: iproxy LOCAL_PORT:DEVICE_PORT --udid UDID
return _processUtils.start(
<String>[
_iproxyPath,
'$hostPort:$devicePort',
'--udid',
deviceId,
],
environment: Map<String, String>.fromEntries(
<MapEntry<String, String>>[_dyLdLibEntry],
),
);
}
}
......@@ -21,6 +21,7 @@ import '../convert.dart';
import '../globals.dart' as globals;
import '../ios/devices.dart';
import '../ios/ios_deploy.dart';
import '../ios/iproxy.dart';
import '../ios/mac.dart';
import '../ios/xcodeproj.dart';
import '../reporting/reporting.dart';
......@@ -213,6 +214,7 @@ class XCDevice {
@required Logger logger,
@required Xcode xcode,
@required Platform platform,
@required IProxy iproxy,
}) : _processUtils = ProcessUtils(logger: logger, processManager: processManager),
_logger = logger,
_iMobileDevice = IMobileDevice(
......@@ -228,6 +230,7 @@ class XCDevice {
platform: platform,
processManager: processManager,
),
_iProxy = iproxy,
_xcode = xcode {
_setupDeviceIdentifierByEventStream();
......@@ -242,6 +245,7 @@ class XCDevice {
final IMobileDevice _iMobileDevice;
final IOSDeploy _iosDeploy;
final Xcode _xcode;
final IProxy _iProxy;
List<dynamic> _cachedListResults;
Process _deviceObservationProcess;
......@@ -500,9 +504,9 @@ class XCDevice {
cpuArchitecture: _cpuArchitecture(deviceProperties),
interfaceType: interface,
sdkVersion: _sdkVersion(deviceProperties),
artifacts: globals.artifacts,
iProxy: _iProxy,
fileSystem: globals.fs,
logger: globals.logger,
logger: _logger,
iosDeploy: _iosDeploy,
iMobileDevice: _iMobileDevice,
platform: globals.platform,
......
......@@ -19,6 +19,7 @@ import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/ios/ios_deploy.dart';
import 'package:flutter_tools/src/ios/ios_workflow.dart';
import 'package:flutter_tools/src/ios/iproxy.dart';
import 'package:flutter_tools/src/ios/mac.dart';
import 'package:flutter_tools/src/macos/xcode.dart';
import 'package:mockito/mockito.dart';
......@@ -68,7 +69,7 @@ void main() {
testWithoutContext('successfully instantiates on Mac OS', () {
IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -85,7 +86,7 @@ void main() {
testWithoutContext('parses major version', () {
expect(IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -99,7 +100,7 @@ void main() {
).majorSdkVersion, 1);
expect(IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -113,7 +114,7 @@ void main() {
).majorSdkVersion, 13);
expect(IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -127,7 +128,7 @@ void main() {
).majorSdkVersion, 10);
expect(IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -141,7 +142,7 @@ void main() {
).majorSdkVersion, 0);
expect(IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -158,7 +159,7 @@ void main() {
testWithoutContext('Supports debug, profile, and release modes', () {
final IOSDevice device = IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -183,7 +184,7 @@ void main() {
() {
IOSDevice(
'device-123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: platform,
......@@ -217,22 +218,22 @@ void main() {
Logger logger;
IOSDeploy iosDeploy;
FileSystem mockFileSystem;
IProxy iproxy;
IOSDevicePortForwarder createPortForwarder(
ForwardedPort forwardedPort,
IOSDevice device) {
iproxy = IProxy.test(logger: logger, processManager: FakeProcessManager.any());
final IOSDevicePortForwarder portForwarder = IOSDevicePortForwarder(
dyLdLibEntry: mockCache.dyLdLibEntry,
id: device.id,
iproxyPath: mockArtifacts.getArtifactPath(Artifact.iproxy, platform: TargetPlatform.ios),
logger: logger,
processManager: FakeProcessManager.any(),
operatingSystemUtils: OperatingSystemUtils(
fileSystem: mockFileSystem,
logger: logger,
platform: FakePlatform(operatingSystem: 'macos'),
processManager: FakeProcessManager.any(),
),
iproxy: iproxy,
);
portForwarder.addForwardedPorts(<ForwardedPort>[forwardedPort]);
return portForwarder;
......@@ -274,7 +275,7 @@ void main() {
testWithoutContext('kills all log readers & port forwarders', () async {
device = IOSDevice(
'123',
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
fileSystem: mockFileSystem,
logger: logger,
platform: macPlatform,
......@@ -344,7 +345,7 @@ void main() {
name: 'Paired iPhone',
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
iosDeploy: iosDeploy,
iMobileDevice: iMobileDevice,
logger: logger,
......@@ -359,7 +360,7 @@ void main() {
name: 'iPhone 6s',
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
artifacts: mockArtifacts,
iProxy: IProxy.test(logger: logger, processManager: FakeProcessManager.any()),
iosDeploy: iosDeploy,
iMobileDevice: iMobileDevice,
logger: logger,
......
......@@ -13,6 +13,7 @@ import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/ios/ios_deploy.dart';
import 'package:flutter_tools/src/ios/iproxy.dart';
import 'package:flutter_tools/src/ios/mac.dart';
import 'package:meta/meta.dart';
import 'package:mockito/mockito.dart';
......@@ -301,7 +302,7 @@ IOSDevice setUpIOSDevice({
artifacts: artifacts,
cache: cache,
),
artifacts: artifacts,
iProxy: IProxy.test(logger: logger, processManager: processManager),
interfaceType: interfaceType,
vmServiceConnectUri: (String string, {Log log}) async => MockVmService(),
);
......
......@@ -9,6 +9,7 @@ import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/ios/iproxy.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:mockito/mockito.dart';
import 'package:vm_service/vm_service.dart';
......@@ -89,7 +90,7 @@ IOSDevice setUpIOSDevice(FileSystem fileSystem) {
name: 'iPhone 1',
sdkVersion: '13.3',
cpuArchitecture: DarwinArch.arm64,
artifacts: artifacts,
iProxy: IProxy.test(logger: BufferLogger.test(), processManager: FakeProcessManager.any()),
interfaceType: IOSDeviceInterface.usb,
vmServiceConnectUri: (String string, {Log log}) async => MockVmService(),
);
......
......@@ -13,6 +13,7 @@ import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/ios/ios_deploy.dart';
import 'package:flutter_tools/src/ios/iproxy.dart';
import 'package:flutter_tools/src/ios/mac.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/macos/xcode.dart';
......@@ -321,7 +322,7 @@ IOSDevice setUpIOSDevice({
sdkVersion: sdkVersion,
fileSystem: fileSystem ?? MemoryFileSystem.test(),
platform: macPlatform,
artifacts: artifacts,
iProxy: IProxy.test(logger: logger, processManager: processManager ?? FakeProcessManager.any()),
logger: logger,
iosDeploy: IOSDeploy(
logger: logger,
......
......@@ -18,6 +18,7 @@ import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/ios/fallback_discovery.dart';
import 'package:flutter_tools/src/ios/ios_deploy.dart';
import 'package:flutter_tools/src/ios/iproxy.dart';
import 'package:flutter_tools/src/ios/mac.dart';
import 'package:flutter_tools/src/mdns_discovery.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
......@@ -422,7 +423,7 @@ IOSDevice setUpIOSDevice({
sdkVersion: sdkVersion,
fileSystem: fileSystem ?? MemoryFileSystem.test(),
platform: macPlatform,
artifacts: artifacts,
iProxy: IProxy.test(logger: logger, processManager: processManager ?? FakeProcessManager.any()),
logger: BufferLogger.test(),
iosDeploy: IOSDeploy(
logger: logger ?? BufferLogger.test(),
......
......@@ -12,6 +12,7 @@ import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/ios/devices.dart';
import 'package:flutter_tools/src/ios/iproxy.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/macos/xcode.dart';
import 'package:mockito/mockito.dart';
......@@ -80,6 +81,7 @@ void main() {
platform: null,
artifacts: MockArtifacts(),
cache: MockCache(),
iproxy: IProxy.test(logger: logger, processManager: processManager),
);
});
......@@ -350,6 +352,7 @@ void main() {
platform: null,
artifacts: mockArtifacts,
cache: mockCache,
iproxy: IProxy.test(logger: logger, processManager: fakeProcessManager),
);
});
......
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