blob: 7bdfbdd1df472cdbddb752adf50e89b5b4772843 [file] [log] [blame]
#!/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.
# NOTE: allow unbound variable here
set +u
if [[ ! -z $CI_PYTEST_ADD_OPTIONS ]]; then
export PYTEST_ADDOPTS="-s -vv $CI_PYTEST_ADD_OPTIONS $PYTEST_ADDOPTS"
else
export PYTEST_ADDOPTS="-s -vv $PYTEST_ADDOPTS"
fi
set -ux
export TVM_PATH=`pwd`
export PYTHONPATH="${TVM_PATH}/python"
export TVM_PYTEST_RESULT_DIR="${TVM_PATH}/build/pytest-results"
mkdir -p "${TVM_PYTEST_RESULT_DIR}"
pytest_errors=()
# This ensures that all pytest invocations that are run through run_pytest will
# complete and errors will be reported once Bash is done executing all scripts.
function cleanup() {
set +x
if [ "${#pytest_errors[@]}" -gt 0 ]; then
echo "These pytest invocations failed, the results can be found in the Jenkins 'Tests' tab or by scrolling up through the raw logs here."
python3 ci/scripts/jenkins/pytest_wrapper.py "${pytest_errors[@]}"
exit 1
fi
set -x
}
trap cleanup 0
function run_pytest() {
set -e
local ffi_type="$1"
shift
local test_suite_name="$1"
shift
extra_args=( "$@" )
if [ -z "${ffi_type}" -o -z "${test_suite_name}" ]; then
echo "error: run_pytest called incorrectly: run_pytest ${ffi_type} ${test_suite_name}" "${extra_args[@]}"
echo "usage: run_pytest <FFI_TYPE> <TEST_SUITE_NAME> [pytest args...]"
exit 2
fi
# Allow unbound variable here.
set +u
if [[ -z "${TVM_SHARD_INDEX}" ]]; then
current_shard="no-shard"
else
current_shard="shard-${TVM_SHARD_INDEX}"
fi
set -u
has_reruns=$(python3 -m pytest --help 2>&1 | grep 'reruns=' || true)
if [ -n "$has_reruns" ]; then
if [[ ! "${extra_args[*]}" == *"--reruns"* ]]; then
extra_args+=('--reruns=3')
fi
fi
suite_name="${test_suite_name}-${current_shard}-${ffi_type}"
DEFAULT_PARALLELISM=1
if [[ ! "${extra_args[*]}" == *" -n"* ]] && [[ ! "${extra_args[*]}" == *" -dist"* ]]; then
extra_args+=("-n=$DEFAULT_PARALLELISM")
fi
exit_code=0
set +e
TVM_FFI=${ffi_type} python3 -m pytest \
-o "junit_suite_name=${suite_name}" \
"--junit-xml=${TVM_PYTEST_RESULT_DIR}/${suite_name}.xml" \
"--junit-prefix=${ffi_type}" \
"${extra_args[@]}" || exit_code=$?
# Pytest will return error code -5 if no test is collected.
if [ "$exit_code" -ne "0" ] && [ "$exit_code" -ne "5" ]; then
pytest_errors+=("${suite_name}: $@")
fi
# To avoid overwriting.
set -e
}