blob: a53d9c85a7b3933eb1113a35c944645672cae12a [file] [log] [blame]
#!/bin/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.
set -e
die()
{
local _ret="${2:-1}"
test "${_PRINT_HELP:-no}" = yes && print_help >&2
echo "$1" >&2
exit "${_ret}"
}
_positionals=()
_arg_image_tag_prefix=
_arg_tags_to_exclude=
_arg_parallel_processes=3
print_help()
{
printf '%s\n' "Runs the provided behave tests in a containerized environment"
printf 'Usage: %s [--image-tag-prefix <arg>] [-h|--help] <minifi_version> <feature_path-1> [<feature_path-2>] ... [<feature_path-n>] ...\n' "$0"
printf '\t%s\n' "<minifi_version>: the version of minifi"
printf '\t%s\n' "<tags_to_run>: include these tags"
printf '\t%s\n' "--tags_to_exclude: optional tags that should be skipped (no default)"
printf '\t%s\n' "--image-tag-prefix: optional prefix to the docker tag (no default)"
printf '\t%s\n' "--parallel_processes: optional argument that specifies the number of parallel processes that can be executed simultaneously. (default: 3)"
printf '\t%s\n' "-h, --help: Prints help"
}
parse_commandline()
{
_positionals_count=0
while test $# -gt 0
do
_key="$1"
case "$_key" in
--image-tag-prefix)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_image_tag_prefix="$2"
shift
;;
--image-tag-prefix=*)
_arg_image_tag_prefix="${_key##--image-tag-prefix=}"
;;
--tags_to_exclude)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_tags_to_exclude="$2"
shift
;;
--tags_to_exclude=*)
_arg_tags_to_exclude="${_key##--tags_to_exclude=}"
;;
--parallel_processes)
test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
_arg_parallel_processes="$2"
shift
;;
--parallel_processes=*)
_arg_parallel_processes="${_key##--parallel_processes=}"
;;
-h|--help)
print_help
exit 0
;;
-h*)
print_help
exit 0
;;
*)
_last_positional="$1"
_positionals+=("$_last_positional")
_positionals_count=$((_positionals_count + 1))
;;
esac
shift
done
}
handle_passed_args_count()
{
local _required_args_string="'minifi_version' and 'tags_to_run'"
test "${_positionals_count}" -ge 2 || _PRINT_HELP=yes die "FATAL ERROR: Not enough positional arguments - we require at least 2 (namely: $_required_args_string), but got only ${_positionals_count}." 1
}
assign_positional_args()
{
local _positional_name _shift_for=$1
_positional_names="_arg_minifi_version _arg_tags_to_run "
shift "$_shift_for"
for _positional_name in ${_positional_names}
do
test $# -gt 0 || break
eval "$_positional_name=\${1}" || die "Error during argument parsing." 1
shift
done
}
parse_commandline "$@"
handle_passed_args_count
assign_positional_args 1 "${_positionals[@]}"
docker_dir="$( cd "${0%/*}" && pwd )"
# shellcheck disable=SC2154
export MINIFI_VERSION=${_arg_minifi_version}
if test -z "$_arg_image_tag_prefix"
then
export MINIFI_TAG_PREFIX=""
else
export MINIFI_TAG_PREFIX=${_arg_image_tag_prefix}-
fi
# Create virtual environment for testing
if [[ ! -d ./test-env-py3 ]]; then
echo "Creating virtual environment in ./test-env-py3" 1>&2
virtualenv --python=python3 ./test-env-py3
fi
echo "Activating virtual environment..." 1>&2
# shellcheck disable=SC1091
. ./test-env-py3/bin/activate
pip install --trusted-host pypi.python.org --upgrade pip setuptools
# Install test dependencies
echo "Installing test dependencies..." 1>&2
# hint include/library paths if homewbrew is in use
if brew list 2> /dev/null | grep openssl > /dev/null 2>&1; then
echo "Using homebrew paths for openssl" 1>&2
LDFLAGS="-L$(brew --prefix openssl@1.1)/lib"
export LDFLAGS
CFLAGS="-I$(brew --prefix openssl@1.1)/include"
export CFLAGS
SWIG_FEATURES="-cpperraswarn -includeall -I$(brew --prefix openssl@1.1)/include"
export SWIG_FEATURES
fi
if ! command swig -version &> /dev/null; then
echo "Swig could not be found on your system (dependency of m2crypto python library). Please install swig to continue."
exit 1
fi
pip install -r "${docker_dir}/requirements.txt"
JAVA_HOME="/usr/lib/jvm/default-jvm"
export JAVA_HOME
PATH="$PATH:/usr/lib/jvm/default-jvm/bin"
export PATH
TEST_DIRECTORY="${docker_dir}/test/integration"
export TEST_DIRECTORY
# Add --no-logcapture to see logs interleaved with the test output
BEHAVE_OPTS=(--logging-level INFO --parallel-processes "${_arg_parallel_processes}" --parallel-scheme feature -o "${PWD}/behavex_output" -t "${_arg_tags_to_run}")
if ! test -z "${_arg_tags_to_exclude}"
then
IFS=','
read -ra splits <<< "${_arg_tags_to_exclude}"
for split in "${splits[@]}"
do
BEHAVE_OPTS=("${BEHAVE_OPTS[@]}" -t "~${split}")
done
fi
echo "${BEHAVE_OPTS[@]}"
cd "${docker_dir}/test/integration"
exec
behavex "${BEHAVE_OPTS[@]}"