Bash · 2082 bytes Raw Blame History
1 #!/bin/sh
2 TEST_PREFIX="[coproc]"
3
4 # Coproc tests require job control (PTY) — skip in CI/non-interactive mode
5 if [ ! -t 0 ] && [ -z "$FORCE_COPROC_TESTS" ]; then
6 echo "Passed: 0"
7 echo "Failed: 0"
8 echo "Skipped: 0"
9 echo "Total: 0"
10 exit 0
11 fi
12
13 . "$(cd "$(dirname "$0")/.." && pwd)/test_harness.sh"
14
15 section "1. coproc basic launch"
16 compare_output "coproc sets COPROC_PID" 'coproc sleep 60; test -n "$COPROC_PID" && echo yes; kill $COPROC_PID 2>/dev/null; wait 2>/dev/null'
17 compare_output "coproc fd array exists" 'coproc sleep 60; test -n "${COPROC[0]}" && test -n "${COPROC[1]}" && echo yes; kill $COPROC_PID 2>/dev/null; wait 2>/dev/null'
18 compare_exit "coproc PID is valid process" 'coproc sleep 60; kill -0 $COPROC_PID; ret=$?; kill $COPROC_PID 2>/dev/null; wait 2>/dev/null; exit $ret'
19
20 section "2. coproc I/O"
21 compare_output "coproc bidirectional cat" 'coproc cat; echo hello >&${COPROC[1]}; read line <&${COPROC[0]}; echo $line; kill $COPROC_PID 2>/dev/null; wait 2>/dev/null'
22 compare_output "coproc multiple writes and reads" 'coproc cat; echo one >&${COPROC[1]}; echo two >&${COPROC[1]}; read l1 <&${COPROC[0]}; read l2 <&${COPROC[0]}; echo "$l1 $l2"; kill $COPROC_PID 2>/dev/null; wait 2>/dev/null'
23 compare_output "coproc with tr" 'coproc tr a-z A-Z; echo hello >&${COPROC[1]}; eval "exec ${COPROC[1]}>&-"; read line <&${COPROC[0]}; echo $line; wait 2>/dev/null'
24
25 section "3. named coproc"
26 # bash only supports named coprocs with compound commands; fortsh extends to simple commands
27 check_output "named coproc I/O" 'coproc MYPROC cat; echo test >&${MYPROC[1]}; read line <&${MYPROC[0]}; echo $line; kill $MYPROC_PID 2>/dev/null; wait 2>/dev/null' "test"
28 check_output "named coproc PID var" 'coproc MYPROC sleep 60; test -n "$MYPROC_PID" && echo yes; kill $MYPROC_PID 2>/dev/null; wait 2>/dev/null' "yes"
29
30 section "4. coproc cleanup"
31 compare_output "coproc cleanup after kill" 'coproc sleep 60; kill $COPROC_PID 2>/dev/null; wait 2>/dev/null; echo done'
32 compare_output "coproc wait returns exit" 'coproc true; wait $COPROC_PID; echo $?'
33
34 print_summary