Skip to content

Commit 1dbae0e

Browse files
committed
cleanup: make the featuragate test more extensible.
Signed-off-by: Lan Liang <[email protected]>
1 parent 93a245a commit 1dbae0e

File tree

1 file changed

+73
-110
lines changed

1 file changed

+73
-110
lines changed

server/embed/config_test.go

+73-110
Original file line numberDiff line numberDiff line change
@@ -92,136 +92,99 @@ func TestConfigFileOtherFields(t *testing.T) {
9292
assert.Equal(t, false, cfg.SocketOpts.ReuseAddress, "ReuseAddress does not match")
9393
}
9494

95-
func TestConfigFileFeatureGates(t *testing.T) {
96-
testCases := []struct {
97-
name string
98-
serverFeatureGatesJSON string
99-
experimentalStopGRPCServiceOnDefrag string
100-
experimentalInitialCorruptCheck string
101-
expectErr bool
102-
expectedFeatures map[featuregate.Feature]bool
103-
}{
104-
{
105-
name: "default",
106-
expectedFeatures: map[featuregate.Feature]bool{
107-
features.DistributedTracing: false,
108-
features.StopGRPCServiceOnDefrag: false,
109-
features.InitialCorruptCheck: false,
110-
},
111-
},
95+
func defaultFeatureGates() map[featuregate.Feature]bool {
96+
fgs := make(map[featuregate.Feature]bool)
97+
for fg, fgspec := range features.DefaultEtcdServerFeatureGates {
98+
fgs[fg] = fgspec.Default
99+
}
100+
return fgs
101+
}
102+
103+
func defaultFeatureGatesWithFG(fg featuregate.Feature, enabled bool) map[featuregate.Feature]bool {
104+
fgs := defaultFeatureGates()
105+
fgs[fg] = enabled
106+
return fgs
107+
}
108+
109+
func defaultFeatureGatesWithFGs(fgs2 []featuregate.Feature, enabled bool) map[featuregate.Feature]bool {
110+
fgs := defaultFeatureGates()
111+
for _, f := range fgs2 {
112+
fgs[f] = enabled
113+
}
114+
return fgs
115+
}
116+
117+
func testCasesForFeaturegate(experimentalKey, fgname string, fg featuregate.Feature) []featureTestCase {
118+
return []featureTestCase{
112119
{
113-
name: "cannot set both experimental flag and feature gate flag",
114-
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=true",
115-
experimentalStopGRPCServiceOnDefrag: "false",
116-
expectErr: true,
120+
name: "cannot set both experimental flag and feature gate flag",
121+
serverFeatureGatesJSON: fgname + "=true",
122+
experimentalKey: experimentalKey,
123+
experimentalValue: false,
124+
expectErr: true,
117125
},
118126
{
119-
name: "cannot set both experimental flag and feature gate flag for InitialCorruptCheck",
120-
serverFeatureGatesJSON: "InitialCorruptCheck=true",
121-
experimentalInitialCorruptCheck: "false",
122-
expectErr: true,
127+
name: "can set feature gate to true from experimental flag",
128+
experimentalKey: experimentalKey,
129+
experimentalValue: true,
130+
expectedFeatures: defaultFeatureGatesWithFG(fg, true),
123131
},
124132
{
125-
name: "ok to set different experimental flag and feature gate flag",
126-
serverFeatureGatesJSON: "DistributedTracing=true",
127-
experimentalStopGRPCServiceOnDefrag: "true",
128-
expectedFeatures: map[featuregate.Feature]bool{
129-
features.DistributedTracing: true,
130-
features.StopGRPCServiceOnDefrag: true,
131-
features.InitialCorruptCheck: false,
132-
},
133+
name: "can set feature gate to false from experimental flag",
134+
experimentalKey: experimentalKey,
135+
experimentalValue: false,
136+
expectedFeatures: defaultFeatureGatesWithFG(fg, false),
133137
},
134138
{
135-
name: "can set feature gate to true from experimental flag",
136-
experimentalStopGRPCServiceOnDefrag: "true",
137-
expectedFeatures: map[featuregate.Feature]bool{
138-
features.StopGRPCServiceOnDefrag: true,
139-
features.DistributedTracing: false,
140-
features.InitialCorruptCheck: false,
141-
},
139+
name: "can set feature gate " + fgname + " to true from feature gate flag",
140+
serverFeatureGatesJSON: fgname + "=true",
141+
expectedFeatures: defaultFeatureGatesWithFG(fg, true),
142142
},
143143
{
144-
name: "can set feature gate to false from experimental flag",
145-
experimentalStopGRPCServiceOnDefrag: "false",
146-
expectedFeatures: map[featuregate.Feature]bool{
147-
features.StopGRPCServiceOnDefrag: false,
148-
features.DistributedTracing: false,
149-
features.InitialCorruptCheck: false,
150-
},
151-
},
152-
{
153-
name: "can set feature gate experimentalInitialCorruptCheck to true from experimental flag",
154-
experimentalInitialCorruptCheck: "true",
155-
expectedFeatures: map[featuregate.Feature]bool{
156-
features.StopGRPCServiceOnDefrag: false,
157-
features.DistributedTracing: false,
158-
features.InitialCorruptCheck: true,
159-
},
160-
},
161-
{
162-
name: "can set feature gate experimentalInitialCorruptCheck to false from experimental flag",
163-
experimentalInitialCorruptCheck: "false",
164-
expectedFeatures: map[featuregate.Feature]bool{
165-
features.StopGRPCServiceOnDefrag: false,
166-
features.DistributedTracing: false,
167-
features.InitialCorruptCheck: false,
168-
},
169-
},
170-
{
171-
name: "can set feature gate StopGRPCServiceOnDefrag to true from feature gate flag",
172-
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=true",
173-
expectedFeatures: map[featuregate.Feature]bool{
174-
features.StopGRPCServiceOnDefrag: true,
175-
features.DistributedTracing: false,
176-
features.InitialCorruptCheck: false,
177-
},
144+
name: "can set feature gate to false from feature gate flag",
145+
serverFeatureGatesJSON: fgname + "=false",
146+
expectedFeatures: defaultFeatureGatesWithFG(fg, false),
178147
},
148+
}
149+
}
150+
151+
type featureTestCase struct {
152+
name string
153+
serverFeatureGatesJSON string
154+
expectErr bool
155+
expectedFeatures map[featuregate.Feature]bool
156+
experimentalKey string
157+
experimentalValue bool
158+
}
159+
160+
func TestConfigFileFeatureGates(t *testing.T) {
161+
testCases := []featureTestCase{
179162
{
180-
name: "can set feature gate InitialCorruptCheck to true from feature gate flag",
181-
serverFeatureGatesJSON: "InitialCorruptCheck=true",
182-
expectedFeatures: map[featuregate.Feature]bool{
183-
features.StopGRPCServiceOnDefrag: false,
184-
features.DistributedTracing: false,
185-
features.InitialCorruptCheck: true,
186-
},
163+
name: "default",
164+
expectedFeatures: defaultFeatureGates(),
187165
},
188166
{
189-
name: "can set feature gate to false from feature gate flag",
190-
serverFeatureGatesJSON: "StopGRPCServiceOnDefrag=false",
191-
expectedFeatures: map[featuregate.Feature]bool{
192-
features.StopGRPCServiceOnDefrag: false,
193-
features.DistributedTracing: false,
194-
features.InitialCorruptCheck: false,
195-
},
167+
name: "ok to set different experimental flag and feature gate flag",
168+
serverFeatureGatesJSON: "DistributedTracing=true",
169+
experimentalKey: "experimental-stop-grpc-service-on-defrag",
170+
experimentalValue: true,
171+
expectedFeatures: defaultFeatureGatesWithFGs([]featuregate.Feature{features.StopGRPCServiceOnDefrag, features.DistributedTracing}, true),
196172
},
197173
}
174+
175+
testCases = append(testCases, testCasesForFeaturegate("experimental-stop-grpc-service-on-defrag", "StopGRPCServiceOnDefrag", features.StopGRPCServiceOnDefrag)...)
176+
testCases = append(testCases, testCasesForFeaturegate("experimental-initial-corrupt-check", "InitialCorruptCheck", features.InitialCorruptCheck)...)
177+
198178
for _, tc := range testCases {
199179
t.Run(tc.name, func(t *testing.T) {
200-
yc := struct {
201-
ExperimentalStopGRPCServiceOnDefrag *bool `json:"experimental-stop-grpc-service-on-defrag,omitempty"`
202-
ExperimentalInitialCorruptCheck *bool `json:"experimental-initial-corrupt-check,omitempty"`
203-
ServerFeatureGatesJSON string `json:"feature-gates"`
204-
}{
205-
ServerFeatureGatesJSON: tc.serverFeatureGatesJSON,
206-
}
180+
ycmap := make(map[string]interface{})
181+
ycmap["feature-gates"] = tc.serverFeatureGatesJSON
207182

208-
if tc.experimentalInitialCorruptCheck != "" {
209-
experimentalInitialCorruptCheck, err := strconv.ParseBool(tc.experimentalInitialCorruptCheck)
210-
if err != nil {
211-
t.Fatal(err)
212-
}
213-
yc.ExperimentalInitialCorruptCheck = &experimentalInitialCorruptCheck
214-
}
215-
216-
if tc.experimentalStopGRPCServiceOnDefrag != "" {
217-
experimentalStopGRPCServiceOnDefrag, err := strconv.ParseBool(tc.experimentalStopGRPCServiceOnDefrag)
218-
if err != nil {
219-
t.Fatal(err)
220-
}
221-
yc.ExperimentalStopGRPCServiceOnDefrag = &experimentalStopGRPCServiceOnDefrag
183+
if tc.experimentalKey != "" {
184+
ycmap[tc.experimentalKey] = tc.experimentalValue
222185
}
223186

224-
b, err := yaml.Marshal(&yc)
187+
b, err := yaml.Marshal(ycmap)
225188
if err != nil {
226189
t.Fatal(err)
227190
}

0 commit comments

Comments
 (0)