#!/usr/bin/env bash

##
# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##

set -e;
set -u;

wd="$(cd "$(dirname "$0")" && pwd -L)";

. "${wd}/support/build.sh";

do_setup="false";
do_get="false";

random="--random=$(date "+%s")";
no_colour="";
until_fail="";
coverage="";
m_twisted="";
numjobs="";
reactor="";

if [ "$(uname -s)" == "Darwin" ]; then
  reactor="--reactor=kqueue";
fi;

usage ()
{
  program="$(basename "$0")";

  if [ "${1--}" != "-" ]; then echo "$@"; echo; fi;

  echo "Usage: ${program} [options]";
  echo "Options:";
  echo "        -h  Print this help and exit";
  echo "        -n  Do not use color";
  echo "        -o  Do not run tests in random order.";
  echo "        -r<num>  Use specified seed to determine order.";
  echo "        -u  Run until the tests fail.";
  echo "        -c  Generate coverage reports.";

  if [ "${1-}" == "-" ]; then return 0; fi;
  exit 64;
}

while getopts "nhoucr:j:" option; do
  case "${option}" in
    '?') usage; ;;
    'h') usage -; exit 0; ;;
    'o')     random=""; ;;
    'r')     random="--random=$OPTARG"; ;;
    'n')  no_colour="--reporter=bwverbose"; ;;
    'u') until_fail="--until-failure"; ;;
    'c')   coverage="--coverage"; ;;
    't')  m_twisted="twisted"; ;;
    'j')    numjobs="-j $OPTARG"; ;;
  esac;
done;
shift $((${OPTIND} - 1));

export PYTHONPATH="${wd}:${PYTHONPATH:-}";

dependencies;
trial="$(type -p trial)";

if [ $# -gt 0 ]; then
  test_modules="$@";
  flaky=true;
else
  test_modules="calendarserver twistedcaldav twext txdav contrib ${m_twisted}";
  flaky=true;
fi;

find "${wd}" -name \*.pyc -print0 | xargs -0 rm;

mkdir -p "${wd}/data";
cd "${wd}" && "${python}" "${trial}" --temp-directory="${wd}/data/trial" --rterrors ${reactor} ${random} ${until_fail} ${no_colour} ${coverage} ${numjobs} ${test_modules};

if ${flaky}; then
  echo "";
  echo "Running pyflakes...";
  tmp="$(mktemp "/tmp/calendarserver_test_flakes.XXXXX")";
  cd "${wd}" && ./pyflakes ${test_modules} | tee "${tmp}" 2>&1;
  if [ -s "${tmp}" ]; then
    echo "**** Pyflakes says you have some code to clean up. ****";
    exit 1;
  fi;
  rm -f "${tmp}";
fi;

search_py ()
{
  find . \
    ! '(' -type d '(' -path '*/.*' -or -name data ')' -prune ')' \
    -type f -name '*.py' \
    -print0 \
    | xargs -0 -n 100 grep "$@";
}

#tmp="$(mktemp "/tmp/calendarserver_test_flakish.XXXXX")";
#echo "";
#echo "Checking for other issues..."
#search_py 'print  *[^(]' | sed 's|#.*||' | grep 'print  *[^(]' > "${tmp}" || true;
#if [ -s "${tmp}" ]; then
#    echo "**** Use of legacy print statement found. ****";
#    cat "${tmp}";
#    exit 1;
#fi;
#rm -f "${tmp}";

tmp="$(mktemp "/tmp/calendarserver_test_emtpy.XXXXX")";
find "${wd}" '!' '(' -type d '(' -path '*/.*' -or -name data ')' -prune ')' -type f -size 0 > "${tmp}";
if [ -s "${tmp}" ]; then
    echo "**** Empty files: ****";
    cat "${tmp}";
    exit 1;
fi;
rm -f "${tmp}";
