Skip to content

Commit

Permalink
Merge pull request #361 from Jefftree/oasv3-serialize-test
Browse files Browse the repository at this point in the history
Add json Unmarshal benchmark for OpenAPI V3 (No unmarshal changes)
  • Loading branch information
k8s-ci-robot committed Jan 27, 2023
2 parents 1cb3ae2 + a855b91 commit 68031ae
Show file tree
Hide file tree
Showing 4 changed files with 16,770 additions and 0 deletions.
1 change: 1 addition & 0 deletions pkg/internal/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ package internal

// Used by tests to selectively disable experimental JSON unmarshaler
var UseOptimizedJSONUnmarshaling bool = true
var UseOptimizedJSONUnmarshalingV3 bool = false
120 changes: 120 additions & 0 deletions pkg/spec3/benchmark_serialization_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package spec3

import (
"encoding/json"
"fmt"
"io"
"os"
"reflect"
"testing"

"github.com/google/go-cmp/cmp"
"k8s.io/kube-openapi/pkg/internal"
"k8s.io/kube-openapi/pkg/validation/spec"
)

// cmp.Diff panics when reflecting unexported fields under jsonreference.Ref
// a custom comparator is required
var swaggerDiffOptions = []cmp.Option{cmp.Comparer(func(a spec.Ref, b spec.Ref) bool {
return a.String() == b.String()
})}

func TestOpenAPIV3Deserialize(t *testing.T) {
swagFile, err := os.Open("./testdata/appsv1spec.json")
if err != nil {
t.Fatal(err)
}
defer swagFile.Close()
originalJSON, err := io.ReadAll(swagFile)
if err != nil {
t.Fatal(err)
}
internal.UseOptimizedJSONUnmarshalingV3 = false

var result1 *OpenAPI

if err := json.Unmarshal(originalJSON, &result1); err != nil {
t.Fatal(err)
}
internal.UseOptimizedJSONUnmarshalingV3 = true
var result2 *OpenAPI
if err := json.Unmarshal(originalJSON, &result2); err != nil {
t.Fatal(err)
}

if !reflect.DeepEqual(result1, result2) {
t.Fatal(cmp.Diff(result1, result2, swaggerDiffOptions...))
}
}

func BenchmarkOpenAPIV3Deserialize(b *testing.B) {
benchcases := []struct {
file string
}{
{
file: "appsv1spec.json",
},
{
file: "authorizationv1spec.json",
},
}
for _, bc := range benchcases {
swagFile, err := os.Open("./testdata/" + bc.file)
if err != nil {
b.Fatal(err)
}
defer swagFile.Close()
originalJSON, err := io.ReadAll(swagFile)
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
b.Run(fmt.Sprintf("%s jsonv1", bc.file), func(b2 *testing.B) {
b2.ReportAllocs()
internal.UseOptimizedJSONUnmarshaling = false
internal.UseOptimizedJSONUnmarshalingV3 = false
for i := 0; i < b2.N; i++ {
var result *OpenAPI
if err := json.Unmarshal(originalJSON, &result); err != nil {
b2.Fatal(err)
}
}
})

b.Run(fmt.Sprintf("%s jsonv2 via jsonv1 schema only", bc.file), func(b2 *testing.B) {
b2.ReportAllocs()
internal.UseOptimizedJSONUnmarshaling = true
internal.UseOptimizedJSONUnmarshalingV3 = false
for i := 0; i < b2.N; i++ {
var result *OpenAPI
if err := json.Unmarshal(originalJSON, &result); err != nil {
b2.Fatal(err)
}
}
})

b.Run(fmt.Sprintf("%s jsonv2 via jsonv1 full spec", bc.file), func(b2 *testing.B) {
b2.ReportAllocs()
internal.UseOptimizedJSONUnmarshaling = true
internal.UseOptimizedJSONUnmarshalingV3 = true
for i := 0; i < b2.N; i++ {
var result *OpenAPI
if err := json.Unmarshal(originalJSON, &result); err != nil {
b2.Fatal(err)
}
}
})

// TODO: Enable this benchmark when jsonv2 is functional for OpenAPI V3.
// b.Run("jsonv2", func(b2 *testing.B) {
// b2.ReportAllocs()
// internal.UseOptimizedJSONUnmarshaling = true
// for i := 0; i < b2.N; i++ {
// var result OpenAPI
// if err := result.UnmarshalJSON(originalJSON); err != nil {
// b2.Fatal(err)
// }
// }
// })
}
}

0 comments on commit 68031ae

Please sign in to comment.