commit - 79f05bf96cd7e01f3482670fd236c624bba177e0
commit + 1064babd89d73d9e1207d1212c78523c029dbe6a
blob - 47b00ed92f85eeb33c03f3fb4ad6a84b91973756
blob + dd3930ae6f3b40c910393b9077d5fdcbd9c562fa
--- regress/turn/run.sh
+++ regress/turn/run.sh
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"