Unverified Commit bf329741 authored by Zachary Anderson's avatar Zachary Anderson Committed by GitHub

[flutter_tools] Handle asynchronous errors writing to stdio (#50779)

parent 0b43647a
......@@ -47,6 +47,7 @@ import 'dart:io' as io
import 'package:meta/meta.dart';
import '../globals.dart' as globals;
import 'async_guard.dart';
import 'context.dart';
import 'process.dart';
......@@ -271,15 +272,15 @@ class Stdio {
void _stdioWrite(io.IOSink sink, String message, {
void Function(String, dynamic, StackTrace) fallback,
}) {
try {
asyncGuard<void>(() async {
sink.write(message);
} catch (err, stack) {
}, onError: (Object error, StackTrace stackTrace) {
if (fallback == null) {
print(message);
} else {
fallback(message, err, stack);
}
fallback(message, error, stackTrace);
}
});
}
/// Adds [stream] to [stdout].
......
......@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:convert' show jsonEncode;
import 'package:platform/platform.dart';
......@@ -90,7 +91,7 @@ void main() {
});
});
testWithoutContext('Logger does not throw when stdio write throws', () async {
testWithoutContext('Logger does not throw when stdio write throws synchronously', () async {
final MockStdout stdout = MockStdout();
final MockStdout stderr = MockStdout();
final ThrowingStdio stdio = ThrowingStdio(stdout, stderr);
......@@ -119,6 +120,45 @@ void main() {
expect(stderrThrew, true);
});
testWithoutContext('Logger does not throw when stdio write throws asynchronously', () async {
final MockStdout stdout = MockStdout();
final MockStdout stderr = MockStdout();
final ThrowingStdio stdio = ThrowingStdio(stdout, stderr);
bool stdoutThrew = false;
bool stderrThrew = false;
final Completer<void> stdoutCompleter = Completer<void>();
final Completer<void> stderrCompleter = Completer<void>();
when(stdout.write(any)).thenAnswer((_) {
Zone.current.runUnaryGuarded<void>((_) {
stdoutThrew = true;
stdoutCompleter.complete();
throw 'Error';
}, null);
});
when(stderr.write(any)).thenAnswer((_) {
Zone.current.runUnaryGuarded<void>((_) {
stderrThrew = true;
stderrCompleter.complete();
throw 'Error';
}, null);
});
final Logger logger = StdoutLogger(
terminal: AnsiTerminal(
stdio: stdio,
platform: _kNoAnsiPlatform,
),
stdio: stdio,
outputPreferences: OutputPreferences.test(),
timeoutConfiguration: const TimeoutConfiguration(),
);
logger.printStatus('message');
logger.printError('error message');
await stdoutCompleter.future;
await stderrCompleter.future;
expect(stdoutThrew, true);
expect(stderrThrew, true);
});
group('Spinners', () {
mocks.MockStdio mockStdio;
FakeStopwatch mockStopwatch;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment