#!/usr/bin/env sh
# Run the same test compiled with -fstack-cleaner / f-no-stack-cleaner
# and compare the output.

srcdir="$1"
bindir="$2"

cd "$srcdir"

die() {
  echo "$@" >&2
  exit 1
}

assert() {
  if ! eval "$1"; then
    die "Assertion failed: $*"
  fi
}

# If we don't have timeout, fake it:
if ! which timeout > /dev/null; then
  timeout() {
    shift
    "$@"
  }
fi

run() {
  state=$1
  shift
  timeout 30s ${bindir:=.}/bugged1_liveness_cleaner_$state \
    ${srcdir:=.}/../../platforms/platform.xml \
    ${srcdir:=.}/deploy_bugged1_liveness.xml \
    "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n" \
    --cfg=contexts/factory:ucontext \
    --cfg=contexts/stack-size:256
  assert 'test $? = 134'
}

get_states() {
  echo "$1" | grep "Expanded pairs = " | sed "s/^.*Expanded pairs = //" | head -n1
}

RES_ON="$(run on 2>&1 1>/dev/null)"
RES_OFF="$(run off 2>&1 1>/dev/null)"

STATES_ON=$(get_states "$RES_ON")
STATES_OFF=$(get_states "$RES_OFF")

# Both runs finished:
assert 'test -n "$STATES_ON"'
assert 'test -n "$STATES_OFF"'

# We expect 21 visited pairs with the stack cleaner:
assert 'test "$STATES_ON" = 21'

# We expect more states without the stack cleaner:
assert 'test "$STATES_ON" -lt "$STATES_OFF"'
