From 8a32f346a09589d76d718c45610ccd7bb195dd68 Mon Sep 17 00:00:00 2001 From: Lukasz Szaszkiewicz Date: Mon, 15 Jan 2024 12:55:14 +0100 Subject: [PATCH] kube/features: improve unit testing known/registered features Co-authored-by: Ben Luddy --- pkg/features/kube_features_test.go | 58 +++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/pkg/features/kube_features_test.go b/pkg/features/kube_features_test.go index 177c12ddd8f..81bfbc421d2 100644 --- a/pkg/features/kube_features_test.go +++ b/pkg/features/kube_features_test.go @@ -17,22 +17,56 @@ limitations under the License. package features import ( - utilfeature "k8s.io/apiserver/pkg/util/feature" "testing" + + utilfeature "k8s.io/apiserver/pkg/util/feature" + clientfeatures "k8s.io/client-go/features" + "k8s.io/component-base/featuregate" ) -func TestKubeFeatures(t *testing.T) { - features := utilfeature.DefaultFeatureGate.DeepCopy().GetAll() +// TestKubeFeaturesRegistered tests that all kube features are registered. +func TestKubeFeaturesRegistered(t *testing.T) { + registeredFeatures := utilfeature.DefaultFeatureGate.DeepCopy().GetAll() - for i := range features { - featureName := string(i) - - if featureName == "AllAlpha" || featureName == "AllBeta" { - continue - } - - if _, ok := defaultKubernetesFeatureGates[i]; !ok { - t.Errorf("The feature gate %q is not registered", featureName) + for featureName := range defaultKubernetesFeatureGates { + if _, ok := registeredFeatures[featureName]; !ok { + t.Errorf("The feature gate %q is not registered in the DefaultFeatureGate", featureName) + } + } +} + +// TestClientFeaturesRegistered tests that all client features are registered. +func TestClientFeaturesRegistered(t *testing.T) { + onlyClientFg := featuregate.NewFeatureGate() + if err := clientfeatures.AddFeaturesToExistingFeatureGates(&clientAdapter{onlyClientFg}); err != nil { + t.Fatal(err) + } + registeredFeatures := utilfeature.DefaultFeatureGate.DeepCopy().GetAll() + + for featureName := range onlyClientFg.GetAll() { + if _, ok := registeredFeatures[featureName]; !ok { + t.Errorf("The client-go's feature gate %q is not registered in the DefaultFeatureGate", featureName) + } + } +} + +// TestAllRegisteredFeaturesExpected tests that the set of features actually registered does not +// include any features other than those on the list in this package or in client-go's feature +// package. +func TestAllRegisteredFeaturesExpected(t *testing.T) { + registeredFeatures := utilfeature.DefaultFeatureGate.DeepCopy().GetAll() + knownFeatureGates := featuregate.NewFeatureGate() + if err := clientfeatures.AddFeaturesToExistingFeatureGates(&clientAdapter{knownFeatureGates}); err != nil { + t.Fatal(err) + } + if err := knownFeatureGates.Add(defaultKubernetesFeatureGates); err != nil { + t.Fatal(err) + } + knownFeatures := knownFeatureGates.GetAll() + + for registeredFeature := range registeredFeatures { + if _, ok := knownFeatures[registeredFeature]; !ok { + t.Errorf("The feature gate %q is not from known feature gates", registeredFeature) } } }