diff --git a/hack/make-rules/verify.sh b/hack/make-rules/verify.sh index 93df92c47e1..7929264ce0c 100755 --- a/hack/make-rules/verify.sh +++ b/hack/make-rules/verify.sh @@ -48,6 +48,7 @@ QUICK_PATTERNS+=( "verify-spelling.sh" "verify-staging-client-go.sh" "verify-staging-meta-files.sh" + "verify-test-featuregates.sh" "verify-test-images.sh" "verify-test-owners.sh" ) diff --git a/hack/verify-test-featuregates.sh b/hack/verify-test-featuregates.sh new file mode 100755 index 00000000000..e801cc53420 --- /dev/null +++ b/hack/verify-test-featuregates.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" + +cd "${KUBE_ROOT}" + +rc=0 + +# find test files accessing the mutable global feature gate or interface +direct_sets=$(grep -n --include *_test.go -R 'MutableFeatureGate' . 2>/dev/null) || true +if [[ -n "${direct_sets}" ]]; then + echo "Test files may not access mutable global feature gates directly:" >&2 + echo "${direct_sets}" >&2 + echo >&2 + echo "Use this invocation instead:" >&2 + echo " defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features., )()" >&2 + echo >&2 + rc=1 +fi + +# find test files calling SetFeatureGateDuringTest and not calling the result +missing_defers=$(grep -n --include *_test.go -R 'SetFeatureGateDuringTest' . 2>/dev/null | egrep -v "defer .*\\)\\(\\)$") || true +if [[ -n "${missing_defers}" ]]; then + echo "Invalid invocations of utilfeaturetesting.SetFeatureGateDuringTest():" >&2 + echo "${missing_defers}" >&2 + echo >&2 + echo "Always make a deferred call to the returned function to ensure the feature gate is reset:" >&2 + echo " defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features., )()" >&2 + echo >&2 + rc=1 +fi + +exit $rc