Revert "Keep LLDB connection to iOS device alive while running from CLI. (#36194)" (#36293)
This reverts commit 5501a1c1e7d74a088f3fd11d84b5391a02c23918.
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index ed7084f..1dd5765 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -129,11 +129,6 @@
/// If [filter] is non-null, all lines that do not match it are removed. If
/// [mapFunction] is present, all lines that match [filter] are also forwarded
/// to [mapFunction] for further processing.
-///
-/// If [detachFilter] is non-null, the returned future will complete with exit code `0`
-/// when the process outputs something matching [detachFilter] to stderr. The process will
-/// continue in the background, and the final exit code will not be reported. [filter] is
-/// not considered on lines matching [detachFilter].
Future<int> runCommandAndStreamOutput(
List<String> cmd, {
String workingDirectory,
@@ -143,9 +138,7 @@
RegExp filter,
StringConverter mapFunction,
Map<String, String> environment,
- RegExp detachFilter,
}) async {
- final Completer<int> result = Completer<int>();
final Process process = await runCommand(
cmd,
workingDirectory: workingDirectory,
@@ -155,15 +148,6 @@
final StreamSubscription<String> stdoutSubscription = process.stdout
.transform<String>(utf8.decoder)
.transform<String>(const LineSplitter())
- .map((String line) {
- if (detachFilter != null && detachFilter.hasMatch(line) && !result.isCompleted) {
- // Detach from the process, assuming it will eventually complete successfully.
- // Output printed after detaching (incl. stdout and stderr) will still be
- // processed by [filter] and [mapFunction].
- result.complete(0);
- }
- return line;
- })
.where((String line) => filter == null || filter.hasMatch(line))
.listen((String line) {
if (mapFunction != null)
@@ -187,28 +171,19 @@
printError('$prefix$line', wrap: false);
});
- // Wait for stdout to be fully processed before completing with the exit code (non-detached case),
- // because process.exitCode may complete first causing flaky tests. If the process detached,
- // we at least have a predictable output for stdout, although (unavoidably) not for stderr.
- Future<void> readOutput() async {
- await waitGroup<void>(<Future<void>>[
- stdoutSubscription.asFuture<void>(),
- stderrSubscription.asFuture<void>(),
- ]);
+ // Wait for stdout to be fully processed
+ // because process.exitCode may complete first causing flaky tests.
+ await waitGroup<void>(<Future<void>>[
+ stdoutSubscription.asFuture<void>(),
+ stderrSubscription.asFuture<void>(),
+ ]);
- await waitGroup<void>(<Future<void>>[
- stdoutSubscription.cancel(),
- stderrSubscription.cancel(),
- ]);
+ await waitGroup<void>(<Future<void>>[
+ stdoutSubscription.cancel(),
+ stderrSubscription.cancel(),
+ ]);
- // Complete the future if the we did not detach the process yet.
- if (!result.isCompleted) {
- result.complete(process.exitCode);
- }
- }
-
- unawaited(readOutput());
- return result.future;
+ return await process.exitCode;
}
/// Runs the [command] interactively, connecting the stdin/stdout/stderr
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index b38e2d6..33e520d 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -48,7 +48,7 @@
'--bundle',
bundlePath,
'--no-wifi',
- '--noninteractive',
+ '--justlaunch',
];
if (launchArguments.isNotEmpty) {
launchCommand.add('--args');
@@ -66,14 +66,11 @@
iosDeployEnv['PATH'] = '/usr/bin:${iosDeployEnv['PATH']}';
iosDeployEnv.addEntries(<MapEntry<String, String>>[cache.dyLdLibEntry]);
- // Detach from the ios-deploy process once it' outputs 'autoexit', signaling that the
- // App has been started and LLDB is in "autopilot" mode.
return await runCommandAndStreamOutput(
launchCommand,
mapFunction: _monitorInstallationFailure,
trace: true,
environment: iosDeployEnv,
- detachFilter: RegExp('.*autoexit.*')
);
}
diff --git a/packages/flutter_tools/test/general.shard/base/process_test.dart b/packages/flutter_tools/test/general.shard/base/process_test.dart
index 14f7d38..8ffca5e 100644
--- a/packages/flutter_tools/test/general.shard/base/process_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/process_test.dart
@@ -2,20 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:async';
-
import 'package: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/convert.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
import '../../src/common.dart';
import '../../src/context.dart';
-import '../../src/mocks.dart' show FakeProcess, MockProcess, MockProcessManager;
+import '../../src/mocks.dart' show MockProcess, MockProcessManager;
void main() {
group('process exceptions', () {
@@ -93,43 +90,6 @@
Platform: () => FakePlatform.fromPlatform(const LocalPlatform())..stdoutSupportsAnsi = false,
});
});
-
- group('runCommandAndStreamOutput', () {
- ProcessManager mockProcessManager;
- const Utf8Encoder utf8 = Utf8Encoder();
-
- setUp(() {
- mockProcessManager = PlainMockProcessManager();
- });
-
- testUsingContext('detach after detachFilter matches', () async {
- // Create a fake process which outputs three lines ("foo", "bar" and "baz")
- // to stdout, nothing to stderr, and doesn't exit.
- final Process fake = FakeProcess(
- exitCode: Completer<int>().future,
- stdout: Stream<List<int>>.fromIterable(
- <String>['foo\n', 'bar\n', 'baz\n'].map(utf8.convert)),
- stderr: const Stream<List<int>>.empty());
-
- when(mockProcessManager.start(<String>['test1'])).thenAnswer((_) => Future<Process>.value(fake));
-
- // Detach when we see "bar", and check that:
- // - mapFunction still gets run on "baz",
- // - we don't wait for the process to terminate (it never will), and
- // - we get an exit-code of 0 back.
- bool seenBaz = false;
- String mapFunction(String line) {
- seenBaz = seenBaz || line == 'baz';
- return line;
- }
-
- final int exitCode = await runCommandAndStreamOutput(
- <String>['test1'], mapFunction: mapFunction, detachFilter: RegExp('.*baz.*'));
-
- expect(exitCode, 0);
- expect(seenBaz, true);
- }, overrides: <Type, Generator>{ProcessManager: () => mockProcessManager});
- });
}
class PlainMockProcessManager extends Mock implements ProcessManager {}
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 6e918c9..48093ca 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
@@ -200,9 +200,6 @@
Stream<T> where(bool test(T event)) => MockStream<T>();
@override
- Stream<S> map<S>(S Function(T) _) => MockStream<S>();
-
- @override
StreamSubscription<T> listen(void onData(T event), { Function onError, void onDone(), bool cancelOnError }) {
return MockStreamSubscription<T>();
}