#!/usr/bin/env bash # Phase H test — native-only http-listen primitive. # Starts sx_server with a tiny SX echo handler, drives it with curl # (GET / POST / 404 / custom header), asserts, then kills it. set -u cd "$(dirname "$0")/.." SRV=_build/default/bin/sx_server.exe PORT=${HTTP_TEST_PORT:-8911} PASS=0 FAIL=0 ok() { echo " PASS: $1"; PASS=$((PASS+1)); } bad() { echo " FAIL: $1 — $2"; FAIL=$((FAIL+1)); } if [ ! -x "$SRV" ]; then echo "build sx_server.exe first (dune build bin/sx_server.exe)"; exit 1 fi H='(begin (define (h req) (if (= (get req "path") "/echo") {:status 200 :headers {"X-Echo" (get req "method")} :body (str "M=" (get req "method") " P=" (get req "path") " Q=" (get req "query") " B=" (get req "body"))} {:status 404 :body "nope"})) (http-listen '"$PORT"' h))' ESC=${H//\"/\\\"} { printf '(epoch 1)\n(eval "%s")\n' "$ESC"; sleep 30; } | "$SRV" >/tmp/test_http_srv.out 2>&1 & SVPID=$! trap 'kill $SVPID 2>/dev/null; wait 2>/dev/null' EXIT up=0 for _ in $(seq 1 50); do curl -s -o /dev/null "http://127.0.0.1:$PORT/echo" 2>/dev/null && { up=1; break; } sleep 0.2 done [ "$up" = 1 ] || { echo " FAIL: server did not start"; cat /tmp/test_http_srv.out; exit 1; } # GET with query + custom response header. g=$(curl -s -i "http://127.0.0.1:$PORT/echo?x=1" | tr -d '\r') echo "$g" | grep -q '^HTTP/1.1 200 OK' && ok "GET status 200" || bad "GET status" "$g" echo "$g" | grep -q '^X-Echo: GET' && ok "GET custom header" || bad "GET header" "$g" echo "$g" | grep -q '^M=GET P=/echo Q=x=1 B=$' && ok "GET echo body" || bad "GET body" "$g" # POST with body. p=$(curl -s -X POST --data 'hello' "http://127.0.0.1:$PORT/echo") [ "$p" = 'M=POST P=/echo Q= B=hello' ] && ok "POST body echoed" || bad "POST body" "$p" # 404 path. n=$(curl -s -i "http://127.0.0.1:$PORT/missing" | tr -d '\r') echo "$n" | grep -q '^HTTP/1.1 404 Not Found' && ok "404 status" || bad "404 status" "$n" echo "$n" | grep -q '^nope$' && ok "404 body" || bad "404 body" "$n" echo "Results: $PASS passed, $FAIL failed" [ "$FAIL" = 0 ]