@@ -24,7 +24,6 @@ import (
24
24
"os"
25
25
"path/filepath"
26
26
"reflect"
27
- "strings"
28
27
"testing"
29
28
30
29
"github.com/google/go-cmp/cmp"
@@ -111,6 +110,7 @@ func TestVerifyOrUpdateFeatureListUnversioned(t *testing.T) {
111
110
tests := []struct {
112
111
name string
113
112
goFileContent string
113
+ featureListFileContent string
114
114
updatedFeatureListFileContent string
115
115
expectVerifyErr bool
116
116
expectUpdateErr bool
@@ -132,8 +132,48 @@ var otherFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
132
132
AppArmorFields: {Default: true, PreRelease: featuregate.Beta},
133
133
}
134
134
` ,
135
+ featureListFileContent : featureListFileContent ,
135
136
updatedFeatureListFileContent : featureListFileContent ,
136
137
},
138
+ {
139
+ name : "semantically equivalent, formatting wrong" ,
140
+ goFileContent : `
141
+ package features
142
+
143
+ import (
144
+ "k8s.io/component-base/featuregate"
145
+ )
146
+ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
147
+ AppArmorFields: {Default: true, PreRelease: featuregate.Beta},
148
+ CPUCFSQuotaPeriod: {Default: false, PreRelease: featuregate.Alpha},
149
+ ClusterTrustBundleProjection: {Default: false, PreRelease: featuregate.Alpha},
150
+ }
151
+ var otherFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
152
+ AppArmorFields: {Default: true, PreRelease: featuregate.Beta},
153
+ }
154
+ ` ,
155
+ featureListFileContent : `- name: AppArmorFields
156
+ versionedSpecs:
157
+ - default: true
158
+ lockToDefault: false
159
+ preRelease: Beta
160
+ version: ""
161
+ - name: ClusterTrustBundleProjection
162
+ versionedSpecs:
163
+ - default: false
164
+ lockToDefault: false
165
+ preRelease: Alpha
166
+ version: ""
167
+ - name: CPUCFSQuotaPeriod
168
+ versionedSpecs:
169
+ - default: false
170
+ lockToDefault: false
171
+ preRelease: Alpha
172
+ version: ""
173
+ ` ,
174
+ updatedFeatureListFileContent : featureListFileContent ,
175
+ expectVerifyErr : true ,
176
+ },
137
177
{
138
178
name : "same feature added twice with different lifecycle" ,
139
179
goFileContent : `
@@ -151,8 +191,9 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
151
191
AppArmorFields: {Default: true, PreRelease: featuregate.Alpha},
152
192
}
153
193
` ,
154
- expectVerifyErr : true ,
155
- expectUpdateErr : true ,
194
+ featureListFileContent : featureListFileContent ,
195
+ expectVerifyErr : true ,
196
+ expectUpdateErr : true ,
156
197
},
157
198
{
158
199
name : "new feature added" ,
@@ -169,8 +210,9 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
169
210
SELinuxMount: {Default: false, PreRelease: featuregate.Alpha},
170
211
}
171
212
` ,
172
- expectVerifyErr : true ,
173
- expectUpdateErr : true ,
213
+ featureListFileContent : featureListFileContent ,
214
+ expectVerifyErr : true ,
215
+ expectUpdateErr : true ,
174
216
},
175
217
{
176
218
name : "delete feature" ,
@@ -185,7 +227,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
185
227
ClusterTrustBundleProjection: {Default: false, PreRelease: featuregate.Alpha},
186
228
}
187
229
` ,
188
- expectVerifyErr : true ,
230
+ featureListFileContent : featureListFileContent ,
231
+ expectVerifyErr : true ,
189
232
updatedFeatureListFileContent : `- name: AppArmorFields
190
233
versionedSpecs:
191
234
- default: true
@@ -214,13 +257,14 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
214
257
ClusterTrustBundleProjection: {Default: false, PreRelease: featuregate.Alpha},
215
258
}
216
259
` ,
217
- expectVerifyErr : true ,
218
- expectUpdateErr : true ,
260
+ featureListFileContent : featureListFileContent ,
261
+ expectVerifyErr : true ,
262
+ expectUpdateErr : true ,
219
263
},
220
264
}
221
265
for _ , tc := range tests {
222
266
t .Run (tc .name , func (t * testing.T ) {
223
- featureListFile := writeContentToTmpFile (t , "" , "feature_list.yaml" , strings . TrimSpace ( featureListFileContent ) )
267
+ featureListFile := writeContentToTmpFile (t , "" , "feature_list.yaml" , tc . featureListFileContent )
224
268
tmpDir := filepath .Dir (featureListFile .Name ())
225
269
_ = writeContentToTmpFile (t , tmpDir , "pkg/new_features.go" , tc .goFileContent )
226
270
err := verifyOrUpdateFeatureList (tmpDir , filepath .Base (featureListFile .Name ()), false , false )
@@ -229,7 +273,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
229
273
}
230
274
err = verifyOrUpdateFeatureList (tmpDir , filepath .Base (featureListFile .Name ()), true , false )
231
275
if tc .expectUpdateErr != (err != nil ) {
232
- t .Errorf ("expectVerifyErr =%v, got err: %s" , tc .expectVerifyErr , err )
276
+ t .Errorf ("expectUpdateErr =%v, got err: %s" , tc .expectUpdateErr , err )
233
277
}
234
278
if tc .expectUpdateErr {
235
279
return
@@ -272,6 +316,7 @@ func TestVerifyOrUpdateFeatureListVersioned(t *testing.T) {
272
316
tests := []struct {
273
317
name string
274
318
goFileContent string
319
+ featureListFileContent string
275
320
updatedFeatureListFileContent string
276
321
expectVerifyErr bool
277
322
expectUpdateErr bool
@@ -302,8 +347,62 @@ var otherFeatureGates = map[featuregate.Feature]featuregate.VersionedSpecs{
302
347
{Version: version.MajorMinor(1, 30), Default: true, PreRelease: featuregate.Beta},
303
348
},
304
349
}
350
+ ` ,
351
+ featureListFileContent : featureListFileContent ,
352
+ updatedFeatureListFileContent : featureListFileContent ,
353
+ },
354
+ {
355
+ name : "semantically equivalent, formatting wrong" ,
356
+ goFileContent : `
357
+ package features
358
+
359
+ import (
360
+ "k8s.io/apimachinery/pkg/util/version"
361
+ "k8s.io/component-base/featuregate"
362
+ )
363
+ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate.VersionedSpecs{
364
+ AppArmorFields: {
365
+ {Version: version.MajorMinor(1, 30), Default: true, PreRelease: featuregate.Beta},
366
+ },
367
+ CPUCFSQuotaPeriod: {
368
+ {Version: version.MustParse("1.30"), Default: false, PreRelease: featuregate.Alpha},
369
+ {Version: version.MustParse("1.31"), Default: true, PreRelease: featuregate.Beta},
370
+ },
371
+ genericfeatures.APIListChunking: {
372
+ {Version: version.MustParse("1.30"), Default: true, PreRelease: featuregate.GA, LockToDefault: true},
373
+ },
374
+ }
375
+ var otherFeatureGates = map[featuregate.Feature]featuregate.VersionedSpecs{
376
+ AppArmorFields: {
377
+ {Version: version.MajorMinor(1, 30), Default: true, PreRelease: featuregate.Beta},
378
+ },
379
+ }
380
+ ` ,
381
+ featureListFileContent : `- name: APIListChunking
382
+ versionedSpecs:
383
+ - default: true
384
+ lockToDefault: true
385
+ preRelease: GA
386
+ version: "1.30"
387
+ - name: AppArmorFields
388
+ versionedSpecs:
389
+ - default: true
390
+ lockToDefault: false
391
+ preRelease: Beta
392
+ version: "1.30"
393
+ - name: CPUCFSQuotaPeriod
394
+ versionedSpecs:
395
+ - default: false
396
+ lockToDefault: false
397
+ preRelease: Alpha
398
+ version: "1.30"
399
+ - default: true
400
+ lockToDefault: false
401
+ preRelease: Beta
402
+ version: "1.31"
305
403
` ,
306
404
updatedFeatureListFileContent : featureListFileContent ,
405
+ expectVerifyErr : true ,
307
406
},
308
407
{
309
408
name : "same feature added twice with different lifecycle" ,
@@ -332,8 +431,9 @@ var otherFeatureGates = map[featuregate.Feature]featuregate.VersionedSpecs{
332
431
},
333
432
}
334
433
` ,
335
- expectVerifyErr : true ,
336
- expectUpdateErr : true ,
434
+ featureListFileContent : featureListFileContent ,
435
+ expectVerifyErr : true ,
436
+ expectUpdateErr : true ,
337
437
},
338
438
{
339
439
name : "VersionedSpecs not ordered by version" ,
@@ -357,8 +457,9 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
357
457
},
358
458
}
359
459
` ,
360
- expectVerifyErr : true ,
361
- expectUpdateErr : true ,
460
+ featureListFileContent : featureListFileContent ,
461
+ expectVerifyErr : true ,
462
+ expectUpdateErr : true ,
362
463
},
363
464
{
364
465
name : "add new feature" ,
@@ -385,7 +486,8 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
385
486
},
386
487
}
387
488
` ,
388
- expectVerifyErr : true ,
489
+ expectVerifyErr : true ,
490
+ featureListFileContent : featureListFileContent ,
389
491
updatedFeatureListFileContent : `- name: APIListChunking
390
492
versionedSpecs:
391
493
- default: true
@@ -435,7 +537,8 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
435
537
},
436
538
}
437
539
` ,
438
- expectVerifyErr : true ,
540
+ expectVerifyErr : true ,
541
+ featureListFileContent : featureListFileContent ,
439
542
updatedFeatureListFileContent : `- name: APIListChunking
440
543
versionedSpecs:
441
544
- default: true
@@ -477,7 +580,8 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
477
580
},
478
581
}
479
582
` ,
480
- expectVerifyErr : true ,
583
+ expectVerifyErr : true ,
584
+ featureListFileContent : featureListFileContent ,
481
585
updatedFeatureListFileContent : `- name: APIListChunking
482
586
versionedSpecs:
483
587
- default: true
@@ -509,7 +613,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
509
613
}
510
614
for _ , tc := range tests {
511
615
t .Run (tc .name , func (t * testing.T ) {
512
- featureListFile := writeContentToTmpFile (t , "" , "feature_list.yaml" , strings . TrimSpace ( featureListFileContent ) )
616
+ featureListFile := writeContentToTmpFile (t , "" , "feature_list.yaml" , tc . featureListFileContent )
513
617
tmpDir := filepath .Dir (featureListFile .Name ())
514
618
_ = writeContentToTmpFile (t , tmpDir , "pkg/new_features.go" , tc .goFileContent )
515
619
err := verifyOrUpdateFeatureList (tmpDir , filepath .Base (featureListFile .Name ()), false , true )
0 commit comments