| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| |
| import 'package:fxtest/fxtest.dart'; |
| import 'package:fxutils/fxutils.dart'; |
| import 'package:test/test.dart'; |
| import 'package:pedantic/pedantic.dart'; |
| |
| void main() { |
| test('waits for test process to terminate before closing StreamController', |
| () async { |
| var processExitCode = Completer<int>(); |
| var mockProcess = |
| mockStartProcess(MockProcess(exitCode: processExitCode.future)); |
| var testRunner = TestRunner(startProcess: mockProcess); |
| |
| // Drain output as it's generated. This prevents the StreamController from |
| // blocking on close. |
| testRunner.output.listen((event) {}); |
| |
| var result = testRunner.run('', [], workingDirectory: ''); |
| |
| // [result] won't complete until the mock process ends, so we don't await it |
| // here. |
| var completed = false; |
| unawaited(result.whenComplete(() => completed = true)); |
| expect(completed, false); |
| |
| // Terminate the mock process. |
| processExitCode.complete(0); |
| |
| // Verify that the result has now completed. |
| await result; |
| expect(completed, true); |
| }); |
| |
| test('waits for stdout to close before closing StreamController', () async { |
| var stdout = StreamController<List<int>>(); |
| var mockProcess = mockStartProcess(MockProcess(stdout: stdout.stream)); |
| var testRunner = TestRunner(startProcess: mockProcess); |
| |
| // Drain output as it's generated. This prevents the StreamController from |
| // blocking on close. |
| testRunner.output.listen((event) {}); |
| |
| var result = testRunner.run('', [], workingDirectory: ''); |
| |
| // [result] won't complete until the mock process ends, so we don't await it |
| // here. |
| var completed = false; |
| unawaited(result.whenComplete(() => completed = true)); |
| expect(completed, false); |
| |
| // Complete the stdout stream. This should cause the result to complete. |
| await stdout.close(); |
| |
| // Verify that the result has now completed. |
| await result; |
| expect(completed, true); |
| }); |
| |
| test('waits for stderr to close before closing StreamController', () async { |
| var stderr = StreamController<List<int>>(); |
| var mockProcess = mockStartProcess(MockProcess(stderr: stderr.stream)); |
| var testRunner = TestRunner(startProcess: mockProcess); |
| |
| // Drain output as it's generated. This prevents the StreamController from |
| // blocking on close. |
| testRunner.output.listen((event) {}); |
| |
| var result = testRunner.run('', [], workingDirectory: ''); |
| |
| // [result] won't complete until the mock process ends, so we don't await it |
| // here. |
| var completed = false; |
| unawaited(result.whenComplete(() => completed = true)); |
| expect(completed, false); |
| |
| // Complete the stderr stream. |
| await stderr.close(); |
| |
| // Verify that the result has now completed. |
| await result; |
| expect(completed, true); |
| }); |
| } |