From 9766cc590132643ee61f694dd39fcba45d1f6904 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 20 Apr 2026 12:23:46 -0400 Subject: [PATCH] Fixes the group id parsing --- tools/marmot-interop/lib.sh | 31 ++++++++++++++++++++++++-- tools/marmot-interop/marmot-interop.sh | 14 +++++++----- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/tools/marmot-interop/lib.sh b/tools/marmot-interop/lib.sh index fe463a956..aaa04bfae 100644 --- a/tools/marmot-interop/lib.sh +++ b/tools/marmot-interop/lib.sh @@ -143,6 +143,33 @@ expect_contains() { return 1 } +# ------- JSON helpers -------------------------------------------------------- + +# Extract MLS group ID as lowercase hex from wn JSON output. +# Handles both formats: +# - plain hex string (from `groups list`) +# - {"value":{"vec":[...]}} serde struct (from `groups create`) +# - flat byte array [n, ...] (from some responses) +# Input: JSON string via stdin; optional 2nd arg = field name (default: mls_group_id) +jq_group_id() { + local field="${1:-mls_group_id}" + jq -r --arg f "$field" ' + def byte2hex: + . as $n | + [($n / 16 | floor), ($n % 16)] | + map(if . < 10 then (48 + .) else (87 + .) end) | + implode; + (.result // .) | + .[$f] | + if type == "string" then . + elif (type == "object" and (.value.vec != null)) then + [.value.vec[] | byte2hex] | join("") + elif type == "array" then + [.[] | byte2hex] | join("") + else empty end + ' 2>/dev/null || true +} + # ------- polling helpers ----------------------------------------------------- # wait_for_invite @@ -154,10 +181,10 @@ wait_for_invite() { while [[ $(date +%s) -lt $deadline ]]; do if [[ "$who" == "B" ]]; then gid=$(wn_b_json groups invites 2>/dev/null \ - | jq -r '.[0].group_id // .[0].mls_group_id // empty' 2>/dev/null || true) + | jq -c '.[0] // empty' 2>/dev/null | jq_group_id || true) else gid=$(wn_c_json groups invites 2>/dev/null \ - | jq -r '.[0].group_id // .[0].mls_group_id // empty' 2>/dev/null || true) + | jq -c '.[0] // empty' 2>/dev/null | jq_group_id || true) fi if [[ -n "${gid:-}" ]]; then printf '%s\n' "$gid" diff --git a/tools/marmot-interop/marmot-interop.sh b/tools/marmot-interop/marmot-interop.sh index 69c213468..a7c60e96f 100755 --- a/tools/marmot-interop/marmot-interop.sh +++ b/tools/marmot-interop/marmot-interop.sh @@ -379,7 +379,7 @@ test_03_wn_creates_group() { local out gid out=$(wn_b --json groups create "Interop-03" "$A_NPUB" 2>>"$LOG_FILE") printf 'wn groups create raw output: %s\n' "$out" >>"$LOG_FILE" - gid=$(printf '%s' "$out" | jq -r '.group_id // .mls_group_id // empty' 2>/dev/null || true) + gid=$(printf '%s' "$out" | jq_group_id) if [[ -z "$gid" ]]; then fail_msg "could not parse group_id from 'wn groups create' output" info "raw output: $out" @@ -425,7 +425,7 @@ test_04_three_member_group() { warn "GROUP_02 not set (Test 02 likely skipped/failed); creating new group here" local out out=$(wn_b --json groups create "Interop-04-bootstrap" "$A_NPUB" 2>>"$LOG_FILE") - gid=$(printf '%s' "$out" | jq -r '.group_id // .mls_group_id // empty' 2>/dev/null || true) + gid=$(printf '%s' "$out" | jq_group_id) save_state GROUP_02 "$gid" prompt_human "In Amethyst, accept the new group invite 'Interop-04-bootstrap'." fi @@ -469,8 +469,9 @@ test_05_wn_adds_amethyst_existing() { step "B creates group with only C, then adds A" local out gid - out=$(wn_b --json groups create "Interop-05" "$C_NPUB" 2>&1 | tee -a "$LOG_FILE") - gid=$(printf '%s' "$out" | jq -r '.group_id // .mls_group_id // empty') + out=$(wn_b --json groups create "Interop-05" "$C_NPUB" 2>>"$LOG_FILE") + printf 'wn groups create raw output: %s\n' "$out" >>"$LOG_FILE" + gid=$(printf '%s' "$out" | jq_group_id) if [[ -z "$gid" ]]; then fail_msg "could not create Interop-05" record_result "05 wn adds Amethyst existing" fail "create failed" @@ -748,8 +749,9 @@ test_12_offline_catchup() { wn_c keys publish >/dev/null 2>&1 || true sleep 3 local out gid - out=$(wn_b --json groups create "Interop-12" "$A_NPUB" 2>&1 | tee -a "$LOG_FILE") - gid=$(printf '%s' "$out" | jq -r '.group_id // .mls_group_id // empty') + out=$(wn_b --json groups create "Interop-12" "$A_NPUB" 2>>"$LOG_FILE") + printf 'wn groups create raw output: %s\n' "$out" >>"$LOG_FILE" + gid=$(printf '%s' "$out" | jq_group_id) if [[ -z "$gid" ]]; then fail_msg "could not create Interop-12"; record_result "12 offline catchup" fail "create failed"; return fi