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';