From 5bfed5d439d7b13eae892bb0b084b1db089151f6 Mon Sep 17 00:00:00 2001 From: Hemanth Krishna Date: Sat, 8 Jul 2023 00:57:02 +0530 Subject: [PATCH] fix: forward `stdin` from shorebird to flutter process (#692) Signed-off-by: Hemanth Krishna Co-authored-by: Felix Angelov --- .../lib/src/commands/run_command.dart | 4 ++++ .../test/src/commands/run_command_test.dart | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/shorebird_cli/lib/src/commands/run_command.dart b/packages/shorebird_cli/lib/src/commands/run_command.dart index b3f6c4a0..13177b28 100644 --- a/packages/shorebird_cli/lib/src/commands/run_command.dart +++ b/packages/shorebird_cli/lib/src/commands/run_command.dart @@ -1,4 +1,6 @@ +import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:shorebird_cli/src/command.dart'; import 'package:shorebird_cli/src/logger.dart'; @@ -84,6 +86,8 @@ class RunCommand extends ShorebirdCommand logger.err(utf8.decode(event)); }); + unawaited(flutter.stdin.addStream(stdin)); + return flutter.exitCode; } } diff --git a/packages/shorebird_cli/test/src/commands/run_command_test.dart b/packages/shorebird_cli/test/src/commands/run_command_test.dart index bd491e23..86ec60fa 100644 --- a/packages/shorebird_cli/test/src/commands/run_command_test.dart +++ b/packages/shorebird_cli/test/src/commands/run_command_test.dart @@ -37,6 +37,8 @@ class _MockShorebirdFlutterValidator extends Mock class _MockShorebirdProcess extends Mock implements ShorebirdProcess {} +class _MockIOSink extends Mock implements IOSink {} + void main() { group(RunCommand, () { late ArgResults argResults; @@ -49,6 +51,7 @@ void main() { late ShorebirdFlutterValidator flutterValidator; late ShorebirdProcess shorebirdProcess; late RunCommand command; + late IOSink ioSink; R runWithOverrides(R Function() body) { return runScoped( @@ -60,6 +63,10 @@ void main() { ); } + setUpAll(() { + registerFallbackValue(const Stream>.empty()); + }); + setUp(() { argResults = _MockArgResults(); httpClient = _MockHttpClient(); @@ -71,6 +78,7 @@ void main() { androidInternetPermissionValidator = _MockAndroidInternetPermissionValidator(); flutterValidator = _MockShorebirdFlutterValidator(); + ioSink = _MockIOSink(); registerFallbackValue(shorebirdProcess); @@ -89,6 +97,7 @@ void main() { () => androidInternetPermissionValidator.validate(any()), ).thenAnswer((_) async => []); when(() => flutterValidator.validate(any())).thenAnswer((_) async => []); + when(() => ioSink.addStream(any())).thenAnswer((_) async {}); command = runWithOverrides( () => RunCommand( @@ -128,10 +137,10 @@ void main() { const error = 'oops something went wrong'; const exitCode = 1; - when( () => process.stdout, ).thenAnswer((_) => const Stream.empty()); + when(() => process.stdin).thenAnswer((_) => ioSink); when(() => process.stderr).thenAnswer( (_) => Stream.value(utf8.encode(error)), ); @@ -156,6 +165,7 @@ void main() { when( () => process.stdout, ).thenAnswer((_) => Stream.value(utf8.encode(output))); + when(() => process.stdin).thenAnswer((_) => ioSink); when(() => process.stderr).thenAnswer((_) => const Stream.empty()); when( () => process.exitCode, @@ -168,6 +178,7 @@ void main() { await expectLater(result, equals(ExitCode.success.code)); verify(() => logger.info(output)).called(1); + verify(() => ioSink.addStream(any())).called(1); }); test('passes additional args when specified', () async { @@ -186,6 +197,7 @@ void main() { when(() => argResults['dart-define']).thenReturn(dartDefines); when(() => process.stdout).thenAnswer((_) => const Stream.empty()); + when(() => process.stdin).thenAnswer((_) => ioSink); when(() => process.stderr).thenAnswer((_) => const Stream.empty()); when( () => process.exitCode, @@ -242,9 +254,11 @@ void main() { when(() => logger.progress(any())).thenReturn(progress); const output = 'some output'; + final ioSink = IOSink(StreamController()); when( () => process.stdout, ).thenAnswer((_) => Stream.value(utf8.encode(output))); + when(() => process.stdin).thenAnswer((_) => ioSink); when(() => process.stderr).thenAnswer((_) => const Stream.empty()); when( () => process.exitCode,