Fix bug in ProcessWrapper (#37)
It wasn't properly closing its stdio streams
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 917a936..b0a0dc8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,8 @@
+#### 3.0.9
+
+* Fixed bug in `ProcessWrapper`
+
#### 3.0.8
* Fixed bug in `ProcessWrapper`
diff --git a/lib/src/interface/process_wrapper.dart b/lib/src/interface/process_wrapper.dart
index 2162637..cd43af6 100644
--- a/lib/src/interface/process_wrapper.dart
+++ b/lib/src/interface/process_wrapper.dart
@@ -35,7 +35,7 @@
controller.add,
onError: controller.addError,
onDone: () {
- controller.close;
+ controller.close();
completer.complete();
},
);
diff --git a/pubspec.yaml b/pubspec.yaml
index 45b360d..00a4510 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: process
-version: 3.0.8
+version: 3.0.9
authors:
- Todd Volkert <tvolkert@google.com>
- Michael Goderbauer <goderbauer@google.com>
diff --git a/test/src/interface/process_wrapper_test.dart b/test/src/interface/process_wrapper_test.dart
index 8799e66..04f2cb1 100644
--- a/test/src/interface/process_wrapper_test.dart
+++ b/test/src/interface/process_wrapper_test.dart
@@ -10,45 +10,75 @@
import 'package:test/test.dart';
void main() {
- group('done', () {
+ group('ProcessWrapper', () {
TestProcess delegate;
ProcessWrapper process;
- bool done;
setUp(() {
delegate = TestProcess();
process = ProcessWrapper(delegate);
- done = false;
- // ignore: unawaited_futures
- process.done.then((int result) {
- done = true;
+ });
+
+ group('done', () {
+ bool done;
+
+ setUp(() {
+ done = false;
+ // ignore: unawaited_futures
+ process.done.then((int result) {
+ done = true;
+ });
+ });
+
+ test('completes only when all done', () async {
+ expect(done, isFalse);
+ delegate.exitCodeCompleter.complete(0);
+ await Future<void>.value();
+ expect(done, isFalse);
+ await delegate.stdoutController.close();
+ await Future<void>.value();
+ expect(done, isFalse);
+ await delegate.stderrController.close();
+ await Future<void>.value();
+ expect(done, isTrue);
+ expect(await process.exitCode, 0);
+ });
+
+ test('works in conjunction with subscribers to stdio streams', () async {
+ process.stdout
+ .transform<String>(utf8.decoder)
+ .transform<String>(const LineSplitter())
+ .listen(print);
+ delegate.exitCodeCompleter.complete(0);
+ await delegate.stdoutController.close();
+ await delegate.stderrController.close();
+ await Future<void>.value();
+ expect(done, isTrue);
});
});
- test('completes only when all done', () async {
- expect(done, isFalse);
- delegate.exitCodeCompleter.complete(0);
- await Future<void>.value();
- expect(done, isFalse);
- await delegate.stdoutController.close();
- await Future<void>.value();
- expect(done, isFalse);
- await delegate.stderrController.close();
- await Future<void>.value();
- expect(done, isTrue);
- expect(await process.exitCode, 0);
- });
+ group('stdio', () {
+ test('streams properly close', () async {
+ Future<void> testStream(
+ Stream<List<int>> stream,
+ StreamController<List<int>> controller,
+ String name,
+ ) async {
+ bool closed = false;
+ stream.listen(
+ (_) {},
+ onDone: () {
+ closed = true;
+ },
+ );
+ await controller.close();
+ await Future<void>.value();
+ expect(closed, isTrue, reason: 'for $name');
+ }
- test('works in conjunction with subscribers to stdio streams', () async {
- process.stdout
- .transform<String>(utf8.decoder)
- .transform<String>(const LineSplitter())
- .listen(print);
- delegate.exitCodeCompleter.complete(0);
- await delegate.stdoutController.close();
- await delegate.stderrController.close();
- await Future<void>.value();
- expect(done, isTrue);
+ await testStream(process.stdout, delegate.stdoutController, 'stdout');
+ await testStream(process.stderr, delegate.stderrController, 'stderr');
+ });
});
});
}