From 8b6baae44c8661d548643ced73493e6a66862622 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 4 Feb 2021 13:19:11 -0800 Subject: [PATCH] [flutter_tools] move process manager into tool (#75350) Our current top crasher is an unclear error when ProcessManager fails to resolve an executable path. To fix this, we'd like to being adjusting the process resolution logic and adding more instrumentation to track failures. In order to begin the process, the ProcessManager has been folded back into the flutter tool --- dev/tools/pubspec.yaml | 2 - dev/tools/test/codesign_test.dart | 2 +- dev/tools/test/fake_process_manager.dart | 376 +++++++++++++++++ dev/tools/test/roll_dev_test.dart | 2 +- .../lib/src/android/android_device.dart | 1 - .../src/android/android_device_discovery.dart | 1 - .../lib/src/android/android_emulator.dart | 1 - .../lib/src/android/android_workflow.dart | 2 +- .../lib/src/application_package.dart | 1 - packages/flutter_tools/lib/src/artifacts.dart | 2 +- .../flutter_tools/lib/src/base/build.dart | 1 - .../lib/src/base/error_handling_io.dart | 15 +- packages/flutter_tools/lib/src/base/os.dart | 1 - .../flutter_tools/lib/src/base/process.dart | 387 +++++++++++++++++- .../lib/src/build_system/build_system.dart | 2 +- .../targets/icon_tree_shaker.dart | 2 +- packages/flutter_tools/lib/src/cache.dart | 1 - .../lib/src/commands/analyze.dart | 2 +- .../lib/src/commands/analyze_base.dart | 2 +- .../src/commands/analyze_continuously.dart | 2 +- .../lib/src/commands/analyze_once.dart | 2 +- .../lib/src/commands/downgrade.dart | 2 - packages/flutter_tools/lib/src/compile.dart | 2 +- .../flutter_tools/lib/src/context_runner.dart | 2 - .../flutter_tools/lib/src/dart/analysis.dart | 2 +- packages/flutter_tools/lib/src/dart/pub.dart | 1 - .../flutter_tools/lib/src/desktop_device.dart | 2 +- packages/flutter_tools/lib/src/device.dart | 2 +- .../lib/src/devtools_launcher.dart | 2 +- packages/flutter_tools/lib/src/doctor.dart | 2 +- packages/flutter_tools/lib/src/emulator.dart | 1 - .../lib/src/fuchsia/fuchsia_dev_finder.dart | 1 - packages/flutter_tools/lib/src/globals.dart | 6 +- .../lib/src/ios/code_signing.dart | 1 - .../flutter_tools/lib/src/ios/devices.dart | 2 +- .../flutter_tools/lib/src/ios/ios_deploy.dart | 1 - .../flutter_tools/lib/src/ios/iproxy.dart | 1 - packages/flutter_tools/lib/src/ios/mac.dart | 1 - .../lib/src/ios/plist_parser.dart | 1 - .../flutter_tools/lib/src/ios/simulators.dart | 1 - .../flutter_tools/lib/src/ios/xcodeproj.dart | 1 - .../lib/src/linux/linux_device.dart | 2 +- .../lib/src/linux/linux_doctor.dart | 2 +- .../lib/src/macos/cocoapods.dart | 1 - .../lib/src/macos/macos_device.dart | 2 +- .../flutter_tools/lib/src/macos/xcode.dart | 1 - .../lib/src/test/web_test_compiler.dart | 2 +- .../lib/src/tester/flutter_tester.dart | 2 +- .../flutter_tools/lib/src/web/chrome.dart | 2 +- .../flutter_tools/lib/src/web/web_device.dart | 2 +- .../lib/src/windows/visual_studio.dart | 1 - .../lib/src/windows/windows_device.dart | 2 +- .../hermetic/analyze_continuously_test.dart | 7 +- .../commands.shard/hermetic/attach_test.dart | 1 - .../hermetic/build_fuchsia_test.dart | 1 - .../hermetic/build_ipa_test.dart | 2 +- .../hermetic/build_linux_test.dart | 2 +- .../hermetic/build_macos_test.dart | 2 +- .../hermetic/build_web_test.dart | 1 + .../hermetic/build_windows_test.dart | 2 +- .../commands.shard/hermetic/clean_test.dart | 2 +- .../commands.shard/hermetic/devices_test.dart | 2 +- .../commands.shard/hermetic/doctor_test.dart | 2 +- .../hermetic/downgrade_test.dart | 1 + .../commands.shard/hermetic/pub_get_test.dart | 1 + .../commands.shard/hermetic/run_test.dart | 1 + .../hermetic/shell_completion_test.dart | 2 +- .../commands.shard/hermetic/test_test.dart | 2 +- .../permeable/analyze_once_test.dart | 7 +- .../permeable/build_aar_test.dart | 2 +- .../permeable/build_apk_test.dart | 2 +- .../permeable/build_appbundle_test.dart | 1 - .../permeable/build_bundle_test.dart | 2 +- .../commands.shard/permeable/create_test.dart | 2 +- .../permeable/packages_test.dart | 2 +- .../permeable/upgrade_test.dart | 2 +- .../test/general.shard/analytics_test.dart | 1 + .../android_device_discovery_test.dart | 1 + .../android/android_device_test.dart | 2 +- .../android/android_install_test.dart | 1 + .../android/android_sdk_test.dart | 2 +- .../android/android_studio_test.dart | 1 + .../android_studio_validator_test.dart | 2 +- .../android/gradle_errors_test.dart | 2 +- .../general.shard/android/gradle_test.dart | 2 +- .../android/gradle_utils_test.dart | 2 +- .../application_package_test.dart | 2 +- .../asset_bundle_package_fonts_test.dart | 1 + .../base/error_handling_io_test.dart | 2 +- .../test/general.shard/base/os_test.dart | 1 - .../general.shard/base/os_utils_test.dart | 2 +- .../base/process_manager_test.dart | 327 +++++++++++++++ .../build_system/targets/web_test.dart | 1 - .../test/general.shard/cache_test.dart | 1 - .../test/general.shard/channel_test.dart | 1 - .../general.shard/compile_batch_test.dart | 1 - .../compile_expression_test.dart | 1 - .../compile_incremental_test.dart | 1 - .../test/general.shard/dart/pub_get_test.dart | 1 - .../general.shard/desktop_device_test.dart | 1 - .../drive/drive_service_test.dart | 1 - .../test/general.shard/emulator_test.dart | 1 - .../general.shard/flutter_platform_test.dart | 1 - .../fuchsia/fuchsia_dev_finder_test.dart | 1 - .../fuchsia/fuchsia_device_test.dart | 1 - .../general.shard/ios/code_signing_test.dart | 1 - .../general.shard/ios/ios_deploy_test.dart | 1 - .../test/general.shard/ios/mac_test.dart | 1 - .../general.shard/ios/simulators_test.dart | 1 - .../general.shard/ios/xcodeproj_test.dart | 1 - .../linux/linux_doctor_test.dart | 1 - .../general.shard/macos/cocoapods_test.dart | 1 - .../test/general.shard/macos/xcode_test.dart | 1 - .../runner/flutter_command_runner_test.dart | 1 - .../tester/flutter_tester_test.dart | 1 - .../test/general.shard/version_test.dart | 1 - .../web/golden_comparator_test.dart | 2 +- .../integration.shard/daemon_mode_test.dart | 2 - .../integration.shard/flutter_run_test.dart | 5 +- .../forbidden_imports_test.dart | 1 + .../test/integration.shard/test_driver.dart | 4 +- .../test/integration.shard/test_utils.dart | 7 +- .../integration.shard/unit_coverage_test.dart | 2 +- packages/flutter_tools/test/src/context.dart | 4 +- .../flutter_tools/test/src/darwin_common.dart | 2 +- .../test/src/fake_process_manager.dart | 13 +- packages/flutter_tools/test/src/mocks.dart | 2 +- packages/flutter_tools/test/src/testbed.dart | 1 - 128 files changed, 1185 insertions(+), 146 deletions(-) create mode 100644 dev/tools/test/fake_process_manager.dart create mode 100644 packages/flutter_tools/test/general.shard/base/process_manager_test.dart diff --git a/dev/tools/pubspec.yaml b/dev/tools/pubspec.yaml index 09e160df50..cc5e1b25d9 100644 --- a/dev/tools/pubspec.yaml +++ b/dev/tools/pubspec.yaml @@ -7,8 +7,6 @@ environment: dependencies: archive: 3.0.0 args: 1.6.0 - flutter_tools: - path: '../../packages/flutter_tools' http: 0.12.2 intl: 0.17.0 meta: 1.3.0 diff --git a/dev/tools/test/codesign_test.dart b/dev/tools/test/codesign_test.dart index 3200616394..18524ceb9b 100644 --- a/dev/tools/test/codesign_test.dart +++ b/dev/tools/test/codesign_test.dart @@ -11,8 +11,8 @@ import 'package:file/memory.dart'; import 'package:meta/meta.dart'; import 'package:platform/platform.dart'; -import '../../../packages/flutter_tools/test/src/fake_process_manager.dart'; import './common.dart'; +import 'fake_process_manager.dart'; void main() { group('codesign command', () { diff --git a/dev/tools/test/fake_process_manager.dart b/dev/tools/test/fake_process_manager.dart new file mode 100644 index 0000000000..0796926501 --- /dev/null +++ b/dev/tools/test/fake_process_manager.dart @@ -0,0 +1,376 @@ +// 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. + +// @dart = 2.8 + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:process/process.dart'; +import 'package:meta/meta.dart'; +import 'common.dart'; + +// TODO(flutter): consider moving this into package:process. + +typedef VoidCallback = void Function(); + +/// A command for [FakeProcessManager]. +@immutable +class FakeCommand { + const FakeCommand({ + @required this.command, + this.workingDirectory, + this.environment, + this.encoding, + this.duration = Duration.zero, + this.onRun, + this.exitCode = 0, + this.stdout = '', + this.stderr = '', + this.completer, + this.stdin, + }) : assert(command != null), + assert(duration != null), + assert(exitCode != null); + + /// The exact commands that must be matched for this [FakeCommand] to be + /// considered correct. + final List command; + + /// The exact working directory that must be matched for this [FakeCommand] to + /// be considered correct. + /// + /// If this is null, the working directory is ignored. + final String workingDirectory; + + /// The environment that must be matched for this [FakeCommand] to be considered correct. + /// + /// If this is null, then the environment is ignored. + /// + /// Otherwise, each key in this environment must be present and must have a + /// value that matches the one given here for the [FakeCommand] to match. + final Map environment; + + /// The stdout and stderr encoding that must be matched for this [FakeCommand] + /// to be considered correct. + /// + /// If this is null, then the encodings are ignored. + final Encoding encoding; + + /// The time to allow to elapse before returning the [exitCode], if this command + /// is "executed". + /// + /// If you set this to a non-zero time, you should use a [FakeAsync] zone, + /// otherwise the test will be artificially slow. + final Duration duration; + + /// A callback that is run after [duration] expires but before the [exitCode] + /// (and output) are passed back. + final VoidCallback onRun; + + /// The process' exit code. + /// + /// To simulate a never-ending process, set [duration] to a value greater than + /// 15 minutes (the timeout for our tests). + /// + /// To simulate a crash, subtract the crash signal number from 256. For example, + /// SIGPIPE (-13) is 243. + final int exitCode; + + /// The output to simulate on stdout. This will be encoded as UTF-8 and + /// returned in one go. + final String stdout; + + /// The output to simulate on stderr. This will be encoded as UTF-8 and + /// returned in one go. + final String stderr; + + /// If provided, allows the command completion to be blocked until the future + /// resolves. + final Completer completer; + + /// An optional stdin sink that will be exposed through the resulting + /// [FakeProcess]. + final IOSink stdin; + + void _matches( + List command, + String workingDirectory, + Map environment, + Encoding encoding, + ) { + expect(command, equals(this.command)); + if (this.workingDirectory != null) { + expect(this.workingDirectory, workingDirectory); + } + if (this.environment != null) { + expect(this.environment, environment); + } + if (this.encoding != null) { + expect(this.encoding, encoding); + } + } +} + +class _FakeProcess implements Process { + _FakeProcess( + this._exitCode, + Duration duration, + this.pid, + this._stderr, + this.stdin, + this._stdout, + this._completer, + ) : exitCode = Future.delayed(duration).then((void value) { + if (_completer != null) { + return _completer.future.then((void _) => _exitCode); + } + return _exitCode; + }), + stderr = _stderr == null + ? const Stream>.empty() + : Stream>.value(utf8.encode(_stderr)), + stdout = _stdout == null + ? const Stream>.empty() + : Stream>.value(utf8.encode(_stdout)); + + final int _exitCode; + final Completer _completer; + + @override + final Future exitCode; + + @override + final int pid; + + final String _stderr; + + @override + final Stream> stderr; + + @override + final IOSink stdin; + + @override + final Stream> stdout; + + final String _stdout; + + @override + bool kill([ProcessSignal signal = ProcessSignal.sigterm]) { + // Killing a fake process has no effect. + return false; + } +} + +abstract class FakeProcessManager implements ProcessManager { + /// A fake [ProcessManager] which responds to all commands as if they had run + /// instantaneously with an exit code of 0 and no output. + factory FakeProcessManager.any() = _FakeAnyProcessManager; + + /// A fake [ProcessManager] which responds to particular commands with + /// particular results. + /// + /// On creation, pass in a list of [FakeCommand] objects. When the + /// [ProcessManager] methods such as [start] are invoked, the next + /// [FakeCommand] must match (otherwise the test fails); its settings are used + /// to simulate the result of running that command. + /// + /// If no command is found, then one is implied which immediately returns exit + /// code 0 with no output. + /// + /// There is no logic to ensure that all the listed commands are run. Use + /// [FakeCommand.onRun] to set a flag, or specify a sentinel command as your + /// last command and verify its execution is successful, to ensure that all + /// the specified commands are actually called. + factory FakeProcessManager.list(List commands) = _SequenceProcessManager; + + FakeProcessManager._(); + + /// Adds a new [FakeCommand] to the current process manager. + /// + /// This can be used to configure test expectations after the [ProcessManager] has been + /// provided to another interface. + /// + /// This is a no-op on [FakeProcessManager.any]. + void addCommand(FakeCommand command); + + /// Add multiple [FakeCommand] to the current process manager. + void addCommands(Iterable commands) { + commands.forEach(addCommand); + } + + final Map _fakeRunningProcesses = {}; + + /// Whether this fake has more [FakeCommand]s that are expected to run. + /// + /// This is always `true` for [FakeProcessManager.any]. + bool get hasRemainingExpectations; + + @protected + FakeCommand findCommand( + List command, + String workingDirectory, + Map environment, + Encoding encoding, + ); + + int _pid = 9999; + + _FakeProcess _runCommand( + List command, + String workingDirectory, + Map environment, + Encoding encoding, + ) { + _pid += 1; + final FakeCommand fakeCommand = findCommand(command, workingDirectory, environment, encoding); + if (fakeCommand.onRun != null) { + fakeCommand.onRun(); + } + return _FakeProcess( + fakeCommand.exitCode, + fakeCommand.duration, + _pid, + fakeCommand.stderr, + fakeCommand.stdin, + fakeCommand.stdout, + fakeCommand.completer, + ); + } + + @override + Future start( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, // ignored + bool runInShell = false, // ignored + ProcessStartMode mode = ProcessStartMode.normal, // ignored + }) { + final _FakeProcess process = _runCommand(command.cast(), workingDirectory, environment, systemEncoding); + if (process._completer != null) { + _fakeRunningProcesses[process.pid] = process; + process.exitCode.whenComplete(() { + _fakeRunningProcesses.remove(process.pid); + }); + } + return Future.value(process); + } + + @override + Future run( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, // ignored + bool runInShell = false, // ignored + Encoding stdoutEncoding = systemEncoding, + Encoding stderrEncoding = systemEncoding, + }) async { + final _FakeProcess process = _runCommand(command.cast(), workingDirectory, environment, stdoutEncoding); + await process.exitCode; + return ProcessResult( + process.pid, + process._exitCode, + stdoutEncoding == null ? process.stdout : await stdoutEncoding.decodeStream(process.stdout), + stderrEncoding == null ? process.stderr : await stderrEncoding.decodeStream(process.stderr), + ); + } + + @override + ProcessResult runSync( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, // ignored + bool runInShell = false, // ignored + Encoding stdoutEncoding = systemEncoding, // actual encoder is ignored + Encoding stderrEncoding = systemEncoding, // actual encoder is ignored + }) { + final _FakeProcess process = _runCommand(command.cast(), workingDirectory, environment, stdoutEncoding); + return ProcessResult( + process.pid, + process._exitCode, + stdoutEncoding == null ? utf8.encode(process._stdout) : process._stdout, + stderrEncoding == null ? utf8.encode(process._stderr) : process._stderr, + ); + } + + /// Returns false if executable in [excludedExecutables]. + @override + bool canRun(dynamic executable, {String workingDirectory}) => !excludedExecutables.contains(executable); + + Set excludedExecutables = {}; + + @override + bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) { + // Killing a fake process has no effect unless it has an attached completer. + final _FakeProcess fakeProcess = _fakeRunningProcesses[pid]; + if (fakeProcess == null) { + return false; + } + fakeProcess._completer.complete(); + return true; + } +} + +class _FakeAnyProcessManager extends FakeProcessManager { + _FakeAnyProcessManager() : super._(); + + @override + FakeCommand findCommand( + List command, + String workingDirectory, + Map environment, + Encoding encoding, + ) { + return FakeCommand( + command: command, + workingDirectory: workingDirectory, + environment: environment, + encoding: encoding, + duration: Duration.zero, + exitCode: 0, + stdout: '', + stderr: '', + ); + } + + @override + void addCommand(FakeCommand command) { } + + @override + bool get hasRemainingExpectations => true; +} + +class _SequenceProcessManager extends FakeProcessManager { + _SequenceProcessManager(this._commands) : super._(); + + final List _commands; + + @override + FakeCommand findCommand( + List command, + String workingDirectory, + Map environment, + Encoding encoding, + ) { + expect(_commands, isNotEmpty, + reason: 'ProcessManager was told to execute $command (in $workingDirectory) ' + 'but the FakeProcessManager.list expected no more processes.' + ); + _commands.first._matches(command, workingDirectory, environment, encoding); + return _commands.removeAt(0); + } + + @override + void addCommand(FakeCommand command) { + _commands.add(command); + } + + @override + bool get hasRemainingExpectations => _commands.isNotEmpty; +} diff --git a/dev/tools/test/roll_dev_test.dart b/dev/tools/test/roll_dev_test.dart index e88cdaff2e..8f5229876b 100644 --- a/dev/tools/test/roll_dev_test.dart +++ b/dev/tools/test/roll_dev_test.dart @@ -9,8 +9,8 @@ import 'package:dev_tools/roll_dev.dart'; import 'package:dev_tools/globals.dart'; import 'package:dev_tools/repository.dart'; -import '../../../packages/flutter_tools/test/src/fake_process_manager.dart'; import './common.dart'; +import 'fake_process_manager.dart'; void main() { group('rollDev()', () { diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index e5af683cf6..e7260c7ab6 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../android/android_builder.dart'; import '../android/android_sdk.dart'; diff --git a/packages/flutter_tools/lib/src/android/android_device_discovery.dart b/packages/flutter_tools/lib/src/android/android_device_discovery.dart index b712fbdeb3..d7f01250d7 100644 --- a/packages/flutter_tools/lib/src/android/android_device_discovery.dart +++ b/packages/flutter_tools/lib/src/android/android_device_discovery.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/common.dart'; import '../base/file_system.dart'; diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart index 4378d26341..b5932c3f46 100644 --- a/packages/flutter_tools/lib/src/android/android_emulator.dart +++ b/packages/flutter_tools/lib/src/android/android_emulator.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../android/android_sdk.dart'; import '../android/android_workflow.dart'; diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart index cc3a55630a..2665cd199c 100644 --- a/packages/flutter_tools/lib/src/android/android_workflow.dart +++ b/packages/flutter_tools/lib/src/android/android_workflow.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/common.dart'; import '../base/context.dart'; @@ -14,6 +13,7 @@ import '../base/io.dart'; import '../base/logger.dart'; import '../base/os.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/user_messages.dart' hide userMessages; import '../base/version.dart'; import '../convert.dart'; diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart index 740674ab2b..78fb7f130b 100644 --- a/packages/flutter_tools/lib/src/application_package.dart +++ b/packages/flutter_tools/lib/src/application_package.dart @@ -7,7 +7,6 @@ import 'dart:collection'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:xml/xml.dart'; import 'android/android_sdk.dart'; diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index fc2e1808db..aef8921ef8 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -5,11 +5,11 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'base/common.dart'; import 'base/file_system.dart'; import 'base/platform.dart'; +import 'base/process.dart'; import 'base/utils.dart'; import 'build_info.dart'; import 'cache.dart'; diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index a1fe82f8b8..1d7a7405fe 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../build_info.dart'; diff --git a/packages/flutter_tools/lib/src/base/error_handling_io.dart b/packages/flutter_tools/lib/src/base/error_handling_io.dart index 2298cf6626..383bdada7c 100644 --- a/packages/flutter_tools/lib/src/base/error_handling_io.dart +++ b/packages/flutter_tools/lib/src/base/error_handling_io.dart @@ -5,17 +5,18 @@ // @dart = 2.8 import 'dart:convert'; -import 'dart:io' as io show Directory, File, Link, ProcessException, ProcessResult, ProcessSignal, systemEncoding, Process, ProcessStartMode; +import 'dart:io' as io show Directory, File, Link, ProcessException, ProcessResult, systemEncoding, Process, ProcessStartMode; import 'dart:typed_data'; import 'package:file/file.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; // ignore: package_path_import -import 'package:process/process.dart'; import '../reporting/reporting.dart'; import 'common.dart' show throwToolExit; +import 'io.dart'; import 'platform.dart'; +import 'process.dart'; // The Flutter tool hits file system and process errors that only the end-user can address. // We would like these errors to not hit crash logging. In these cases, we @@ -673,7 +674,7 @@ class ErrorHandlingProcessManager extends ProcessManager { } @override - bool canRun(dynamic executable, {String workingDirectory}) { + bool canRun(String executable, {String workingDirectory}) { return _runSync( () => _delegate.canRun(executable, workingDirectory: workingDirectory), platform: _platform, @@ -681,7 +682,7 @@ class ErrorHandlingProcessManager extends ProcessManager { } @override - bool killPid(int pid, [io.ProcessSignal signal = io.ProcessSignal.sigterm]) { + bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) { return _runSync( () => _delegate.killPid(pid, signal), platform: _platform, @@ -690,7 +691,7 @@ class ErrorHandlingProcessManager extends ProcessManager { @override Future run( - List command, { + List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, @@ -724,7 +725,7 @@ class ErrorHandlingProcessManager extends ProcessManager { @override Future start( - List command, { + List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, @@ -753,7 +754,7 @@ class ErrorHandlingProcessManager extends ProcessManager { @override io.ProcessResult runSync( - List command, { + List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart index 6dd472973c..87eef85805 100644 --- a/packages/flutter_tools/lib/src/base/os.dart +++ b/packages/flutter_tools/lib/src/base/os.dart @@ -7,7 +7,6 @@ import 'package:archive/archive.dart'; import 'package:file/file.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../build_info.dart'; import '../globals.dart' as globals; diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart index e4b8e052c9..ace02bc668 100644 --- a/packages/flutter_tools/lib/src/base/process.dart +++ b/packages/flutter_tools/lib/src/base/process.dart @@ -7,13 +7,15 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; +import 'package:file/local.dart' as local_fs; import '../convert.dart'; import 'common.dart'; import 'context.dart'; +import 'file_system.dart'; import 'io.dart'; import 'logger.dart'; +import 'platform.dart'; typedef StringConverter = String Function(String string); @@ -607,3 +609,386 @@ class _DefaultProcessUtils implements ProcessUtils { } } } + +/// Manages the creation of abstract processes. +/// +/// Using instances of this class provides level of indirection from the static +/// methods in the [Process] class, which in turn allows the underlying +/// implementation to be mocked out or decorated for testing and debugging +/// purposes. +abstract class ProcessManager { + /// Starts a process by running the specified [command]. + /// + /// The first element in [command] will be treated as the executable to run, + /// with subsequent elements being passed as arguments to the executable. It + /// is left to implementations to decide what element types they support in + /// the [command] list. + /// + /// Returns a `Future` that completes with a Process instance when + /// the process has been successfully started. That [Process] object can be + /// used to interact with the process. If the process cannot be started, the + /// returned [Future] completes with an exception. + /// + /// Use [workingDirectory] to set the working directory for the process. Note + /// that the change of directory occurs before executing the process on some + /// platforms, which may have impact when using relative paths for the + /// executable and the arguments. + /// + /// Use [environment] to set the environment variables for the process. If not + /// set, the environment of the parent process is inherited. Currently, only + /// US-ASCII environment variables are supported and errors are likely to occur + /// if an environment variable with code-points outside the US-ASCII range is + /// passed in. + /// + /// If [includeParentEnvironment] is `true`, the process's environment will + /// include the parent process's environment, with [environment] taking + /// precedence. Default is `true`. + /// + /// If [runInShell] is `true`, the process will be spawned through a system + /// shell. On Linux and OS X, `/bin/sh` is used, while + /// `%WINDIR%\system32\cmd.exe` is used on Windows. + /// + /// Users must read all data coming on the `stdout` and `stderr` + /// streams of processes started with [start]. If the user + /// does not read all data on the streams the underlying system + /// resources will not be released since there is still pending data. + /// + /// The following code uses `start` to grep for `main` in the + /// file `test.dart` on Linux. + /// + /// ProcessManager mgr = new LocalProcessManager(); + /// mgr.start('grep', ['-i', 'main', 'test.dart']).then((process) { + /// stdout.addStream(process.stdout); + /// stderr.addStream(process.stderr); + /// }); + /// + /// If [mode] is [ProcessStartMode.normal] (the default) a child + /// process will be started with `stdin`, `stdout` and `stderr` + /// connected. + /// + /// If `mode` is [ProcessStartMode.detached] a detached process will + /// be created. A detached process has no connection to its parent, + /// and can keep running on its own when the parent dies. The only + /// information available from a detached process is its `pid`. There + /// is no connection to its `stdin`, `stdout` or `stderr`, nor will + /// the process' exit code become available when it terminates. + /// + /// If `mode` is [ProcessStartMode.detachedWithStdio] a detached + /// process will be created where the `stdin`, `stdout` and `stderr` + /// are connected. The creator can communicate with the child through + /// these. The detached process will keep running even if these + /// communication channels are closed. The process' exit code will + /// not become available when it terminated. + /// + /// The default value for `mode` is `ProcessStartMode.NORMAL`. + Future start( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + ProcessStartMode mode = ProcessStartMode.normal, + }); + + /// Starts a process and runs it non-interactively to completion. + /// + /// The first element in [command] will be treated as the executable to run, + /// with subsequent elements being passed as arguments to the executable. + /// + /// Use [workingDirectory] to set the working directory for the process. Note + /// that the change of directory occurs before executing the process on some + /// platforms, which may have impact when using relative paths for the + /// executable and the arguments. + /// + /// Use [environment] to set the environment variables for the process. If not + /// set the environment of the parent process is inherited. Currently, only + /// US-ASCII environment variables are supported and errors are likely to occur + /// if an environment variable with code-points outside the US-ASCII range is + /// passed in. + /// + /// If [includeParentEnvironment] is `true`, the process's environment will + /// include the parent process's environment, with [environment] taking + /// precedence. Default is `true`. + /// + /// If [runInShell] is true, the process will be spawned through a system + /// shell. On Linux and OS X, `/bin/sh` is used, while + /// `%WINDIR%\system32\cmd.exe` is used on Windows. + /// + /// The encoding used for decoding `stdout` and `stderr` into text is + /// controlled through [stdoutEncoding] and [stderrEncoding]. The + /// default encoding is [systemEncoding]. If `null` is used no + /// decoding will happen and the [ProcessResult] will hold binary + /// data. + /// + /// Returns a `Future` that completes with the + /// result of running the process, i.e., exit code, standard out and + /// standard in. + /// + /// The following code uses `run` to grep for `main` in the + /// file `test.dart` on Linux. + /// + /// ProcessManager mgr = new LocalProcessManager(); + /// mgr.run('grep', ['-i', 'main', 'test.dart']).then((result) { + /// stdout.write(result.stdout); + /// stderr.write(result.stderr); + /// }); + Future run( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + Encoding stdoutEncoding = systemEncoding, + Encoding stderrEncoding = systemEncoding, + }); + + /// Starts a process and runs it to completion. This is a synchronous + /// call and will block until the child process terminates. + /// + /// The arguments are the same as for [run]`. + /// + /// Returns a `ProcessResult` with the result of running the process, + /// i.e., exit code, standard out and standard in. + ProcessResult runSync( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + Encoding stdoutEncoding = systemEncoding, + Encoding stderrEncoding = systemEncoding, + }); + + /// Returns `true` if the [executable] exists and if it can be executed. + bool canRun(String executable, {String workingDirectory}); + + /// Kills the process with id [pid]. + /// + /// Where possible, sends the [signal] to the process with id + /// `pid`. This includes Linux and OS X. The default signal is + /// [ProcessSignal.sigterm] which will normally terminate the + /// process. + /// + /// On platforms without signal support, including Windows, the call + /// just terminates the process with id `pid` in a platform specific + /// way, and the `signal` parameter is ignored. + /// + /// Returns `true` if the signal is successfully delivered to the + /// process. Otherwise the signal could not be sent, usually meaning + /// that the process is already dead. + bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]); +} + +/// A process manager that delegates directly to the dart:io Process class. +class LocalProcessManager implements ProcessManager { + const LocalProcessManager({ + @visibleForTesting FileSystem fileSystem = const local_fs.LocalFileSystem(), + @visibleForTesting Platform platform = const LocalPlatform(), + }) : _platform = platform, + _fileSystem = fileSystem; + + final Platform _platform; + final FileSystem _fileSystem; + + @override + bool canRun(String executable, {String workingDirectory}) { + return getExecutablePath(executable, workingDirectory, platform: _platform, fileSystem: _fileSystem) != null; + } + + @override + bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) { + return signal.send(pid); + } + + @override + Future run(List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + Encoding stdoutEncoding = systemEncoding, + Encoding stderrEncoding = systemEncoding, + }) { + return Process.run( + sanitizeExecutablePath(_getExecutable( + command, + workingDirectory, + runInShell, + ), platform: _platform), + _getArguments(command), + environment: environment, + includeParentEnvironment: includeParentEnvironment, + stdoutEncoding: systemEncoding, + stderrEncoding: systemEncoding, + workingDirectory: workingDirectory, + runInShell: runInShell, + ); + } + + @override + ProcessResult runSync(List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + Encoding stdoutEncoding = systemEncoding, + Encoding stderrEncoding = systemEncoding, + }) { + return Process.runSync( + sanitizeExecutablePath(_getExecutable( + command, + workingDirectory, + runInShell, + ), platform: _platform), + _getArguments(command), + environment: environment, + includeParentEnvironment: includeParentEnvironment, + stdoutEncoding: systemEncoding, + stderrEncoding: systemEncoding, + workingDirectory: workingDirectory, + runInShell: runInShell, + ); + } + + @override + Future start( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, + bool runInShell = false, + ProcessStartMode mode = ProcessStartMode.normal, + }) { + return Process.start( + sanitizeExecutablePath(_getExecutable( + command, + workingDirectory, + runInShell, + ), platform: _platform), + _getArguments(command), + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + mode: mode, + ); + } + + String _getExecutable( + List command, + String workingDirectory, + bool runInShell, + ) { + final String commandName = command.first.toString(); + if (runInShell) { + return commandName; + } + final String executable = getExecutablePath(commandName, workingDirectory, platform: _platform, fileSystem: _fileSystem); + if (executable == null) { + throw ArgumentError('Could not resolve $commandName to executablePath in $workingDirectory'); + } + return executable; + } + + List _getArguments( + List command, + ) { + return command.skip(1).toList(); + } +} + +/// Sanatizes the executable path on Windows. +/// https://github.com/dart-lang/sdk/issues/37751 +String sanitizeExecutablePath(String executable, {@required Platform platform }) { + if (executable.isEmpty) { + return executable; + } + if (!platform.isWindows) { + return executable; + } + if (executable.contains(' ') && !executable.contains('"')) { + // Use quoted strings to indicate where the file name ends and the arguments begin; + // otherwise, the file name is ambiguous. + return '"$executable"'; + } + return executable; +} + +/// Searches the `PATH` for the executable that [command] is supposed to launch. +/// +/// This first builds a list of candidate paths where the executable may reside. +/// If [command] is already an absolute path, then the `PATH` environment +/// variable will not be consulted, and the specified absolute path will be the +/// only candidate that is considered. +/// +/// Once the list of candidate paths has been constructed, this will pick the +/// first such path that represents an existent file. +/// +/// Return `null` if there were no viable candidates, meaning the executable +/// could not be found. +/// +/// If [platform] is not specified, it will default to the current platform. +@visibleForTesting +String getExecutablePath( + String command, + String workingDirectory, { + @required Platform platform, + @required FileSystem fileSystem, +}) { + try { + workingDirectory ??= fileSystem.currentDirectory.path; + } on FileSystemException { + // The `currentDirectory` getter can throw a FileSystemException for example + // when the process doesn't have read/list permissions in each component of + // the cwd path. In this case, fall back on '.'. + workingDirectory ??= '.'; + } + final String pathSeparator = platform.isWindows ? ';' : ':'; + + List extensions = []; + if (platform.isWindows && fileSystem.path.extension(command).isEmpty) { + extensions = platform.environment['PATHEXT'].split(pathSeparator); + } + + List candidates = []; + if (command.contains(fileSystem.path.separator)) { + candidates = _getCandidatePaths( + command, [workingDirectory], extensions, fileSystem); + } else { + final List searchPath = platform.environment['PATH'].split(pathSeparator); + candidates = _getCandidatePaths(command, searchPath, extensions, fileSystem); + } + for (final String path in candidates) { + if (fileSystem.file(path).existsSync()) { + return path; + } + } + return null; +} + +/// Returns all possible combinations of `$searchPath\$command.$ext` for +/// `searchPath` in [searchPaths] and `ext` in [extensions]. +/// +/// If [extensions] is empty, it will just enumerate all +/// `$searchPath\$command`. +/// If [command] is an absolute path, it will just enumerate +/// `$command.$ext`. +List _getCandidatePaths( + String command, + List searchPaths, + List extensions, + FileSystem fileSystem, +) { + final List withExtensions = extensions.isNotEmpty + ? extensions.map((String ext) => '$command$ext').toList() + : [command]; + if (fileSystem.path.isAbsolute(command)) { + return withExtensions; + } + return searchPaths + .map((String path) => + withExtensions.map((String command) => fileSystem.path.join(path, command))) + .expand((Iterable e) => e) + .toList() + .cast(); +} diff --git a/packages/flutter_tools/lib/src/build_system/build_system.dart b/packages/flutter_tools/lib/src/build_system/build_system.dart index 48013e80e0..1c9a61eeea 100644 --- a/packages/flutter_tools/lib/src/build_system/build_system.dart +++ b/packages/flutter_tools/lib/src/build_system/build_system.dart @@ -9,13 +9,13 @@ import 'package:convert/convert.dart'; import 'package:crypto/crypto.dart'; import 'package:meta/meta.dart'; import 'package:pool/pool.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/error_handling_io.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/utils.dart'; import '../cache.dart'; import '../convert.dart'; diff --git a/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart b/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart index 4eb4dc5ca8..1bbefca6f8 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/icon_tree_shaker.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:mime/mime.dart' as mime; import '../../artifacts.dart'; @@ -13,6 +12,7 @@ import '../../base/common.dart'; import '../../base/file_system.dart'; import '../../base/io.dart'; import '../../base/logger.dart'; +import '../../base/process.dart'; import '../../convert.dart'; import '../../devfs.dart'; import '../build_system.dart'; diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart index 2eef212dca..3fa36f7b46 100644 --- a/packages/flutter_tools/lib/src/cache.dart +++ b/packages/flutter_tools/lib/src/cache.dart @@ -10,7 +10,6 @@ import 'package:crypto/crypto.dart'; import 'package:file/memory.dart'; import 'package:meta/meta.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import 'android/gradle_utils.dart'; import 'base/common.dart'; diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart index 8b014f5e65..1012bbbaaa 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.dart @@ -5,12 +5,12 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/terminal.dart'; import '../runner/flutter_command.dart'; import 'analyze_continuously.dart'; diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart index b9ee1081e9..3efc142c15 100644 --- a/packages/flutter_tools/lib/src/commands/analyze_base.dart +++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart @@ -6,7 +6,6 @@ import 'package:args/args.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:yaml/yaml.dart' as yaml; import '../artifacts.dart'; @@ -14,6 +13,7 @@ import '../base/common.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/terminal.dart'; import '../base/utils.dart'; import '../cache.dart'; diff --git a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart index 84aa07e175..4ad30b0f8f 100644 --- a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart +++ b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart @@ -6,7 +6,6 @@ import 'package:args/args.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/common.dart'; @@ -14,6 +13,7 @@ import '../base/file_system.dart'; import '../base/io.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/terminal.dart'; import '../dart/analysis.dart'; import 'analyze_base.dart'; diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart index 6a559092c2..dbc80aa266 100644 --- a/packages/flutter_tools/lib/src/commands/analyze_once.dart +++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart @@ -8,13 +8,13 @@ import 'dart:async'; import 'package:args/args.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/common.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/terminal.dart'; import '../dart/analysis.dart'; import 'analyze_base.dart'; diff --git a/packages/flutter_tools/lib/src/commands/downgrade.dart b/packages/flutter_tools/lib/src/commands/downgrade.dart index 71dfec2bd0..88bbf557e2 100644 --- a/packages/flutter_tools/lib/src/commands/downgrade.dart +++ b/packages/flutter_tools/lib/src/commands/downgrade.dart @@ -4,8 +4,6 @@ // @dart = 2.8 -import 'package:process/process.dart'; - import '../base/common.dart'; import '../base/file_system.dart'; import '../base/io.dart'; diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart index 76923c2746..0a5095a656 100644 --- a/packages/flutter_tools/lib/src/compile.dart +++ b/packages/flutter_tools/lib/src/compile.dart @@ -8,7 +8,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import 'package:usage/uuid/uuid.dart'; import 'artifacts.dart'; @@ -17,6 +16,7 @@ import 'base/file_system.dart'; import 'base/io.dart'; import 'base/logger.dart'; import 'base/platform.dart'; +import 'base/process.dart'; import 'build_info.dart'; import 'convert.dart'; diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index ae436f5611..bb3139bb8e 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -6,8 +6,6 @@ import 'dart:async'; -import 'package:process/process.dart'; - import 'android/android_sdk.dart'; import 'android/android_studio.dart'; import 'android/android_workflow.dart'; diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart index ef873b2b37..cc05e91960 100644 --- a/packages/flutter_tools/lib/src/dart/analysis.dart +++ b/packages/flutter_tools/lib/src/dart/analysis.dart @@ -8,13 +8,13 @@ import 'dart:async'; import 'dart:math' as math; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/common.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/terminal.dart'; import '../base/utils.dart'; import '../convert.dart'; diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart index 535a08b41f..61c9c44a80 100644 --- a/packages/flutter_tools/lib/src/dart/pub.dart +++ b/packages/flutter_tools/lib/src/dart/pub.dart @@ -6,7 +6,6 @@ import 'package:meta/meta.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import '../base/bot_detector.dart'; import '../base/common.dart'; diff --git a/packages/flutter_tools/lib/src/desktop_device.dart b/packages/flutter_tools/lib/src/desktop_device.dart index 0a8d1b9c3e..20f7facb1d 100644 --- a/packages/flutter_tools/lib/src/desktop_device.dart +++ b/packages/flutter_tools/lib/src/desktop_device.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'application_package.dart'; import 'base/common.dart'; @@ -15,6 +14,7 @@ import 'base/file_system.dart'; import 'base/io.dart'; import 'base/logger.dart'; import 'base/os.dart'; +import 'base/process.dart'; import 'build_info.dart'; import 'convert.dart'; import 'devfs.dart'; diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index d6bbc427c9..1c6d661cc2 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -8,7 +8,6 @@ import 'dart:async'; import 'dart:math' as math; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart' as vm_service; import 'android/android_device_discovery.dart'; @@ -25,6 +24,7 @@ import 'base/io.dart'; import 'base/logger.dart'; import 'base/os.dart'; import 'base/platform.dart'; +import 'base/process.dart'; import 'base/terminal.dart'; import 'base/user_messages.dart' hide userMessages; import 'base/utils.dart'; diff --git a/packages/flutter_tools/lib/src/devtools_launcher.dart b/packages/flutter_tools/lib/src/devtools_launcher.dart index 791f57726d..3562058534 100644 --- a/packages/flutter_tools/lib/src/devtools_launcher.dart +++ b/packages/flutter_tools/lib/src/devtools_launcher.dart @@ -8,11 +8,11 @@ import 'dart:async'; import 'package:http/http.dart' as http; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'base/io.dart' as io; import 'base/logger.dart'; import 'base/platform.dart'; +import 'base/process.dart'; import 'convert.dart'; import 'persistent_tool_state.dart'; import 'resident_runner.dart'; diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index badb2943d5..44b8590078 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'android/android_studio_validator.dart'; import 'android/android_workflow.dart'; @@ -16,6 +15,7 @@ import 'base/file_system.dart'; import 'base/logger.dart'; import 'base/os.dart'; import 'base/platform.dart'; +import 'base/process.dart'; import 'base/terminal.dart'; import 'base/user_messages.dart'; import 'base/utils.dart'; diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart index e825ea2bbd..de70d4ae26 100644 --- a/packages/flutter_tools/lib/src/emulator.dart +++ b/packages/flutter_tools/lib/src/emulator.dart @@ -7,7 +7,6 @@ import 'dart:math' as math; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'android/android_emulator.dart'; import 'android/android_sdk.dart'; diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart index 4086dfcbb3..44b6b9177d 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_dev_finder.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/common.dart'; import '../base/logger.dart'; diff --git a/packages/flutter_tools/lib/src/globals.dart b/packages/flutter_tools/lib/src/globals.dart index 9288e75a0b..7a04cce8c3 100644 --- a/packages/flutter_tools/lib/src/globals.dart +++ b/packages/flutter_tools/lib/src/globals.dart @@ -4,8 +4,6 @@ // @dart = 2.8 -import 'package:process/process.dart'; - import 'android/android_sdk.dart'; import 'android/android_studio.dart'; import 'artifacts.dart'; @@ -82,10 +80,8 @@ FileSystemUtils get fsUtils => context.get() ?? FileSystemUtils platform: platform, ); -const ProcessManager _kLocalProcessManager = LocalProcessManager(); - /// The active process manager. -ProcessManager get processManager => context.get() ?? _kLocalProcessManager; +ProcessManager get processManager => context.get(); ProcessUtils get processUtils => context.get(); const Platform _kLocalPlatform = LocalPlatform(); diff --git a/packages/flutter_tools/lib/src/ios/code_signing.dart b/packages/flutter_tools/lib/src/ios/code_signing.dart index 20708d1d2e..22e2fce0f6 100644 --- a/packages/flutter_tools/lib/src/ios/code_signing.dart +++ b/packages/flutter_tools/lib/src/ios/code_signing.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../application_package.dart'; import '../base/common.dart'; diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index a66f947edc..e29d606c73 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart' as vm_service; import '../application_package.dart'; @@ -17,6 +16,7 @@ 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'; diff --git a/packages/flutter_tools/lib/src/ios/ios_deploy.dart b/packages/flutter_tools/lib/src/ios/ios_deploy.dart index 9980d77741..55c8cecf0b 100644 --- a/packages/flutter_tools/lib/src/ios/ios_deploy.dart +++ b/packages/flutter_tools/lib/src/ios/ios_deploy.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/common.dart'; diff --git a/packages/flutter_tools/lib/src/ios/iproxy.dart b/packages/flutter_tools/lib/src/ios/iproxy.dart index 6ce94554ee..e712b6f48b 100644 --- a/packages/flutter_tools/lib/src/ios/iproxy.dart +++ b/packages/flutter_tools/lib/src/ios/iproxy.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/io.dart'; import '../base/logger.dart'; diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 9aeaf00802..e4bca0f05d 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../application_package.dart'; import '../artifacts.dart'; diff --git a/packages/flutter_tools/lib/src/ios/plist_parser.dart b/packages/flutter_tools/lib/src/ios/plist_parser.dart index 46efe26132..a3319a9510 100644 --- a/packages/flutter_tools/lib/src/ios/plist_parser.dart +++ b/packages/flutter_tools/lib/src/ios/plist_parser.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/file_system.dart'; import '../base/io.dart'; diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 05d4a1df62..800f4e8615 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -8,7 +8,6 @@ import 'dart:async'; import 'dart:math' as math; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../application_package.dart'; import '../base/common.dart'; diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart index 88d128055d..56cb7d7b1f 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart @@ -6,7 +6,6 @@ import 'package:file/memory.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/common.dart'; diff --git a/packages/flutter_tools/lib/src/linux/linux_device.dart b/packages/flutter_tools/lib/src/linux/linux_device.dart index e122cea9a8..07ccb7f4fd 100644 --- a/packages/flutter_tools/lib/src/linux/linux_device.dart +++ b/packages/flutter_tools/lib/src/linux/linux_device.dart @@ -5,12 +5,12 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/os.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../build_info.dart'; import '../desktop_device.dart'; import '../device.dart'; diff --git a/packages/flutter_tools/lib/src/linux/linux_doctor.dart b/packages/flutter_tools/lib/src/linux/linux_doctor.dart index 73fa32fcb9..6573e7376b 100644 --- a/packages/flutter_tools/lib/src/linux/linux_doctor.dart +++ b/packages/flutter_tools/lib/src/linux/linux_doctor.dart @@ -5,9 +5,9 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/io.dart'; +import '../base/process.dart'; import '../base/user_messages.dart'; import '../base/version.dart'; import '../doctor.dart'; diff --git a/packages/flutter_tools/lib/src/macos/cocoapods.dart b/packages/flutter_tools/lib/src/macos/cocoapods.dart index de0106401a..39aeb55240 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods.dart @@ -6,7 +6,6 @@ import 'package:file/file.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/common.dart'; import '../base/error_handling_io.dart'; diff --git a/packages/flutter_tools/lib/src/macos/macos_device.dart b/packages/flutter_tools/lib/src/macos/macos_device.dart index 175255fc50..07f0fcbca1 100644 --- a/packages/flutter_tools/lib/src/macos/macos_device.dart +++ b/packages/flutter_tools/lib/src/macos/macos_device.dart @@ -5,13 +5,13 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.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 '../build_info.dart'; import '../desktop_device.dart'; import '../device.dart'; diff --git a/packages/flutter_tools/lib/src/macos/xcode.dart b/packages/flutter_tools/lib/src/macos/xcode.dart index 034b0d9e9b..57ba8deee1 100644 --- a/packages/flutter_tools/lib/src/macos/xcode.dart +++ b/packages/flutter_tools/lib/src/macos/xcode.dart @@ -8,7 +8,6 @@ import 'dart:async'; import 'package:file/memory.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/common.dart'; diff --git a/packages/flutter_tools/lib/src/test/web_test_compiler.dart b/packages/flutter_tools/lib/src/test/web_test_compiler.dart index 5ee47bf225..53dad377da 100644 --- a/packages/flutter_tools/lib/src/test/web_test_compiler.dart +++ b/packages/flutter_tools/lib/src/test/web_test_compiler.dart @@ -6,7 +6,6 @@ import 'package:meta/meta.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import '../artifacts.dart'; import '../base/common.dart'; @@ -14,6 +13,7 @@ import '../base/config.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../build_info.dart'; import '../bundle.dart'; import '../compile.dart'; diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart index d99e7efd1c..8270922fe2 100644 --- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart +++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../application_package.dart'; import '../artifacts.dart'; @@ -15,6 +14,7 @@ import '../base/config.dart'; import '../base/file_system.dart'; import '../base/io.dart'; import '../base/logger.dart'; +import '../base/process.dart'; import '../build_info.dart'; import '../bundle.dart'; import '../convert.dart'; diff --git a/packages/flutter_tools/lib/src/web/chrome.dart b/packages/flutter_tools/lib/src/web/chrome.dart index 427f1d85da..0e44884849 100644 --- a/packages/flutter_tools/lib/src/web/chrome.dart +++ b/packages/flutter_tools/lib/src/web/chrome.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; import '../base/common.dart'; @@ -16,6 +15,7 @@ import '../base/io.dart'; import '../base/logger.dart'; import '../base/os.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../convert.dart'; /// An environment variable used to override the location of Google Chrome. diff --git a/packages/flutter_tools/lib/src/web/web_device.dart b/packages/flutter_tools/lib/src/web/web_device.dart index df30ecec26..044a73ba41 100644 --- a/packages/flutter_tools/lib/src/web/web_device.dart +++ b/packages/flutter_tools/lib/src/web/web_device.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../application_package.dart'; import '../base/file_system.dart'; @@ -13,6 +12,7 @@ import '../base/io.dart'; import '../base/logger.dart'; import '../base/os.dart'; import '../base/platform.dart'; +import '../base/process.dart'; import '../base/version.dart'; import '../build_info.dart'; import '../device.dart'; diff --git a/packages/flutter_tools/lib/src/windows/visual_studio.dart b/packages/flutter_tools/lib/src/windows/visual_studio.dart index 0aedcbb1a6..cf2f9eb9d9 100644 --- a/packages/flutter_tools/lib/src/windows/visual_studio.dart +++ b/packages/flutter_tools/lib/src/windows/visual_studio.dart @@ -5,7 +5,6 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/file_system.dart'; import '../base/io.dart'; diff --git a/packages/flutter_tools/lib/src/windows/windows_device.dart b/packages/flutter_tools/lib/src/windows/windows_device.dart index 479802938d..c67c8ddea7 100644 --- a/packages/flutter_tools/lib/src/windows/windows_device.dart +++ b/packages/flutter_tools/lib/src/windows/windows_device.dart @@ -5,11 +5,11 @@ // @dart = 2.8 import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/os.dart'; +import '../base/process.dart'; import '../build_info.dart'; import '../desktop_device.dart'; import '../device.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart index 38d8086595..cb0950eae6 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/analyze_continuously_test.dart @@ -13,6 +13,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/analyze.dart'; @@ -20,7 +21,6 @@ import 'package:flutter_tools/src/dart/analysis.dart'; import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -41,7 +41,10 @@ void main() { setUp(() { fileSystem = LocalFileSystem.instance; platform = const LocalPlatform(); - processManager = const LocalProcessManager(); + processManager = LocalProcessManager( + fileSystem: fileSystem, + platform: platform, + ); terminal = AnsiTerminal(platform: platform, stdio: Stdio()); logger = BufferLogger(outputPreferences: OutputPreferences.test(), terminal: terminal); tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_analysis_test.'); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart index 92773934aa..03bb779128 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart @@ -26,7 +26,6 @@ import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/vmservice.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart' as vm_service; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart index 0ec608b113..4efecf7099 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart index 1f459c0c52..820dbe8c76 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart @@ -8,11 +8,11 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart index e614b936f6..051d484217 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart @@ -9,6 +9,7 @@ import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/utils.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cmake.dart'; @@ -17,7 +18,6 @@ import 'package:flutter_tools/src/commands/build_linux.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart index 72c15d0681..2ffe2d5965 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart @@ -12,6 +12,7 @@ import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; @@ -20,7 +21,6 @@ import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart index d5ac8d647f..96a5e27f11 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart @@ -8,6 +8,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart index 06b06a311f..ffab943ddc 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart @@ -8,13 +8,13 @@ import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_windows.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/windows/visual_studio.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart index fbdbffeb15..4c800ed35d 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart @@ -9,12 +9,12 @@ import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/commands/clean.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart index 42b89425ab..7462be995e 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart @@ -8,11 +8,11 @@ import 'dart:convert'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/devices.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart index 39fd9fc3d4..0fadb98b89 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/doctor_test.dart @@ -14,6 +14,7 @@ import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/build_info.dart'; @@ -29,7 +30,6 @@ import 'package:flutter_tools/src/vscode/vscode.dart'; import 'package:flutter_tools/src/vscode/vscode_validator.dart'; import 'package:flutter_tools/src/web/workflow.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:fake_async/fake_async.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart index 7193904f30..fbd10c2654 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart @@ -8,6 +8,7 @@ import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/downgrade.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart index b73360ed49..746bf1a593 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/pub_get_test.dart @@ -7,6 +7,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/packages.dart'; import 'package:flutter_tools/src/dart/pub.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart index 54d64f92b3..f10497ba13 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart @@ -15,6 +15,7 @@ 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/logger.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart index fbc2e9d533..d727099f0f 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart @@ -9,9 +9,9 @@ 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/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/shell_completion.dart'; -import 'package:process/process.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index 84ff16e5de..ffcdc26133 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -10,6 +10,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/test.dart'; @@ -19,7 +20,6 @@ import 'package:flutter_tools/src/test/runner.dart'; import 'package:flutter_tools/src/test/test_wrapper.dart'; import 'package:flutter_tools/src/test/watcher.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart b/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart index b2857bb50c..bedf889844 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/analyze_once_test.dart @@ -5,6 +5,7 @@ // @dart = 2.8 import 'package:flutter_tools/src/base/error_handling_io.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/artifacts.dart'; @@ -17,7 +18,6 @@ import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/analyze.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -108,10 +108,13 @@ void main() { setUpAll(() { Cache.disableLocking(); - processManager = const LocalProcessManager(); platform = const LocalPlatform(); terminal = AnsiTerminal(platform: platform, stdio: Stdio()); fileSystem = LocalFileSystem.instance; + processManager = LocalProcessManager( + platform: platform, + fileSystem: fileSystem, + ); logger = BufferLogger.test(); analyzerSeparator = platform.isWindows ? '-' : '•'; artifacts = CachedArtifacts( diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart index 4a857bcdb4..d5f44238bc 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart @@ -10,6 +10,7 @@ import 'package:args/command_runner.dart'; import 'package:flutter_tools/src/android/android_builder.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_aar.dart'; @@ -17,7 +18,6 @@ import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/android_common.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart index 4984b8b43c..8a685b5ee2 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/android/android_builder.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_apk.dart'; @@ -18,7 +19,6 @@ import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/android_common.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart index 9fe51a968e..34e1482fb4 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart @@ -17,7 +17,6 @@ import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/android_common.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart index d0452f0521..ad387a6b95 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart @@ -7,6 +7,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/build_system/targets/common.dart'; import 'package:flutter_tools/src/build_system/targets/icon_tree_shaker.dart'; @@ -16,7 +17,6 @@ import 'package:flutter_tools/src/commands/build_bundle.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart index 4db25b0832..af049dd30a 100755 --- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart @@ -16,6 +16,7 @@ import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/net.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/create.dart'; @@ -25,7 +26,6 @@ import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:pub_semver/pub_semver.dart'; import 'package:pubspec_parse/pubspec_parse.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart b/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart index f34b953fe4..56623d48c9 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart @@ -11,11 +11,11 @@ import 'package:flutter_tools/src/base/bot_detector.dart'; import 'package:flutter_tools/src/base/error_handling_io.dart'; import 'package:flutter_tools/src/base/file_system.dart' hide IOSink; import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/packages.dart'; import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; -import 'package:process/process.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart index c394676d10..b74bec3419 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/upgrade.dart'; import 'package:flutter_tools/src/convert.dart'; @@ -15,7 +16,6 @@ import 'package:flutter_tools/src/persistent_tool_state.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/analytics_test.dart b/packages/flutter_tools/test/general.shard/analytics_test.dart index fbbafac2f1..93a7720708 100644 --- a/packages/flutter_tools/test/general.shard/analytics_test.dart +++ b/packages/flutter_tools/test/general.shard/analytics_test.dart @@ -10,6 +10,7 @@ import 'package:flutter_tools/src/base/config.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/time.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart index 6600a6b1e2..74c8063b3d 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart @@ -10,6 +10,7 @@ import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/android/android_workflow.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:test/fake.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart index 33d6963d5d..943ab128c2 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart @@ -16,11 +16,11 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/android_install_test.dart b/packages/flutter_tools/test/general.shard/android/android_install_test.dart index 2540af3142..f25ae6c6ed 100644 --- a/packages/flutter_tools/test/general.shard/android/android_install_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_install_test.dart @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:test/fake.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart index 7ac4e719e6..bc54cdfafa 100644 --- a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart @@ -10,9 +10,9 @@ import 'package:flutter_tools/src/base/config.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart' show ProcessResult; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart index bd3812920e..2b14a8a097 100644 --- a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart @@ -8,6 +8,7 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/android/android_studio.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/version.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/ios/plist_parser.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart b/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart index 50ea44a4dd..41cd0f25ff 100644 --- a/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_studio_validator_test.dart @@ -10,10 +10,10 @@ import 'package:flutter_tools/src/base/config.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/doctor.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart index 4430784e88..5696fa001a 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart @@ -12,11 +12,11 @@ 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/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart index c7dfa2ba10..84a4cf4356 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart @@ -18,6 +18,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; @@ -25,7 +26,6 @@ import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart index e1dfccb02b..07972fdedf 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_utils_test.dart @@ -8,11 +8,11 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/android/gradle_utils.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/os.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/application_package_test.dart b/packages/flutter_tools/test/general.shard/application_package_test.dart index 10346e3adc..253ae1e33a 100644 --- a/packages/flutter_tools/test/general.shard/application_package_test.dart +++ b/packages/flutter_tools/test/general.shard/application_package_test.dart @@ -13,6 +13,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; @@ -21,7 +22,6 @@ import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/ios/plist_parser.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart index a312ea9197..9aabcfab1a 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart @@ -11,6 +11,7 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/asset.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/globals.dart' as globals; diff --git a/packages/flutter_tools/test/general.shard/base/error_handling_io_test.dart b/packages/flutter_tools/test/general.shard/base/error_handling_io_test.dart index 1d705cf73e..2d814a6391 100644 --- a/packages/flutter_tools/test/general.shard/base/error_handling_io_test.dart +++ b/packages/flutter_tools/test/general.shard/base/error_handling_io_test.dart @@ -11,11 +11,11 @@ import 'package:flutter_tools/src/base/error_handling_io.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/globals.dart' as globals show flutterUsage; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; import 'package:path/path.dart' as path; // ignore: package_path_import -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/base/os_test.dart b/packages/flutter_tools/test/general.shard/base/os_test.dart index 0178dbe9ee..d698209800 100644 --- a/packages/flutter_tools/test/general.shard/base/os_test.dart +++ b/packages/flutter_tools/test/general.shard/base/os_test.dart @@ -13,7 +13,6 @@ import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/base/os_utils_test.dart b/packages/flutter_tools/test/general.shard/base/os_utils_test.dart index 5a21ab7ff7..855c8e85c2 100644 --- a/packages/flutter_tools/test/general.shard/base/os_utils_test.dart +++ b/packages/flutter_tools/test/general.shard/base/os_utils_test.dart @@ -8,8 +8,8 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/base/signals.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/general.shard/base/process_manager_test.dart b/packages/flutter_tools/test/general.shard/base/process_manager_test.dart new file mode 100644 index 0000000000..d898845f14 --- /dev/null +++ b/packages/flutter_tools/test/general.shard/base/process_manager_test.dart @@ -0,0 +1,327 @@ +// 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. + +// @dart = 2.8 + +import 'package:file/memory.dart'; +import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; + +import '../../src/common.dart'; + +void main() { + group('getExecutablePath', () { + FileSystem fileSystem; + Directory workingDir; + Directory dir1; + Directory dir2; + Directory dir3; + + void initialize(FileSystemStyle style) { + setUp(() { + fileSystem = MemoryFileSystem(style: style); + workingDir = fileSystem.systemTempDirectory.createTempSync('work_dir_'); + dir1 = fileSystem.systemTempDirectory.createTempSync('dir1_'); + dir2 = fileSystem.systemTempDirectory.createTempSync('dir2_'); + dir3 = fileSystem.systemTempDirectory.createTempSync('dir3_'); + }); + } + + tearDown(() { + workingDir.deleteSync(recursive: true); + dir1.deleteSync(recursive: true); + dir2.deleteSync(recursive: true); + dir3.deleteSync(recursive: true); + }); + + group('on windows', () { + Platform platform; + + initialize(FileSystemStyle.windows); + + setUp(() { + platform = FakePlatform( + operatingSystem: 'windows', + environment: { + 'PATH': '${dir1.path};${dir2.path}', + 'PATHEXT': '.exe;.bat' + }, + ); + }); + + test('absolute', () { + String command = fileSystem.path.join(dir3.path, 'bla.exe'); + final String expectedPath = command; + fileSystem.file(command).createSync(); + + String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + + command = fileSystem.path.withoutExtension(command); + executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('in path', () { + String command = 'bla.exe'; + final String expectedPath = fileSystem.path.join(dir2.path, command); + fileSystem.file(expectedPath).createSync(); + + String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + + command = fileSystem.path.withoutExtension(command); + executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('in path multiple times', () { + String command = 'bla.exe'; + final String expectedPath = fileSystem.path.join(dir1.path, command); + final String wrongPath = fileSystem.path.join(dir2.path, command); + fileSystem.file(expectedPath).createSync(); + fileSystem.file(wrongPath).createSync(); + + String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + + command = fileSystem.path.withoutExtension(command); + executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('in subdir of work dir', () { + String command = fileSystem.path.join('.', 'foo', 'bla.exe'); + final String expectedPath = fileSystem.path.join(workingDir.path, command); + fileSystem.file(expectedPath).createSync(recursive: true); + + String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + + command = fileSystem.path.withoutExtension(command); + executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('in work dir', () { + String command = fileSystem.path.join('.', 'bla.exe'); + final String expectedPath = fileSystem.path.join(workingDir.path, command); + final String wrongPath = fileSystem.path.join(dir2.path, command); + fileSystem.file(expectedPath).createSync(); + fileSystem.file(wrongPath).createSync(); + + String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + + command = fileSystem.path.withoutExtension(command); + executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('with multiple extensions', () { + const String command = 'foo'; + final String expectedPath = fileSystem.path.join(dir1.path, '$command.exe'); + final String wrongPath1 = fileSystem.path.join(dir1.path, '$command.bat'); + final String wrongPath2 = fileSystem.path.join(dir2.path, '$command.exe'); + fileSystem.file(expectedPath).createSync(); + fileSystem.file(wrongPath1).createSync(); + fileSystem.file(wrongPath2).createSync(); + + final String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('not found', () { + const String command = 'foo.exe'; + + final String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + expect(executablePath, isNull); + }); + + test('when path has spaces', () { + expect( + sanitizeExecutablePath(r'Program Files\bla.exe', platform: platform), + r'"Program Files\bla.exe"'); + expect( + sanitizeExecutablePath(r'ProgramFiles\bla.exe', platform: platform), + r'ProgramFiles\bla.exe'); + expect( + sanitizeExecutablePath(r'"Program Files\bla.exe"', platform: platform), + r'"Program Files\bla.exe"'); + expect( + sanitizeExecutablePath(r'"Program Files\bla.exe"', platform: platform), + r'"Program Files\bla.exe"'); + expect( + sanitizeExecutablePath(r'C:"Program Files"\bla.exe', platform: platform), + r'C:"Program Files"\bla.exe'); + }); + + test('with absolute path when currentDirectory getter throws', () { + final FileSystem fileSystemNoCwd = MemoryFileSystemNoCwd(fileSystem); + final String command = fileSystem.path.join(dir3.path, 'bla.exe'); + final String expectedPath = command; + fileSystem.file(command).createSync(); + + final String executablePath = getExecutablePath( + command, + null, + platform: platform, + fileSystem: fileSystemNoCwd, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('with relative path when currentDirectory getter throws', () { + final FileSystem fileSystemNoCwd = MemoryFileSystemNoCwd(fileSystem); + final String command = fileSystem.path.join('.', 'bla.exe'); + + final String executablePath = getExecutablePath( + command, + null, + platform: platform, + fileSystem: fileSystemNoCwd, + ); + expect(executablePath, isNull); + }); + }); + + group('on Linux', () { + Platform platform; + + initialize(FileSystemStyle.posix); + + setUp(() { + platform = FakePlatform( + operatingSystem: 'linux', + environment: {'PATH': '${dir1.path}:${dir2.path}'}); + }); + + test('absolute', () { + final String command = fileSystem.path.join(dir3.path, 'bla'); + final String expectedPath = command; + final String wrongPath = fileSystem.path.join(dir3.path, 'bla.bat'); + fileSystem.file(command).createSync(); + fileSystem.file(wrongPath).createSync(); + + final String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('in path multiple times', () { + const String command = 'xxx'; + final String expectedPath = fileSystem.path.join(dir1.path, command); + final String wrongPath = fileSystem.path.join(dir2.path, command); + fileSystem.file(expectedPath).createSync(); + fileSystem.file(wrongPath).createSync(); + + final String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + _expectSamePath(executablePath, expectedPath); + }); + + test('not found', () { + const String command = 'foo'; + + final String executablePath = getExecutablePath( + command, + workingDir.path, + platform: platform, + fileSystem: fileSystem, + ); + expect(executablePath, isNull); + }); + + test('when path has spaces', () { + expect( + sanitizeExecutablePath('/usr/local/bin/foo bar', + platform: platform), + '/usr/local/bin/foo bar'); + }); + }); + }); +} + +void _expectSamePath(String actual, String expected) { + expect(actual, isNotNull); + expect(actual.toLowerCase(), expected.toLowerCase()); +} + +class MemoryFileSystemNoCwd extends ForwardingFileSystem { + MemoryFileSystemNoCwd(FileSystem delegate) : super(delegate); + + @override + Directory get currentDirectory { + throw const FileSystemException('Access denied'); + } +} diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart index 60201dbb55..1006bfd087 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart @@ -15,7 +15,6 @@ import 'package:flutter_tools/src/build_system/targets/common.dart'; import 'package:flutter_tools/src/build_system/targets/web.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../../src/common.dart'; import '../../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart index 68112c9d02..eccbe2d4cf 100644 --- a/packages/flutter_tools/test/general.shard/cache_test.dart +++ b/packages/flutter_tools/test/general.shard/cache_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/dart/pub.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/channel_test.dart b/packages/flutter_tools/test/general.shard/channel_test.dart index 2156143c48..6b137924d5 100644 --- a/packages/flutter_tools/test/general.shard/channel_test.dart +++ b/packages/flutter_tools/test/general.shard/channel_test.dart @@ -11,7 +11,6 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/commands/channel.dart'; import 'package:flutter_tools/src/version.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/compile_batch_test.dart b/packages/flutter_tools/test/general.shard/compile_batch_test.dart index 0805f51d3c..a10fa35b73 100644 --- a/packages/flutter_tools/test/general.shard/compile_batch_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_batch_test.dart @@ -15,7 +15,6 @@ import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:mockito/mockito.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/compile_expression_test.dart b/packages/flutter_tools/test/general.shard/compile_expression_test.dart index c2cf844dcd..d4ba1ba68a 100644 --- a/packages/flutter_tools/test/general.shard/compile_expression_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_expression_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:mockito/mockito.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart index 7e2747a843..20edf451ca 100644 --- a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:mockito/mockito.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart index d254c0f06f..6432fa971f 100644 --- a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart +++ b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:fake_async/fake_async.dart'; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/general.shard/desktop_device_test.dart b/packages/flutter_tools/test/general.shard/desktop_device_test.dart index 6cdf75ed9c..ce68147c5c 100644 --- a/packages/flutter_tools/test/general.shard/desktop_device_test.dart +++ b/packages/flutter_tools/test/general.shard/desktop_device_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:test/fake.dart'; import '../src/common.dart'; diff --git a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart index 31cb932412..ac880d6430 100644 --- a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart +++ b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/drive/drive_service.dart'; import 'package:flutter_tools/src/vmservice.dart'; import 'package:package_config/package_config_types.dart'; -import 'package:process/process.dart'; import 'package:test/fake.dart'; import 'package:vm_service/vm_service.dart' as vm_service; diff --git a/packages/flutter_tools/test/general.shard/emulator_test.dart b/packages/flutter_tools/test/general.shard/emulator_test.dart index 77aa8c1ee2..55dc9843b8 100644 --- a/packages/flutter_tools/test/general.shard/emulator_test.dart +++ b/packages/flutter_tools/test/general.shard/emulator_test.dart @@ -13,7 +13,6 @@ import 'package:flutter_tools/src/emulator.dart'; import 'package:flutter_tools/src/ios/ios_emulators.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/flutter_platform_test.dart b/packages/flutter_tools/test/general.shard/flutter_platform_test.dart index 25b99672da..74c315fa41 100644 --- a/packages/flutter_tools/test/general.shard/flutter_platform_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_platform_test.dart @@ -15,7 +15,6 @@ import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/test/flutter_platform.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:test_core/backend.dart'; // ignore: deprecated_member_use import '../src/common.dart'; diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_dev_finder_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_dev_finder_test.dart index f70b019b2c..cde59a24db 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_dev_finder_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_dev_finder_test.dart @@ -11,7 +11,6 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_dev_finder.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart index dff03316da..5ab53e8af8 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart @@ -36,7 +36,6 @@ import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/vmservice.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart' as vm_service; import '../../src/common.dart'; diff --git a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart index 359fb4c9cc..465948e026 100644 --- a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/ios/code_signing.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart index 37ad924148..ddcf15c53d 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart @@ -15,7 +15,6 @@ 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:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/ios/mac_test.dart b/packages/flutter_tools/test/general.shard/ios/mac_test.dart index f7a0a4a8cf..f935eaa881 100644 --- a/packages/flutter_tools/test/general.shard/ios/mac_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/mac_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/ios/mac.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart index f0952f6326..66b12624de 100644 --- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart @@ -21,7 +21,6 @@ import 'package:flutter_tools/src/ios/simulators.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart index cff5cb85f2..8ba98c3cb9 100644 --- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart b/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart index cd99342c75..66741b46ee 100644 --- a/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart +++ b/packages/flutter_tools/test/general.shard/linux/linux_doctor_test.dart @@ -7,7 +7,6 @@ import 'package:flutter_tools/src/base/user_messages.dart'; import 'package:flutter_tools/src/doctor.dart'; import 'package:flutter_tools/src/linux/linux_doctor.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart index dec5713c63..211e6af07b 100644 --- a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/plugins.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/macos/xcode_test.dart b/packages/flutter_tools/test/general.shard/macos/xcode_test.dart index a36155b9e8..39f580ca5a 100644 --- a/packages/flutter_tools/test/general.shard/macos/xcode_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/xcode_test.dart @@ -17,7 +17,6 @@ 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'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart index f6ea741e3f..c3a02b9401 100644 --- a/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/runner/flutter_command_runner.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart b/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart index 325940334c..7a28344edc 100644 --- a/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart +++ b/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/tester/flutter_tester.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/version_test.dart b/packages/flutter_tools/test/general.shard/version_test.dart index 615fb7f989..6b7a8b8a29 100644 --- a/packages/flutter_tools/test/general.shard/version_test.dart +++ b/packages/flutter_tools/test/general.shard/version_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/version.dart'; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; diff --git a/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart b/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart index 8765bd6196..103f39d96e 100644 --- a/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart +++ b/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart @@ -7,11 +7,11 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/test/flutter_web_goldens.dart'; import 'package:flutter_tools/src/test/test_compiler.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:mockito/mockito.dart'; -import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/fakes.dart'; diff --git a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart index f955624538..06fc453f0a 100644 --- a/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart +++ b/packages/flutter_tools/test/integration.shard/daemon_mode_test.dart @@ -11,7 +11,6 @@ import 'dart:io'; import 'package:file/file.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; import 'test_data/basic_project.dart'; @@ -37,7 +36,6 @@ void main() { final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter'); - const ProcessManager processManager = LocalProcessManager(); daemonProcess = await processManager.start( [flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'], workingDirectory: tempDir.path, diff --git a/packages/flutter_tools/test/integration.shard/flutter_run_test.dart b/packages/flutter_tools/test/integration.shard/flutter_run_test.dart index a6eb91cbbb..217e65d6dc 100644 --- a/packages/flutter_tools/test/integration.shard/flutter_run_test.dart +++ b/packages/flutter_tools/test/integration.shard/flutter_run_test.dart @@ -6,10 +6,8 @@ import 'package:file/file.dart'; import 'package:flutter_tools/src/base/io.dart'; -import 'package:process/process.dart'; import '../src/common.dart'; -import '../src/context.dart'; import 'test_data/basic_project.dart'; import 'test_driver.dart'; import 'test_utils.dart'; @@ -37,8 +35,7 @@ void main() { // some of the checks for devices. final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter'); - const ProcessManager _processManager = LocalProcessManager(); - final ProcessResult _proc = await _processManager.run( + final ProcessResult _proc = await processManager.run( [flutterBin, 'run', '-d', 'invalid-device-id'], workingDirectory: tempDir.path, ); diff --git a/packages/flutter_tools/test/integration.shard/forbidden_imports_test.dart b/packages/flutter_tools/test/integration.shard/forbidden_imports_test.dart index 2c14356d86..51bc8647d1 100644 --- a/packages/flutter_tools/test/integration.shard/forbidden_imports_test.dart +++ b/packages/flutter_tools/test/integration.shard/forbidden_imports_test.dart @@ -139,6 +139,7 @@ void main() { final List allowedPath = [ fileSystem.path.join(flutterTools, 'test', 'integration.shard', 'test_utils.dart'), fileSystem.path.join(flutterTools, 'lib', 'src', 'base', 'file_system.dart'), + fileSystem.path.join(flutterTools, 'lib', 'src', 'base', 'process.dart'), ]; for (final String dirName in ['lib', 'bin', 'test']) { final Iterable files = fileSystem.directory(fileSystem.path.join(flutterTools, dirName)) diff --git a/packages/flutter_tools/test/integration.shard/test_driver.dart b/packages/flutter_tools/test/integration.shard/test_driver.dart index 1bab241ff9..cb40a00593 100644 --- a/packages/flutter_tools/test/integration.shard/test_driver.dart +++ b/packages/flutter_tools/test/integration.shard/test_driver.dart @@ -14,7 +14,6 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/utils.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service_io.dart'; @@ -104,8 +103,7 @@ abstract class FlutterTestDriver { } _debugPrint('Spawning flutter $arguments in ${_projectFolder.path}'); - const ProcessManager _processManager = LocalProcessManager(); - _process = await _processManager.start( + _process = await processManager.start( [flutterBin] .followedBy(arguments) .toList(), diff --git a/packages/flutter_tools/test/integration.shard/test_utils.dart b/packages/flutter_tools/test/integration.shard/test_utils.dart index 45596f12cc..6e310f58e3 100644 --- a/packages/flutter_tools/test/integration.shard/test_utils.dart +++ b/packages/flutter_tools/test/integration.shard/test_utils.dart @@ -8,8 +8,8 @@ import 'package:file/file.dart'; import 'package:file/local.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart'; import '../src/common.dart'; @@ -22,7 +22,10 @@ const FileSystem fileSystem = LocalFileSystem(); const Platform platform = LocalPlatform(); /// The [ProcessManager] for the integration test environment. -const ProcessManager processManager = LocalProcessManager(); +const ProcessManager processManager = LocalProcessManager( + platform: platform, + fileSystem: fileSystem, +); /// Creates a temporary directory but resolves any symlinks to return the real /// underlying path to avoid issues with breakpoints/hot reload. diff --git a/packages/flutter_tools/test/integration.shard/unit_coverage_test.dart b/packages/flutter_tools/test/integration.shard/unit_coverage_test.dart index 56f0d2fab6..5e06d3fd14 100644 --- a/packages/flutter_tools/test/integration.shard/unit_coverage_test.dart +++ b/packages/flutter_tools/test/integration.shard/unit_coverage_test.dart @@ -6,7 +6,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; -import 'package:process/process.dart'; +import 'package:flutter_tools/src/base/process.dart'; import '../src/common.dart'; import 'test_utils.dart'; diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart index b8691d490d..fc8f134c4b 100644 --- a/packages/flutter_tools/test/src/context.dart +++ b/packages/flutter_tools/test/src/context.dart @@ -37,13 +37,13 @@ import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; import 'common.dart'; -import 'fake_process_manager.dart'; import 'fakes.dart'; import 'mocks.dart'; import 'throwing_pub.dart'; export 'package:flutter_tools/src/base/context.dart' show Generator; -export 'fake_process_manager.dart' show ProcessManager, FakeProcessManager, FakeCommand; +export 'package:flutter_tools/src/base/process.dart' show ProcessManager; +export 'fake_process_manager.dart' show FakeProcessManager, FakeCommand; /// Return the test logger. This assumes that the current Logger is a BufferLogger. BufferLogger get testLogger => context.get() as BufferLogger; diff --git a/packages/flutter_tools/test/src/darwin_common.dart b/packages/flutter_tools/test/src/darwin_common.dart index b5bea318f3..9ca7121bd0 100644 --- a/packages/flutter_tools/test/src/darwin_common.dart +++ b/packages/flutter_tools/test/src/darwin_common.dart @@ -6,8 +6,8 @@ import 'dart:convert'; -import 'package:process/process.dart'; import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/base/process.dart'; bool containsBitcode(String pathToBinary, ProcessManager processManager) { // See: https://stackoverflow.com/questions/32755775/how-to-check-a-static-library-is-built-contain-bitcode diff --git a/packages/flutter_tools/test/src/fake_process_manager.dart b/packages/flutter_tools/test/src/fake_process_manager.dart index 028b453cd5..ab7a2eef22 100644 --- a/packages/flutter_tools/test/src/fake_process_manager.dart +++ b/packages/flutter_tools/test/src/fake_process_manager.dart @@ -9,12 +9,9 @@ import 'dart:convert'; import 'dart:io' as io show ProcessSignal; import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'common.dart'; -import 'context.dart'; - -export 'package:process/process.dart' show ProcessManager; typedef VoidCallback = void Function(); @@ -245,7 +242,7 @@ abstract class FakeProcessManager implements ProcessManager { @override Future start( - List command, { + List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, // ignored @@ -264,7 +261,7 @@ abstract class FakeProcessManager implements ProcessManager { @override Future run( - List command, { + List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, // ignored @@ -284,7 +281,7 @@ abstract class FakeProcessManager implements ProcessManager { @override ProcessResult runSync( - List command, { + List command, { String workingDirectory, Map environment, bool includeParentEnvironment = true, // ignored @@ -308,7 +305,7 @@ abstract class FakeProcessManager implements ProcessManager { Set excludedExecutables = {}; @override - bool killPid(int pid, [io.ProcessSignal signal = io.ProcessSignal.sigterm]) { + bool killPid(int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]) { // Killing a fake process has no effect unless it has an attached completer. final _FakeProcess fakeProcess = _fakeRunningProcesses[pid]; if (fakeProcess == null) { diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart index 46c5444954..3cad33ca8f 100644 --- a/packages/flutter_tools/test/src/mocks.dart +++ b/packages/flutter_tools/test/src/mocks.dart @@ -15,6 +15,7 @@ import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/file_system.dart' hide IOSink; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/base/process.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -22,7 +23,6 @@ import 'package:flutter_tools/src/ios/devices.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; import 'package:package_config/package_config.dart'; -import 'package:process/process.dart'; import 'common.dart'; import 'fakes.dart'; diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart index 20abb1247e..4d92ff7b2f 100644 --- a/packages/flutter_tools/test/src/testbed.dart +++ b/packages/flutter_tools/test/src/testbed.dart @@ -26,7 +26,6 @@ import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:meta/meta.dart'; -import 'package:process/process.dart'; import 'common.dart' as tester; import 'context.dart';