diff --git a/pkg/api/testing/defaulting_test.go b/pkg/api/testing/defaulting_test.go index a442b14dfbf..2a08f788e29 100644 --- a/pkg/api/testing/defaulting_test.go +++ b/pkg/api/testing/defaulting_test.go @@ -192,24 +192,6 @@ func TestDefaulting(t *testing.T) { {Group: "flowcontrol.apiserver.k8s.io", Version: "v1", Kind: "PriorityLevelConfigurationList"}: {}, } - f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1)) - f.Funcs( - func(s *runtime.RawExtension, c fuzz.Continue) {}, - func(s *metav1.LabelSelector, c fuzz.Continue) { - c.FuzzNoCustom(s) - s.MatchExpressions = nil // need to fuzz this specially - }, - func(s *metav1.ListOptions, c fuzz.Continue) { - c.FuzzNoCustom(s) - s.LabelSelector = "" // need to fuzz requirement strings specially - s.FieldSelector = "" // need to fuzz requirement strings specially - }, - func(s *extensionsv1beta1.ScaleStatus, c fuzz.Continue) { - c.FuzzNoCustom(s) - s.TargetSelector = "" // need to fuzz requirement strings specially - }, - ) - scheme := legacyscheme.Scheme var testTypes orderedGroupVersionKinds for gvk := range scheme.AllKnownTypes() { @@ -221,45 +203,77 @@ func TestDefaulting(t *testing.T) { sort.Sort(testTypes) for _, gvk := range testTypes { - _, expectedChanged := typesWithDefaulting[gvk] - iter := 0 - changedOnce := false - for { - if iter > *roundtrip.FuzzIters { - if !expectedChanged || changedOnce { - break + gvk := gvk + t.Run(gvk.String(), func(t *testing.T) { + // Each sub-tests gets its own fuzzer instance to make running it independent + // from what other tests ran before. + f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1)) + f.Funcs( + func(s *runtime.RawExtension, c fuzz.Continue) {}, + func(s *metav1.LabelSelector, c fuzz.Continue) { + c.FuzzNoCustom(s) + s.MatchExpressions = nil // need to fuzz this specially + }, + func(s *metav1.ListOptions, c fuzz.Continue) { + c.FuzzNoCustom(s) + s.LabelSelector = "" // need to fuzz requirement strings specially + s.FieldSelector = "" // need to fuzz requirement strings specially + }, + func(s *extensionsv1beta1.ScaleStatus, c fuzz.Continue) { + c.FuzzNoCustom(s) + s.TargetSelector = "" // need to fuzz requirement strings specially + }, + ) + + _, expectedChanged := typesWithDefaulting[gvk] + iter := 0 + changedOnce := false + for { + if iter > *roundtrip.FuzzIters { + if !expectedChanged || changedOnce { + break + } + // This uses to be 300, but for ResourceClaimList that was not high enough + // because depending on the starting conditions, the fuzzer never created the + // one combination where defaulting kicked in (empty string in non-empty slice + // in another non-empty slice). + if iter > 3000 { + t.Errorf("expected %s to trigger defaulting due to fuzzing", gvk) + break + } + // if we expected defaulting, continue looping until the fuzzer gives us one + // at worst, we will timeout } - if iter > 300 { - t.Errorf("expected %s to trigger defaulting due to fuzzing", gvk) - break + iter++ + + src, err := scheme.New(gvk) + if err != nil { + t.Fatal(err) } - // if we expected defaulting, continue looping until the fuzzer gives us one - // at worst, we will timeout - } - iter++ + f.Fuzz(src) - src, err := scheme.New(gvk) - if err != nil { - t.Fatal(err) - } - f.Fuzz(src) + src.GetObjectKind().SetGroupVersionKind(schema.GroupVersionKind{}) - src.GetObjectKind().SetGroupVersionKind(schema.GroupVersionKind{}) + original := src.DeepCopyObject() - original := src.DeepCopyObject() + // get internal + withDefaults := src.DeepCopyObject() + scheme.Default(withDefaults) - // get internal - withDefaults := src.DeepCopyObject() - scheme.Default(withDefaults.(runtime.Object)) - - if !reflect.DeepEqual(original, withDefaults) { - changedOnce = true - if !expectedChanged { - t.Errorf("{Group: \"%s\", Version: \"%s\", Kind: \"%s\"} did not expect defaults to be set - update expected or check defaulter registering: %s", gvk.Group, gvk.Version, gvk.Kind, cmp.Diff(original, withDefaults)) + if !reflect.DeepEqual(original, withDefaults) { + diff := cmp.Diff(original, withDefaults) + if !changedOnce { + t.Logf("got diff (-fuzzed, +with defaults):\n%s", diff) + changedOnce = true + } + if !expectedChanged { + t.Errorf("{Group: \"%s\", Version: \"%s\", Kind: \"%s\"} did not expect defaults to be set - update expected or check defaulter registering: %s", gvk.Group, gvk.Version, gvk.Kind, diff) + } } } - } + }) } + } func BenchmarkPodDefaulting(b *testing.B) {