| 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 |