125 lines
3.8 KiB
Dart
125 lines
3.8 KiB
Dart
import 'package:test/test.dart';
|
|
import 'package:platform_process/platform_process.dart';
|
|
|
|
void main() {
|
|
late Factory factory;
|
|
|
|
setUp(() {
|
|
factory = Factory();
|
|
});
|
|
|
|
group('Basic Process Operations', () {
|
|
test('echo command returns expected output', () async {
|
|
final result = await factory.command(['echo', 'test']).run();
|
|
expect(result.output().trim(), equals('test'));
|
|
expect(result.exitCode, equals(0));
|
|
});
|
|
|
|
test('nonexistent command throws ProcessFailedException', () async {
|
|
expect(
|
|
() => factory.command(['nonexistent-command']).run(),
|
|
throwsA(isA<ProcessFailedException>()),
|
|
);
|
|
});
|
|
|
|
test('command with arguments works correctly', () async {
|
|
final result = await factory.command(['echo', '-n', 'test']).run();
|
|
expect(result.output(), equals('test'));
|
|
});
|
|
});
|
|
|
|
group('Process Configuration', () {
|
|
test('working directory is respected', () async {
|
|
final result =
|
|
await factory.command(['pwd']).withWorkingDirectory('/tmp').run();
|
|
expect(result.output().trim(), equals('/tmp'));
|
|
});
|
|
|
|
test('environment variables are passed correctly', () async {
|
|
final result = await factory
|
|
.command(['sh', '-c', 'echo \$TEST_VAR']).withEnvironment(
|
|
{'TEST_VAR': 'test_value'}).run();
|
|
expect(result.output().trim(), equals('test_value'));
|
|
});
|
|
|
|
test('quiet mode suppresses output', () async {
|
|
final result =
|
|
await factory.command(['echo', 'test']).withoutOutput().run();
|
|
expect(result.output(), isEmpty);
|
|
});
|
|
});
|
|
|
|
group('Async Process Operations', () {
|
|
test('async process completes successfully', () async {
|
|
final process = await factory.command(['sleep', '0.1']).start();
|
|
|
|
expect(process.pid, greaterThan(0));
|
|
|
|
final result = await process.wait();
|
|
expect(result.exitCode, equals(0));
|
|
});
|
|
|
|
test('process input is handled correctly', () async {
|
|
final result =
|
|
await factory.command(['cat']).withInput('test input').run();
|
|
expect(result.output(), equals('test input'));
|
|
});
|
|
|
|
test('process can be killed', () async {
|
|
final process = await factory.command(['sleep', '10']).start();
|
|
|
|
expect(process.kill(), isTrue);
|
|
|
|
final result = await process.wait();
|
|
expect(result.exitCode, isNot(0));
|
|
});
|
|
});
|
|
|
|
group('Shell Commands', () {
|
|
test('pipe operations work correctly', () async {
|
|
final result =
|
|
await factory.command(['sh', '-c', 'echo hello | tr a-z A-Z']).run();
|
|
expect(result.output().trim(), equals('HELLO'));
|
|
});
|
|
|
|
test('multiple commands execute in sequence', () async {
|
|
final result = await factory
|
|
.command(['sh', '-c', 'echo start && sleep 0.1 && echo end']).run();
|
|
expect(
|
|
result.output().trim().split('\n'),
|
|
equals(['start', 'end']),
|
|
);
|
|
});
|
|
|
|
test('complex shell operations work', () async {
|
|
final result = await factory
|
|
.command(['sh', '-c', 'echo "Count: 1" && echo "Count: 2"']).run();
|
|
expect(
|
|
result.output().trim().split('\n'),
|
|
equals(['Count: 1', 'Count: 2']),
|
|
);
|
|
});
|
|
});
|
|
|
|
group('Error Handling', () {
|
|
test('failed process throws with correct exit code', () async {
|
|
try {
|
|
await factory.command(['sh', '-c', 'exit 1']).run();
|
|
fail('Should have thrown');
|
|
} on ProcessFailedException catch (e) {
|
|
expect(e.exitCode, equals(1));
|
|
}
|
|
});
|
|
|
|
test('process failure includes error output', () async {
|
|
try {
|
|
await factory
|
|
.command(['sh', '-c', 'echo error message >&2; exit 1']).run();
|
|
fail('Should have thrown');
|
|
} on ProcessFailedException catch (e) {
|
|
expect(e.errorOutput.trim(), equals('error message'));
|
|
expect(e.exitCode, equals(1));
|
|
}
|
|
});
|
|
});
|
|
}
|