...

Source file src/sigs.k8s.io/structured-merge-diff/v4/merge/real_test.go

Documentation: sigs.k8s.io/structured-merge-diff/v4/merge

     1  /*
     2  Copyright 2019 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package merge_test
    18  
    19  import (
    20  	"io/ioutil"
    21  	"path/filepath"
    22  	"testing"
    23  
    24  	. "sigs.k8s.io/structured-merge-diff/v4/internal/fixture"
    25  	"sigs.k8s.io/structured-merge-diff/v4/typed"
    26  )
    27  
    28  func testdata(file string) string {
    29  	return filepath.Join("..", "internal", "testdata", file)
    30  }
    31  
    32  func read(file string) []byte {
    33  	s, err := ioutil.ReadFile(file)
    34  	if err != nil {
    35  		panic(err)
    36  	}
    37  	return s
    38  }
    39  
    40  func loadParser(name string) Parser {
    41  	s := read(testdata(name))
    42  	parser, err := typed.NewParser(typed.YAMLObject(s))
    43  	if err != nil {
    44  		panic(err)
    45  	}
    46  	return parser
    47  }
    48  
    49  var k8s = loadParser("k8s-schema.yaml")
    50  var apiresourceimport = loadParser("apiresourceimport.yaml")
    51  var k8s100pctOverrides = loadParser("k8s-schema-100pct-fieldoverride.yaml")
    52  var k8s10pctOverrides = loadParser("k8s-schema-10pct-fieldoverride.yaml")
    53  
    54  func BenchmarkOperations(b *testing.B) {
    55  	benches := []struct {
    56  		name      string
    57  		parseType typed.ParseableType
    58  		filename  string
    59  	}{
    60  		{
    61  			name:      "Pod",
    62  			parseType: k8s.Type("io.k8s.api.core.v1.Pod"),
    63  			filename:  "pod.yaml",
    64  		},
    65  		{
    66  			name:      "Node",
    67  			parseType: k8s.Type("io.k8s.api.core.v1.Node"),
    68  			filename:  "node.yaml",
    69  		},
    70  		{
    71  			name:      "Endpoints",
    72  			parseType: k8s.Type("io.k8s.api.core.v1.Endpoints"),
    73  			filename:  "endpoints.yaml",
    74  		},
    75  		{
    76  			name:      "Node100%override",
    77  			parseType: k8s100pctOverrides.Type("io.k8s.api.core.v1.Node"),
    78  			filename:  "node.yaml",
    79  		},
    80  		{
    81  			name:      "Node10%override",
    82  			parseType: k8s10pctOverrides.Type("io.k8s.api.core.v1.Node"),
    83  			filename:  "node.yaml",
    84  		},
    85  		{
    86  			name:      "Endpoints100%override",
    87  			parseType: k8s100pctOverrides.Type("io.k8s.api.core.v1.Endpoints"),
    88  			filename:  "endpoints.yaml",
    89  		},
    90  		{
    91  			name:      "Endpoints10%override",
    92  			parseType: k8s10pctOverrides.Type("io.k8s.api.core.v1.Endpoints"),
    93  			filename:  "endpoints.yaml",
    94  		},
    95  		{
    96  			name:      "PrometheusCRD",
    97  			parseType: k8s.Type("io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition"),
    98  			filename:  "prometheus-crd.yaml",
    99  		},
   100  		{
   101  			name:      "apiresourceimport",
   102  			parseType: apiresourceimport.Type("apiresourceimport"),
   103  			filename:  "apiresourceimport-cr.yaml",
   104  		},
   105  	}
   106  
   107  	for _, bench := range benches {
   108  		b.Run(bench.name, func(b *testing.B) {
   109  			obj := typed.YAMLObject(read(testdata(bench.filename)))
   110  			tests := []struct {
   111  				name              string
   112  				returnInputonNoop bool
   113  				ops               []Operation
   114  			}{
   115  				{
   116  					name: "Create",
   117  					ops: []Operation{
   118  						Update{
   119  							Manager:    "controller",
   120  							APIVersion: "v1",
   121  							Object:     obj,
   122  						},
   123  					},
   124  				},
   125  				{
   126  					name: "Apply",
   127  					ops: []Operation{
   128  						Apply{
   129  							Manager:    "controller",
   130  							APIVersion: "v1",
   131  							Object:     obj,
   132  						},
   133  					},
   134  				},
   135  				{
   136  					name: "ApplyTwice",
   137  					ops: []Operation{
   138  						Apply{
   139  							Manager:    "controller",
   140  							APIVersion: "v1",
   141  							Object:     obj,
   142  						},
   143  						Apply{
   144  							Manager:    "other-controller",
   145  							APIVersion: "v1",
   146  							Object:     obj,
   147  						},
   148  					},
   149  				},
   150  				{
   151  					name:              "ApplyTwiceNoCompare",
   152  					returnInputonNoop: true,
   153  					ops: []Operation{
   154  						Apply{
   155  							Manager:    "controller",
   156  							APIVersion: "v1",
   157  							Object:     obj,
   158  						},
   159  						Apply{
   160  							Manager:    "other-controller",
   161  							APIVersion: "v1",
   162  							Object:     obj,
   163  						},
   164  					},
   165  				},
   166  				{
   167  					name: "Update",
   168  					ops: []Operation{
   169  						Update{
   170  							Manager:    "controller",
   171  							APIVersion: "v1",
   172  							Object:     obj,
   173  						},
   174  						Update{
   175  							Manager:    "other-controller",
   176  							APIVersion: "v1",
   177  							Object:     obj,
   178  						},
   179  					},
   180  				},
   181  				{
   182  					name: "UpdateVersion",
   183  					ops: []Operation{
   184  						Update{
   185  							Manager:    "controller",
   186  							APIVersion: "v1",
   187  							Object:     obj,
   188  						},
   189  						Update{
   190  							Manager:    "other-controller",
   191  							APIVersion: "v2",
   192  							Object:     obj,
   193  						},
   194  					},
   195  				},
   196  			}
   197  			for _, test := range tests {
   198  				b.Run(test.name, func(b *testing.B) {
   199  					tc := TestCase{
   200  						Ops:               test.ops,
   201  						ReturnInputOnNoop: test.returnInputonNoop,
   202  					}
   203  					p := SameVersionParser{T: bench.parseType}
   204  					tc.PreprocessOperations(p)
   205  
   206  					b.ReportAllocs()
   207  					b.ResetTimer()
   208  					for n := 0; n < b.N; n++ {
   209  						if err := tc.Bench(p); err != nil {
   210  							b.Fatal(err)
   211  						}
   212  					}
   213  				})
   214  			}
   215  		})
   216  	}
   217  }
   218  

View as plain text