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');
+      });
     });
   });
 }