#!/bin/bash # joule-moq-interop against joule-moq-relay on this host: every test at each draft, and # wai-receipts across drafts. No network beyond loopback. # scripts/local.sh # The relay binds a port the system chooses (127.0.0.1:0) and logs the address it bound, # which this script reads; it and its files are gone before this script is. set -u T=${1:-target} for b in wai-relay joule-moq-interop; do [ -x "$T/debug/$b" ] || { echo "no $T/debug/$b: build it first (cargo build -p joule-moq-relay -p joule-moq-interop)"; exit 2; } done W=$(mktemp -d) printf 'quic_listen = "127.0.0.1:0"\n' > "$W/relay.toml" "$T/debug/wai-relay" --config "$W/relay.toml" > "$W/relay.log" 2>&1 & R=$! trap 'kill $R 2>/dev/null; wait $R 2>/dev/null; rm -rf "$W"' EXIT ADDR= for _ in $(seq 1 100); do ADDR=$(sed -n 's/.*WebTransport (h3) on udp \([0-9.:]*\),.*/\1/p' "$W/relay.log" | head -1) [ -n "$ADDR" ] && break kill -0 $R 2>/dev/null || { cat "$W/relay.log"; echo "the relay did not start"; exit 1; } sleep 0.1 done [ -n "$ADDR" ] || { cat "$W/relay.log"; echo "the relay logged no address in 10 s"; exit 1; } URL=moqt://$ADDR/moq echo "relay on $ADDR" rc=0 for d in 23 22 18 16; do echo "== draft $d" "$T/debug/joule-moq-interop" --relay $URL --draft $d --tls-disable-verify || rc=1 "$T/debug/joule-moq-interop" --relay $URL --draft $d --tls-disable-verify --test wai-receipts || rc=1 done # The same relay over WebTransport, offering one draft at a time. for d in 23 22 18 16; do echo "== draft $d over WebTransport" "$T/debug/joule-moq-interop" --relay https://$ADDR/moq --draft $d --tls-disable-verify --test wai-receipts || rc=1 done for pair in "23 22" "22 23" "23 18" "16 23" "16 22" "22 16" "18 16" "16 18"; do set -- $pair echo "== wai-receipts publisher $1, subscriber $2" "$T/debug/joule-moq-interop" --relay $URL --draft $1 --sub-draft $2 --tls-disable-verify --test wai-receipts || rc=1 done # The test tracks of draft-afrind-moq-test-01: a publisher and a subscriber of them at each # draft, by PUBLISH too, across drafts, and each planted fault, which the subscriber refuses. for d in 23 22 18 16; do echo "== moq-test at draft $d" "$T/debug/joule-moq-interop" --relay $URL --draft $d --tls-disable-verify --test moq-test --require-fetch --strict-codes || rc=1 "$T/debug/joule-moq-interop" --relay $URL --draft $d --tls-disable-verify --test moq-test --flow publish || rc=1 done for pair in "23 16" "16 23" "22 18"; do set -- $pair echo "== moq-test publisher $1, subscriber $2" "$T/debug/joule-moq-interop" --relay $URL --draft $1 --sub-draft $2 --tls-disable-verify --test moq-test || rc=1 done for f in sequence pattern size subgroup end-of-group extension; do echo "== moq-test at draft 23, fault $f (must fail)" "$T/debug/joule-moq-interop" --relay $URL --draft 23 --tls-disable-verify --test moq-test --fault $f got=$? if [ $got -eq 1 ]; then echo "fault $f: refused, as it must be" else echo "FALSIFICATION FAILED: fault $f exited $got"; rc=1 fi done # The check must fail when the receipts or the objects are not what was signed. for d in 23 18; do for t in payload receipt in-flight; do echo "== wai-receipts at draft $d, tamper $t (must fail)" "$T/debug/joule-moq-interop" --relay $URL --draft $d --tls-disable-verify --test wai-receipts --tamper $t got=$? # 1 is the client's own verdict, a test that failed; anything else is not a refusal. if [ $got -eq 1 ]; then echo "tamper $t at $d: refused, as it must be" else echo "FALSIFICATION FAILED: tamper $t at $d exited $got"; rc=1 fi done done exit $rc