772 lines
21 KiB
Bash
772 lines
21 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
if [[ ! -z "${DEBUG}" ]]; then
|
|
set -x
|
|
fi
|
|
|
|
|
|
SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
SUITE=$(caller)
|
|
SUITE=$(basename "${SUITE}" .sh )
|
|
|
|
tabs 1
|
|
declare -i PADDING_LEVEL=0
|
|
declare -i STEP=1
|
|
declare -a REQUIRED_COMPONENTS
|
|
|
|
find_selenium_dir() {
|
|
TEST_PATH=$1
|
|
FOUND=""
|
|
while [[ $TEST_PATH != "" && $FOUND == "" ]]; do
|
|
FILENAME=$(basename "$TEST_PATH")
|
|
if [[ $FILENAME == "selenium" ]]; then
|
|
FOUND=$TEST_PATH
|
|
fi
|
|
TEST_PATH="$(dirname $TEST_PATH)"
|
|
done
|
|
echo $FOUND
|
|
}
|
|
|
|
SELENIUM_ROOT_FOLDER=$(find_selenium_dir $SCRIPT)
|
|
TEST_DIR=$SELENIUM_ROOT_FOLDER/test
|
|
BIN_DIR=$SELENIUM_ROOT_FOLDER/bin
|
|
if [[ -z "${CONF_DIR_PREFIX}" ]]; then
|
|
CONF_DIR_PREFIX=$(mktemp -d)
|
|
fi
|
|
CONF_DIR=${CONF_DIR_PREFIX}/selenium/${SUITE}
|
|
SCREENS=${CONF_DIR}/screens
|
|
|
|
LOGS=${CONF_DIR}/logs
|
|
ENV_FILE=$CONF_DIR/.env
|
|
OTHER_ENV_FILE=$CONF_DIR/.other.env
|
|
|
|
rm -rf $CONF_DIR
|
|
|
|
for f in $SCRIPT/components/*; do
|
|
if [[ ! "$f" == *README.md ]]
|
|
then
|
|
source $f;
|
|
fi
|
|
done
|
|
|
|
parse_arguments() {
|
|
if [[ "$#" -gt 0 ]]
|
|
then
|
|
if [[ "$1" == "start-rabbitmq" ]]
|
|
then
|
|
echo "start-rabbitmq"
|
|
elif [[ "$1" == "start-other-rabbitmq" ]]
|
|
then
|
|
echo "start-other-rabbitmq"
|
|
elif [[ "$1" == "start-others" ]]
|
|
then
|
|
echo "start-others"
|
|
elif [[ "$1" == "ensure-others" ]]
|
|
then
|
|
echo "ensure-others"
|
|
elif [[ "$1" == "stop-others" ]]
|
|
then
|
|
echo "stop-others"
|
|
elif [[ "$1" == "stop-rabbitmq" ]]
|
|
then
|
|
echo "stop-rabbitmq"
|
|
elif [[ "$1" == "test" ]]
|
|
then
|
|
echo "test $2"
|
|
fi
|
|
else
|
|
echo "run"
|
|
fi
|
|
}
|
|
|
|
COMMAND=$(parse_arguments $@)
|
|
|
|
|
|
|
|
|
|
print() {
|
|
tabbing=""
|
|
if [[ $PADDING_LEVEL -gt 0 ]]; then
|
|
for i in $(seq $PADDING_LEVEL); do
|
|
tabbing="$tabbing\t"
|
|
done
|
|
fi
|
|
echo -e "$tabbing$1"
|
|
}
|
|
|
|
begin() {
|
|
print "\n[$STEP] $@"
|
|
PADDING_LEVEL=$(($PADDING_LEVEL + 1))
|
|
STEP=$(($STEP + 1))
|
|
}
|
|
end() {
|
|
PADDING_LEVEL=$(($PADDING_LEVEL - 1))
|
|
print "$@"
|
|
}
|
|
ensure_docker_network() {
|
|
begin "Ensuring $DOCKER_NETWORK network ..."
|
|
if [ ! "$(docker network ls | grep $DOCKER_NETWORK)" ]; then
|
|
print "> DOCKER_NETWORK: $DOCKER_NETWORK created"
|
|
docker network create $DOCKER_NETWORK
|
|
fi
|
|
end "$DOCKER_NETWORK network exists"
|
|
}
|
|
init_suite() {
|
|
TEST_CASES_DIR=$(realpath ${TEST_DIR}${TEST_CASES_PATH:?"missing TEST_CASES_PATH"})
|
|
if [ -z "${TEST_CONFIG_PATH}" ]; then TEST_CONFIG_DIR=$TEST_CASES_DIR
|
|
else TEST_CONFIG_DIR=$(realpath ${TEST_DIR}${TEST_CONFIG_PATH})
|
|
fi
|
|
DOCKER_NETWORK=${DOCKER_NETWORK:-rabbitmq_net}
|
|
|
|
begin "Initializing suite $SUITE ..."
|
|
print "> REQUIRED_COMPONENTS: ${REQUIRED_COMPONENTS[*]}"
|
|
print "> CONF_DIR_PREFIX: ${CONF_DIR_PREFIX} "
|
|
print "> CONF_DIR: ${CONF_DIR} "
|
|
print "> TEST_CASES_DIR: ${TEST_CASES_DIR} "
|
|
print "> TEST_CONFIG_DIR: ${TEST_CONFIG_DIR} "
|
|
print "> DOCKER_NETWORK: ${DOCKER_NETWORK} "
|
|
print "> initial PROFILES: ${PROFILES} "
|
|
print "> (+) ADDON_PROFILES: ${ADDON_PROFILES} "
|
|
PROFILES="${PROFILES} ${ADDON_PROFILES}"
|
|
print "> (=) final PROFILES: ${PROFILES} "
|
|
print "> ENV_FILE: ${ENV_FILE} "
|
|
print "> OTHER_ENV_FILE: ${OTHER_ENV_FILE} "
|
|
print "> COMMAND: ${COMMAND}"
|
|
end "Initialized suite"
|
|
|
|
mkdir -p ${LOGS}
|
|
mkdir -p ${SCREENS}
|
|
}
|
|
|
|
build_mocha_image() {
|
|
DOCKER_BUILD_ARGS=""
|
|
if [[ -n "$MOCHA_DOCKER_FILE" ]]; then
|
|
DOCKER_BUILD_ARGS="-f $MOCHA_DOCKER_FILE "
|
|
fi
|
|
begin "Ensuring mocha-test image ($DOCKER_BUILD_ARGS) ..."
|
|
tag=($(md5sum $SELENIUM_ROOT_FOLDER/package.json))
|
|
print "> tag : $tag"
|
|
if [[ $(docker images -q mocha-test:$tag 2> /dev/null) == "" ]]; then
|
|
docker build $DOCKER_BUILD_ARGS -t mocha-test:$tag --target test $SELENIUM_ROOT_FOLDER
|
|
print "> Built docker image mocha-test:$tag"
|
|
fi
|
|
end "mocha-test image exists"
|
|
}
|
|
|
|
kill_container_if_exist() {
|
|
if docker stop $1 &> /dev/null; then
|
|
docker rm $1 &> /dev/null
|
|
fi
|
|
}
|
|
wait_for_message() {
|
|
attemps_left=10
|
|
while ! docker logs $1 2>&1 | grep -q "$2";
|
|
do
|
|
sleep 5
|
|
print "Waiting 5sec for $1 to start ($attemps_left attempts left )..."
|
|
((attemps_left--))
|
|
if [[ "$attemps_left" -lt 1 ]]; then
|
|
print "Timed out waiting"
|
|
save_container_log $1
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
wait_for_oidc_endpoint() {
|
|
NAME=$1
|
|
BASE_URL=$2
|
|
if [[ $BASE_URL == *"localhost"** || $BASE_URL == *"0.0.0.0"** ]]; then
|
|
wait_for_oidc_endpoint_local $@
|
|
else
|
|
wait_for_oidc_endpoint_docker $@
|
|
fi
|
|
}
|
|
wait_for_oidc_endpoint_local() {
|
|
NAME=$1
|
|
BASE_URL=$2
|
|
CURL_ARGS="-k --tlsv1.2 -L --fail "
|
|
DELAY_BETWEEN_ATTEMPTS=5
|
|
if [[ $# -eq 3 ]]; then
|
|
CURL_ARGS="$CURL_ARGS --cacert $3"
|
|
DELAY_BETWEEN_ATTEMPTS=10
|
|
fi
|
|
max_retry=15
|
|
counter=0
|
|
print "Waiting for OIDC discovery endpoint $NAME ... (BASE_URL: $BASE_URL)"
|
|
until (curl $CURL_ARGS ${BASE_URL}/.well-known/openid-configuration >/dev/null 2>&1)
|
|
do
|
|
sleep $DELAY_BETWEEN_ATTEMPTS
|
|
[[ counter -eq $max_retry ]] && print "Failed!" && exit 1
|
|
print "Trying again. Try #$counter"
|
|
((counter++))
|
|
done
|
|
sleep 20
|
|
}
|
|
wait_for_oidc_endpoint_docker() {
|
|
NAME=$1
|
|
BASE_URL=$2
|
|
CURL_ARGS="-k --tlsv1.2 -L --fail "
|
|
DOCKER_ARGS="--rm --net ${DOCKER_NETWORK} "
|
|
DELAY_BETWEEN_ATTEMPTS=5
|
|
if [[ $# -gt 2 ]]; then
|
|
DOCKER_ARGS="$DOCKER_ARGS -v $3:/tmp/ca_certificate.pem"
|
|
CURL_ARGS="$CURL_ARGS --cacert /tmp/ca_certificate.pem"
|
|
DELAY_BETWEEN_ATTEMPTS=10
|
|
fi
|
|
max_retry=15
|
|
counter=0
|
|
print "Waiting for OIDC discovery endpoint $NAME ... (BASE_URL: $BASE_URL)"
|
|
until (docker run $DOCKER_ARGS curlimages/curl:7.85.0 $CURL_ARGS ${BASE_URL}/.well-known/openid-configuration >/dev/null 2>&1)
|
|
do
|
|
sleep $DELAY_BETWEEN_ATTEMPTS
|
|
[[ counter -eq $max_retry ]] && print "Failed!" && exit 1
|
|
print "Trying again. Try #$counter"
|
|
((counter++))
|
|
done
|
|
sleep 20
|
|
}
|
|
calculate_rabbitmq_url() {
|
|
echo "${RABBITMQ_SCHEME:-http}://$1${PUBLIC_RABBITMQ_PATH:-$RABBITMQ_PATH}"
|
|
}
|
|
calculate_other_rabbitmq_url() {
|
|
echo "${OTHER_RABBITMQ_SCHEME:-http}://$1${PUBLIC_RABBITMQ_PATH:-$RABBITMQ_PATH}"
|
|
}
|
|
calculate_forward_proxy_url() {
|
|
PROXIED_URL=$1
|
|
PROXY_HOSTNAME=$2
|
|
PROXY_PORT=$3
|
|
SCHEME=$(echo "$PROXIED_URL" | cut -d: -f1)
|
|
PATH=$(echo "$PROXIED_URL" | cut -d/ -f4-)
|
|
echo "$SCHEME://$PROXY_HOSTNAME:$PROXY_PORT/$PATH"
|
|
}
|
|
wait_for_url() {
|
|
BASE_URL=$1
|
|
if [[ $BASE_URL == *"localhost"** ]]; then
|
|
wait_for_url_local $@
|
|
else
|
|
wait_for_url_docker $@
|
|
fi
|
|
}
|
|
wait_for_url_local() {
|
|
url=$1
|
|
proxy=${2:-none}
|
|
proxy_user=${3:-none}
|
|
proxy_pass=$4
|
|
curl_args="-L -f -v"
|
|
max_retry=10
|
|
counter=0
|
|
if [[ "$proxy" != "none" && "$proxy" != "" ]]; then
|
|
curl_args="--proxy ${proxy} ${curl_args}"
|
|
fi
|
|
if [[ "$proxy_user" != "none" && "$proxy_user" != "" ]]; then
|
|
curl_args="--proxy-user ${proxy_user}:${proxy_pass} ${curl_args}"
|
|
fi
|
|
until (curl $curl_args $url >/dev/null 2>&1)
|
|
do
|
|
print "Waiting for $url to start (local)"
|
|
sleep 5
|
|
[[ counter -eq $max_retry ]] && print "Failed!" && exit 1
|
|
print "Trying again. Try #$counter"
|
|
((counter++))
|
|
done
|
|
}
|
|
wait_for_url_docker() {
|
|
url=$1
|
|
proxy=${2:-none}
|
|
proxy_user=${3:-none}
|
|
proxy_pass=$4
|
|
max_retry=10
|
|
counter=0
|
|
curl_args="-L -f -v"
|
|
if [[ "$proxy" != "none" && "$proxy" != "" ]]; then
|
|
curl_args="--proxy ${proxy} ${curl_args}"
|
|
fi
|
|
if [[ "$proxy_user" != "none" && "$proxy_user" != "" ]]; then
|
|
curl_args="--proxy-user ${proxy_user}:${proxy_pass} ${curl_args}"
|
|
fi
|
|
until (docker run --net ${DOCKER_NETWORK} --rm curlimages/curl:7.85.0 $curl_args $url >/dev/null 2>&1)
|
|
do
|
|
print "Waiting for $url to start (docker)"
|
|
sleep 5
|
|
[[ counter -eq $max_retry ]] && print "Failed!" && exit 1
|
|
print "Trying again. Try #$counter"
|
|
((counter++))
|
|
done
|
|
}
|
|
|
|
test_on_cluster() {
|
|
IFS=', ' read -r -a array <<< "$RABBITMQ_CLUSTER_NODES"
|
|
begin "Running against all nodes in cluster $RABBITMQ_CLUSTER_NODES :"
|
|
for item in "${array[@]}"
|
|
do
|
|
RMQ_HOST_0=${RABBITMQ_HOST:-rabbitmq:15672}
|
|
RMQ_HOST=$(rewrite_rabbitmq_hostname ${item} $RMQ_HOST_0)
|
|
PUBLIC_RMQ_HOST_0=${PUBLIC_RABBITMQ_HOST:-$RMQ_HOST}
|
|
PUBLIC_RMQ_HOST=$(rewrite_rabbitmq_hostname ${item} $PUBLIC_RMQ_HOST_0)
|
|
RMQ_URL=$(calculate_rabbitmq_url $PUBLIC_RMQ_HOST)
|
|
RMQ_HOSTNAME=${item}
|
|
_test $RMQ_HOST \
|
|
$PUBLIC_RMQ_HOST \
|
|
$RMQ_URL \
|
|
$RMQ_HOSTNAME
|
|
TEST_RESULT=$?
|
|
if [ $TEST_RESULT -ne 0 ]; then
|
|
break
|
|
fi
|
|
done
|
|
end "Finishing running test ($TEST_RESULT)"
|
|
}
|
|
rewrite_rabbitmq_hostname() {
|
|
IFS=':' read -r -a array <<< "$2"
|
|
if [ "${array[0]}" == "rabbitmq" ]; then
|
|
echo "${2//rabbitmq/$1}"
|
|
else
|
|
echo "$2"
|
|
fi
|
|
}
|
|
test() {
|
|
if [[ "$PROFILES" == *"cluster"* && ! -z "$RABBITMQ_CLUSTER_NODES" ]]; then
|
|
test_on_cluster
|
|
else
|
|
RMQ_HOST=${RABBITMQ_HOST:-rabbitmq:15672}
|
|
PUBLIC_RMQ_HOST=${PUBLIC_RABBITMQ_HOST:-$RMQ_HOST}
|
|
_test $RABBITMQ_HOST \
|
|
$PUBLIC_RMQ_HOST \
|
|
$(calculate_rabbitmq_url $PUBLIC_RMQ_HOST) \
|
|
${RABBITMQ_HOSTNAME:-rabbitmq}
|
|
fi
|
|
}
|
|
|
|
_test() {
|
|
RMQ_HOST=$1
|
|
PUBLIC_RMQ_HOST=$2
|
|
RMQ_URL=$3
|
|
RMQ_HOSTNAME=$4
|
|
|
|
kill_container_if_exist mocha
|
|
begin "Running tests against $RMQ_HOSTNAME with these env variable:"
|
|
|
|
SELENIUM_TIMEOUT=${SELENIUM_TIMEOUT:-20000}
|
|
SELENIUM_POLLING=${SELENIUM_POLLING:-500}
|
|
|
|
print "> SELENIUM_TIMEOUT: ${SELENIUM_TIMEOUT}"
|
|
print "> SELENIUM_POLLING: ${SELENIUM_POLLING}"
|
|
print "> RABBITMQ_HOST: ${RMQ_HOST}"
|
|
print "> RABBITMQ_HOSTNAME: ${RMQ_HOSTNAME}"
|
|
print "> PUBLIC_RABBITMQ_HOST: ${PUBLIC_RMQ_HOST}"
|
|
print "> RABBITMQ_PATH: ${RABBITMQ_PATH}"
|
|
print "> RABBITMQ_URL: ${RMQ_URL}"
|
|
print "> UAA_URL: ${UAA_URL}"
|
|
print "> FAKEPORTAL_URL: ${FAKEPORTAL_URL}"
|
|
mocha_test_tag=($(md5sum $SELENIUM_ROOT_FOLDER/package.json))
|
|
|
|
generate_node_extra_ca_cert
|
|
MOUNT_NODE_EXTRA_CA_CERTS=${CONF_DIR}/node
|
|
|
|
EXTRA_ENV_VARS=""
|
|
EXTRA_MOUNTS=""
|
|
if [[ -f ${MOUNT_NODE_EXTRA_CA_CERTS}/node_ca_certs.pem ]]; then
|
|
print "> MOUNT_NODE_EXTRA_CA_CERTS: ${MOUNT_NODE_EXTRA_CA_CERTS}"
|
|
EXTRA_ENV_VARS="${EXTRA_ENV_VARS} --env NODE_EXTRA_CA_CERTS=/nodejs/node_ca_certs.pem "
|
|
EXTRA_MOUNTS="${EXTRA_MOUNTS} -v ${MOUNT_NODE_EXTRA_CA_CERTS}:/nodejs "
|
|
fi
|
|
|
|
docker run \
|
|
--rm \
|
|
--name mocha \
|
|
--net ${DOCKER_NETWORK} \
|
|
--env RABBITMQ_URL=${RMQ_URL} \
|
|
--env RABBITMQ_HOSTNAME=${RMQ_HOSTNAME} \
|
|
--env UAA_URL=${UAA_URL} \
|
|
--env FAKE_PORTAL_URL=${FAKEPORTAL_URL} \
|
|
--env RUN_LOCAL=false \
|
|
--env SELENIUM_TIMEOUT=${SELENIUM_TIMEOUT} \
|
|
--env SELENIUM_POLLING=${SELENIUM_POLLING} \
|
|
--env PROFILES="${PROFILES}" \
|
|
--env ENV_FILE="/code/.env" \
|
|
--env RABBITMQ_CERTS=/etc/rabbitmq/certs \
|
|
${EXTRA_ENV_VARS} \
|
|
-v ${TEST_DIR}:/code/test \
|
|
-v ${TEST_CONFIG_DIR}/certs:/etc/rabbitmq/certs \
|
|
-v ${SCREENS}:/screens \
|
|
-v ${ENV_FILE}:/code/.env \
|
|
${EXTRA_MOUNTS} \
|
|
mocha-test:${mocha_test_tag} test /code/test${TEST_CASES_PATH}
|
|
|
|
TEST_RESULT=$?
|
|
end "Finishing running test ($TEST_RESULT)"
|
|
return $TEST_RESULT
|
|
}
|
|
|
|
save_logs() {
|
|
mkdir -p $LOGS
|
|
save_container_logs selenium
|
|
}
|
|
save_container_logs() {
|
|
echo "Saving logs for $1"
|
|
if docker container ls | grep $1 >/dev/null 2>&1; then
|
|
docker logs $1 &> $LOGS/$1.log
|
|
else
|
|
echo "$1 not running"
|
|
fi
|
|
}
|
|
save_container_log() {
|
|
echo "Saving container $1 logs to $LOGS/$1.log ..."
|
|
docker logs $1 &> $LOGS/$1.log
|
|
}
|
|
profiles_with_local_or_docker() {
|
|
if [[ "$PROFILES" != *"local"* && "$PROFILES" != *"docker"* ]]; then
|
|
echo "$PROFILES docker"
|
|
else
|
|
echo "$PROFILES"
|
|
fi
|
|
}
|
|
other_profiles_with_local_or_docker() {
|
|
if [[ "$PROFILES_FOR_OTHER" != *"local"* && "$PROFILES_FOR_OTHER" != *"docker"* ]]; then
|
|
echo "$PROFILES_FOR_OTHER docker"
|
|
else
|
|
echo "$PROFILES_FOR_OTHER"
|
|
fi
|
|
}
|
|
generate_env_file() {
|
|
begin "Generating env file from profiles: [${PROFILES}] ..."
|
|
mkdir -p $CONF_DIR
|
|
${BIN_DIR}/gen-env-file "${PROFILES}" $TEST_CONFIG_DIR ${ENV_FILE}.tmp
|
|
grep -v '^#' ${ENV_FILE}.tmp > $ENV_FILE
|
|
source $ENV_FILE
|
|
end "Finished generating env file."
|
|
}
|
|
generate_other_env_file() {
|
|
begin "Generating other env file from profiles: [${PROFILES_FOR_OTHER}] "
|
|
mkdir -p $CONF_DIR
|
|
${BIN_DIR}/gen-env-file "${PROFILES_FOR_OTHER}" $TEST_CONFIG_DIR ${OTHER_ENV_FILE}.tmp
|
|
grep -v '^#' ${OTHER_ENV_FILE}.tmp > $OTHER_ENV_FILE
|
|
end "Finished generating other env file."
|
|
}
|
|
generate-ca-server-client-kpi() {
|
|
NAME=$1
|
|
FOLDER=$2
|
|
if [[ ! -f "${FOLDER}/server_${NAME}_key.pem" ]]; then
|
|
do_generate-ca-server-client-kpi $1 $2
|
|
fi
|
|
}
|
|
do_generate-ca-server-client-kpi() {
|
|
NAME=$1
|
|
FOLDER=$2
|
|
ROOT=$SELENIUM_ROOT_FOLDER
|
|
|
|
begin "Generate certs for $NAME"
|
|
|
|
if [ ! -d "$ROOT/tls-gen" ]; then
|
|
git clone https://github.com/michaelklishin/tls-gen $ROOT/tls-gen
|
|
fi
|
|
|
|
print "Generating CA and Server (localhost and $NAME) PKI under $FOLDER ..."
|
|
mkdir -p $FOLDER
|
|
|
|
CUR_DIR=$(pwd)
|
|
cd $ROOT/tls-gen/basic
|
|
cp openssl.cnf openssl.cnf.bak
|
|
if [ -f "$FOLDER/openssl.cnf.in" ]; then
|
|
cp $FOLDER/openssl.cnf.in >> openssl.cnf
|
|
fi
|
|
if [[ ! -z "${DEBUG}" ]]; then
|
|
print "Used this openssl.conf"
|
|
cat openssl.cnf
|
|
fi
|
|
make CN=$NAME CLIENT_ALT_NAME=internaluser
|
|
cp openssl.cnf.bak openssl.cnf
|
|
cd $CUR_DIR
|
|
|
|
cp $ROOT/tls-gen/basic/result/ca_certificate.pem $FOLDER/ca_${NAME}_certificate.pem
|
|
cp $ROOT/tls-gen/basic/result/server_${NAME}_certificate.pem $FOLDER
|
|
cp $ROOT/tls-gen/basic/result/server_${NAME}_key.pem $FOLDER
|
|
cp $ROOT/tls-gen/basic/result/server_${NAME}.p12 $FOLDER
|
|
cp $ROOT/tls-gen/basic/result/client_${NAME}_certificate.pem $FOLDER
|
|
cp $ROOT/tls-gen/basic/result/client_${NAME}_key.pem $FOLDER
|
|
cp $ROOT/tls-gen/basic/result/client_${NAME}.p12 $FOLDER
|
|
chmod ugo+r $FOLDER/*.pem
|
|
end "SSL Certificates generated for $NAME under $FOLDER"
|
|
}
|
|
generate-truststore-if-required() {
|
|
NAME=$1
|
|
FOLDER=$2
|
|
if [[ ! -f "${FOLDER}/truststore.jks" ]]; then
|
|
keytool -import \
|
|
-trustcacerts \
|
|
-file ${FOLDER}/ca_${NAME}_certificate.pem \
|
|
-keystore ${FOLDER}/truststore.jks \
|
|
-storepass foobar \
|
|
-noprompt
|
|
fi
|
|
}
|
|
generate-server-keystore-if-required() {
|
|
NAME=$1
|
|
FOLDER=$2
|
|
if [ ! -f "${FOLDER}/server_${NAME}.jks" ]; then
|
|
keytool -importkeystore \
|
|
-destkeystore ${FOLDER}/server_${NAME}.jks \
|
|
-srckeystore ${FOLDER}/server_${NAME}.p12 \
|
|
-deststoretype pkcs12 \
|
|
-srcstoretype pkcs12 \
|
|
-alias 1 \
|
|
-destalias server-${NAME}-tls \
|
|
-deststorepass foobar \
|
|
-destkeypass foobar \
|
|
-srcstorepass "" \
|
|
-srckeypass "" \
|
|
-noprompt
|
|
fi
|
|
}
|
|
generate-client-keystore-if-required() {
|
|
NAME=$1
|
|
FOLDER=$2
|
|
if [ ! -f "${FOLDER}/client_${NAME}.jks" ]; then
|
|
keytool -importkeystore \
|
|
-destkeystore ${FOLDER}/client_${NAME}.jks \
|
|
-srckeystore ${FOLDER}/client_${NAME}.p12 \
|
|
-deststoretype pkcs12 \
|
|
-srcstoretype pkcs12 \
|
|
-alias 1 \
|
|
-destalias client-${NAME}-tls \
|
|
-deststorepass foobar \
|
|
-destkeypass foobar \
|
|
-srcstorepass "" \
|
|
-srckeypass "" \
|
|
-noprompt
|
|
fi
|
|
}
|
|
|
|
run() {
|
|
runWith rabbitmq
|
|
}
|
|
runWith() {
|
|
if [[ "$COMMAND" == "run" ]]
|
|
then
|
|
run_on_docker_with $@
|
|
else
|
|
run_local_with $@
|
|
fi
|
|
}
|
|
initOnly() {
|
|
if [[ "$COMMAND" == "initOnly" ]]
|
|
then
|
|
init_only $@
|
|
fi
|
|
}
|
|
|
|
run_local_with() {
|
|
export PROFILES="local ${PROFILES}"
|
|
determine_required_components_excluding_rabbitmq $@
|
|
init_suite
|
|
ensure_docker_network
|
|
generate_env_file
|
|
build_mocha_image
|
|
|
|
if [[ "$PROFILES_FOR_OTHER" != "" ]]
|
|
then
|
|
export PROFILES_FOR_OTHER="local ${PROFILES_FOR_OTHER}"
|
|
generate_other_env_file
|
|
fi
|
|
|
|
if [[ "$COMMAND" == "start-rabbitmq" ]]
|
|
then
|
|
start_local_rabbitmq
|
|
elif [[ "$COMMAND" == "stop-rabbitmq" ]]
|
|
then
|
|
stop_local_rabbitmq
|
|
elif [[ "$COMMAND" == "start-other-rabbitmq" ]]
|
|
then
|
|
start_local_other_rabbitmq
|
|
elif [[ "$COMMAND" == "start-others" ]]
|
|
then
|
|
start_local_others
|
|
elif [[ "$COMMAND" == "ensure-others" ]]
|
|
then
|
|
ensure_local_others
|
|
elif [[ "$COMMAND" == "stop-others" ]]
|
|
then
|
|
teardown_local_others
|
|
elif [[ "$COMMAND" == "stop-rabbitmq" ]]
|
|
then
|
|
stop_local_rabbitmq
|
|
elif [[ "$COMMAND" =~ test[[:space:]]*([^[:space:]]*) ]]
|
|
then
|
|
test_local ${BASH_REMATCH[1]}
|
|
fi
|
|
}
|
|
determine_required_components_including_rabbitmq() {
|
|
for (( i=1; i<=$#; i++)) {
|
|
eval val='$'$i
|
|
REQUIRED_COMPONENTS+=( "$val" )
|
|
}
|
|
if [[ "$@" != *"rabbitmq"* ]]; then
|
|
REQUIRED_COMPONENTS+=("rabbitmq")
|
|
fi
|
|
}
|
|
determine_required_components_excluding_rabbitmq() {
|
|
for (( i=1; i<=$#; i++)) {
|
|
eval val='$'$i
|
|
if [[ "$val" != "rabbitmq" ]] && [[ "$val" != "other_rabbitmq" ]]; then
|
|
REQUIRED_COMPONENTS+=( "$val" )
|
|
fi
|
|
}
|
|
}
|
|
initOnly() {
|
|
for (( i=1; i<=$#; i++)) {
|
|
eval val='$'$i
|
|
if [[ $val != "rabbitmq" ]]; then
|
|
init="init_$val"
|
|
$init
|
|
fi
|
|
}
|
|
}
|
|
run_on_docker_with() {
|
|
determine_required_components_including_rabbitmq $@
|
|
export PROFILES=`profiles_with_local_or_docker`
|
|
init_suite
|
|
ensure_docker_network
|
|
generate_env_file
|
|
build_mocha_image
|
|
start_selenium
|
|
|
|
if [[ "$PROFILES_FOR_OTHER" != "" ]]
|
|
then
|
|
export PROFILES_FOR_OTHER=`other_profiles_with_local_or_docker`
|
|
generate_other_env_file
|
|
fi
|
|
|
|
trap "teardown_components" EXIT
|
|
|
|
start_components
|
|
test
|
|
TEST_RESULT=$?
|
|
save_logs
|
|
save_components_logs
|
|
|
|
kill_container_if_exist selenium
|
|
|
|
exit $TEST_RESULT
|
|
}
|
|
start_local_others() {
|
|
if [[ $REQUIRED_COMPONENTS == "" ]]; then
|
|
print "There are no other components"
|
|
else
|
|
start_components
|
|
fi
|
|
}
|
|
ensure_local_others() {
|
|
if [[ $REQUIRED_COMPONENTS == "" ]]; then
|
|
print "There are no other components"
|
|
else
|
|
ensure_components
|
|
fi
|
|
}
|
|
teardown_local_others() {
|
|
if [[ $REQUIRED_COMPONENTS == "" ]]; then
|
|
print "There are no other components"
|
|
else
|
|
teardown_components true
|
|
fi
|
|
}
|
|
test_local() {
|
|
begin "Running local test ${1:-}"
|
|
|
|
RABBITMQ_HOST=${RABBITMQ_HOST:-rabbitmq:15672}
|
|
OTHER_RABBITMQ_HOST=${OTHER_RABBITMQ_HOST:-none}
|
|
PUBLIC_RABBITMQ_HOST=${PUBLIC_RABBITMQ_HOST:-$RABBITMQ_HOST}
|
|
OTHER_PUBLIC_RABBITMQ_HOST=${OTHER_PUBLIC_RABBITMQ_HOST:-$OTHER_RABBITMQ_HOST}
|
|
|
|
export RABBITMQ_URL=$(calculate_rabbitmq_url $PUBLIC_RABBITMQ_HOST)
|
|
export OTHER_RABBITMQ_URL=$(calculate_rabbitmq_url $OTHER_PUBLIC_RABBITMQ_HOST)
|
|
export RABBITMQ_HOSTNAME=${RABBITMQ_HOSTNAME:-rabbitmq}
|
|
export RABBITMQ_AMQP_USERNAME=${RABBITMQ_AMQP_USERNAME}
|
|
export RABBITMQ_AMQP_PASSWORD=${RABBITMQ_AMQP_PASSWORD}
|
|
export SELENIUM_TIMEOUT=${SELENIUM_TIMEOUT:-20000}
|
|
export SELENIUM_POLLING=${SELENIUM_POLLING:-500}
|
|
|
|
generate_node_extra_ca_cert
|
|
MOUNT_NODE_EXTRA_CA_CERTS=${CONF_DIR}/node/node_ca_certs.pem
|
|
|
|
print "> SELENIUM_TIMEOUT: ${SELENIUM_TIMEOUT}"
|
|
print "> SELENIUM_POLLING: ${SELENIUM_POLLING}"
|
|
print "> RABBITMQ_HOST: ${RABBITMQ_HOST}"
|
|
print "> RABBITMQ_HOSTNAME: ${RABBITMQ_HOSTNAME}"
|
|
print "> PUBLIC_RABBITMQ_HOST: ${PUBLIC_RABBITMQ_HOST}"
|
|
print "> RABBITMQ_PATH: ${RABBITMQ_PATH}"
|
|
print "> RABBITMQ_URL: ${RABBITMQ_URL}"
|
|
print "> UAA_URL: ${UAA_URL}"
|
|
print "> FAKE_PORTAL_URL: ${FAKE_PORTAL_URL}"
|
|
print "> MOUNT_NODE_EXTRA_CA_CERTS: ${MOUNT_NODE_EXTRA_CA_CERTS}"
|
|
|
|
export RUN_LOCAL=true
|
|
export SCREENSHOTS_DIR=${SCREENS}
|
|
|
|
export PROFILES
|
|
export ENV_FILE
|
|
export NODE_EXTRA_CA_CERTS=$MOUNT_NODE_EXTRA_CA_CERTS
|
|
npm test $TEST_CASES_DIR/$1
|
|
|
|
}
|
|
ensure_components() {
|
|
for i in "${REQUIRED_COMPONENTS[@]}"
|
|
do
|
|
start="ensure_$i"
|
|
$start
|
|
done
|
|
}
|
|
start_components() {
|
|
for i in "${REQUIRED_COMPONENTS[@]}"
|
|
do
|
|
start="start_$i"
|
|
$start
|
|
done
|
|
}
|
|
teardown_components() {
|
|
skip_rabbitmq=${1:-false}
|
|
|
|
begin "Tear down ... "
|
|
for i in "${REQUIRED_COMPONENTS[@]}"
|
|
do
|
|
if [[ $i != "rabbitmq" || ($i == "rabbitmq" && $skip_rabbitmq == false) ]]
|
|
then
|
|
local component="$i"
|
|
stop="stop_$i"
|
|
type "$stop" &>/dev/null && $stop || kill_container_if_exist "$component"
|
|
print "Tear down $component"
|
|
fi
|
|
done
|
|
end "Finished teardown"
|
|
}
|
|
save_components_logs() {
|
|
begin "Saving Logs to $LOGS for ${REQUIRED_COMPONENTS[@]} ..."
|
|
for i in "${REQUIRED_COMPONENTS[@]}"
|
|
do
|
|
local component="$i"
|
|
save="save_logs_$i"
|
|
type "$save" &>/dev/null && $save || save_container_logs "$component"
|
|
print "Saving logs for component $component"
|
|
done
|
|
end "Finished saving logs"
|
|
}
|
|
generate_node_extra_ca_cert() {
|
|
begin "Generating ${CONF_DIR}/node/node_ca_certs.pem ..."
|
|
mkdir -p ${CONF_DIR}/node
|
|
rm -f ${CONF_DIR}/node/node_ca_certs.pem
|
|
env | while IFS= read -r line; do
|
|
value=${line#*=}
|
|
name=${line%%=*}
|
|
|
|
if [[ $name == *NODE_EXTRA_CA_CERTS ]]
|
|
then
|
|
print "Adding ${TEST_DIR}/${value} to ${CONF_DIR}/node/node_ca_certs.pem ..."
|
|
cat ${TEST_DIR}/${value} >> ${CONF_DIR}/node/node_ca_certs.pem
|
|
fi
|
|
done
|
|
if [[ -f ${CONF_DIR}/node/node_ca_certs.pem ]]; then
|
|
end "Generated ${CONF_DIR}/node/node_ca_certs.pem"
|
|
else
|
|
end "Did not generate ${CONF_DIR}/node/node_ca_certs.pem"
|
|
fi
|
|
} |