| // 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); | |
| }); | |
| } |