commit 1064babd89d73d9e1207d1212c78523c029dbe6a from: Isaac Meerleo date: Sat Jul 18 17:28:43 2026 UTC Prove same-Session contenders have no side effects commit - 79f05bf96cd7e01f3482670fd236c624bba177e0 commit + 1064babd89d73d9e1207d1212c78523c029dbe6a blob - 47b00ed92f85eeb33c03f3fb4ad6a84b91973756 blob + dd3930ae6f3b40c910393b9077d5fdcbd9c562fa --- regress/turn/run.sh +++ regress/turn/run.sh @@ -305,6 +305,57 @@ grep -q '"output_config":{"effort":"low"}' \ ok "resume: current invocation Effort replaces prior live policy" $? stop_stub +# --- 3a: the lifetime Session lock precedes replay and Provider access ----- +# Keep one resumed owner idle in line mode, then prove a second process cannot +# observe or mutate that Session before it loses the Artifact Role's lock. +journal=$(ls "$sessions"/*.ndjson 2>/dev/null | head -1) +sid=$(basename "$journal" .ndjson) +rm -f "$dir/session-owner.in" "$dir/session-owner.out" \ + "$dir/session-owner.err" "$dir/reqlog" +mkfifo "$dir/session-owner.in" +start_stub "OK" +write_conf "$stubport" +: > "$dir/reqlog" +exec 9<>"$dir/session-owner.in" +FUGU_CONF=$dir/fugu.conf FUGU_LIBEXEC=$dir/libexec/fugu \ + FUGU_CA_FILE=$dir/cert.pem FUGU_RETRY_BASE_MS=50 \ + "$fugu" -r "$sid" <&9 9>&- \ + >"$dir/session-owner.out" 2>"$dir/session-owner.err" & +fugupid=$! +i=0 +while ! grep -q '^> ' "$dir/session-owner.out" 2>/dev/null && + [ "$i" -lt 200 ] && kill -0 "$fugupid" 2>/dev/null; do + sleep 0.05 + i=$((i + 1)) +done +grep -q '^> ' "$dir/session-owner.out" 2>/dev/null && + kill -0 "$fugupid" 2>/dev/null +ok "Session lock: owner reaches an idle line-mode prompt" $? + +cp "$journal" "$dir/session-journal.before" +cp "$dir/reqlog" "$dir/session-requests.before" +run_fugu -r "$sid" -p "losing same-Session contender" +ok "Session lock: contender is refused" \ + $([ "$rc" -ne 0 ]; echo $?) +grep -Fq "fugu-artifact: Session lock" "$dir/errout" +ok "Session lock: refusal identifies the lifetime lock" $? +kill -0 "$fugupid" 2>/dev/null +ok "Session lock: original owner remains live" $? +cmp -s "$dir/session-journal.before" "$journal" +ok "Session lock: losing contender leaves the Journal byte-identical" $? +cmp -s "$dir/session-requests.before" "$dir/reqlog" && + ! test -s "$dir/reqlog" +ok "Session lock: losing contender sends zero Provider requests" $? + +printf '/quit\n' >&9 +wait "$fugupid" +owner_rc=$? +fugupid='' +exec 9>&- +ok "Session lock: original owner exits cleanly" \ + $([ "$owner_rc" -eq 0 ]; echo $?) +stop_stub + # --- 4: a non-2xx HTTP response ------------------------------------- rm -rf "$HOME/.fugu" start_stub "HTTP500"