From d08047c240dce45f45614580ee8b663b825221c0 Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Mon, 11 Sep 2017 21:10:15 +0530 Subject: [PATCH] Add round trip tests for conversion to go-openapi types --- .../pkg/apiserver/validation/BUILD | 18 ++++ .../apiserver/validation/validation_test.go | 87 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation_test.go diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD index 3d6cbab9b0a..6cd57b61b51 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load( "@io_bazel_rules_go//go:def.bzl", "go_library", + "go_test", ) go_library( @@ -27,3 +28,20 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["validation_test.go"], + library = ":go_default_library", + deps = [ + "//vendor/github.com/go-openapi/spec:go_default_library", + "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", + "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", + "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", + ], +) diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation_test.go new file mode 100644 index 00000000000..a64c48f2d1f --- /dev/null +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/validation_test.go @@ -0,0 +1,87 @@ +/* +Copyright 2017 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. +*/ + +package validation + +import ( + "math/rand" + "testing" + + "github.com/go-openapi/spec" + + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/testing/fuzzer" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/json" + + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + apiextensionsfuzzer "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" +) + +// TestRoundTrip checks the conversion to go-openapi types. +// internal -> go-openapi -> JSON -> external -> internal +func TestRoundTrip(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + + // add internal and external types to scheme + if err := apiextensions.AddToScheme(scheme); err != nil { + t.Fatal(err) + } + if err := apiextensionsv1beta1.AddToScheme(scheme); err != nil { + t.Fatal(err) + } + + seed := rand.Int63() + fuzzerFuncs := fuzzer.MergeFuzzerFuncs(apiextensionsfuzzer.Funcs) + f := fuzzer.FuzzerFor(fuzzerFuncs, rand.NewSource(seed), codecs) + + for i := 0; i < 20; i++ { + // fuzz internal types + internal := &apiextensions.JSONSchemaProps{} + f.Fuzz(internal) + + // internal -> go-openapi + openAPITypes := &spec.Schema{} + if err := convertJSONSchemaProps(internal, openAPITypes); err != nil { + t.Fatal(err) + } + + // go-openapi -> JSON + openAPIJSON, err := json.Marshal(openAPITypes) + if err != nil { + t.Fatal(err) + } + + // JSON -> external + external := &apiextensionsv1beta1.JSONSchemaProps{} + if err := json.Unmarshal(openAPIJSON, external); err != nil { + t.Fatal(err) + } + + // external -> internal + internalRoundTripped := &apiextensions.JSONSchemaProps{} + if err := scheme.Convert(external, internalRoundTripped, nil); err != nil { + t.Fatal(err) + } + + if !apiequality.Semantic.DeepEqual(internal, internalRoundTripped) { + t.Fatalf("expected\n\t%#v, got \n\t%#v", internal, internalRoundTripped) + } + } +}