From 15aad88404da3a6dfcabcfc04a9c41bec89e3cc9 Mon Sep 17 00:00:00 2001 From: Alex Thiessen Date: Tue, 2 Jan 2018 17:40:55 +0000 Subject: [PATCH] util/gitconfig: Add timeout test Add a `util/gitconfig/test` subdirectory which will contain tests to run as executable files, add a helper script. Add a timeout test that verifies that gitconfig completes in under two seconds (typical run time is ~30 ms). Add gitconfig tests to the `testing` Makefile under the `test-tools` target. Change-Id: Id46f905b9f782e67be97a65d10045c3345dc996b Signed-off-by: Alex Thiessen Reviewed-on: https://review.coreboot.org/23280 Reviewed-by: Stefan Reinauer Tested-by: build bot (Jenkins) --- util/gitconfig/test/helpers.sh | 71 ++++++++++++++++++++++++++++++++++ util/gitconfig/test/timeout.sh | 69 +++++++++++++++++++++++++++++++++ util/testing/Makefile.inc | 6 +++ 3 files changed, 146 insertions(+) create mode 100644 util/gitconfig/test/helpers.sh create mode 100755 util/gitconfig/test/timeout.sh diff --git a/util/gitconfig/test/helpers.sh b/util/gitconfig/test/helpers.sh new file mode 100644 index 0000000000..0d4b3c8e21 --- /dev/null +++ b/util/gitconfig/test/helpers.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +## +## This file is part of the coreboot project. +## +## Copyright (C) 2003-2018 Alex Thiessen +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; version 3 or later of the License. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## SPDX-License-Identifier: GPL-3.0-or-later +## +## + +set -o errexit +set -o nounset + +# dependency check +dependencies=(cut git readlink) +for dependency in "${dependencies[@]}"; do + if ! command -v "${dependency}" 1>/dev/null; then + echo "missing ${dependency}, test skipped" >&2 + exit 0 + fi +done + +# helper functions +function clone_submodules() { + clone_dir="${1}" + log_dir="${2}" + + modules_dir="$(readlink --canonicalize-missing \ + "$(git rev-parse --git-dir)/modules")" + cd "${clone_dir}" + git submodule init 1>>"${log_dir}/clone.log" 2>&1 + for submodule in $(git config --get-regexp "submodule\..*\.url" \ + | cut --delimiter=. --fields=2); do + git config "submodule.${submodule}.url" \ + "${modules_dir}/${submodule}" + done + git submodule update 1>>"${log_dir}/clone.log" 2>&1 +} + +function check_exit_code() { + declare -i err=${?} + + # either "positive" or "negative" + polarity="${1}" + log_file="${2}" + + # exit code 124 is special as per `timeout` manpage + if [ "${polarity}" == "positive" ] && [ ${err} -eq 124 ]; then + echo >&2 "timed out" + fi + + if [ "${polarity}" == "positive" ] && [ ${err} -ne 0 ]; then + echo "bad exit code: expected 0, actually ${err}" + echo "for details, refer to log file \"${log_file}\"" + exit ${err} + elif [ "${polarity}" == "negative" ] && [ ${err} -eq 0 ]; then + echo "bad exit code: expected non-zero, actually 0" + echo "for details, refer to log file \"${log_file}\"" + exit 1 + fi +} diff --git a/util/gitconfig/test/timeout.sh b/util/gitconfig/test/timeout.sh new file mode 100755 index 0000000000..5e2164f811 --- /dev/null +++ b/util/gitconfig/test/timeout.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +## +## This file is part of the coreboot project. +## +## Copyright (C) 2003-2018 Alex Thiessen +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; version 3 or later of the License. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## SPDX-License-Identifier: GPL-3.0-or-later +## +## + +set -o errexit +set -o nounset + +# static analysis +if command -v shellcheck 1>/dev/null; then + shellcheck --exclude=1090,1091 \ + "${BASH_SOURCE[0]}" \ + "$(dirname "${BASH_SOURCE[0]}")/helpers.sh" +else + echo "shellcheck not found, running unchecked" >&2 +fi + +# dependency check +dependencies=(dirname git make mktemp rm timeout) +for dependency in "${dependencies[@]}"; do + if ! command -v "${dependency}" 1>/dev/null; then + echo "missing ${dependency}, test skipped" >&2 + exit 0 + fi +done + +source "$(dirname "${BASH_SOURCE[0]}")/helpers.sh" + +# setup +base_dir="$(mktemp --directory --tmpdir \ + "test-$(basename "${BASH_SOURCE[0]}" .sh)-XXXXXXXX")" +clone_dir="${base_dir}/coreboot" +git clone "$(git rev-parse --show-toplevel)" "${clone_dir}" \ + 1>"${base_dir}/clone.log" 2>&1 + +( + set -o errexit + set -o nounset + + clone_submodules "${clone_dir}" "${base_dir}" + + # mock + git config user.name "John Doe" + git config user.email "john.doe@example.com" + + # test + log_file="${base_dir}/gitconfig.log" + timeout 2s make gitconfig \ + 1>"${log_file}" 2>&1 \ + || check_exit_code positive "${log_file}" +) + +# teardown +rm --force --recursive "${base_dir}" diff --git a/util/testing/Makefile.inc b/util/testing/Makefile.inc index 595e8e3bc3..dddb76590f 100644 --- a/util/testing/Makefile.inc +++ b/util/testing/Makefile.inc @@ -123,6 +123,12 @@ test-tools: $(MAKE) -C util/romcc all test -j $(CPUS) V=$(V) Q=$(Q) echo "Testing broadcom/secimage" $(MAKE) -C util/broadcom/secimage test + @echo "Running gitconfig tests" + @for test in $$(find util/gitconfig/test -maxdepth 1 \ + -type f -executable); do \ + echo "$${test}"; \ + "$${test}" || exit $${?}; \ + done test-cleanup: rm -rf coreboot-builds coreboot-builds-chromeos