114 lines
3.0 KiB
Prolog
114 lines
3.0 KiB
Prolog
:- module(test_process,
|
|
[ test_process/0
|
|
]).
|
|
|
|
:- asserta(user:file_search_path(foreign, '.')).
|
|
:- asserta(user:file_search_path(library, '.')).
|
|
:- asserta(user:file_search_path(library, '../plunit')).
|
|
|
|
:- use_module(library(plunit)).
|
|
:- use_module(library(readutil)).
|
|
:- use_module(process).
|
|
|
|
test_process :-
|
|
run_tests([ process_create,
|
|
process_wait
|
|
]).
|
|
|
|
read_process(In, Text) :-
|
|
read_stream_to_codes(In, Codes),
|
|
close(In),
|
|
atom_codes(Text, Codes).
|
|
|
|
:- begin_tests(process_create, [sto(rational_trees)]).
|
|
|
|
test(echo, true) :-
|
|
process_create(path(true), [], []).
|
|
test(null_input, Codes == []) :-
|
|
process_create(path(cat), [], [stdin(null), stdout(pipe(Out))]),
|
|
read_stream_to_codes(Out, Codes),
|
|
close(Out).
|
|
test(null_output, true) :-
|
|
process_create(path(sh),
|
|
['-c', 'echo THIS IS AN ERROR'],
|
|
[stdout(null)]).
|
|
test(null_error, true) :-
|
|
process_create(path(sh),
|
|
['-c', 'echo "THIS IS AN ERROR" 1>&2'],
|
|
[stderr(null)]).
|
|
test(read_error, X == 'error\n') :-
|
|
process_create(path(sh),
|
|
['-c', 'echo "error" 1>&2'],
|
|
[stderr(pipe(Out))]),
|
|
read_process(Out, X).
|
|
test(echo, X == 'hello\n') :-
|
|
process_create(path(sh),
|
|
['-c', 'echo hello'],
|
|
[ stdout(pipe(Out))
|
|
]),
|
|
read_process(Out, X).
|
|
test(lwr, X == 'HELLO') :-
|
|
process_create(path(tr), ['a-z', 'A-Z'],
|
|
[ stdin(pipe(In)),
|
|
stdout(pipe(Out))
|
|
]),
|
|
format(In, hello, []),
|
|
close(In),
|
|
read_process(Out, X).
|
|
test(cwd, [true, condition(\+current_prolog_flag(windows, true))]) :-
|
|
tmp_dir(Tmp),
|
|
process_create(path(pwd), [],
|
|
[ stdout(pipe(Out)),
|
|
cwd(Tmp)
|
|
]),
|
|
read_process(Out, CWD0),
|
|
normalize_space(atom(CWD), CWD0),
|
|
same_file(CWD, Tmp).
|
|
test(cwd, [true, condition(current_prolog_flag(windows, true))]) :-
|
|
tmp_dir(Tmp),
|
|
getenv('COMSPEC', Shell),
|
|
process_create(Shell, ['/c', cd],
|
|
[ stdout(pipe(Out)),
|
|
cwd(Tmp)
|
|
]),
|
|
read_process(Out, CWD0),
|
|
normalize_space(atom(CWD), CWD0),
|
|
same_file(CWD, Tmp).
|
|
|
|
tmp_dir(Dir) :-
|
|
getenv('TEMP', Dir), !.
|
|
tmp_dir('/tmp').
|
|
|
|
:- end_tests(process_create).
|
|
|
|
|
|
:- begin_tests(process_wait, [sto(rational_trees)]).
|
|
|
|
test(wait_ok, X == exit(0)) :-
|
|
process_create(path(sh), ['-c', 'exit 0'], [process(PID)]),
|
|
process_wait(PID, X).
|
|
test(wait_ok, X == exit(42)) :-
|
|
process_create(path(sh), ['-c', 'exit 42'], [process(PID)]),
|
|
process_wait(PID, X).
|
|
test(kill_ok, [ X == killed(9),
|
|
condition(\+current_prolog_flag(windows, true))]) :-
|
|
process_create(path(sleep), [2], [process(PID)]),
|
|
process_kill(PID, 9),
|
|
process_wait(PID, X).
|
|
test(kill_ok, [ X = exit(_),
|
|
condition(current_prolog_flag(windows, true))]) :-
|
|
process_create(path(sleep), [2], [process(PID)]),
|
|
process_kill(PID, 9),
|
|
process_wait(PID, X).
|
|
test(wait_timeout, [ X = timeout ]) :-
|
|
process_create(path(sleep), [2], [process(PID)]),
|
|
( current_prolog_flag(windows, true)
|
|
-> TMO = 0.1
|
|
; TMO = 0
|
|
),
|
|
process_wait(PID, X, [timeout(TMO)]),
|
|
process_kill(PID, 9),
|
|
process_wait(PID, _).
|
|
|
|
:- end_tests(process_wait).
|