Unify fuzzers and roundtrip tests

This commit is contained in:
Dr. Stefan Schimanski
2017-07-12 16:10:48 +02:00
parent ec2fa9d46c
commit ecc811d263
47 changed files with 591 additions and 261 deletions

View File

@@ -32,6 +32,8 @@ go_library(
"//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/labels:go_default_library",

View File

@@ -26,6 +26,8 @@ import (
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
apitesting "k8s.io/apimachinery/pkg/api/testing"
"k8s.io/apimachinery/pkg/api/testing/fuzzer"
genericfuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
@@ -49,7 +51,7 @@ import (
// overrideGenericFuncs override some generic fuzzer funcs from k8s.io/apiserver in order to have more realistic
// values in a Kubernetes context.
func overrideGenericFuncs(t apitesting.TestingCommon, codecs runtimeserializer.CodecFactory) []interface{} {
func overrideGenericFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(j *runtime.Object, c fuzz.Continue) {
// TODO: uncomment when round trip starts from a versioned object
@@ -83,8 +85,7 @@ func overrideGenericFuncs(t apitesting.TestingCommon, codecs runtimeserializer.C
// Convert the object to raw bytes
bytes, err := runtime.Encode(codec, obj)
if err != nil {
t.Errorf("Failed to encode object: %v", err)
return
panic(fmt.Sprintf("Failed to encode object: %v", err))
}
// Set the bytes field on the RawExtension
@@ -93,7 +94,7 @@ func overrideGenericFuncs(t apitesting.TestingCommon, codecs runtimeserializer.C
}
}
func coreFuncs(t apitesting.TestingCommon) []interface{} {
func coreFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(q *resource.Quantity, c fuzz.Continue) {
*q = *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent)
@@ -500,7 +501,7 @@ func coreFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func extensionFuncs(t apitesting.TestingCommon) []interface{} {
func extensionFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(j *extensions.DeploymentSpec, c fuzz.Continue) {
c.FuzzNoCustom(j) // fuzz self without calling this function again
@@ -580,7 +581,7 @@ func extensionFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func batchFuncs(t apitesting.TestingCommon) []interface{} {
func batchFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(j *batch.JobSpec, c fuzz.Continue) {
c.FuzzNoCustom(j) // fuzz self without calling this function again
@@ -617,7 +618,7 @@ func batchFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func autoscalingFuncs(t apitesting.TestingCommon) []interface{} {
func autoscalingFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(s *autoscaling.HorizontalPodAutoscalerSpec, c fuzz.Continue) {
c.FuzzNoCustom(s) // fuzz self without calling this function again
@@ -680,7 +681,7 @@ func autoscalingFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func rbacFuncs(t apitesting.TestingCommon) []interface{} {
func rbacFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(r *rbac.RoleRef, c fuzz.Continue) {
c.FuzzNoCustom(r) // fuzz self without calling this function again
@@ -714,7 +715,7 @@ func rbacFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func appsFuncs(t apitesting.TestingCommon) []interface{} {
func appsFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(s *apps.StatefulSet, c fuzz.Continue) {
c.FuzzNoCustom(s) // fuzz self without calling this function again
@@ -733,7 +734,7 @@ func appsFuncs(t apitesting.TestingCommon) []interface{} {
},
}
}
func policyFuncs(t apitesting.TestingCommon) []interface{} {
func policyFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(s *policy.PodDisruptionBudgetStatus, c fuzz.Continue) {
c.FuzzNoCustom(s) // fuzz self without calling this function again
@@ -742,7 +743,7 @@ func policyFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func certificateFuncs(t apitesting.TestingCommon) []interface{} {
func certificateFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(obj *certificates.CertificateSigningRequestSpec, c fuzz.Continue) {
c.FuzzNoCustom(obj) // fuzz self without calling this function again
@@ -751,7 +752,7 @@ func certificateFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func admissionregistrationFuncs(t apitesting.TestingCommon) []interface{} {
func admissionregistrationFuncs(codecs runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
func(obj *admissionregistration.ExternalAdmissionHook, c fuzz.Continue) {
c.FuzzNoCustom(obj) // fuzz self without calling this function again
@@ -766,22 +767,20 @@ func admissionregistrationFuncs(t apitesting.TestingCommon) []interface{} {
}
}
func FuzzerFuncs(t apitesting.TestingCommon, codecs runtimeserializer.CodecFactory) []interface{} {
return apitesting.MergeFuzzerFuncs(t,
apitesting.GenericFuzzerFuncs(t, codecs),
overrideGenericFuncs(t, codecs),
coreFuncs(t),
extensionFuncs(t),
appsFuncs(t),
batchFuncs(t),
autoscalingFuncs(t),
rbacFuncs(t),
kubeadmfuzzer.KubeadmFuzzerFuncs(t),
policyFuncs(t),
certificateFuncs(t),
admissionregistrationFuncs(t),
)
}
var FuzzerFuncs = fuzzer.MergeFuzzerFuncs(
genericfuzzer.Funcs,
overrideGenericFuncs,
coreFuncs,
extensionFuncs,
appsFuncs,
batchFuncs,
autoscalingFuncs,
rbacFuncs,
kubeadmfuzzer.Funcs,
policyFuncs,
certificateFuncs,
admissionregistrationFuncs,
)
func newBool(val bool) *bool {
p := new(bool)