#!/usr/bin/env bash
# Sandboxer create / first-command / resume timings (ORI-564). Wall-clock from the client running this script, so
# every number includes the CLI and network round trips to sandboxer.com. Run with a signed-in `sbx` (or
# SANDBOXER_API_KEY set). Uses 2 starts per run (create + resume) and deletes every sandbox it makes.
#   N=10 TYPE=default ./create-resume.sh > results.tsv
set -euo pipefail
N=${N:-10}; TYPE=${TYPE:-default}; PAUSE=${PAUSE:-15}
now() { date +%s.%N; }
ms() { awk -v a="$1" -v b="$2" 'BEGIN{printf "%d", (b-a)*1000}'; }
echo -e "run\tcreate_ready_ms\tfirst_exec_ms\tresume_ready_ms\tresume_exec_ms\tprocess_survived"
for i in $(seq 1 "$N"); do
  t0=$(now)
  id=$(sbx new --type "$TYPE" --no-env --ttl 900 --json | jq -r 'select(.event=="ready") | .id' | tail -1)
  t1=$(now)
  sbx exec "$id" "true" >/dev/null
  t2=$(now)
  sbx exec "$id" --detach "sleep 100000" >/dev/null
  pid_before=$(sbx exec "$id" "pgrep -f 'sleep 100000'" | head -1)
  sbx stop "$id" >/dev/null
  # Resume needs the stop snapshot written: wait until the sandbox reports stopped.
  for _ in $(seq 1 120); do
    st=$(sbx info "$id" --json 2>/dev/null | jq -r '.sandbox.state // .state // empty'); case "$st" in stopped|archived) break;; esac; sleep 1
  done
  sleep "$PAUSE"
  t3=$(now)
  sbx resume "$id" >/dev/null
  t4=$(now)
  pid_after=$(sbx exec "$id" "pgrep -f 'sleep 100000'" | head -1)
  t5=$(now)
  survived=$([ -n "$pid_before" ] && [ "$pid_before" = "$pid_after" ] && echo yes || echo no)
  echo -e "$i\t$(ms "$t0" "$t1")\t$(ms "$t1" "$t2")\t$(ms "$t3" "$t4")\t$(ms "$t4" "$t5")\t$survived"
  sbx delete "$id" --yes >/dev/null
done
