#!/bin/bash
set -e
E=/private/var/folders/ft/fkt3bwqd01g7f54wvyz9wgjc0000gn/T/opencode/dlopen-exp
S=/private/var/folders/ft/fkt3bwqd01g7f54wvyz9wgjc0000gn/T/opencode/size-exp
cd "$S"
printf 'void dummy(void){}\n' > iso.c
mkent() { cat > "$1" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>$2</dict></plist>
EOF
}
mkent lv.entitlements '<key>com.apple.security.cs.disable-library-validation</key><true/>'
mkent jit.entitlements '<key>com.apple.security.cs.allow-jit</key><true/><key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>'
mkent gt.entitlements '<key>com.apple.security.get-task-allow</key><true/>'

cd /Users/oscar/.worktree/hot-reload/labs/hot-reload
PLAIN=/Users/oscar/.worktree/hot-reload/labs/hot-reload/target/debug/server

run_case() {
  local label="$1" signer="$2" opts="$3" ent="$4"
  local host="$S/host_$label"
  cp "$PLAIN" "$host"
  local args=(-f -s "$signer")
  [ -n "$opts" ] && args+=(--options "$opts")
  [ -n "$ent" ] && args+=(--entitlements "$S/$ent")
  if ! codesign "${args[@]}" "$host" >/dev/null 2>&1; then echo "$label: SIGN FAILED"; return; fi
  head -c 30000 /dev/urandom > "$S/pad_$label"
  cc -dynamiclib -o "$S/dy_$label.dylib" "$S/iso.c" -Wl,-sectcreate,__DATA,__pad,"$S/pad_$label"
  sleep 2
  echo -n "$label: "
  KAN_HOT_TIMING=1 KAN_HOT_LIBRARY="$S/dy_$label.dylib" KAN_HOT_EXAMPLE_ONCE=1 "$host" 2>&1 \
    | grep -E "kan-hot timing: dlopen|Code Signature|not valid|killed|Library not loaded|failed to load" | head -2 | tr '\n' ' '
  echo
}

run_case plain - "" ""
run_case runtime_adhoc - runtime ""
run_case runtime_lv - runtime lv.entitlements
run_case runtime_jit - runtime jit.entitlements
run_case runtime_gt - runtime gt.entitlements
run_case lv_noruntime - "" lv.entitlements
run_case runtime_lv_dev "Apple Development: Oscar Beaumont (WHM4XRS262)" runtime lv.entitlements
