main zmx / test / test_helper.bash
Eric Bower  ·  2026-08-11
 1# test_helper.bash — shared setup/teardown for zmx BATS tests
 2
 3REPO_DIR="$(cd "$BATS_TEST_DIRNAME/.." && pwd)"
 4
 5setup() {
 6  # Build once per test suite (skips if already built)
 7  if [[ ! -x "$REPO_DIR/zig-out/bin/zmx" ]]; then
 8    cd "$REPO_DIR" && zig build
 9  fi
10  ZMX="$REPO_DIR/zig-out/bin/zmx"
11
12  # Isolate socket dir so tests don't interfere with real sessions or each other
13  export ZMX_DIR="$BATS_TEST_TMPDIR/zmx-sockets"
14  mkdir -p "$ZMX_DIR"
15}
16
17teardown() {
18  # Kill any sessions created during this test
19  if [[ -d "$ZMX_DIR" ]]; then
20    local sessions
21    sessions=$("$ZMX" list --short 2>/dev/null) || true
22    if [[ -n "$sessions" ]]; then
23      echo "$sessions" | xargs "$ZMX" kill --force 2>/dev/null || true
24    fi
25  fi
26}
27
28# Helper: wait for a session to appear in list (up to N seconds)
29wait_for_session() {
30  local name="$1" timeout="${2:-5}" i=0
31  while (( i < timeout * 10 )); do
32    if "$ZMX" list --short 2>/dev/null | grep -qx "$name"; then
33      return 0
34    fi
35    sleep 0.1
36    (( i++ )) || true
37  done
38  echo "Timed out waiting for session '$name'" >&2
39  return 1
40}
41
42# Helper: wait for a marker to appear in a session's history (up to N seconds).
43# Use this instead of a fixed sleep whenever a test needs the daemon to have
44# processed and buffered PTY output before it checks/sends more.
45wait_for_output() {
46  local name="$1" marker="$2" timeout="${3:-5}" i=0
47  while (( i < timeout * 10 )); do
48    if "$ZMX" history "$name" 2>/dev/null | grep -qF "$marker"; then
49      return 0
50    fi
51    sleep 0.1
52    (( i++ )) || true
53  done
54  echo "Timed out waiting for output '$marker' in session '$name'" >&2
55  return 1
56}
57
58# Helper: wait for a session's cwd to match expected substring (up to N seconds).
59wait_for_cwd() {
60  local name="$1" pattern="$2" timeout="${3:-5}" i=0
61  while (( i < timeout * 10 )); do
62    if "$ZMX" list 2>/dev/null | grep -F "name=$name" | grep -qF "$pattern"; then
63      return 0
64    fi
65    sleep 0.1
66    (( i++ )) || true
67  done
68  echo "Timed out waiting for cwd '$pattern' in session '$name'" >&2
69  return 1
70}