#!/bin/bash
#
# proxy.py
# ~~~~~~~~
# ⚡⚡⚡ Fast, Lightweight, Programmable, TLS interception capable
#     proxy server for Application debugging, testing and development.
#
# :copyright: (c) 2013-present by Abhinav Singh and contributors.
# :license: BSD, see LICENSE for more details.
#
usage() {
  echo "Usage: ./benchmark/compare.sh"
  echo "You must run this script from proxy.py repo root."
}

DIRNAME=$(dirname "$0")
if [ "$DIRNAME" != "./benchmark" ]; then
  usage
  exit 1
fi

BASENAME=$(basename "$0")
if [ "$BASENAME" != "compare.sh" ]; then
  usage
  exit 1
fi

PWD=$(pwd)
if [ $(basename $PWD) != "proxy.py" ]; then
  usage
  exit 1
fi

TIMEOUT=1sec
CONCURRENCY=100
DURATION=1m
TOTAL_REQUESTS=100000
OPEN_FILE_LIMIT=65536
BACKLOG=OPEN_FILE_LIMIT

SERVER_HOST=127.0.0.1

AIOHTTP_PORT=8080
TORNADO_PORT=8888
STARLETTE_PORT=8890
PROXYPY_PORT=8899
BLACKSHEEP_PORT=9000

ulimit -n $OPEN_FILE_LIMIT

echo "CONCURRENCY: $CONCURRENCY workers, DURATION: $DURATION, TIMEOUT: $TIMEOUT"

run_benchmark() {
  oha \
    --no-tui \
    --latency-correction \
    -z $DURATION \
    -c $CONCURRENCY \
    -t $TIMEOUT \
    http://127.0.0.1:$1/http-route-example
}

benchmark_lib() {
  python ./benchmark/_$1.py > /dev/null 2>&1 &
  local SERVER_PID=$!
  echo "Server (pid:$SERVER_PID) running"
  sleep 1
  run_benchmark $2
  kill -15 $SERVER_PID
  sleep 1
  kill -0 $SERVER_PID > /dev/null 2>&1
  local RUNNING=$?
  if [ "$RUNNING" == "1" ]; then
    echo "Server gracefully shutdown"
  fi
}

benchmark_asgi() {
  uvicorn \
    --port $1 \
    --backlog 65536 \
    $2 > /dev/null 2>&1 &
  local SERVER_PID=$!
  echo "Server (pid:$SERVER_PID) running"
  sleep 1
  run_benchmark $1
  kill -15 $SERVER_PID
  sleep 1
  kill -0 $SERVER_PID > /dev/null 2>&1
  local RUNNING=$?
  if [ "$RUNNING" == "1" ]; then
    echo "Server gracefully shutdown"
  fi
}

echo "============================="
echo "Benchmarking Proxy.Py"
PYTHONPATH=. benchmark_lib proxy $PROXYPY_PORT
echo "============================="

# echo "============================="
# echo "Benchmarking Blacksheep"
# benchmark_lib blacksheep $BLACKSHEEP_PORT
# echo "============================="

# echo "============================="
# echo "Benchmarking Starlette"
# benchmark_lib starlette $STARLETTE_PORT
# echo "============================="

# echo "============================="
# echo "Benchmarking AIOHTTP"
# benchmark_lib aiohttp $AIOHTTP_PORT
# echo "============================="

# echo "============================="
# echo "Benchmarking Tornado"
# benchmark_lib tornado $TORNADO_PORT
# echo "============================="
