zephyr/scripts/ci/run_ci.sh
Alberto Escolar Piedras 917711fd8a ci: Run bsim_bt tests and collect coverage results
Compile and run the tests avaliable in bsim_bt
and collect the coverage results into the coverage report.

Also, detect if bsim's component folder already contains the
nRF52 HW models, and if it does instead of trying to fetch
them again (which will fail) check that the right versio is
present. This should ease testing locally.

Signed-off-by: Alberto Escolar Piedras <alpi@oticon.com>
2018-11-13 11:14:19 -05:00

166 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2017 Linaro Limited
#
# SPDX-License-Identifier: Apache-2.0
#
# Author: Anas Nashif
#
# This script is run in CI and support both pull request and commit modes. So
# it can be used also on commits to the tree or on tags.
# The following options are supports:
# -p start the script for pull requests
# -m matrix node number, for example 3 on a 5 node matrix
# -M total number of nodes in the matrix
# -b base branch
# -r the remote to rebase on
#
# The script can be run locally using for exmaple:
# ./scripts/ci/run_ci.sh -b master -r upstream -p
source zephyr-env.sh
SANITYCHECK_OPTIONS=" --inline-logs --enable-coverage -N"
SANITYCHECK_OPTIONS_RETRY="${SANITYCHECK_OPTIONS} --only-failed --outdir=out-2nd-pass"
SANITYCHECK_OPTIONS_RETRY_2="${SANITYCHECK_OPTIONS} --only-failed --outdir=out-3nd-pass"
SANITYCHECK="${ZEPHYR_BASE}/scripts/sanitycheck"
MATRIX_BUILDS=1
MATRIX=1
while getopts ":pm:b:r:M:" opt; do
case $opt in
p)
echo "Testing a Pull Request." >&2
PULL_REQUEST=1
;;
m)
echo "Running on Matrix $OPTARG" >&2
MATRIX=$OPTARG
;;
M)
echo "Running a matrix of $OPTARG slaves" >&2
MATRIX_BUILDS=$OPTARG
;;
b)
echo "Base Branch: $OPTARG" >&2
BRANCH=$OPTARG
;;
r)
echo "Remote: $OPTARG" >&2
REMOTE=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
DOC_MATRIX=${MATRIX_BUILDS}
if [ -z "$BRANCH" ]; then
echo "No base branch given"
exit
fi
if [ -n "$PULL_REQUEST" ]; then
git rebase $REMOTE/${BRANCH};
fi
if [ -n "$BRANCH" ]; then
COMMIT_RANGE=$REMOTE/${BRANCH}..HEAD
echo "Commit range:" ${COMMIT_RANGE}
else
exit
fi
function build_btsim() {
NRF_HW_MODELS_VERSION=`cat boards/posix/nrf52_bsim/hw_models_version`
pushd . ;
cd ${BSIM_COMPONENTS_PATH} ;
if [ -d ext_NRF52_hw_models ]; then
cd ext_NRF52_hw_models
git describe --tags --abbrev=0 ${NRF52_HW_MODELS_TAG}\
> /dev/null
if [ "$?" != "0" ]; then
echo "`pwd` seems to contain the nRF52 HW\
models but they are out of date"
exit 1;
fi
else
git clone -b ${NRF_HW_MODELS_VERSION} \
https://github.com/BabbleSim/ext_NRF52_hw_models.git
fi
cd ${BSIM_OUT_PATH}
make everything -j 8 -s
popd ;
}
function run_bsim_bt_tests() {
WORK_DIR=${ZEPHYR_BASE}/bsim_bt_out tests/bluetooth/bsim_bt/compile.sh
RESULTS_FILE=${ZEPHYR_BASE}/${BSIM_BT_TEST_RESULTS_FILE} \
SEARCH_PATH=tests/bluetooth/bsim_bt/bsim_test_app/tests_scripts \
tests/bluetooth/bsim_bt/run_parallel.sh
}
function build_docs() {
echo "- Building Documentation";
make htmldocs
if [ "$?" != "0" ]; then
echo "Documentation build failed";
exit 1;
fi
if [ -s doc/_build/doc.warnings ]; then
echo " => New documentation warnings/errors";
cp doc/_build/doc.warnings doc.warnings
fi
echo "- Verify commit message, coding style, doc build";
}
function get_tests_to_run() {
./scripts/ci/get_modified_tests.py --commits ${COMMIT_RANGE} > modified_tests.args;
./scripts/ci/get_modified_boards.py --commits ${COMMIT_RANGE} > modified_boards.args;
if [ -s modified_boards.args ]; then
${SANITYCHECK} ${SANITYCHECK_OPTIONS} +modified_boards.args --save-tests test_file.txt || exit 1;
fi
if [ -s modified_tests.args ]; then
${SANITYCHECK} ${SANITYCHECK_OPTIONS} +modified_tests.args --save-tests test_file.txt || exit 1;
fi
rm -f modified_tests.args modified_boards.args;
}
if [ ! -z "${BSIM_OUT_PATH}" ]; then
# Build BT Simulator
build_btsim
# Run BLE tests in simulator on the 1st CI instance:
if [ "$MATRIX" = "1" ]; then
run_bsim_bt_tests
fi
else
echo "Skipping BT simulator tests"
fi
# Build Docs on matrix 5 in a pull request
if [ "${MATRIX}" = "${DOC_MATRIX}" -a -n "${PULL_REQUEST}" ]; then
build_docs
./scripts/ci/check-compliance.py --commits ${COMMIT_RANGE} || true;
fi
# In a pull-request see if we have changed any tests or board definitions
if [ -n "${PULL_REQUEST}" ]; then
get_tests_to_run
fi
# Save list of tests to be run
${SANITYCHECK} ${SANITYCHECK_OPTIONS} --save-tests test_file.txt || exit 1
# Run a subset of tests based on matrix size
${SANITYCHECK} ${SANITYCHECK_OPTIONS} --load-tests test_file.txt --subset ${MATRIX}/${MATRIX_BUILDS}
if [ "$?" != 0 ]; then
# let the host settle down
sleep 10
${SANITYCHECK} ${SANITYCHECK_OPTIONS_RETRY} || \
( sleep 10; ${SANITYCHECK} ${SANITYCHECK_OPTIONS_RETRY}; )
fi
# cleanup
rm test_file.txt