Files
snapd/run-checks
Sergio Cazzolato fb2d143976 tests: allow to re-execute aborted tests (#11811)
* Squashed 'tests/lib/external/snapd-testing-tools/' changes from 53ca1b3b70..1c9dff58ff

1c9dff58ff Merge pull request #23 from snapcore/improve-log-parser
cc7ee488d1 Fix shellcheck
324b99e719 revert change in log-analyzer test
f746f40ebe Fix shellcheck
2d7dbbe1bd Fix spelling
728dd64c2c Last set of changes for log analizer tools
bf389dcd01 New fixes for log parses
3b56339b88 Merge pull request #22 from snapcore/tests-fix-spread-shellcheck
488408d792 fix shellcheck test
b9340d265c Fix spread-shellcheck and update the test with new scenario

git-subtree-dir: tests/lib/external/snapd-testing-tools
git-subtree-split: 1c9dff58ff43d120d8ca5cc19b305a5c99ea2698

* Get the list of tasks to re-execute from the log-analyzer tool

* Simplify the logic to re-execute tasks

* printing the changed file to run shellcheck

* Squashed 'tests/lib/external/snapd-testing-tools/' changes from 1c9dff58ff..84dc8092b1

84dc8092b1 Merge pull request #24 from snapcore/improve-log-parser
515770b3bf Add support for fedora-35
875c29b5ce Updated results with latest log-parser changes
d27f2bcdb7 Fix log-parser
b2cce1fcce fix wording
14d15e4fe4 Fixes for log-parser and changes for log analyzer
438d92d241 Log analyzer updated to support reexecute in all the scenarios

git-subtree-dir: tests/lib/external/snapd-testing-tools
git-subtree-split: 84dc8092b13c63c02ade50198bfddf6f520e8ab4

* filter the tests for list-reexecute-tasks

* fix reexecution expression for nested

* Fix workflow for nested tests

* Squashed 'tests/lib/external/snapd-testing-tools/' changes from 84dc8092b1..2540135b90

2540135b90 Merge pull request #25 from snapcore/add-indent-to-log-parser
2536b0f070 Minor improvements in log-parser and log-analyzer based con review comments

git-subtree-dir: tests/lib/external/snapd-testing-tools
git-subtree-split: 2540135b9022dc2782f44827a091818f271f4a91

* Squashed 'tests/lib/external/snapd-testing-tools/' changes from 2540135b90..b4654950d4

b4654950d4 Merge pull request #26 from snapcore/support-csv-for-expressions
3250bbd885 Support expressions with comma separation

git-subtree-dir: tests/lib/external/snapd-testing-tools
git-subtree-split: b4654950d49e465d4c978e6ce1cd9eac898e063a

* Fix the scenario of re-re-execute

* Squashed 'tests/lib/external/snapd-testing-tools/' changes from b4654950d4..7fe27d4aea

7fe27d4aea Improve log analyzer utility
207536268e Merge pull request #19 from snapcore/new-spread-manager
2f2ff2e282 Update spread manager to support csv
33a44ca3be Merge branch 'main' into new-spread-manager
6b2b56afc3 Fix another shellcheck
56163e170b Fix shellcheck
d96ab8094f Merge branch 'main' into new-spread-manager
60fb99f02f new dir task5
259a7e188c Fix spread test
e674234454 New spread-manager tool

git-subtree-dir: tests/lib/external/snapd-testing-tools
git-subtree-split: 7fe27d4aea8302aeb29f44517808f690633eb547

* Fix manual nested tests for ubuntu xenial
2022-06-02 22:39:06 -03:00

391 lines
13 KiB
Bash
Executable File

#!/bin/bash -eu
export LANG=C.UTF-8
export LANGUAGE=en
if command -v goctest >/dev/null; then
goctest="goctest"
else
goctest="go test"
fi
COVERMODE=${COVERMODE:-atomic}
COVERAGE_SUFFIX=${GO_BUILD_TAGS:-notags}
COVERAGE_OUT=${COVERAGE_OUT:-.coverage/coverage-$COVERAGE_SUFFIX.cov}
CHANGED_FILES=${CHANGED_FILES:-""}
if [ -z "${GITHUB_WORKFLOW:-}" ]; then
# when *not* running inside github, ensure we use go-1.13 by default
export PATH=/usr/lib/go-1.13/bin:"${PATH}"
fi
# add workaround for https://github.com/golang/go/issues/24449
if [ "$(uname -m)" = "s390x" ]; then
if go version | grep -q go1.10; then
echo "covermode 'atomic' crashes on s390x with go1.10, reseting "
echo "to 'set'. see https://github.com/golang/go/issues/24449"
COVERMODE="set"
fi
fi
export GOPATH="${GOPATH:-$(realpath "$(dirname "$0")"/../../../../)}"
export PATH="$PATH:${GOPATH%%:*}/bin"
short=
STATIC=
UNIT=
case "${1:-all}" in
all)
STATIC=1
UNIT=1
;;
--static)
STATIC=1
;;
--unit)
UNIT=1
;;
--short-unit)
UNIT=1
short=1
;;
*)
echo "Wrong flag ${1}. To run a single suite use --static, --unit."
exit 1
esac
CURRENTTRAP="true"
EXIT_CODE=99
store_exit_code() {
EXIT_CODE=$?
}
exit_with_exit_code() {
exit $EXIT_CODE
}
addtrap() {
CURRENTTRAP="$CURRENTTRAP ; $1"
# shellcheck disable=SC2064
trap "store_exit_code; $CURRENTTRAP ; exit_with_exit_code" EXIT
}
goinstall() {
pkg="$1"
# go1.18+ will no longer build/install packages. Here "go install"
# must be used but it will only fetch remote packages if the @latest
# (or similar syntax is used). Instead of checking the version we
# check if the "go install" help mentions this new feature.
if go help install | grep -q @latest; then
go install "${pkg}"@latest
else
go get -u "${pkg}"
fi
}
endmsg() {
if [ $EXIT_CODE -eq 0 ]; then
p="success.txt"
m="All good, what could possibly go wrong."
else
p="failure.txt"
m="Crushing failure and despair."
fi
echo
if [ -t 1 ] && [ -z "$STATIC" ]; then
cat "data/$p"
else
echo "$m"
fi
}
addtrap endmsg
missing_interface_spread_test() {
snap_yaml="tests/lib/snaps/test-snapd-policy-app-consumer/meta/snap.yaml"
core_snap_yaml="tests/main/interfaces-many-snap-provided/test-snapd-policy-app-provider-core/meta/snap.yaml"
classic_snap_yaml="tests/main/interfaces-many-snap-provided/test-snapd-policy-app-provider-classic/meta/snap.yaml"
for iface in $(go run ./tests/lib/list-interfaces.go) ; do
search="plugs: \\[ $iface \\]"
case "$iface" in
bool-file|gpio|pwm|dsp|netlink-driver|hidraw|i2c|iio|serial-port|spi)
# skip gadget provided interfaces for now
continue
;;
dbus|content)
search="interface: $iface"
;;
autopilot)
search='plugs: \[ autopilot-introspection \]'
;;
esac
if ! grep -q "$search" "$snap_yaml" ; then
echo "Missing high-level test for interface '$iface'. Please add to:"
echo "* $snap_yaml"
echo "* $core_snap_yaml (if needed)"
echo "* $classic_snap_yaml (if needed)"
exit 1
fi
done
}
if [ "$STATIC" = 1 ]; then
./get-deps.sh
# Run static tests.
echo Checking docs
./mdlint.py ./*.md docs/*.md
# XXX: remove once we can use an action, see workflows/test.yaml for
# details why we still use this script
if [ -n "${GITHUB_PULL_REQUEST:-}" ] && [ "${GITHUB_PULL_REQUEST:-}" != "false" ]; then
echo Checking pull request summary
./check-pr-title.py "$GITHUB_PULL_REQUEST"
fi
# check commit author/committer name for unicode
./check-commit-email.py
if [ -z "${SKIP_GOFMT:-}" ]; then
echo Checking formatting
fmt=""
for dir in $(go list -f '{{.Dir}}' ./... | grep -v '/\(c-\)\?vendor/' ); do
# skip vendor packages
s="$(${GOFMT:-gofmt} -s -d "$dir" || true)"
if [ -n "$s" ]; then
fmt="$s\\n$fmt"
fi
done
if [ -n "$fmt" ]; then
echo "Formatting wrong in following files:"
# shellcheck disable=SC2001
echo "$fmt" | sed -e 's/\\n/\n/g'
exit 1
fi
fi
# go vet
echo Running vet
go list ./... | grep -v '/vendor/' | xargs go vet
echo 'Checking for usages of http.Status*'
got=""
for dir in $(go list -f '{{.Dir}}' ./... | grep -v '/vendor/' ); do
s="$(grep -nP 'http\.Status(?!Text)' "$dir"/*.go || true)"
if [ -n "$s" ]; then
got="$s\\n$got"
fi
done
if [ -n "$got" ]; then
echo 'Usages of http.Status*, we prefer the numeric values directly:'
echo "$got"
exit 1
fi
echo "Checking for direct usages of math/rand"
got=""
for dir in $(go list -f '{{.Dir}}' ./... | grep -v '/vendor/' ); do
# shellcheck disable=SC2063
s="$(grep -nP --exclude '*_test.go' --exclude 'randutil/*.go' math/rand "$dir"/*.go || true)"
if [ -n "$s" ]; then
got="$s\\n$got"
fi
done
if [ -n "$got" ]; then
echo 'Direct usages of math/rand, we prefer randutil:'
echo "$got"
exit 1
fi
if command -v shellcheck >/dev/null; then
exclude_tools_path=tests/lib/external/snapd-testing-tools
echo "Checking shell scripts..."
if [ -n "$CHANGED_FILES" ]; then
echo "Checking just the changed bash files"
echo "Changed files: $CHANGED_FILES"
# shellcheck disable=SC2086
INITIAL_FILES="$( file -N $CHANGED_FILES | awk -F": " '$2~/shell.script/{print $1}' )"
else
echo "Checking all the bash files"
INITIAL_FILES="$( ( git ls-files -z 2>/dev/null || find . \( -name .git -o -name vendor -o -name c-vendor \) -prune -o -print0) | xargs -0 file -N | awk -F": " '$2~/shell.script/{print $1}' )"
fi
FILTERED_FILES="$( echo "$INITIAL_FILES" | grep -v "$exclude_tools_path" )"
if [ -n "$FILTERED_FILES" ]; then
echo "Running shellcheck for files: $FILTERED_FILES"
# shellcheck disable=SC2086
shellcheck -x $FILTERED_FILES
else
echo "Skipping shellcheck, no files to check"
fi
regexp='GOPATH(?!%%:\*)(?!:)[^= ]*/'
if grep -qPr --exclude HACKING.md --exclude 'Makefile.*' --exclude-dir .git --exclude-dir vendor "$regexp"; then
echo "Using GOPATH as if it were a single entry and not a list:"
grep -PHrn -C1 --color=auto --exclude HACKING.md --exclude 'Makefile.*' --exclude-dir .git --exclude-dir vendor "$regexp"
echo "Use GOHOME, or {GOPATH%%:*}, instead."
exit 1
fi
unset regexp
# also run spread-shellcheck
FILTERED_FILES="spread.yaml"
if [ -n "$CHANGED_FILES" ]; then
# shellcheck disable=SC2086
for changed_file in $CHANGED_FILES; do
if [[ $changed_file == */task.yaml ]]; then
FILTERED_FILES="$FILTERED_FILES $changed_file"
fi
done
else
FILTERED_FILES="$FILTERED_FILES tests"
fi
# XXX: exclude core20-preseed test as its environment block confuses shellcheck, and it's not possible to disable shellcheck there.
# shellcheck disable=SC2086
./tests/lib/external/snapd-testing-tools/utils/spread-shellcheck $FILTERED_FILES --exclude "$exclude_tools_path" --exclude "tests/nested/manual/core20-preseed"
fi
if [ -z "${SKIP_MISSPELL-}" ]; then
echo "Checking spelling errors"
if ! command -v misspell >/dev/null; then
goinstall github.com/client9/misspell/cmd/misspell
fi
# FIXME: auter is only misspelled in the changelog so we should fix there
# PROCES is used in the seccomp tests (PRIO_PROCES{,S,SS})
# exportfs is used in the nfs-support test
MISSPELL_IGNORE="auther,PROCES,PROCESSS,proces,processs,exportfs"
git ls-files -z -- . ':!:./po' ':!:./vendor' ':!:./c-vendor' ':!:./cmd/libsnap-confine-private/bpf/vendor' |
xargs -0 misspell -error -i "$MISSPELL_IGNORE"
fi
if [ -z "${SKIP_INEFFASSIGN-}" ]; then
if dpkg --compare-versions "$(go version | awk '$3 ~ /^go[0-9]/ {print substr($3, 3)}')" ge 1.12; then
echo "Checking for ineffective assignments"
if ! command -v ineffassign >/dev/null; then
goinstall github.com/gordonklaus/ineffassign
fi
# ineffassign knows about ignoring vendor/ \o/
ineffassign ./...
fi
fi
echo "Checking for naked returns"
if ! command -v nakedret >/dev/null; then
goinstall github.com/alexkohler/nakedret
fi
got=$(go list ./... | grep -v '/osutil/udev/' | grep -v '/vendor/' | xargs nakedret 2>&1)
if [ -n "$got" ]; then
echo "$got"
if [ -z "${SKIP_NAKEDRET:-}" ]; then
exit 1
else
echo "Ignoring nakedret errors as requested"
fi
fi
echo "Checking all interfaces have minimal spread test"
missing_interface_spread_test
echo "Checking for incorrect multiline strings in spread tests"
badmultiline=$(find tests -name 'task.yaml' -print0 -o -name 'spread.yaml' -print0 | \
xargs -0 grep -R -n -E '(restore*|prepare*|execute|debug):\s*$' || true)
if [ -n "$badmultiline" ]; then
echo "Incorrect multiline strings at the following locations:"
echo "$badmultiline"
exit 1
fi
echo "Checking for potentially incorrect use of MATCH -v"
badMATCH=$(find tests -name 'task.yaml' -print0 -o -name 'spread.yaml' -print0 | \
xargs -0 grep -R -n -E 'MATCH +-v' || true)
if [ -n "$badMATCH" ]; then
echo "Potentially incorrect use of MATCH -v at the following locations:"
echo "$badMATCH"
exit 1
fi
# FIXME: re-add staticcheck with a matching version for the used go-version
if [ -z "${SKIP_TESTS_FORMAT_CHECK-}" ] || [ "$SKIP_TESTS_FORMAT_CHECK" = 0 ]; then
echo "Checking tests formatting"
./tests/lib/external/snapd-testing-tools/utils/check-test-format ./tests
fi
echo "Checking for usages of !=, == or Equals with ErrNoState"
if got=$(grep -n -R -E "(\!=|==|Equals,) (state\.)?ErrNoState" --include=*.go) ; then
echo "Don't use equality checks with ErrNoState, use errors.Is() instead"
echo "$got"
exit 1
fi
fi
if [ "$UNIT" = 1 ]; then
./get-deps.sh
echo "Show go version"
command -v go
go version
tags=
if [ -n "${GO_BUILD_TAGS-}" ]; then
echo "Using build tags: $GO_BUILD_TAGS"
tags="-tags $GO_BUILD_TAGS"
fi
echo Building
# shellcheck disable=SC2086
go build -v $tags github.com/snapcore/snapd/...
# tests
echo Running tests from "$PWD"
if [ "$short" = 1 ]; then
# shellcheck disable=SC2046,SC2086
GOTRACEBACK=1 $goctest $tags -short -timeout 5m $(go list ./... | grep -v '/vendor/' )
else
coverage=""
if [ -z "${SKIP_COVERAGE-}" ]; then
coverage="-coverprofile=$COVERAGE_OUT -covermode=$COVERMODE"
# Prepare the coverage output profile.
mkdir -p "$(dirname "$COVERAGE_OUT")"
echo "mode: $COVERMODE" > "$COVERAGE_OUT"
else
echo "Skipping test coverage"
fi
# shellcheck disable=SC2046,SC2086
GOTRACEBACK=1 $goctest $tags -timeout 5m $coverage $(go list ./... | grep -v '/vendor/' )
fi
# python unit test for mountinfo.query and version-compare
command -v python2 && python2 ./tests/lib/tools/mountinfo.query --run-unit-tests
command -v python3 && python3 ./tests/lib/tools/mountinfo.query --run-unit-tests
command -v python2 && python2 ./tests/lib/tools/version-compare --run-unit-tests
command -v python3 && python3 ./tests/lib/tools/version-compare --run-unit-tests
fi
UNCLEAN="$(git status -s|grep '^??')" || true
SKIP_UNCLEAN=${SKIP_UNCLEAN=}
if [ -n "$UNCLEAN" ] && [ -z "$SKIP_UNCLEAN" ]; then
cat <<EOF
There are files left in the git tree after the tests:
$UNCLEAN
EOF
exit 1
fi
if [ -n "${SKIP_DIRTY_CHECK-}" ]; then
exit 0
fi
# XXX: re-enable after vendor/vendor.json is removed
# if git describe --always --dirty | grep -q dirty; then
# echo "Build tree is dirty"
# git diff
# exit 1
# fi