From f7c28ccecd8e5db75fdf8eefe107ff6adaa385d4 Mon Sep 17 00:00:00 2001 From: Lucas Jenss Date: Tue, 24 Nov 2015 06:02:39 +0100 Subject: [PATCH] Improve execution of static-tests Allow execution of static tests with the `make static-tests` command and improve its output for the human reader --- Makefile | 2 + Makefile.tests | 3 + dist/tools/static-tests.sh | 45 +++++++++++++ dist/tools/travis-scripts/build_and_test.sh | 75 ++++++++++++++++----- 4 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 Makefile.tests create mode 100755 dist/tools/static-tests.sh diff --git a/Makefile b/Makefile index c2510fb18a..890f740ac5 100644 --- a/Makefile +++ b/Makefile @@ -36,3 +36,5 @@ welcome: @echo " https://github.com/RIOT-OS/RIOT/wiki/Quick-Start-Guide" @echo "Or ask questions on our mailing list:" @echo " users@riot-os.org (http://lists.riot-os.org/mailman/listinfo/users)" + +-include Makefile.tests diff --git a/Makefile.tests b/Makefile.tests new file mode 100644 index 0000000000..fd5e492ce6 --- /dev/null +++ b/Makefile.tests @@ -0,0 +1,3 @@ + +static-test: + ./dist/tools/static-tests.sh diff --git a/dist/tools/static-tests.sh b/dist/tools/static-tests.sh new file mode 100755 index 0000000000..d04c197637 --- /dev/null +++ b/dist/tools/static-tests.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright (C) 2015 Lucas Jenß +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. +# + +# Change to RIOT root +cd "$(dirname "$0")/../../" + +function dep { + which $1 2>&1 1>/dev/null + if (( $? != 0 )); then + echo "Dependency not met: $1" + exit 1 + fi +} + +function abort { + echo "$(tput setaf 1)$1$(tput sgr0)" + exit 1 +} + +function request_confirmation { + read -p "$(tput setaf 4)$1 (y/n) $(tput sgr0)" + [ "$REPLY" == "y" ] || abort "Aborted!" +} + +# Make sure all required commands are available +dep cppcheck +dep pcregrep + +RIOT_REMOTE_COUNT="$(git remote | grep "^riot$" | wc -l)" +if (( "$RIOT_REMOTE_COUNT" != 1 )); then + echo "The static test setup expect a remote called 'riot', pointing to the" + echo "central repository. This remote currently does not exist." + request_confirmation "Do you wish to create it?" + + git remote add riot https://github.com/RIOT-OS/RIOT.git + git fetch riot +fi + +BUILDTEST_MCU_GROUP=static-tests ./dist/tools/travis-scripts/build_and_test.sh diff --git a/dist/tools/travis-scripts/build_and_test.sh b/dist/tools/travis-scripts/build_and_test.sh index 49fac0312b..d786175662 100755 --- a/dist/tools/travis-scripts/build_and_test.sh +++ b/dist/tools/travis-scripts/build_and_test.sh @@ -9,6 +9,45 @@ CI_BASE_BRANCH=${CI_BASE_BRANCH:-master} +function print_result { + local RED="\033[0;31m" + local GREEN="\033[0;32m" + local NO_COLOUR="\033[0m" + + if (( "$1" == 0 )); then + echo -e "${GREEN}✓$NO_COLOUR" + else + echo -e "${RED}x$NO_COLOUR" + fi +} + +RESULT=0 +set_result() { + NEW_RESULT=$1 + + if (( $NEW_RESULT != 0)) + then + RESULT=$NEW_RESULT + fi +} + +function run { + echo -n "Running '$@' " + OUT=$($@ 2>&1) + NEW_RESULT=$? + + print_result $NEW_RESULT + set_result $NEW_RESULT + + # Indent command output so that its easily discernable from the rest + OUT_LENGTH="$(echo -n $OUT | wc -c)" + if (( "$OUT_LENGTH" > 0 )); then + echo -e "Command output:\n" + (echo $OUT | while read -r line; do echo -ne "\t"; echo $line; done) + echo "" + fi +} + if [[ $BUILDTEST_MCU_GROUP ]] then @@ -43,31 +82,30 @@ then trap "RESULT=1" ERR - git rebase ${CI_BASE_BRANCH} || git rebase --abort + git rebase ${CI_BASE_BRANCH} + if (( $? != 0 )); then + git rebase --abort > /dev/null 2>&1 + echo "Rebase failed, aborting..." + exit 1 + fi + if [ $RESULT -ne 0 ]; then exit $RESULT fi - ./dist/tools/whitespacecheck/check.sh ${CI_BASE_BRANCH} - - ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0 - - ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=AC - - ./dist/tools/doccheck/check.sh ${CI_BASE_BRANCH} - - ./dist/tools/externc/check.sh ${CI_BASE_BRANCH} + run ./dist/tools/whitespacecheck/check.sh ${CI_BASE_BRANCH} + run ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0 + run ./dist/tools/licenses/check.sh ${CI_BASE_BRANCH} --diff-filter=AC + run ./dist/tools/doccheck/check.sh ${CI_BASE_BRANCH} + run ./dist/tools/externc/check.sh ${CI_BASE_BRANCH} # TODO: # Remove all but `${CI_BASE_BRANCH}` parameters to cppcheck (and remove second # invocation) once all warnings of cppcheck have been taken care of # in ${CI_BASE_BRANCH}. - ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0 - - ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=AC - - ./dist/tools/pr_check/pr_check.sh ${CI_BASE_BRANCH} - + run ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=MR --error-exitcode=0 + run ./dist/tools/cppcheck/check.sh ${CI_BASE_BRANCH} --diff-filter=AC + run ./dist/tools/pr_check/pr_check.sh ${CI_BASE_BRANCH} exit $RESULT fi @@ -79,11 +117,16 @@ then if [ "$BUILDTEST_MCU_GROUP" == "x86" ] then make -C ./tests/unittests all-debug test BOARD=native TERMPROG='gdb -batch -ex r -ex bt $(ELF)' || exit + set_result $? # TODO: # Reenable once https://github.com/RIOT-OS/RIOT/issues/2300 is # resolved: # - make -C ./tests/unittests all test BOARD=qemu-i386 || exit fi + BASE_BRANCH="${TRAVIS_BRANCH:-${CI_BASE_BRANCH}}" ./dist/tools/compile_test/compile_test.py $BASE_BRANCH + set_result $? fi + +exit $RESULT