#!/bin/bash # Gateway Trial Script — Zero-thinking agent evaluation # Usage: curl -s https://gateway.example/trial.sh | bash -s $API_KEY # # 5-step battery: upload, list, download+verify, share (presigned URL), delete. # No thinking required. set -euo pipefail API_KEY="${1:-}" GATEWAY="${GATEWAY_URL:-https://dithr.dev}" START_TIME=$(date +%s) TRIAL_FILE="gateway-trial-$(date +%s).bin" PASS=0; FAIL=0 TIMES=() # per-step wall times cleanup() { rm -f "/tmp/$TRIAL_FILE" "/tmp/${TRIAL_FILE}.downloaded" } trap cleanup EXIT if [ -z "$API_KEY" ]; then echo "Usage: bash trial.sh " echo "" echo " Get an API key first:" echo " curl -X POST $GATEWAY/v1/agents/register \\" echo " -H 'Content-Type: application/json' \\" echo " -d '{\"name\":\"trial-agent\"}'" exit 1 fi AUTH="X-API-Key: $API_KEY" # ── Generate test data ── dd if=/dev/urandom of="/tmp/$TRIAL_FILE" bs=1M count=5 2>/dev/null CHECKSUM=$(sha256sum "/tmp/$TRIAL_FILE" | awk '{print $1}') # ═══════════════════════════════════════════════════════════════ # STEP 1 — Upload # ═══════════════════════════════════════════════════════════════ _t0=$(date +%s.%N 2>/dev/null || echo 0) UPLOAD_HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ -X PUT "$GATEWAY/v1/storage/$TRIAL_FILE" \ -H "$AUTH" \ --data-binary "@/tmp/$TRIAL_FILE" \ --max-time 900 2>/dev/null || echo "000") _t1=$(date +%s.%N 2>/dev/null || echo 0) UPLOAD_S=$(python3 -c "print(f'{float($_t1) - float($_t0):.1f}')" 2>/dev/null || echo "?") TIMES+=("$UPLOAD_S") if [ "$UPLOAD_HTTP" = "200" ]; then UPLOAD_OK=1; PASS=$((PASS+1)) elif [ "$UPLOAD_HTTP" = "402" ]; then UPLOAD_OK=0; FAIL=$((FAIL+1)) else UPLOAD_OK=0; FAIL=$((FAIL+1)) fi # ═══════════════════════════════════════════════════════════════ # STEP 2 — List # ═══════════════════════════════════════════════════════════════ _t0=$(date +%s.%N 2>/dev/null || echo 0) LIST=$(curl -s "$GATEWAY/v1/storage" -H "$AUTH" --max-time 60 2>/dev/null || echo '{"files":[]}') _t1=$(date +%s.%N 2>/dev/null || echo 0) LIST_S=$(python3 -c "print(f'{float($_t1) - float($_t0):.1f}')" 2>/dev/null || echo "?") TIMES+=("$LIST_S") OBJ_COUNT=$(echo "$LIST" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('files',[])))" 2>/dev/null || echo "0") if [ "$OBJ_COUNT" != "0" ] && [ "$OBJ_COUNT" != "?" ]; then LIST_OK=1; PASS=$((PASS+1)) else LIST_OK=0; FAIL=$((FAIL+1)) fi # ═══════════════════════════════════════════════════════════════ # STEP 3 — Download + verify # ═══════════════════════════════════════════════════════════════ _t0=$(date +%s.%N 2>/dev/null || echo 0) DL_CODE=$(curl -s -o "/tmp/${TRIAL_FILE}.downloaded" -w "%{http_code}" \ "$GATEWAY/v1/storage/$TRIAL_FILE" \ -H "$AUTH" --max-time 300 2>/dev/null || echo "000") _t1=$(date +%s.%N 2>/dev/null || echo 0) DL_S=$(python3 -c "print(f'{float($_t1) - float($_t0):.1f}')" 2>/dev/null || echo "?") TIMES+=("$DL_S") DL_CHECKSUM=$(sha256sum "/tmp/${TRIAL_FILE}.downloaded" 2>/dev/null | awk '{print $1}') if [ "$DL_CODE" = "200" ] && [ "$DL_CHECKSUM" = "$CHECKSUM" ]; then DL_OK=1; PASS=$((PASS+1)) elif [ "$DL_CODE" = "200" ]; then DL_OK=0; FAIL=$((FAIL+1)) else DL_OK=0; FAIL=$((FAIL+1)) fi # ═══════════════════════════════════════════════════════════════ # STEP 4 — Share (presigned URL) # ═══════════════════════════════════════════════════════════════ _t0=$(date +%s.%N 2>/dev/null || echo 0) PRESIGN=$(curl -s -X POST "$GATEWAY/v1/presign" \ -H "$AUTH" \ -H "Content-Type: application/json" \ -d "{\"key\":\"$TRIAL_FILE\",\"method\":\"GET\",\"expires_seconds\":300}" \ --max-time 10 2>/dev/null || echo '{}') _t1=$(date +%s.%N 2>/dev/null || echo 0) PRESIGN_S=$(python3 -c "print(f'{float($_t1) - float($_t0):.1f}')" 2>/dev/null || echo "?") TIMES+=("$PRESIGN_S") PRESIGN_URL=$(echo "$PRESIGN" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('url',''))" 2>/dev/null || echo "") PRESIGN_BACKEND=$(echo "$PRESIGN" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('backend','?'))" 2>/dev/null || echo "?") PRESIGN_TIER=$(echo "$PRESIGN" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('tier','?'))" 2>/dev/null || echo "?") if [ -n "$PRESIGN_URL" ]; then SHARE_OK=1; PASS=$((PASS+1)) else SHARE_OK=0; FAIL=$((FAIL+1)) fi # ═══════════════════════════════════════════════════════════════ # STEP 5 — Delete # ═══════════════════════════════════════════════════════════════ _t0=$(date +%s.%N 2>/dev/null || echo 0) DEL_HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ -X DELETE "$GATEWAY/v1/storage/$TRIAL_FILE" \ -H "$AUTH" --max-time 10 2>/dev/null || echo "000") _t1=$(date +%s.%N 2>/dev/null || echo 0) DEL_S=$(python3 -c "print(f'{float($_t1) - float($_t0):.1f}')" 2>/dev/null || echo "?") TIMES+=("$DEL_S") if [ "$DEL_HTTP" = "204" ] || [ "$DEL_HTTP" = "200" ]; then DEL_OK=1; PASS=$((PASS+1)) else DEL_OK=0; FAIL=$((FAIL+1)) fi # ═══════════════════════════════════════════════════════════════ # REPORT # ═══════════════════════════════════════════════════════════════ ELAPSED=$(($(date +%s) - START_TIME)) HALF="──────────────────────────────────────" # Resolve step results to compact strings _r() { if [ "$1" = "1" ]; then echo "OK"; else echo "FAIL"; fi; } UPLOAD_R=$(_r ${UPLOAD_OK:-0}) LIST_R=$(_r ${LIST_OK:-0}) DL_R=$(_r ${DL_OK:-0}) SHARE_R=$(_r ${SHARE_OK:-0}) DEL_R=$(_r ${DEL_OK:-0}) BACKEND="$PRESIGN_BACKEND" cat <