Test that SIGINT interrupts non-terminating goals on unix.
Cleanup: use tokio::test instead of special test helpers Added pty_exec.py helper script to run binaries with a pseudoterminal attached (bug won't trigger otherwise). Tested CI to fail on all unixes (ubuntu+macos) with older rustyline, and pass with new one.
This commit is contained in:
38
tests-pl/issue-interrupt-nontermination.pl
Normal file
38
tests-pl/issue-interrupt-nontermination.pl
Normal file
@@ -0,0 +1,38 @@
|
||||
% Server
|
||||
:- use_module(library(process)).
|
||||
:- use_module(library(charsio)).
|
||||
:- use_module(library(lists)).
|
||||
:- use_module(library(time)).
|
||||
|
||||
prolog_path(Prolog) :-
|
||||
read(Body),
|
||||
term_variables(Body, [Prolog]),
|
||||
Body.
|
||||
|
||||
main :-
|
||||
prolog_path(Prolog),
|
||||
CMD = "\
|
||||
use_module(library(os)), \
|
||||
pid(PID), \
|
||||
write(PID), nl, \
|
||||
asserta((f :- f)), \
|
||||
catch(f, Err, (write(Err),nl)), \
|
||||
write(done), nl, \
|
||||
halt.",
|
||||
process_create("tests-pl/pty_exec.py", [Prolog, "-g", CMD], [stdout(pipe(O))]),
|
||||
get_line_to_chars(O, PID0, ""),
|
||||
append(PID, "\r\n", PID0),
|
||||
process_create("kill", ["-s", "INT", PID], []),
|
||||
sleep(5),
|
||||
% second kill should fail because process should exit after one kill
|
||||
process_create("kill", ["-s", "INT", PID], [stderr(null), process(PK)]),
|
||||
process_wait(PK, Status),
|
||||
status_report(Status, PID), nl.
|
||||
|
||||
status_report(exit(1), _PID) :- write(ok).
|
||||
status_report(exit(0), PID) :-
|
||||
write(not_dead),
|
||||
% kill by force to exit cleanly
|
||||
process_create("kill", ["-9", PID], []).
|
||||
|
||||
:- initialization(main).
|
||||
14
tests-pl/pty_exec.py
Executable file
14
tests-pl/pty_exec.py
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env python3
|
||||
# Pseudoterminal wrapper script
|
||||
|
||||
import pty
|
||||
from sys import argv
|
||||
|
||||
def main():
|
||||
if len(argv) < 2:
|
||||
print(f"Usage: {argv[0]} [command]")
|
||||
return
|
||||
pty.spawn(argv[1:])
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user