#!/bin/bash

RET=1

set -e

WORKDIR=$(mktemp -d)
[ -n "${OUTDIR}" ] || OUTDIR="${WORKDIR}"
PHOSH_LOG="${OUTDIR}/phosh.log"
WLROOTS_LOG="${OUTDIR}/phoc.log"
PHOC_CONFIG="${WORKDIR}/phoc.ini"
VGDUMP="./vgdump"
TIMEOUT=5
DISPLAY=:99

function cleanup () {
  [ ! -f "${WLROOTS_LOG}" ] || cat "${WLROOTS_LOG}"                || true
  [ ! -f "${PHOSH_LOG}" ]   || cat "${PHOSH_LOG}"                  || true
  [ -z "${XVFB_PID}" ]      || kill -9 "${XVFB_PID}"  >& /dev/null || true
  [ -z "${PHOSH_PID}" ]     || kill -9 "${PHOSH_PID}" >& /dev/null || true
  [ -z "${WORKDIR}" ]       || rm -rf "${WORKDIR}"
}
trap cleanup EXIT


function usage () {
    cat <<EOF
Usage: $0
    -c           - Try to generate a backtrace automatically
    -h           - Display this help message."
    -T <seconds> - how long should phosh run (default $TIMEOUT seconds
    -V           - run under valgrind
EOF
}


while getopts "chT:V" opt; do
  case ${opt} in
    c)
      debug_crash=1
      ;;
    T)
      TIMEOUT=$OPTARG
      ;;
    V)
      export PHOSH_VALGRIND=1
      ;;
    \?)
      echo "Invalid Option: -$OPTARG" 1>&2
      usage "$0"
      RET=1
      exit 0
      ;;
    h)
      usage "$0"
      RET=0
      exit 0
      ;;
  esac
done

[ -z "${OUTDIR}" ] || mkdir -p "${OUTDIR}"
cat <<EOF > "${PHOC_CONFIG}"
[output:X11-1]
mode = 768x1024

[output:X11-2]
mode = 1280x800
EOF

XVFB_OPTS="${DISPLAY} -screen 0 768x1024x24 -ac +extension GLX +render -noreset"
export WLR_BACKENDS=x11
export XDG_RUNTIME_DIR="${WORKDIR}"
export PHOC_DEBUG=no-quit
xvfb-run -s "${XVFB_OPTS}" -a /usr/bin/phoc \
	 -C "${PHOC_CONFIG}" \
	 -E "printenv | grep WAYLAND_DISPLAY= > ${WORKDIR}/wl-info" \
	 >& "${WLROOTS_LOG}" &
XVFB_PID=$!
echo "xvfb PID is $XVFB_PID"
export DISPLAY

echo -n "Waiting for phoc to start..."
# Wait for startup
WAIT=5
while [ ${WAIT} -gt 0 ]; do
  [ ! -f "${WORKDIR}/wl-info" ] || break
  sleep 1
  ((WAIT-=1))
done
echo "done."

. "${WORKDIR}"/wl-info
export WAYLAND_DISPLAY

if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
   echo -n "No DBUS session bus found, spawning it..."
   eval "$(dbus-launch --sh-syntax)"
fi

if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
   echo "DBUS failed to start." 2>&1
   exit 1
else
   echo "done."
fi

echo "weston-info output:"
weston-info

echo "Starting phosh..."

# When debugging a crash omit all session
# and auto generate a backtrace:
if [ -n "${debug_crash}" ]; then
  echo "Using PHOSH_AUTO_GDB..."
  export SKIP_GNOME_SESSION=1
  export PHOSH_AUTO_GDB=1
fi
_build/run >& "${PHOSH_LOG}" &
PHOSH_PID=$!

echo "Phosh's PID is $PHOSH_PID"
echo -n "Waiting ${TIMEOUT} seconds for phosh to start..."
sleep "${TIMEOUT}"
echo "done."

echo -n "Checking if phosh is alive..."
if ! kill -0 $PHOSH_PID; then
    echo "Phosh did not start in time" 1>&2
    exit 2
fi
echo "yes."

import -display "${DISPLAY}" -window root "${OUTDIR}"/lockscreen.png

echo "Checking if phosh shuts down..."
kill -15 $PHOSH_PID
echo -n "Waiting ${TIMEOUT} seconds for phosh to stop..."
sleep "${TIMEOUT}"
if kill -0 $PHOSH_PID >&/dev/null; then
    echo "Phosh did not terminate in time." 1>&2
    exit 2
fi
echo "yes."

import -display "${DISPLAY}" -window root "${OUTDIR}"/empty.png

echo "Started/stopped phosh successfully"
RET=0

if grep -qs "phosh.*WARNING" "${PHOSH_LOG}"; then
    echo "Found warning log messages" 1>&2
    # We're having warnings due to missing DBus
    # services and gnome-session depending on X11.
    # python-dbusmock I'm looking at you
    #RET=1
fi

if grep -qs "phosh.*CRITICAL" "${PHOSH_LOG}"; then
    echo "Found critical log messages" 1>&2
    RET=1
fi

if [ -n "${PHOSH_VALGRIND}" ] && grep -qs "definitely lost in loss record" "${VGDUMP}"; then
    echo "Found memory leaks" 1>&2
    cat ${VGDUMP}
    RET=1
fi

exit $RET
