Skip to content

Commit

Permalink
Improve test script
Browse files Browse the repository at this point in the history
add usage
verify flag value for -i is numeric
allow multiple targets on the command line
actually capture coverage output
fix lingering GOFLAGS undef issue
fix issue with -i not working at all: ((x++)) returns 1 when x is 0, which is
  incompatible with "set -e"
  • Loading branch information
thockin committed Sep 3, 2014
1 parent 42eea82 commit 640a1d3
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 36 deletions.
5 changes: 4 additions & 1 deletion hack/build-go.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,13 @@ for arg; do
binaries+=("${KUBE_GO_PACKAGE}/${arg}")
done

# Use eval to preserve embedded quoted strings.
eval "goflags=(${GOFLAGS:-})"

# Note that the flags to 'go build' are duplicated in the salt build setup
# (release/build-release.sh) for our cluster deploy. If we add more command
# line options to our standard build we'll want to duplicate them there. As we
# move to distributing pre- built binaries we can eliminate this duplication.
go install ${GOFLAGS:-} \
go install "${goflags[@]:+${goflags[@]}}" \
-ldflags "${version_ldflags}" \
"${binaries[@]}"
109 changes: 75 additions & 34 deletions hack/test-go.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,11 @@ find_test_dirs() {
-o -wholename '*/third_party/*' \
-o -wholename '*/Godeps/*' \
\) -prune \
\) -name '*_test.go' -print0 | xargs -0n1 dirname | sort -u | xargs -n1 printf "${KUBE_GO_PACKAGE}/%s\n"
\) -name '*_test.go' -print0 | xargs -0n1 dirname | sed 's|^\./||' | sort -u
}

find_test_pkgs() {
find_test_dirs | xargs -n1 printf "${KUBE_GO_PACKAGE}/%s\n"
}

# -covermode=atomic becomes default with -race in Go >=1.3
Expand All @@ -46,62 +50,99 @@ KUBE_TIMEOUT=${KUBE_TIMEOUT:--timeout 30s}

cd "${KUBE_TARGET}"

while getopts "i:" opt ; do
usage() {
cat << EOF
usage: $0 [OPTIONS] [TARGETS]
OPTIONS:
-i <number> : number of times to run each test, must be >= 1
EOF
}

isnum() {
[[ "$1" =~ ^[0-9]+$ ]]
}

iterations=1
while getopts "hi:" opt ; do
case $opt in
h)
usage
exit 0
;;
i)
iterations=$OPTARG
iterations="$OPTARG"
if ! isnum "${iterations}" || [[ "${iterations}" -le 0 ]]; then
echo "$0": argument to -i must be numeric and greater than 0 >&2
usage >&2
exit 1
fi
;;
?)
echo "Invalid argument -$OPTARG"
usage >&2
exit 1
;;
:)
echo "Option -$OPTARG <value>"
echo "Option -$OPTARG <value>" >&2
usage >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))

if [[ -n "${iterations}" ]]; then
echo "Running ${iterations} times"
if [[ -n "$1" ]]; then
pkg=$KUBE_GO_PACKAGE/$1
# Use eval to preserve embedded quoted strings.
eval "goflags=(${GOFLAGS:-})"

if [[ "${iterations}" -gt 1 ]]; then
if [[ $# -eq 0 ]]; then
set -- $(find_test_dirs)
fi
rm -f *.test
# build a test binary
echo "${pkg}"
go test -c -race ${KUBE_TIMEOUT} "${pkg}"
# keep going, even if there are failures
pass=0
count=0
for i in $(seq 1 ${iterations}); do
for test_binary in *.test; do
if "./${test_binary}"; then
((pass++))
echo "Running ${iterations} times"
fails=0
for arg; do
trap 'exit 1' SIGINT
echo
pkg=${KUBE_GO_PACKAGE}/${arg}
echo "${pkg}"
# keep going, even if there are failures
pass=0
count=0
for i in $(seq 1 ${iterations}); do
if go test "${goflags[@]:+${goflags[@]}}" \
-race ${KUBE_TIMEOUT} "${pkg}"; then
pass=$((pass + 1))
else
fails=$((fails + 1))
fi
((count++))
done
done 2>&1
echo "${pass}" / "${count}" passing
if [[ ${pass} != ${count} ]]; then
count=$((count + 1))
done 2>&1
echo "${pass}" / "${count}" passed
done
if [[ ${fails} -gt 0 ]]; then
exit 1
else
exit 0
fi
fi

if [[ -n "$1" ]]; then
go test ${GOFLAGS} \
-race \
${KUBE_TIMEOUT} \
${KUBE_COVER} -coverprofile=tmp.out \
"${KUBE_GO_PACKAGE}/$1" "${@:2}"
covdir="/tmp/k8s_coverage/$(date "+%s")"
echo saving coverage output in "${covdir}"
for arg; do
trap 'exit 1' SIGINT
mkdir -p "${covdir}/${arg}"
pkg=${KUBE_GO_PACKAGE}/${arg}
go test "${goflags[@]:+${goflags[@]}}" \
-race \
${KUBE_TIMEOUT} \
${KUBE_COVER} -coverprofile="${covdir}/${arg}/coverage.out" \
"${pkg}"
done
exit 0
fi

find_test_dirs | xargs go test ${GOFLAGS:-} \
find_test_pkgs | xargs go test "${goflags[@]:+${goflags[@]}}" \
-race \
-timeout 30s \
${KUBE_COVER} \
"${@:2}"
${KUBE_TIMEOUT} \
${KUBE_COVER}
3 changes: 2 additions & 1 deletion hack/test-integration.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ trap cleanup EXIT SIGINT
echo
echo Integration test cases ...
echo
$(dirname $0)/../hack/test-go.sh test/integration -tags 'integration no-docker'
GOFLAGS="-tags 'integration no-docker'" \
$(dirname $0)/../hack/test-go.sh test/integration
# leave etcd running if integration tests fail
trap "echo etcd still running" EXIT

Expand Down

0 comments on commit 640a1d3

Please sign in to comment.