From fb2298de18eee7cb3d677143d3dd2cfde440aa6a Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Mon, 8 May 2017 17:25:31 +0200 Subject: [PATCH] client-go tpr example: round trip external tpr types --- .../apimachinery/pkg/api/testing/roundtrip.go | 11 ++++-- .../apis/tpr/v1/types_test.go | 35 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip.go b/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip.go index e6daf8c1810..8e665d86f89 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip.go @@ -242,8 +242,15 @@ func roundTripOfExternalType(t *testing.T, scheme *runtime.Scheme, codecFactory // roundTrip applies a single round-trip test to the given runtime object // using the given codec. The round-trip test ensures that an object can be -// deep-copied and converted from internal -> versioned -> internal without -// loss of data. +// deep-copied, converted, marshaled and back without loss of data. +// +// For internal types this means +// +// internal -> external -> json/protobuf -> external -> internal. +// +// For external types this means +// +// external -> json/protobuf -> external. func roundTrip(t *testing.T, scheme *runtime.Scheme, codec runtime.Codec, object runtime.Object) { printer := spew.ConfigState{DisableMethods: true} original := object diff --git a/staging/src/k8s.io/client-go/examples/third-party-resources/apis/tpr/v1/types_test.go b/staging/src/k8s.io/client-go/examples/third-party-resources/apis/tpr/v1/types_test.go index ebe0bd48528..38f612d8907 100644 --- a/staging/src/k8s.io/client-go/examples/third-party-resources/apis/tpr/v1/types_test.go +++ b/staging/src/k8s.io/client-go/examples/third-party-resources/apis/tpr/v1/types_test.go @@ -17,8 +17,15 @@ limitations under the License. package v1 import ( + "math/rand" + "testing" + + "github.com/google/gofuzz" + + apitesting "k8s.io/apimachinery/pkg/api/testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" ) var _ runtime.Object = &Example{} @@ -26,3 +33,31 @@ var _ metav1.ObjectMetaAccessor = &Example{} var _ runtime.Object = &ExampleList{} var _ metav1.ListMetaAccessor = &ExampleList{} + +func exampleFuzzerFuncs(t apitesting.TestingCommon) []interface{} { + return []interface{}{ + func(obj *ExampleList, c fuzz.Continue) { + c.FuzzNoCustom(obj) + obj.Items = make([]Example, c.Intn(10)) + for i := range obj.Items { + c.Fuzz(&obj.Items[i]) + } + }, + } +} + +// TestRoundTrip tests that the third-party kinds can be marshaled and unmarshaled correctly to/from JSON +// without the loss of information. Moreover, deep copy is tested. +func TestRoundTrip(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + + AddToScheme(scheme) + + seed := rand.Int63() + fuzzerFuncs := apitesting.MergeFuzzerFuncs(t, apitesting.GenericFuzzerFuncs(t, codecs), exampleFuzzerFuncs(t)) + fuzzer := apitesting.FuzzerFor(fuzzerFuncs, rand.NewSource(seed)) + + apitesting.RoundTripSpecificKindWithoutProtobuf(t, SchemeGroupVersion.WithKind("Example"), scheme, codecs, fuzzer, nil) + apitesting.RoundTripSpecificKindWithoutProtobuf(t, SchemeGroupVersion.WithKind("ExampleList"), scheme, codecs, fuzzer, nil) +}