mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
1a1f5cc37b
Otherwise the cache gets written to bundles instead of to the volume that we setup in the Makefile as expected. Found this because vscode did not like having these huge objects in bundles/ (didn't harm anything, just that it noticed and said hey I don't like that). This enables cache-reuse when building the test binaries. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
198 lines
6 KiB
Bash
198 lines
6 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# For integration-cli test, we use [gocheck](https://labix.org/gocheck), if you want
|
|
# to run certain tests on your local host, you should run with command:
|
|
#
|
|
# TESTFLAGS='-test.run TestDockerSuite/TestBuild*' ./hack/make.sh binary test-integration
|
|
#
|
|
|
|
if [ -z "${MAKEDIR}" ]; then
|
|
MAKEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
export MAKEDIR
|
|
fi
|
|
source "${MAKEDIR}/.go-autogen"
|
|
|
|
# Set defaults
|
|
: "${TEST_REPEAT:=1}"
|
|
: "${TESTFLAGS:=}"
|
|
: "${TESTDEBUG:=}"
|
|
: "${GOCACHE:=$(go env GOCACHE)}"
|
|
|
|
setup_integration_test_filter() {
|
|
if [ -z "${TEST_FILTER}" ]; then
|
|
return
|
|
fi
|
|
|
|
local dirs
|
|
dirs=$(grep -rIlE --include '*_test.go' "func .*${TEST_FILTER}.*\(. \*testing\.T\)" ./integration*/ | xargs -I file dirname file | uniq)
|
|
if [ -z "${TEST_SKIP_INTEGRATION}" ]; then
|
|
: "${TEST_INTEGRATION_DIR:=$(echo "$dirs" | grep -v '^\./integration-cli$')}"
|
|
if [ -z "${TEST_INTEGRATION_DIR}" ]; then
|
|
echo "Skipping integration tests since the supplied filter \"${TEST_FILTER}\" omits all integration tests"
|
|
TEST_SKIP_INTEGRATION=1
|
|
else
|
|
TESTFLAGS+=" -test.run ${TEST_FILTER}"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "${TEST_SKIP_INTEGRATION_CLI}" ]; then
|
|
if echo "$dirs" | grep -vq '^./integration-cli$'; then
|
|
TEST_SKIP_INTEGRATION_CLI=1
|
|
echo "Skipping integration-cli tests since the supplied filter \"${TEST_FILTER}\" omits all integration-cli tests"
|
|
else
|
|
TESTFLAGS+=" -test.run /${TEST_FILTER}"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
setup_integration_test_filter
|
|
if [ -z "${TEST_SKIP_INTEGRATION}" ] && [ -z "${TEST_INTEGRATION_DIR}" ]; then
|
|
integration_api_dirs="$(go list -test -f '{{- if ne .ForTest "" -}}{{- .Dir -}}{{- end -}}' ./integration/...)"
|
|
else
|
|
integration_api_dirs="${TEST_INTEGRATION_DIR}"
|
|
fi
|
|
|
|
run_test_integration() {
|
|
set_platform_timeout
|
|
if [ -z "${TEST_SKIP_INTEGRATION}" ]; then
|
|
run_test_integration_suites "${integration_api_dirs}"
|
|
fi
|
|
if [ -z "${TEST_SKIP_INTEGRATION_CLI}" ]; then
|
|
TIMEOUT=360m run_test_integration_suites integration-cli
|
|
fi
|
|
}
|
|
|
|
run_test_integration_suites() {
|
|
local flags="-test.v -test.timeout=${TIMEOUT} $TESTFLAGS"
|
|
local dirs="$1"
|
|
for dir in ${dirs}; do
|
|
if ! (
|
|
cd "$dir"
|
|
# Create a useful package name based on the tests's $dir. We need to take
|
|
# into account that "$dir" can be either an absolute (/go/src/github.com/docker/docker/integration/foo)
|
|
# or relative (./integration/foo) path. To account for both, first we strip
|
|
# the absolute path, then remove any leading periods and slashes.
|
|
pkgname="${dir}"
|
|
pkgname="${pkgname#*${GOPATH}/src/${DOCKER_PKG}}"
|
|
pkgname="${pkgname#*.}"
|
|
pkgname="${pkgname#*\/}"
|
|
|
|
# Finally, we use periods as separator (instead of slashes) to be more
|
|
# in line with Java package names (which is what junit.xml was designed for)
|
|
pkgname="$(go env GOARCH).${pkgname//\//.}"
|
|
echo "Running $PWD (${pkgname}) flags=${flags}"
|
|
[ -n "$TESTDEBUG" ] && set -x
|
|
# shellcheck disable=SC2086
|
|
test_env gotestsum \
|
|
--format=standard-verbose \
|
|
--jsonfile="${ABS_DEST}/${pkgname//./-}-go-test-report.json" \
|
|
--junitfile="${ABS_DEST}/${pkgname//./-}-junit-report.xml" \
|
|
--raw-command \
|
|
-- go tool test2json -p "${pkgname}" -t ./test.main ${flags}
|
|
); then exit 1; fi
|
|
done
|
|
}
|
|
|
|
build_test_suite_binaries() {
|
|
if [ -n "${DOCKER_INTEGRATION_TESTS_VERIFIED}" ]; then
|
|
echo "Skipping building test binaries; as DOCKER_INTEGRATION_TESTS_VERIFIED is set"
|
|
return
|
|
fi
|
|
if [ -z "${TEST_SKIP_INTEGRATION_CLI}" ]; then
|
|
build_test_suite_binary ./integration-cli "test.main"
|
|
fi
|
|
if [ -z "${TEST_SKIP_INTEGRATION}" ]; then
|
|
for dir in ${integration_api_dirs}; do
|
|
build_test_suite_binary "$dir" "test.main"
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Build a binary for a test suite package
|
|
build_test_suite_binary() {
|
|
local dir="$1"
|
|
local out="$2"
|
|
echo Building test suite binary "$dir/$out"
|
|
go test -c -o "$dir/$out" -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" "$dir"
|
|
}
|
|
|
|
cleanup_test_suite_binaries() {
|
|
[ -n "$TESTDEBUG" ] && return
|
|
echo "Removing test suite binaries"
|
|
# shellcheck disable=SC2038
|
|
find integration* -name test.main | xargs -r rm
|
|
}
|
|
|
|
repeat() {
|
|
for i in $(seq 1 ${TEST_REPEAT}); do
|
|
echo "Running integration-test (iteration $i)"
|
|
$@
|
|
done
|
|
}
|
|
|
|
# use "env -i" to tightly control the environment variables that bleed into the tests
|
|
test_env() {
|
|
(
|
|
set -e
|
|
[ -n "$TESTDEBUG" ] && set -x
|
|
env -i \
|
|
DEST="$ABS_DEST" \
|
|
DOCKER_API_VERSION="$DOCKER_API_VERSION" \
|
|
DOCKER_BUILDKIT="$DOCKER_BUILDKIT" \
|
|
DOCKER_INTEGRATION_DAEMON_DEST="$DOCKER_INTEGRATION_DAEMON_DEST" \
|
|
DOCKER_TLS_VERIFY="$DOCKER_TEST_TLS_VERIFY" \
|
|
DOCKER_CERT_PATH="$DOCKER_TEST_CERT_PATH" \
|
|
DOCKER_ENGINE_GOARCH="$DOCKER_ENGINE_GOARCH" \
|
|
DOCKER_GRAPHDRIVER="$DOCKER_GRAPHDRIVER" \
|
|
DOCKER_USERLANDPROXY="$DOCKER_USERLANDPROXY" \
|
|
DOCKER_HOST="$DOCKER_HOST" \
|
|
DOCKER_REMAP_ROOT="$DOCKER_REMAP_ROOT" \
|
|
DOCKER_REMOTE_DAEMON="$DOCKER_REMOTE_DAEMON" \
|
|
DOCKER_ROOTLESS="$DOCKER_ROOTLESS" \
|
|
DOCKERFILE="$DOCKERFILE" \
|
|
GOCACHE="$GOCACHE" \
|
|
GOPATH="$GOPATH" \
|
|
GOTRACEBACK=all \
|
|
HOME="$ABS_DEST/fake-HOME" \
|
|
PATH="$PATH" \
|
|
TEMP="$TEMP" \
|
|
TEST_CLIENT_BINARY="$TEST_CLIENT_BINARY" \
|
|
"$@"
|
|
)
|
|
}
|
|
|
|
error_on_leaked_containerd_shims() {
|
|
if [ "$(go env GOOS)" = 'windows' ]; then
|
|
return
|
|
fi
|
|
|
|
leftovers=$(ps -ax -o pid,cmd \
|
|
| awk '$2 == "containerd-shim" && $4 ~ /.*\/bundles\/.*\/test-integration/ { print $1 }')
|
|
if [ -n "$leftovers" ]; then
|
|
ps aux
|
|
# shellcheck disable=SC2086
|
|
kill -9 ${leftovers} 2> /dev/null
|
|
echo "!!!! WARNING you have left over shim(s), Cleanup your test !!!!"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
set_platform_timeout() {
|
|
# Test timeout.
|
|
if [ "${DOCKER_ENGINE_GOARCH}" = "arm64" ] || [ "${DOCKER_ENGINE_GOARCH}" = "arm" ]; then
|
|
: "${TIMEOUT:=10m}"
|
|
elif [ "${DOCKER_ENGINE_GOARCH}" = "windows" ]; then
|
|
: "${TIMEOUT:=8m}"
|
|
else
|
|
: "${TIMEOUT:=5m}"
|
|
fi
|
|
|
|
if [ "${TEST_REPEAT}" -gt 1 ]; then
|
|
# TIMEOUT needs to take TEST_REPEAT into account, or a premature time out may happen.
|
|
# The following ugliness will:
|
|
# - remove last character (usually 'm' from '10m')
|
|
# - multiply by testcount
|
|
# - add last character back
|
|
TIMEOUT=$((${TIMEOUT::-1} * ${TEST_REPEAT}))${TIMEOUT:$((${#TIMEOUT} - 1)):1}
|
|
fi
|
|
}
|