#!/bin/sh [ $# -ge 1 ] && HAWK_BIN="$1" [ -z "$HAWK_BIN" ] && HAWK_BIN="hawk" set -u hawk_lib_path="${LD_LIBRARY_PATH-}" case "$HAWK_BIN" in */.libs/*) libdir=$(cd "$(dirname "$HAWK_BIN")/../../lib/.libs" 2>/dev/null && pwd) if [ -n "${libdir-}" ] then if [ -n "$hawk_lib_path" ] then hawk_lib_path="$libdir:$hawk_lib_path" else hawk_lib_path="$libdir" fi fi ;; esac tmp_prog="/tmp/hawk-regress-environ-$$.hawk" tmp_pipe="/tmp/hawk-regress-environ-$$.pipe" tmp_sys="/tmp/hawk-regress-environ-$$.sys" trap 'rm -f "$tmp_prog" "$tmp_pipe" "$tmp_sys"' EXIT cat > "$tmp_prog" <&3'" print "" | cmd close(cmd) } function emit_env_system(tag, cmd) { cmd = "sh -c 'printf \"" tag ":%s\\n\" \"\${HAWK_TEST_ENV_SYS-unset}\" >> $tmp_sys'" return sys::system(cmd) } function emit_env_system_fd3(tag, cmd) { cmd = "sh -c 'printf \"" tag ":%s\\n\" \"\${HAWK_TEST_ENV_SYS-unset}\" >&3'" return sys::system(cmd) } BEGIN { print hawk::typename(ENVIRON["HAWK_TEST_ENV_INT"]) ":" ENVIRON["HAWK_TEST_ENV_INT"]; print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEG"]) ":" ENVIRON["HAWK_TEST_ENV_NEG"]; print hawk::typename(ENVIRON["HAWK_TEST_ENV_FLT"]) ":" sprintf("%.2f", ENVIRON["HAWK_TEST_ENV_FLT"]); print hawk::typename(ENVIRON["HAWK_TEST_ENV_STR"]) ":" ENVIRON["HAWK_TEST_ENV_STR"]; print hawk::typename(ENVIRON["HAWK_TEST_ENV_EMPTY"]) ":" length(ENVIRON["HAWK_TEST_ENV_EMPTY"]); print hawk::typename(ENVIRON["HAWK_TEST_ENV_MISSING"]) ":" hawk::isnil(ENVIRON["HAWK_TEST_ENV_MISSING"]); ENVIRON["HAWK_TEST_ENV_NEW"] = 456; print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEW"]) ":" ENVIRON["HAWK_TEST_ENV_NEW"]; ENVIRON["HAWK_TEST_ENV_NEW"] = 7.5; print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEW"]) ":" sprintf("%.1f", ENVIRON["HAWK_TEST_ENV_NEW"]); ENVIRON["HAWK_TEST_ENV_NEW"] = "xyz"; print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEW"]) ":" ENVIRON["HAWK_TEST_ENV_NEW"]; delete ENVIRON["HAWK_TEST_ENV_STR"]; print hawk::typename(ENVIRON["HAWK_TEST_ENV_STR"]) ":" hawk::isnil(ENVIRON["HAWK_TEST_ENV_STR"]); emit_env("initial"); print emit_env_system("initial"); ENVIRON["HAWK_TEST_ENV_PIPE"] = "changed"; ENVIRON["HAWK_TEST_ENV_SYS"] = "changed"; emit_env("changed"); print emit_env_system("changed"); delete ENVIRON["HAWK_TEST_ENV_PIPE"]; delete ENVIRON["HAWK_TEST_ENV_SYS"]; emit_env("deleted"); print emit_env_system("deleted"); ENVIRON = @{}; ENVIRON["HAWK_TEST_ENV_PIPE"] = "replaced"; ENVIRON["HAWK_TEST_ENV_SYS"] = "replaced"; emit_env("replaced"); print emit_env_system("replaced"); ENVIRON = 123; emit_env("scalar"); print emit_env_system("scalar"); print emit_env_system_fd3("fd3"); } EOF test_no=0 failed=0 ok() { test_no=$((test_no + 1)) echo "ok $test_no - $1" } not_ok() { test_no=$((test_no + 1)) failed=1 echo "not ok $test_no - $1" echo "# expected: $2" echo "# actual: $3" } check_eq() { desc="$1" expected="$2" actual="$3" if [ "x$actual" = "x$expected" ] then ok "$desc" else not_ok "$desc" "$expected" "$actual" fi } echo "1..28" if out=$(env -i \ LD_LIBRARY_PATH="${hawk_lib_path-}" \ DYLD_LIBRARY_PATH="${DYLD_LIBRARY_PATH-}" \ SHLIB_PATH="${SHLIB_PATH-}" \ LIBPATH="${LIBPATH-}" \ HAWK_TEST_ENV_INT=123 \ HAWK_TEST_ENV_NEG=-7 \ HAWK_TEST_ENV_FLT=1.25 \ HAWK_TEST_ENV_STR=abc123 \ HAWK_TEST_ENV_EMPTY= \ HAWK_TEST_ENV_PIPE=initial \ HAWK_TEST_ENV_SYS=initial \ "$HAWK_BIN" -f "$tmp_prog" 3>"$tmp_pipe" 2>&1) then ok "run environ regression" else not_ok "run environ regression" "exit code 0" "command failed: $out" out="" fi line1=$(printf '%s\n' "$out" | sed -n '1p') line2=$(printf '%s\n' "$out" | sed -n '2p') line3=$(printf '%s\n' "$out" | sed -n '3p') line4=$(printf '%s\n' "$out" | sed -n '4p') line5=$(printf '%s\n' "$out" | sed -n '5p') line6=$(printf '%s\n' "$out" | sed -n '6p') line7=$(printf '%s\n' "$out" | sed -n '7p') line8=$(printf '%s\n' "$out" | sed -n '8p') line9=$(printf '%s\n' "$out" | sed -n '9p') line10=$(printf '%s\n' "$out" | sed -n '10p') line11=$(printf '%s\n' "$out" | sed -n '11p') line12=$(printf '%s\n' "$out" | sed -n '12p') line13=$(printf '%s\n' "$out" | sed -n '13p') line14=$(printf '%s\n' "$out" | sed -n '14p') line15=$(printf '%s\n' "$out" | sed -n '15p') line16=$(printf '%s\n' "$out" | sed -n '16p') pipe1=$(sed -n '1p' "$tmp_pipe") pipe2=$(sed -n '2p' "$tmp_pipe") pipe3=$(sed -n '3p' "$tmp_pipe") pipe4=$(sed -n '4p' "$tmp_pipe") pipe5=$(sed -n '5p' "$tmp_pipe") pipe6=$(sed -n '6p' "$tmp_pipe") sys1=$(sed -n '1p' "$tmp_sys") sys2=$(sed -n '2p' "$tmp_sys") sys3=$(sed -n '3p' "$tmp_sys") sys4=$(sed -n '4p' "$tmp_sys") sys5=$(sed -n '5p' "$tmp_sys") check_eq "int env imported as int" "int:123" "$line1" check_eq "negative int env imported as int" "int:-7" "$line2" check_eq "float env imported as flt" "flt:1.25" "$line3" check_eq "string env imported as str" "str:abc123" "$line4" check_eq "empty env imported as empty string" "str:0" "$line5" check_eq "missing env yields nil" "nil:1" "$line6" check_eq "assigned int remains int" "int:456" "$line7" check_eq "assigned float remains flt" "flt:7.5" "$line8" check_eq "assigned string remains str" "str:xyz" "$line9" check_eq "deleted env entry becomes nil" "nil:1" "$line10" check_eq "system initial returned success" "0" "$line11" check_eq "system changed returned success" "0" "$line12" check_eq "system deleted returned success" "0" "$line13" check_eq "system replaced returned success" "0" "$line14" check_eq "system scalar returned success" "0" "$line15" check_eq "system fd3 returned success" "0" "$line16" check_eq "pipe sees initial imported env" "initial:initial" "$pipe1" check_eq "pipe sees in-place env update" "changed:changed" "$pipe2" check_eq "pipe sees deleted env entry" "deleted:unset" "$pipe3" check_eq "pipe sees replaced environ map" "replaced:replaced" "$pipe4" check_eq "pipe sees scalar environ as empty" "scalar:unset" "$pipe5" check_eq "system preserves fd3 inheritance" "fd3:unset" "$pipe6" check_eq "system sees initial imported env" "initial:initial" "$sys1" check_eq "system sees in-place env update" "changed:changed" "$sys2" check_eq "system sees deleted env entry" "deleted:unset" "$sys3" check_eq "system sees replaced environ map" "replaced:replaced" "$sys4" check_eq "system sees scalar environ as empty" "scalar:unset" "$sys5" exit "$failed"