[flutter_tool] In 'attach' use platform dill and patched sdk dir from the Fuchsia SDK (#32071)
diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart index 6a3e9d5..c822fcd 100644 --- a/packages/flutter_tools/lib/src/commands/attach.dart +++ b/packages/flutter_tools/lib/src/commands/attach.dart
@@ -6,7 +6,9 @@ import 'package:multicast_dns/multicast_dns.dart'; +import '../artifacts.dart'; import '../base/common.dart'; +import '../base/context.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../base/utils.dart'; @@ -160,8 +162,6 @@ @override Future<FlutterCommandResult> runCommand() async { - final FlutterProject flutterProject = FlutterProject.current(); - Cache.releaseLockEarly(); await _validateArguments(); @@ -169,6 +169,19 @@ writePidFile(argResults['pid-file']); final Device device = await findTargetDevice(); + + final Artifacts artifacts = device.artifactOverrides ?? Artifacts.instance; + await context.run<void>( + body: () => _attachToDevice(device), + overrides: <Type, Generator>{ + Artifacts: () => artifacts, + }); + + return null; + } + + Future<void> _attachToDevice(Device device) async { + final FlutterProject flutterProject = FlutterProject.current(); Future<int> getDevicePort() async { if (debugPort != null) { return debugPort; @@ -310,7 +323,6 @@ await device.portForwarder.unforward(port); } } - return null; } Future<void> _validateArguments() async { }
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 8765e54..fa0ae74 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart
@@ -7,6 +7,7 @@ import 'android/android_device.dart'; import 'application_package.dart'; +import 'artifacts.dart'; import 'base/context.dart'; import 'base/file_system.dart'; import 'base/utils.dart'; @@ -274,6 +275,9 @@ /// Clear the device's logs. void clearLogs(); + /// Optional device-specific artifact overrides. + OverrideArtifacts get artifactOverrides => null; + /// Start an app package on the current device. /// /// [platformArgs] allows callers to pass platform-specific arguments to the
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index a2fddc2..f9fa27b 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -7,6 +7,7 @@ import 'package:meta/meta.dart'; import '../application_package.dart'; +import '../artifacts.dart'; import '../base/common.dart'; import '../base/io.dart'; import '../base/logger.dart'; @@ -224,6 +225,16 @@ void clearLogs() {} @override + OverrideArtifacts get artifactOverrides { + return _artifactOverrides ??= OverrideArtifacts( + parent: Artifacts.instance, + platformKernelDill: fuchsiaArtifacts.platformKernelDill, + flutterPatchedSdk: fuchsiaArtifacts.flutterPatchedSdk, + ); + } + OverrideArtifacts _artifactOverrides; + + @override bool get supportsScreenshot => false; bool get ipv6 {
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart index b246a09..d7d3a51 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
@@ -81,7 +81,12 @@ /// Fuchsia-specific artifacts used to interact with a device. class FuchsiaArtifacts { /// Creates a new [FuchsiaArtifacts]. - FuchsiaArtifacts({this.sshConfig, this.devFinder}); + FuchsiaArtifacts({ + this.sshConfig, + this.devFinder, + this.platformKernelDill, + this.flutterPatchedSdk, + }); /// Creates a new [FuchsiaArtifacts] using the cached Fuchsia SDK. /// @@ -92,6 +97,7 @@ factory FuchsiaArtifacts.find() { final String fuchsia = Cache.instance.getArtifactDirectory('fuchsia').path; final String tools = fs.path.join(fuchsia, 'tools'); + final String dartPrebuilts = fs.path.join(tools, 'dart_prebuilts'); // If FUCHSIA_BUILD_DIR is defined, then look for the ssh_config dir // relative to it. Next, if FUCHSIA_SSH_CONFIG is defined, then use it. @@ -99,13 +105,17 @@ File sshConfig; if (platform.environment.containsKey(_kFuchsiaBuildDir)) { sshConfig = fs.file(fs.path.join( - platform.environment[_kFuchsiaSshConfig], 'ssh-keys', 'ssh_config')); + platform.environment[_kFuchsiaBuildDir], 'ssh-keys', 'ssh_config')); } else if (platform.environment.containsKey(_kFuchsiaSshConfig)) { sshConfig = fs.file(platform.environment[_kFuchsiaSshConfig]); } return FuchsiaArtifacts( sshConfig: sshConfig, devFinder: fs.file(fs.path.join(tools, 'dev_finder')), + platformKernelDill: fs.file(fs.path.join( + dartPrebuilts, 'flutter_runner', 'platform_strong.dill')), + flutterPatchedSdk: fs.file(fs.path.join( + dartPrebuilts, 'flutter_runner')), ); } @@ -119,4 +129,10 @@ /// The location of the dev finder tool used to locate connected /// Fuchsia devices. final File devFinder; + + /// The location of the Fuchsia-specific platform dill. + final File platformKernelDill; + + /// The directory containing [platformKernelDill]. + final File flutterPatchedSdk; }
diff --git a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart index e7d3f51..0b5a727 100644 --- a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart +++ b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart
@@ -10,7 +10,9 @@ import 'package:mockito/mockito.dart'; import 'package:process/process.dart'; +import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/common.dart'; +import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/time.dart'; @@ -58,33 +60,98 @@ }); }); - group('displays friendly error when', () { - final MockProcessManager mockProcessManager = MockProcessManager(); - final MockProcessResult mockProcessResult = MockProcessResult(); - final MockFile mockFile = MockFile(); - when(mockProcessManager.run( - any, - environment: anyNamed('environment'), - workingDirectory: anyNamed('workingDirectory'), - )).thenAnswer((Invocation invocation) => - Future<ProcessResult>.value(mockProcessResult)); - when(mockProcessResult.exitCode).thenReturn(1); - when<String>(mockProcessResult.stdout).thenReturn(''); - when<String>(mockProcessResult.stderr).thenReturn(''); - when(mockFile.absolute).thenReturn(mockFile); - when(mockFile.path).thenReturn(''); + group('Fuchsia device artifact overrides', () { + MockFile devFinder; + MockFile sshConfig; + MockFile platformDill; + MockFile patchedSdk; - final MockProcessManager emptyStdoutProcessManager = MockProcessManager(); - final MockProcessResult emptyStdoutProcessResult = MockProcessResult(); - when(emptyStdoutProcessManager.run( - any, - environment: anyNamed('environment'), - workingDirectory: anyNamed('workingDirectory'), - )).thenAnswer((Invocation invocation) => - Future<ProcessResult>.value(emptyStdoutProcessResult)); - when(emptyStdoutProcessResult.exitCode).thenReturn(0); - when<String>(emptyStdoutProcessResult.stdout).thenReturn(''); - when<String>(emptyStdoutProcessResult.stderr).thenReturn(''); + setUp(() { + devFinder = MockFile(); + sshConfig = MockFile(); + platformDill = MockFile(); + patchedSdk = MockFile(); + when(devFinder.absolute).thenReturn(devFinder); + when(sshConfig.absolute).thenReturn(sshConfig); + when(platformDill.absolute).thenReturn(platformDill); + when(patchedSdk.absolute).thenReturn(patchedSdk); + }); + + testUsingContext('exist', () async { + final FuchsiaDevice device = FuchsiaDevice('fuchsia-device'); + expect(device.artifactOverrides, isNotNull); + expect(device.artifactOverrides.platformKernelDill, equals(platformDill)); + expect(device.artifactOverrides.flutterPatchedSdk, equals(patchedSdk)); + }, overrides: <Type, Generator>{ + FuchsiaArtifacts: () => FuchsiaArtifacts( + sshConfig: sshConfig, + devFinder: devFinder, + platformKernelDill: platformDill, + flutterPatchedSdk: patchedSdk, + ), + }); + + testUsingContext('are used', () async { + final FuchsiaDevice device = FuchsiaDevice('fuchsia-device'); + expect(device.artifactOverrides, isNotNull); + expect(device.artifactOverrides.platformKernelDill, equals(platformDill)); + expect(device.artifactOverrides.flutterPatchedSdk, equals(patchedSdk)); + await context.run<void>( + body: () { + expect(Artifacts.instance.getArtifactPath(Artifact.platformKernelDill), + equals(platformDill.path)); + expect(Artifacts.instance.getArtifactPath(Artifact.flutterPatchedSdkPath), + equals(patchedSdk.path)); + }, + overrides: <Type, Generator>{ + Artifacts: () => device.artifactOverrides, + }, + ); + }, overrides: <Type, Generator>{ + FuchsiaArtifacts: () => FuchsiaArtifacts( + sshConfig: sshConfig, + devFinder: devFinder, + platformKernelDill: platformDill, + flutterPatchedSdk: patchedSdk, + ), + }); + }); + + group('displays friendly error when', () { + MockProcessManager mockProcessManager; + MockProcessResult mockProcessResult; + MockFile mockFile; + MockProcessManager emptyStdoutProcessManager; + MockProcessResult emptyStdoutProcessResult; + + setUp(() { + mockProcessManager = MockProcessManager(); + mockProcessResult = MockProcessResult(); + mockFile = MockFile(); + when(mockProcessManager.run( + any, + environment: anyNamed('environment'), + workingDirectory: anyNamed('workingDirectory'), + )).thenAnswer((Invocation invocation) => + Future<ProcessResult>.value(mockProcessResult)); + when(mockProcessResult.exitCode).thenReturn(1); + when<String>(mockProcessResult.stdout).thenReturn(''); + when<String>(mockProcessResult.stderr).thenReturn(''); + when(mockFile.absolute).thenReturn(mockFile); + when(mockFile.path).thenReturn(''); + + emptyStdoutProcessManager = MockProcessManager(); + emptyStdoutProcessResult = MockProcessResult(); + when(emptyStdoutProcessManager.run( + any, + environment: anyNamed('environment'), + workingDirectory: anyNamed('workingDirectory'), + )).thenAnswer((Invocation invocation) => + Future<ProcessResult>.value(emptyStdoutProcessResult)); + when(emptyStdoutProcessResult.exitCode).thenReturn(0); + when<String>(emptyStdoutProcessResult.stdout).thenReturn(''); + when<String>(emptyStdoutProcessResult.stderr).thenReturn(''); + }); testUsingContext('No vmservices found', () async { final FuchsiaDevice device = FuchsiaDevice('id'); @@ -116,26 +183,29 @@ [2018-11-09 01:30:12][52580][52983][log] INFO: example_app.cmx(flutter): Did thing this time '''; - final MockProcessManager mockProcessManager = MockProcessManager(); - final MockProcess mockProcess = MockProcess(); + MockProcessManager mockProcessManager; + MockProcess mockProcess; Completer<int> exitCode; StreamController<List<int>> stdout; StreamController<List<int>> stderr; - when(mockProcessManager.start(any)) - .thenAnswer((Invocation _) => Future<Process>.value(mockProcess)); - when(mockProcess.exitCode).thenAnswer((Invocation _) => exitCode.future); - when(mockProcess.stdout).thenAnswer((Invocation _) => stdout.stream); - when(mockProcess.stderr).thenAnswer((Invocation _) => stderr.stream); - - final MockFile devFinder = MockFile(); - final MockFile sshConfig = MockFile(); - when(devFinder.absolute).thenReturn(devFinder); - when(sshConfig.absolute).thenReturn(sshConfig); + MockFile devFinder; + MockFile sshConfig; setUp(() { + mockProcessManager = MockProcessManager(); + mockProcess = MockProcess(); stdout = StreamController<List<int>>(sync: true); stderr = StreamController<List<int>>(sync: true); exitCode = Completer<int>(); + when(mockProcessManager.start(any)) + .thenAnswer((Invocation _) => Future<Process>.value(mockProcess)); + when(mockProcess.exitCode).thenAnswer((Invocation _) => exitCode.future); + when(mockProcess.stdout).thenAnswer((Invocation _) => stdout.stream); + when(mockProcess.stderr).thenAnswer((Invocation _) => stderr.stream); + devFinder = MockFile(); + sshConfig = MockFile(); + when(devFinder.absolute).thenReturn(devFinder); + when(sshConfig.absolute).thenReturn(sshConfig); }); tearDown(() {