diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index 2451696b0f..57189a8e39 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart @@ -29,7 +29,6 @@ class _FuchsiaLogReader extends DeviceLogReader { _FuchsiaLogReader(this._device, [this._app]); static final RegExp _flutterLogOutput = RegExp(r'INFO: \w+\(flutter\): '); - static final RegExp _utcDateOutput = RegExp(r'\d+\-\d+\-\d+ \d+:\d+:\d+'); FuchsiaDevice _device; ApplicationPackage _app; @@ -43,7 +42,7 @@ class _FuchsiaLogReader extends DeviceLogReader { return _logLines; } - Stream _processLogs(Stream lines) async* { + Stream _processLogs(Stream lines) { // Get the starting time of the log processor to filter logs from before // the process attached. final DateTime startTime = systemClock.now(); @@ -52,26 +51,49 @@ class _FuchsiaLogReader extends DeviceLogReader { final RegExp matchRegExp = _app == null ? _flutterLogOutput : RegExp('INFO: ${_app.name}\\(flutter\\): '); - await for (String line in lines.where(matchRegExp.hasMatch)) { - // Read out the date string from the log and compare it to the current time: - // Example: 2018-11-09 01:27:45 - final String rawDate = _utcDateOutput.firstMatch(line)?.group(0); - if (rawDate == null) { - continue; - } - final DateTime logTime = DateTime.parse(rawDate); - if (logTime.millisecondsSinceEpoch < startTime.millisecondsSinceEpoch) { - continue; - } - // Format log into a useful string: - yield '[${logTime.toLocal()}] Flutter: ${line.split(matchRegExp).last}'; - } + return Stream.eventTransformed( + lines, + (Sink outout) => _FuchsiaLogSink(outout, matchRegExp, startTime), + ); } @override String toString() => name; } +class _FuchsiaLogSink implements EventSink { + _FuchsiaLogSink(this._outputSink, this._matchRegExp, this._startTime); + + static final RegExp _utcDateOutput = RegExp(r'\d+\-\d+\-\d+ \d+:\d+:\d+'); + final EventSink _outputSink; + final RegExp _matchRegExp; + final DateTime _startTime; + + @override + void add(String line) { + if (!_matchRegExp.hasMatch(line)) { + return; + } + final String rawDate = _utcDateOutput.firstMatch(line)?.group(0); + if (rawDate == null) { + return; + } + final DateTime logTime = DateTime.parse(rawDate); + if (logTime.millisecondsSinceEpoch < _startTime.millisecondsSinceEpoch) { + return; + } + _outputSink.add('[${logTime.toLocal()}] Flutter: ${line.split(_matchRegExp).last}'); + } + + @override + void addError(Object error, [StackTrace stackTrace]) { + _outputSink.addError(error, stackTrace); + } + + @override + void close() { _outputSink.close(); } +} + class FuchsiaDevices extends PollingDeviceDiscovery { FuchsiaDevices() : super('Fuchsia devices'); diff --git a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart index 2d8a811bc9..41683698d0 100644 --- a/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart +++ b/packages/flutter_tools/test/fuchsia/fuchsa_device_test.dart @@ -126,11 +126,18 @@ d 2 0 . final FuchsiaDevice device = FuchsiaDevice('id', name: 'tester'); final DeviceLogReader reader = device.getLogReader(app: FuchsiaModulePackage(name: 'example_app')); final List logLines = []; - reader.logLines.listen(logLines.add); + final Completer lock = Completer(); + reader.logLines.listen((String line) { + logLines.add(line); + if (logLines.length == 2) { + lock.complete(); + } + }); expect(logLines, isEmpty); stdout.add(utf8.encode(exampleUtcLogs)); await stdout.close(); + await lock.future.timeout(const Duration(seconds: 1)); expect(logLines, [ '[2018-11-09 01:27:45.000] Flutter: Error doing thing', @@ -154,7 +161,7 @@ d 2 0 . stdout.add(utf8.encode(exampleUtcLogs)); await stdout.close(); - await lock.future; + await lock.future.timeout(const Duration(seconds: 1)); expect(logLines, [ '[2018-11-09 01:30:12.000] Flutter: Did thing this time', @@ -168,11 +175,18 @@ d 2 0 . final FuchsiaDevice device = FuchsiaDevice('id', name: 'tester'); final DeviceLogReader reader = device.getLogReader(); final List logLines = []; - reader.logLines.listen(logLines.add); + final Completer lock = Completer(); + reader.logLines.listen((String line) { + logLines.add(line); + if (logLines.length == 3) { + lock.complete(); + } + }); expect(logLines, isEmpty); stdout.add(utf8.encode(exampleUtcLogs)); await stdout.close(); + await lock.future.timeout(const Duration(seconds: 1)); expect(logLines, [ '[2018-11-09 01:27:45.000] Flutter: Error doing thing',