From 91980a0f61f66ca740fc8cde08943d4ee14b4410 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Wed, 21 Nov 2018 10:11:14 -0500 Subject: [PATCH] Add verification script for test feature gate modification --- hack/make-rules/verify.sh | 1 + hack/verify-test-featuregates.sh | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100755 hack/verify-test-featuregates.sh 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