#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# Bash sanity settings (error on exit, complain for undefined vars, error when pipe fails)
set -euo pipefail

CMDNAME="$(basename -- "$0")"

if [[ ${AIRFLOW_CI_VERBOSE:="false"} == "true" ]]; then
    set -x
fi

if [[ -z "${AIRFLOW__CORE__SQL_ALCHEMY_CONN:=}" ]]; then
    echo "AIRFLOW__CORE__SQL_ALCHEMY_CONN not set - using default" >&2
fi

# Update short and long options in the breeze-complete script
# This way autocomplete will work automagically with all options
# shellcheck source=run-tests-complete
. "${MY_DIR}/run-tests-complete"


# environment
export AIRFLOW_HOME=${AIRFLOW_HOME:=${HOME}}
AIRFLOW_ROOT="$(cd "${MY_DIR}" && pwd)"
export AIRFLOW_ROOT
export AIRFLOW__CORE__DAGS_FOLDER="S{AIRFLOW_ROOT}/tests/dags"
export AIRFLOW__CORE__UNIT_TEST_MODE=True

# add test/test_utils to PYTHONPATH TODO: Do we need that ??? Looks fishy.
export PYTHONPATH=${PYTHONPATH:=}:${AIRFLOW_ROOT}/tests/test_utils

echo Airflow home: "${AIRFLOW_HOME}"
echo Airflow root: "${AIRFLOW_ROOT}"
echo Home of the user: "${HOME}"

export AIRFLOW__CORE__DAGS_FOLDER="${AIRFLOW_ROOT}/tests/dags"

usage() {
      echo """

Usage: ${CMDNAME} [FLAGS] [TESTS_TO_RUN] -- <EXTRA_NOSETEST_ARGS>

Runs tests specified (or all tests if no tests are specified)

Flags:

-h, --help
        Shows this help message.

-i, --with-db-init
        Forces database initialization before tests

-x, --with-xunit
        Dumps result of the tests to Xunit file

-f, --xunit-file
        The file where xunit results should be dumped. Default if not specified
        is ${AIRFLOW_ROOT}/logs/all_tests.xml

-s, --nocapture
        Don't capture stdout when running the tests. This is useful if you are
        debugging with ipdb and want to drop into console with it
        by adding this line to source code:

            import ipdb; ipdb.set_trace()

-v, --verbose
        Verbose output showing coloured output of tests being run and summary
        of the tests - in a manner similar to the tests run in the CI environment.

"""
}

echo

####################  Parsing options/arguments
if ! PARAMS=$(getopt \
    -o "${_RUN_TESTS_GETOPT_SHORT_OPTIONS:=}" \
    -l "${_RUN_TESTS_GETOPT_LONG_OPTIONS:=}" \
    --name "$CMDNAME" -- "$@")
then
    usage
fi

eval set -- "${PARAMS}"
unset PARAMS

WITH_DB_INIT="false"
NOCAPTURE="false"
WITH_XUNIT="false"
XUNIT_FILE="${AIRFLOW_ROOT}/logs/all_tests.xml"
VERBOSE="${AIRFLOW_CI_VERBOSE}"

# Parse Flags.
# Please update short and long options in the run-tests-complete script
# This way autocomplete will work out-of-the-box
while true
do
  case "${1}" in
    -h|--help)
      usage;
      exit 0 ;;
    -i|--with-db-init)
      WITH_DB_INIT="true"
      shift ;;
    -s|--nocapture)
      NOCAPTURE="true"
      shift ;;
    -x|--with-xunit)
      WITH_XUNIT="true"
      shift ;;
    -v|--verbose)
      VERBOSE="true"
      shift;;
    -f|--xunit-file)
      XUNIT_FILE="$2"
      shift; shift ;;
    --)
      shift ;
      break ;;
    *)
      usage
      echo
      echo "ERROR: Unknown argument ${1}"
      echo
      exit 1
      ;;
  esac
done


# any argument received after -- is overriding the default nose execution arguments:
NOSE_ARGS=("$@")

AIRFLOW_DB_INITIALISED_FILE=${HOME}/.airflow_db_initialised

if [[ "${WITH_DB_INIT}" == "true" || ! -f ${AIRFLOW_DB_INITIALISED_FILE} ]]; then
    echo
    if [[ "${WITH_DB_INIT}" == "true" ]]; then
        echo "Initializing the DB - forced with --with-db-init switch"
    else
        echo "Initializing the DB - first time after entering the container"
        echo "You can force re-initialization the database by adding --with-db-init switch to run-tests."
    fi
    echo
    yes | airflow initdb || true
    airflow resetdb -y
    touch "${AIRFLOW_DB_INITIALISED_FILE}"
else
    echo
    echo "Skipping initializing of the DB as it was initialized already"
    echo
    echo "You can re-initialize the database by adding --with-db-init flag when running tests"
    echo
fi

if [[ "${KRB5_KTNAME:=}" == "" ]]; then
    echo "KRB5_KTNAME variable is empty - no kerberos intialisation"
else
    kinit -kt "${KRB5_KTNAME}" airflow
fi

if [[ "${#NOSE_ARGS[@]}" == "0" ]]; then
  NOSE_ARGS=("--with-coverage"
            "--cover-erase"
            "--cover-html"
            "--cover-package=airflow"
            "--cover-html-dir=airflow/www_rbac/static/coverage"
            "--with-ignore-docstrings"
            "--rednose"
            "--with-timer"
            "-v"
            "--logging-level=DEBUG")
fi

if [[ "${WITH_XUNIT}" == "true" ]]; then
    echo
    echo "Dumping results to ${XUNIT_FILE}"
    echo
    NOSE_ARGS+=("--with-xunit" "--xunit-file=${XUNIT_FILE}")
fi

if [[ "${NOCAPTURE}" == "true" ]]; then
    echo
    echo "Stop capturing stdout"
    echo
    NOSE_ARGS+=("--nocapture")
fi

if [[ "${VERBOSE}" == "true" ]]; then
    echo
    echo "Verbose output"
    echo
    NOSE_ARGS+=("--rednose" "--with-timer" "-v" "--logging-level=DEBUG")
fi

echo
echo "Starting the tests with arguments: ${NOSE_ARGS[*]}"
echo
nosetests "${NOSE_ARGS[@]}"
