platform/packages/process/test/process_test_extended.dart

103 lines
3.4 KiB
Dart
Raw Permalink Normal View History

import 'dart:async';
import 'dart:io' show Directory, Platform, ProcessSignal;
import 'package:platform_process/angel3_process.dart';
import 'package:test/test.dart';
import 'package:path/path.dart' as path;
void main() {
late Angel3Process process;
setUp(() {
process = Angel3Process('echo', ['Hello, World!']);
});
tearDown(() async {
await process.dispose();
});
// ... (existing tests remain the same)
test('Process with custom environment variables', () async {
var command = Platform.isWindows ? 'cmd' : 'sh';
var args = Platform.isWindows
? ['/c', 'echo %TEST_VAR%']
: ['-c', r'echo $TEST_VAR']; // Use a raw string for Unix-like systems
var envProcess =
Angel3Process(command, args, environment: {'TEST_VAR': 'custom_value'});
var result = await envProcess.run();
expect(result.output.trim(), equals('custom_value'));
});
test('Process with custom working directory', () async {
var tempDir = Directory.systemTemp.createTempSync();
try {
var workingDirProcess = Angel3Process(Platform.isWindows ? 'cmd' : 'pwd',
Platform.isWindows ? ['/c', 'cd'] : [],
workingDirectory: tempDir.path);
var result = await workingDirProcess.run();
expect(path.equals(result.output.trim(), tempDir.path), isTrue);
} finally {
tempDir.deleteSync();
}
});
test('Process with input', () async {
var catProcess = Angel3Process('cat', []);
await catProcess.start();
catProcess.write('Hello, stdin!');
await catProcess.kill(); // End the process
var output = await catProcess.outputAsString;
expect(output.trim(), equals('Hello, stdin!'));
});
test('Longer-running process', () async {
var sleepProcess = Angel3Process(Platform.isWindows ? 'timeout' : 'sleep',
Platform.isWindows ? ['/t', '2'] : ['2']);
var startTime = DateTime.now();
await sleepProcess.run();
var endTime = DateTime.now();
expect(endTime.difference(startTime).inSeconds, greaterThanOrEqualTo(2));
});
test('Multiple concurrent processes', () async {
var processes =
List.generate(5, (_) => Angel3Process('echo', ['concurrent']));
var results = await Future.wait(processes.map((p) => p.run()));
for (var result in results) {
expect(result.output.trim(), equals('concurrent'));
}
});
test('Process signaling', () async {
if (!Platform.isWindows) {
// SIGSTOP/SIGCONT are not available on Windows
var longProcess = Angel3Process('sleep', ['10']);
await longProcess.start();
await longProcess.sendSignal(ProcessSignal.sigstop);
// Process should be stopped, so it shouldn't complete immediately
expect(longProcess.exitCode, doesNotComplete);
await longProcess.sendSignal(ProcessSignal.sigcont);
await longProcess.kill();
expect(await longProcess.exitCode, isNot(0));
}
});
test('Edge case: empty command', () {
expect(() => Angel3Process('', []), throwsA(isA<ArgumentError>()));
});
test('Edge case: empty arguments list', () {
// This should not throw an error
expect(() => Angel3Process('echo', []), returnsNormally);
});
test('Edge case: invalid argument type', () {
// This should throw a compile-time error, but we can't test for that directly
// Instead, we can test for runtime type checking if implemented
expect(() => Angel3Process('echo', [1, 2, 3] as dynamic),
throwsA(isA<ArgumentError>()));
});
}