1
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