mirror of
https://github.com/moby/moby.git
synced 2026-01-12 03:01:38 +00:00
Running sub-package tests from the root module without readding the replace rules wasn't running the tests from the local in-tree versions of these submodules. Fix by cd-ing into their directories before running tests. Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
148 lines
4.6 KiB
Bash
Executable File
148 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Run unit tests and create report
|
|
#
|
|
# TESTFLAGS - add additional test flags. Ex:
|
|
#
|
|
# TESTFLAGS='-v -run TestBuild' hack/test/unit
|
|
#
|
|
# TESTDIRS - run tests for specified packages. Ex:
|
|
#
|
|
# TESTDIRS='./pkg/term' hack/test/unit
|
|
#
|
|
set -eux -o pipefail
|
|
|
|
BUILDFLAGS=(-tags 'netgo journald')
|
|
TESTFLAGS+=" -test.timeout=${TIMEOUT:-5m}"
|
|
TESTDIRS="${TESTDIRS:-./...}"
|
|
|
|
: "${api_pkg_list:=}"
|
|
: "${client_pkg_list:=}"
|
|
|
|
mkdir -p bundles
|
|
|
|
case "$TESTDIRS" in
|
|
"./api"* | "./...")
|
|
api_pkg_list=$(go -C ./api list -mod=readonly "${TESTDIRS/#\.\/api/\.}")
|
|
;;
|
|
esac
|
|
if [ -n "${api_pkg_list}" ]; then
|
|
# These are tests for a separate module. Run tests for this module with
|
|
# '-mod=readonly' to prevent the "vendor/" directory being used, which
|
|
# does have a copy of these files, but does not contain test files.
|
|
#
|
|
# From the Go documentation https://golang.org/ref/mod:
|
|
#
|
|
# - `-mod=mod` tells the go command to ignore the vendor directory and to
|
|
# automatically update `go.mod`, for example, when an imported package
|
|
# is not provided by any known module.
|
|
# - `-mod=readonly` tells the go command to ignore the vendor directory
|
|
# and to report an error if `go.mod` needs to be updated.
|
|
(
|
|
cd api
|
|
gotestsum --format=standard-quiet --jsonfile=../bundles/api-go-test-report.json --junitfile=../bundles/api-junit-report.xml -- \
|
|
"${BUILDFLAGS[@]}" \
|
|
-cover \
|
|
-coverprofile=../bundles/api-coverage.out \
|
|
-covermode=atomic \
|
|
-mod=readonly \
|
|
${TESTFLAGS} \
|
|
${api_pkg_list} || exit $?
|
|
)
|
|
fi
|
|
|
|
case "$TESTDIRS" in
|
|
"./client"* | "./...")
|
|
client_pkg_list=$(go -C ./client list -mod=readonly "${TESTDIRS/#\.\/client/\.}")
|
|
;;
|
|
esac
|
|
if [ -n "${client_pkg_list}" ]; then
|
|
# These are tests for a separate module. Run tests for this module with
|
|
# '-mod=readonly' to prevent the "vendor/" directory being used, which
|
|
# does have a copy of these files, but does not contain test files.
|
|
#
|
|
# From the Go documentation https://golang.org/ref/mod:
|
|
#
|
|
# - `-mod=mod` tells the go command to ignore the vendor directory and to
|
|
# automatically update `go.mod`, for example, when an imported package
|
|
# is not provided by any known module.
|
|
# - `-mod=readonly` tells the go command to ignore the vendor directory
|
|
# and to report an error if `go.mod` needs to be updated.
|
|
(
|
|
cd client
|
|
gotestsum --format=standard-quiet --jsonfile=../bundles/client-go-test-report.json --junitfile=../bundles/client-junit-report.xml -- \
|
|
"${BUILDFLAGS[@]}" \
|
|
-cover \
|
|
-coverprofile=../bundles/client-coverage.out \
|
|
-covermode=atomic \
|
|
-mod=readonly \
|
|
${TESTFLAGS} \
|
|
${client_pkg_list} || exit $?
|
|
)
|
|
fi
|
|
|
|
case "$TESTDIRS" in
|
|
"./api"* | "./client"*)
|
|
# modules are handled above
|
|
;;
|
|
*)
|
|
exclude_paths='/vendor/|/integration'
|
|
pkgs=$(go list "$TESTDIRS" | grep -vE "($exclude_paths)")
|
|
|
|
pkg_list=$(echo "${pkgs}" | grep --fixed-strings -v "/libnetwork" || :)
|
|
libnetwork_pkg_list=$(echo "${pkgs}" | grep --fixed-strings "/libnetwork" || :)
|
|
|
|
echo "${libnetwork_pkg_list}" | grep --fixed-strings "libnetwork/drivers/bridge" \
|
|
&& if ! type docker-proxy; then
|
|
hack/make.sh binary-proxy install-proxy
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if [ -n "${pkg_list}" ]; then
|
|
gotestsum --format=standard-quiet --jsonfile=bundles/go-test-report.json --junitfile=bundles/junit-report.xml -- \
|
|
"${BUILDFLAGS[@]}" \
|
|
-cover \
|
|
-coverprofile=bundles/coverage.out \
|
|
-covermode=atomic \
|
|
${TESTFLAGS} \
|
|
${pkg_list}
|
|
fi
|
|
|
|
if [ -n "${libnetwork_pkg_list}" ]; then
|
|
rerun_flaky=1
|
|
|
|
gotest_extra_flags="-skip=TestFlaky.*"
|
|
# Custom -run passed, don't run flaky tests separately.
|
|
if echo "$TESTFLAGS" | grep -Eq '(-run|-test.run)[= ]'; then
|
|
rerun_flaky=0
|
|
gotest_extra_flags=""
|
|
fi
|
|
|
|
# libnetwork tests invoke iptables, and cannot be run in parallel. Execute
|
|
# tests within /libnetwork with '-p=1' to run them sequentially. See
|
|
# https://github.com/moby/moby/issues/42458#issuecomment-873216754 for details.
|
|
gotestsum --format=standard-quiet --jsonfile=bundles/libnetwork-go-test-report.json --junitfile=bundles/libnetwork-junit-report.xml \
|
|
-- "${BUILDFLAGS[@]}" \
|
|
-cover \
|
|
-coverprofile=bundles/libnetwork-coverage.out \
|
|
-covermode=atomic \
|
|
-p=1 \
|
|
${gotest_extra_flags} \
|
|
${TESTFLAGS} \
|
|
${libnetwork_pkg_list}
|
|
|
|
if [ $rerun_flaky -eq 1 ]; then
|
|
gotestsum --format=standard-quiet --jsonfile=bundles/libnetwork-flaky-go-test-report.json --junitfile=bundles/libnetwork-flaky-junit-report.xml \
|
|
--packages "${libnetwork_pkg_list}" \
|
|
--rerun-fails=4 \
|
|
-- "${BUILDFLAGS[@]}" \
|
|
-cover \
|
|
-coverprofile=bundles/libnetwork-flaky-coverage.out \
|
|
-covermode=atomic \
|
|
-p=1 \
|
|
-test.run 'TestFlaky.*' \
|
|
${TESTFLAGS}
|
|
fi
|
|
fi
|