blob: 7faedbe36969c8ff9aef3eb3508f33a36e324b12 [file] [log] [blame]
// Copyright 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// ignore_for_file: close_sinks
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:io/io.dart' hide sharedStdIn;
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
void main() {
StreamController<String> fakeStdIn;
late ProcessManager processManager;
SharedStdIn sharedStdIn;
late List<String> stdoutLog;
late List<String> stderrLog;
test('spawn functions should match the type definition of Process.start', () {
const isStartProcess = TypeMatcher<StartProcess>();
expect(Process.start, isStartProcess);
final manager = ProcessManager();
expect(manager.spawn, isStartProcess);
expect(manager.spawnBackground, isStartProcess);
expect(manager.spawnDetached, isStartProcess);
});
group('spawn', () {
setUp(() async {
fakeStdIn = StreamController<String>(sync: true);
sharedStdIn = SharedStdIn(fakeStdIn.stream.map((s) => s.codeUnits));
stdoutLog = <String>[];
stderrLog = <String>[];
final stdoutController = StreamController<List<int>>(sync: true);
stdoutController.stream.map(utf8.decode).listen(stdoutLog.add);
final stdout = IOSink(stdoutController);
final stderrController = StreamController<List<int>>(sync: true);
stderrController.stream.map(utf8.decode).listen(stderrLog.add);
final stderr = IOSink(stderrController);
processManager = ProcessManager(
stdin: sharedStdIn,
stdout: stdout,
stderr: stderr,
);
});
final dart = Platform.executable;
test('should output Hello from another process [via stdout]', () async {
final spawn = await processManager.spawn(
dart,
[p.join('test', '_files', 'stdout_hello.dart')],
);
await spawn.exitCode;
expect(stdoutLog, ['Hello']);
});
test('should output Hello from another process [via stderr]', () async {
final spawn = await processManager.spawn(
dart,
[p.join('test', '_files', 'stderr_hello.dart')],
);
await spawn.exitCode;
expect(stderrLog, ['Hello']);
});
test('should forward stdin to another process', () async {
final spawn = await processManager.spawn(
dart,
[p.join('test', '_files', 'stdin_echo.dart')],
);
spawn.stdin.writeln('Ping');
await spawn.exitCode;
expect(stdoutLog.join(), contains('You said: Ping'));
});
group('should return a Process where', () {
test('.stdout is readable', () async {
final spawn = await processManager.spawn(
dart,
[p.join('test', '_files', 'stdout_hello.dart')],
);
expect(await spawn.stdout.transform(utf8.decoder).first, 'Hello');
});
test('.stderr is readable', () async {
final spawn = await processManager.spawn(
dart,
[p.join('test', '_files', 'stderr_hello.dart')],
);
expect(await spawn.stderr.transform(utf8.decoder).first, 'Hello');
});
});
});
}