File: .integration-test-helpers

package info (click to toggle)
docker.io 20.10.24%2Bdfsg1-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 60,824 kB
  • sloc: sh: 5,621; makefile: 593; ansic: 179; python: 162; asm: 7
file content (198 lines) | stat: -rw-r--r-- 6,166 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#!/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
}