#!/bin/sh
# -*- sh-basic-offset: 2 -*-

##
# Copyright (c) 2005-2017 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;

#
# Initialize build support
#

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

. "${wd}/bin/_build.sh";

init_build > /dev/null;



#
# Options
#

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

    random="--random=$(date "+%s")";
  no_color="";
until_fail="";
  coverage="";
   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 <seed>  Use specified seed to determine order.";
  echo "        -u         Run until the tests fail.";
  echo "        -c         Generate coverage reports.";
  echo "        -L         Show logging output in a separate view.";

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

while getopts "hor:nucj:L" option; do
  case "${option}" in
    '?') usage; ;;
    'h') usage -; exit 0; ;;
    'o')     random=""; ;;
    'r')     random="--random=$OPTARG"; ;;
    'n')  no_color="--reporter=bwverbose"; ;;
    'u') until_fail="--until-failure"; ;;
    'c')   coverage="--coverage"; ;;
    'j')    numjobs="-j $OPTARG"; ;;
    'L')    viewlog="true";
  esac;
done;
shift $((${OPTIND} - 1));


#
# Dependencies
#

develop > /dev/null "${dev_home}/setup.log";

echo "Using ${python} as Python:";
"${python}" -V;
echo "";



#
# Clean up
#

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


#
# Do keychain unlock on OS X
#
if [ -z "${USE_OPENSSL-}" ]; then
  case "$(uname -s)" in
    Darwin)
      bin/python bin/keychain_unlock.py
      ;;
  esac;
fi;  

#
# Unit tests
#

trial_temp="${dev_home}/trial";

if "${viewlog}"; then
  if [ "${TERM_PROGRAM}" = "Apple_Terminal" ]; then
    if [ ! -d "${trial_temp}" ]; then
      mkdir "${trial_temp}";
    fi;

    touch "${trial_temp}/_trial_marker";
    cp /dev/null "${trial_temp}/test.log";

    open -a Console "${trial_temp}/test.log";
  else
    echo "Unable to view log.";
  fi;
fi;

error=0;

if [ $# -eq 0 ]; then
  lint="true";
  # Test these modules with a single invocation of trial
  set - calendarserver twistedcaldav txdav txweb2 contrib
  cd "${wd}" &&                                       \
    "${wd}/bin/trial"                                 \
    --temp-directory="${dev_home}/trial"              \
    --rterrors                                        \
    ${reactor}                                        \
    ${random}                                         \
    ${until_fail}                                     \
    ${no_color}                                       \
    ${coverage}                                       \
    ${numjobs}                                        \
    "$@"                                              \
    || error=$?;
else
  lint="false";
  # Loop over the passed-in modules
  for module in "$@"; do
    if [ -f "${module}" ]; then
      module="--testmodule=${module}";
    fi;
    cd "${wd}" &&                                       \
      "${wd}/bin/trial"                                 \
      --temp-directory="${dev_home}/trial"              \
      --rterrors                                        \
      ${reactor}                                        \
      ${random}                                         \
      ${until_fail}                                     \
      ${no_color}                                       \
      ${coverage}                                       \
      ${numjobs}                                        \
      "${module}"                                       \
      || error=$? ;
  done;
fi;

if [ ${error} -ne 0 ]; then
  exit ${error};
fi;


#
# Linting
#

if ! "${lint}"; then
  exit 0;
fi;

echo "";
echo "Running pyflakes...";

"${python}" -m pip install pyflakes --upgrade >> "${dev_home}/setup.log";
tmp="$(mktemp -t "twext_flakes.XXXXX")";
cd "${wd}" && "${python}" -m pyflakes "$@" | tee "${tmp}" 2>&1;
if [ -s "${tmp}" ]; then
  echo "**** Pyflakes says you have some code to clean up. ****";
  exit 1;
fi;
rm -f "${tmp}";



#
# Empty files
#

echo "";
echo "Checking for empty files...";
tmp="$(mktemp -t "twext_test_empty.XXXXX")";

find "${wd}"                                             \
  '!' '('                                                \
    -type d                                              \
    '(' -path '*/.*' -or -name data -or -name build ')'  \
    -prune                                               \
  ')'                                                    \
  -type f -size 0                                        \
  > "${tmp}";

if [ -s "${tmp}" ]; then
    echo "**** Empty files: ****";
    cat "${tmp}";
    exit 1;
fi;
rm -f "${tmp}";
