platform/packages/process/test/invoked_process_test.dart

130 lines
4.2 KiB
Dart
Raw Normal View History

import 'dart:io';
import 'dart:convert';
import 'package:test/test.dart';
import 'package:platform_process/process.dart';
void main() {
group('InvokedProcess', () {
late Process process;
late InvokedProcess invokedProcess;
setUp(() async {
process = await Process.start('echo', ['test']);
invokedProcess = InvokedProcess(process, 'echo test');
});
test('provides process ID', () {
expect(invokedProcess.pid, equals(process.pid));
});
test('captures output', () async {
final result = await invokedProcess.wait();
expect(result.output().trim(), equals('test'));
});
test('handles error output', () async {
process = await Process.start('sh', ['-c', 'echo error >&2']);
invokedProcess = InvokedProcess(process, 'echo error >&2');
final result = await invokedProcess.wait();
expect(result.errorOutput().trim(), equals('error'));
});
test('provides exit code', () async {
final exitCode = await invokedProcess.exitCode;
expect(exitCode, equals(0));
});
test('handles process kill', () async {
process = await Process.start('sleep', ['10']);
invokedProcess = InvokedProcess(process, 'sleep 10');
expect(invokedProcess.kill(), isTrue);
final exitCode = await invokedProcess.exitCode;
expect(exitCode, isNot(0));
});
test('provides access to stdout stream', () async {
final output = await invokedProcess.stdout.transform(utf8.decoder).join();
expect(output.trim(), equals('test'));
});
test('provides access to stderr stream', () async {
process = await Process.start('sh', ['-c', 'echo error >&2']);
invokedProcess = InvokedProcess(process, 'echo error >&2');
final error = await invokedProcess.stderr.transform(utf8.decoder).join();
expect(error.trim(), equals('error'));
});
test('provides access to stdin', () async {
process = await Process.start('cat', []);
invokedProcess = InvokedProcess(process, 'cat');
await invokedProcess.write('test input\n');
final result = await invokedProcess.wait();
expect(result.output().trim(), equals('test input'));
});
test('writes multiple lines to stdin', () async {
process = await Process.start('cat', []);
invokedProcess = InvokedProcess(process, 'cat');
await invokedProcess.writeLines(['line 1', 'line 2', 'line 3']);
final result = await invokedProcess.wait();
expect(result.output().trim().split('\n'),
equals(['line 1', 'line 2', 'line 3']));
});
test('captures real-time output', () async {
final outputs = <String>[];
process = await Process.start(
'sh', ['-c', 'echo line1; sleep 0.1; echo line2']);
invokedProcess = InvokedProcess(process, 'echo lines', (data) {
outputs.add(data.trim());
});
await invokedProcess.wait();
expect(outputs, equals(['line1', 'line2']));
});
test('handles process failure', () async {
process = await Process.start('false', []);
invokedProcess = InvokedProcess(process, 'false');
final result = await invokedProcess.wait();
expect(result.failed(), isTrue);
expect(result.exitCode(), equals(1));
});
test('handles process with arguments', () async {
process = await Process.start('echo', ['arg1', 'arg2']);
invokedProcess = InvokedProcess(process, 'echo arg1 arg2');
final result = await invokedProcess.wait();
expect(result.output().trim(), equals('arg1 arg2'));
});
test('handles binary output', () async {
process =
await Process.start('printf', [r'\x48\x45\x4C\x4C\x4F']); // "HELLO"
invokedProcess = InvokedProcess(process, 'printf HELLO');
final result = await invokedProcess.wait();
expect(result.output(), equals('HELLO'));
});
test('handles process cleanup', () async {
process = await Process.start('sleep', ['10']);
invokedProcess = InvokedProcess(process, 'sleep 10');
// Kill process and ensure resources are cleaned up
expect(invokedProcess.kill(), isTrue);
await invokedProcess.wait();
// Verify process is terminated
expect(await invokedProcess.exitCode, isNot(0));
});
});
}